快速开始
本文档将帮助您快速了解如何创建 Nexus connector 以连接到 Nexus 仓库,并在不直接处理凭据的情况下安全地执行 mvn 操作。
我们将创建一个 Nexus connector,并使用它执行 mvn deploy,无需在客户端直接处理凭据。
预计阅读时间
15 分钟
前提条件
- 已安装 Connectors 系统(Operator、ConnectorsCore 和 ConnectorsNexus 组件)的 Kubernetes 集群。有关安装这些组件的详细信息,请参阅安装指南。
- Nexus 仓库地址和凭据
- Kubernetes 和 Maven 的基础知识
流程概览
操作步骤
步骤 1:创建 Namespace
为本次演示创建专用命名空间:
kubectl create ns connectors-nexus-demo
步骤 2:创建 Nexus 仓库凭据和 Connector
创建包含 Nexus 凭据的 Secret 和 Nexus connector 资源。您的 Nexus 仓库应为 snapshots 仓库。
有关创建和配置 connectors 的详细信息,请参阅Connectors 快速开始指南。
cat <<EOF | kubectl apply -n connectors-nexus-demo -f -
kind: Secret
apiVersion: v1
metadata:
name: nexus-registry-secret
type: kubernetes.io/basic-auth
stringData:
username: your-nexus-username # 替换为您的 Nexus 用户名
password: your-nexus-password # 替换为您的 Nexus 密码
---
apiVersion: connectors.alauda.io/v1alpha1
kind: Connector
metadata:
name: nexus-connector
spec:
connectorClassName: nexus
address: https://nexus.example.com # 替换为您的 Nexus 服务器地址
auth:
name: basicAuth
secretRef:
name: nexus-registry-secret
EOF
确认 connector 状态为 "Ready":
kubectl get connector nexus-connector -n connectors-nexus-demo
输出应显示:
NAME CLASS ADDRESS READY REASON AGE
nexus-connector nexus https://nexus.example.com True 10s
步骤 3:创建执行 mvn deploy 的 Job
创建一个使用 connector 执行 Maven 操作的 Job:
cat <<'EOF' | kubectl apply -n connectors-nexus-demo -f -
apiVersion: batch/v1
kind: Job
metadata:
name: mvn-deploy
spec:
backoffLimit: 0
template:
spec:
restartPolicy: Never
containers:
- name: mvn
image: 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: "nexus-connector"
configuration.names: "settings"
configuration.params: '{"settings":{"mirrorRepository":"maven-public"}}' # 可选
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:您的 Nexus connector 名称
configuration.names:设置为 settings,引用 Nexus ConnectorClass 中定义的 Maven 配置模板。该模板生成带有适当代理和认证设置的 settings.xml 文件。
configuration.params:运行时配置参数的 JSON 字符串。对于 configuration.names: "settings",可以设置 settings.mirrorRepository(可选)。如果省略,则使用 ConnectorClass 默认值(""),不会在 settings.xml 中注入 Maven 镜像。
步骤 4:验证操作
查看 Job 日志,确认 mvn deploy 操作成功执行:
kubectl logs -f job/mvn-deploy -n connectors-nexus-demo
您应看到 mvn deploy 操作成功完成并将 jar 上传到 Nexus 仓库。
示例输出:
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)
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 01:27 min
[INFO] Finished at: 2025-09-02T10:18:50Z
[INFO] ------------------------------------------------------------------------
底层原理
Nexus connector 的工作原理:
- 创建一个代理服务,位于客户端和目标 Nexus 仓库之间
- 请求通过代理时注入认证信息
- 为客户端提供配置文件(如
settings.xml、.npmrc、pip.conf),以通过代理执行操作
为演示此机制,请检查生成的 settings.xml 文件:
cat <<EOF | kubectl apply -n connectors-nexus-demo -f -
apiVersion: v1
kind: Pod
metadata:
name: inspect-nexus-settings
spec:
restartPolicy: Never
containers:
- name: mvn
image: maven:3.9.11-eclipse-temurin-24-alpine
command: ["sleep", "3600"]
volumeMounts:
- name: settings
mountPath: /opt/maven
volumes:
- name: settings
csi:
readOnly: true
driver: connectors-csi
volumeAttributes:
connector.name: "nexus-connector"
configuration.names: "settings"
EOF
查看 /opt/maven/ 下生成的文件:
$ kubectl exec -it inspect-nexus-settings -n connectors-nexus-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-nexus-settings -n connectors-nexus-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-nexus-connector.connectors-nexus-demo.svc.cluster.local</host>
<port>80</port>
<username>connectors-nexus-demo/nexus-connector</username>
<password>eyJhbGciOiJEnEZaTQ</password>
<nonProxyHosts>localhost</nonProxyHosts>
</proxy>
</proxies>
</settings>
关键说明
- 通过 Connectors CSI Driver 挂载了两个文件到 Pod:
settings.xml 和 ca.cert。
settings.xml 文件包含代理配置部分,提供通过代理连接 Nexus Maven 仓库的能力。代理在请求通过时注入认证信息。
settings.xml 文件不包含原始的 Secret,且通过 Connectors CSI Driver 挂载到 Pod。
故障排查
如果操作失败,请检查以下内容:
-
Connector 状态:确保 connector 处于 "Ready" 状态:
kubectl describe connector nexus-connector -n connectors-nexus-demo
-
检查 connectors 部署状态:确保所有组件均已部署且处于 "Ready" 状态
kubectl get pods -n <connector-component-namespace>
进一步阅读
成功使用 Nexus connector 执行操作后,您可以:
参考资料