快速开始
本文档将帮助您快速了解如何创建一个 maven connector,以连接到 maven registry 并安全地执行 mvn 操作,而无需直接处理凭据。
我们将创建一个 maven connector,并使用它执行 mvn deploy,无需在客户端直接处理凭据。
预计阅读时间
15 分钟
前提条件
- 已安装 Connectors 系统(Operator、ConnectorsCore 和 ConnectorsMaven 组件)的 Kubernetes 集群。有关安装这些组件的详细信息,请参阅安装指南。
- maven registry 地址(snapshots)和凭据
- Kubernetes 和 Maven 的基础知识
流程概览
操作步骤
第 1 步:创建 Namespace
为本次演示创建专用的命名空间:
kubectl create ns connectors-maven-demo
第 2 步:创建 Maven Registry 凭据和 Connector
创建包含 maven registry 凭据的 Secret 和 maven connector 资源。您的 maven registry 应为 snapshots 仓库。
有关创建和配置 connectors 的详细信息,请参阅Connectors 快速开始指南。
cat <<EOF | kubectl apply -n connectors-maven-demo -f -
kind: Secret
apiVersion: v1
metadata:
name: maven-registry-secret
type: kubernetes.io/basic-auth
stringData:
username: your-registry-username # 替换为您的 Maven registry 用户名
password: your-registry-password # 替换为您的 Maven registry 密码
---
apiVersion: connectors.alauda.io/v1alpha1
kind: Connector
metadata:
name: maven-connector
spec:
connectorClassName: maven
address: https://nexus.example.com/repository/maven-snapshots # 替换为您的 Maven snapshots 仓库地址,我们将向该仓库部署 jar 包。
auth:
name: basicAuth
secretRef:
name: maven-registry-secret
EOF
确认 connector 处于 "Ready" 状态:
kubectl get connector maven-connector -n connectors-maven-demo
输出应显示:
NAME CLASS ADDRESS READY REASON AGE
maven-connector maven https://nexus.example.com/repository/maven-snapshots True 10s
第 3 步:创建执行 mvn deploy 的 Job
创建一个使用 connector 执行 maven 操作的 Job:
cat <<'EOF' | kubectl apply -n connectors-maven-demo -f -
apiVersion: batch/v1
kind: Job
metadata:
name: mvn-deploy
spec:
backoffLimit: 0
template:
spec:
restartPolicy: Never
containers:
- name: mvn
image: docker.io/library/maven:3.9.11-eclipse-temurin-24-alpine # 替换为包含 maven 的镜像
imagePullPolicy: IfNotPresent
env:
- name: MAVEN_OPTS
value: -Dmaven.resolver.transport=wagon
command:
- "sh"
- "-c"
- |
set -ex
mkdir -p ~/.m2
cp /opt/maven/settings.xml ~/.m2/settings.xml
keytool -importcert -noprompt \
-trustcacerts \
-keystore $JAVA_HOME/lib/security/cacerts \
-storepass changeit \
-alias corp-ca \
-file /opt/maven/ca.cert
echo "Generating project using maven archetype"
cd /tmp
mvn archetype:generate -DgroupId=com.example -DartifactId=HelloWorldApp -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
cd HelloWorldApp/
echo "Building and deploying project"
mvn package deploy -DaltDeploymentRepository=maven-snapshots::default::https://nexus.example.com/repository/maven-snapshots
volumeMounts:
- name: settings
mountPath: /opt/maven
volumes:
- name: settings
csi:
readOnly: true
driver: connectors-csi
volumeAttributes:
connector.name: "maven-connector"
configuration.names: "settings"
EOF
关键设置
容器环境中的 MAVEN_OPTS:
设置为 MAVEN_OPTS=-Dmaven.resolver.transport=wagon
容器中的脚本:
使用 keytool 命令将 ca.cert 文件导入客户端的 truststore,以信任 connector 代理服务器,然后执行 mvn 操作。
keytool -importcert -noprompt \
-trustcacerts \
-keystore $JAVA_HOME/lib/security/cacerts \
-storepass changeit \
-alias corp-ca \
-file /opt/maven/ca.cert
volumes[].volumeAttributes
connector.name:您的 maven connector 名称
configuration.names:设置为 "settings",引用 maven connectorClass 中定义的特定配置模板。该模板用于生成带有适当认证设置的 "settings.xml" 文件。
第 4 步:验证操作
检查 Job 的日志,确认 mvn deploy 操作成功执行:
kubectl logs -f job/mvn-deploy -n connectors-maven-demo
您应看到 mvn deploy 操作成功完成,并将 jar 上传到 maven 仓库。
示例输出:
Uploading to maven-snapshots: https://nexus.example.com/repository/maven-snapshots/com/example/HelloWorldApp/1.0-SNAPSHOT/maven-metadata.xml
Uploaded to maven-snapshots: https://nexus.example.com/repository/maven-snapshots/com/example/HelloWorldApp/1.0-SNAPSHOT/maven-metadata.xml (768 B at 80 B/s)
Uploading to maven-snapshots: https://nexus.example.com/repository/maven-snapshots/com/example/HelloWorldApp/maven-metadata.xml
Uploaded to maven-snapshots: https://nexus.example.com/repository/maven-snapshots/com/example/HelloWorldApp/maven-metadata.xml (282 B at 29 B/s)
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 01:27 min
[INFO] Finished at: 2025-09-02T10:18:50Z
[INFO] ------------------------------------------------------------------------
底层原理
maven connector 的工作原理:
- 创建一个代理服务,位于您的 maven 客户端和目标 maven registry 之间
- 当请求通过代理时注入认证信息
- 为客户端提供
settings.xml 文件,以便通过代理执行 mvn 操作
为了演示此机制,我们来查看生成的 settings.xml 文件:
cat <<EOF | kubectl apply -n connectors-maven-demo -f -
apiVersion: v1
kind: Pod
metadata:
name: inspect-mvn-deploy
spec:
restartPolicy: Never
containers:
- name: mvn
image: docker.io/library/maven:3.9.11-eclipse-temurin-24-alpine # 替换为包含 maven 的镜像
command: ["sleep", "3600"]
env:
- name: MAVEN_OPTS
value: -Dmaven.resolver.transport=wagon
volumeMounts:
- name: settings
mountPath: /opt/maven
volumes:
- name: settings
csi:
readOnly: true
driver: connectors-csi
volumeAttributes:
connector.name: "maven-connector"
configuration.names: "settings"
EOF
查看 /opt/maven/ 下生成的文件:
$ kubectl exec -it inspect-mvn-deploy -n connectors-maven-demo -- ls -l /opt/maven
total 8
-r--r--r-- 1 root root 1261 Sep 2 10:25 ca.cert
-r--r--r-- 1 root root 1679 Sep 2 10:25 settings.xml
查看生成的 settings.xml 文件:
$ kubectl exec -it inspect-mvn-deploy -n connectors-maven-demo -- cat /opt/maven/settings.xml
示例输出:
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 https://maven.apache.org/xsd/settings-1.0.0.xsd">
<proxies>
<proxy>
<id>connectors-proxy</id>
<active>true</active>
<protocol>http</protocol>
<host>c-maven-connector.connectors-maven-demo.svc.cluster.local</host>
<port>80</port>
<username>connectors-maven-demo/maven-connector</username>
<password>eyJhbGciOiJEnEZaTQ</password>
<nonProxyHosts>localhost</nonProxyHosts>
</proxy>
</proxies>
</settings>
关键说明
- 通过 Connectors CSI Driver 挂载了两个文件到 Pod:
settings.xml 和 ca.cert。
settings.xml 文件包含代理配置部分,提供通过代理连接 maven registry 的能力。代理会在请求通过时注入认证信息。
settings.xml 文件不包含原始的 Secret,且通过 Connectors CSI Driver 挂载到 Pod。
认证流程
inspect-mvn-deploy Pod 不包含原始集群令牌。当 maven 向 maven registry 发起 HTTPS 请求时,代理服务器会拦截这些请求,从 maven-connector 注入认证凭据,并将认证后的请求转发到后端 maven registry 服务器。
Settings 卷
settings.xml 文件通过 Connectors CSI Driver 挂载到 Pod。
volumes:
- name: settings
csi:
readOnly: true
driver: connectors-csi
volumeAttributes:
connector.name: "maven-connector"
configuration.names: "settings"
在上述示例中,settings.xml 和 ca.cert 文件通过 Connectors CSI Driver 挂载到 Pod。
settings.xml 文件包含代理配置部分,提供通过代理连接 maven registry 的能力。代理会在请求通过时注入认证信息。
ca.cert 文件用于信任 connectors 代理服务器,因此您应在执行 mvn 操作前将 ca.cert 文件导入客户端的 truststore。
有关卷参数,请参阅 Maven Connector Concepts 文档中的使用 Connectors CSI Driver 挂载 settings.xml 文件。
故障排查
如果您的 mvn deploy 操作失败,请检查以下内容:
-
Connector 状态:确保 connector 处于 "Ready" 状态:
kubectl describe connector maven-connector -n connectors-maven-demo
-
验证 connectors 部署状态:确保所有组件已部署且处于 "Ready" 状态
kubectl get pods -n <connector-component-namespace>
深入阅读
成功使用 maven connector 执行 mvn deploy 操作后,您可以:
参考资料