快速开始

本文档将帮助您快速了解如何创建一个 maven connector,以连接到 maven registry 并安全地执行 mvn 操作,而无需直接处理凭据。

我们将创建一个 maven connector,并使用它执行 mvn deploy,无需在客户端直接处理凭据。

预计阅读时间

15 分钟

前提条件

  • 已安装 Connectors 系统(Operator、ConnectorsCore 和 ConnectorsMaven 组件)的 Kubernetes 集群。有关安装这些组件的详细信息,请参阅安装指南
  • maven registry 地址(snapshots)和凭据
  • Kubernetes 和 Maven 的基础知识

流程概览

步骤操作说明
1创建 Namespace为演示设置专用的命名空间
2配置 Maven Registry 凭据及 Connector创建认证 Secret 和 maven connector 资源
3创建执行 mvn deploy 的 Maven Job创建一个通过 connector 执行 mvn deploy 的 Job
4验证结果验证 mvn deploy 操作是否成功执行

操作步骤

第 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 的工作原理:

  1. 创建一个代理服务,位于您的 maven 客户端和目标 maven registry 之间
  2. 当请求通过代理时注入认证信息
  3. 为客户端提供 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.xmlca.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.xmlca.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 操作失败,请检查以下内容:

  1. Connector 状态:确保 connector 处于 "Ready" 状态:

    kubectl describe connector maven-connector -n connectors-maven-demo
  2. 验证 connectors 部署状态:确保所有组件已部署且处于 "Ready" 状态

    kubectl get pods -n <connector-component-namespace>

深入阅读

成功使用 maven connector 执行 mvn deploy 操作后,您可以:

参考资料