Git 连接器

Git 连接器是一个与平台无关的连接器,可用于连接任何 Git Server,例如 GitHub、GitLab、Bitbucket。

您可以使用 Git 连接器在 CICD 流水线中安全地克隆私有仓库,也可以在容器化工作负载中使用它来执行无需凭证的 Git 操作。

此外,您还可以跨 namespace 集中管理 Git 访问配置,无需在每个 namespace 中重复配置 Git 凭证。

本文将介绍:

  • Git server 的要求
  • 如何基于 Git ConnectorClass 创建 Git 连接器
  • Git 连接器的代理和配置能力

Git Server 的要求

要访问的 Git server 必须满足以下条件:

  1. 必须支持 HTTP/HTTPS 传输协议,并且仅兼容 Git 的 "smart HTTP" 协议模式。该模式是现代 Git server 的标准实现,支持高效的数据传输和认证机制。

基于 Git ConnectorClass 创建 Git 连接器

快速开始

apiVersion: connectors.alauda.io/v1alpha1
kind: Connector
metadata:
  name: github-demo
spec:
  connectorClassName: git
  address: https://github.com
  auth:
    name: basicAuth
    params:
    - name: repository
      value: "kubernetes/website.git"

spec.connectorClassName

固定值 git

描述

您可以通过 annotations 字段为 Git 连接器添加描述信息。

  • cpaas.io/description:Git 连接器的描述信息。

例如:

apiVersion: connectors.alauda.io/v1alpha1
kind: Connector
metadata:
  name: github-demo
  annotations:
    cpaas.io/description: "Connect to GitHub for accessing team public repositories"

地址

spec.address 指定 Git server 的访问地址,例如:https://github.com。需要注意的是,该地址用于克隆 Git 仓库,而不是 Git server 的 API 地址。

认证

Git 连接器支持以下认证类型:

  • basicAuth:基于用户名和密码的认证(可选),对应的 secret 类型:kubernetes.io/basic-auth

使用 Basic Authentication

例如:

apiVersion: connectors.alauda.io/v1alpha1
kind: Connector
metadata:
  name: github-demo
spec:
  connectorClassName: git
  address: https://github.com
  auth:
    name: basicAuth
    secretRef:
      name: github-secret

您需要在同一个 namespace 中创建一个 Secret,例如:

apiVersion: v1
stringData:
  password: your-password
  username: your-username
kind: Secret
metadata:
  name: github-secret
type: kubernetes.io/basic-auth

注意password 字段不局限于实际的用户密码。只要满足 所需的凭证权限 章节中列出的权限要求,您可以使用其他类型的凭证,例如 Personal Access Tokens (PAT) 或 API keys。

如果 Git server 不需要认证,您可以省略 secretRef 字段:

apiVersion: connectors.alauda.io/v1alpha1
kind: Connector
metadata:
  name: github-demo
spec:
  connectorClassName: git
  address: https://github.com
  auth:
    name: basicAuth

所需的凭证权限

配置的凭证所需的权限取决于您计划在 Pod/流水线中如何使用它。此外,凭证还必须对 认证参数 章节中指定的认证仓库具备 clone 权限。

例如:

  • 如果您需要在使用该连接器的流水线中同时执行 clone 和 push 操作,那么凭证必须对目标仓库同时具有 clone 和 push 权限。换句话说,该凭证应允许您既能从仓库 clone,也能向仓库 push。
  • 如果您只需要在流水线中克隆仓库,则凭证只需要对目标仓库具有 clone 权限。

出于安全最佳实践,我们建议创建仅具备最低必需权限的凭证。当确实需要更高权限时,请创建使用更高权限 secret 的独立 Connector,并使用 namespace 隔离来控制哪些用户可以访问每个 Connector。

认证参数

为了检查凭证是否有效,您需要指定一个 Git 仓库路径。连接器将在运行时使用该凭证访问该仓库,以确定凭证是否有效。

该认证参数通过 spec.auth.params 指定。

  • repository:指定用于认证检查的 Git 仓库路径,例如 org/repo.git

例如:

apiVersion: connectors.alauda.io/v1alpha1
kind: Connector
metadata:
  name: github-demo
spec:
  connectorClassName: git
  address: https://github.com
  auth:
    name: basicAuth
    params:
    - name: repository
      value: org/repo.git
    secretRef:
      name: github-secret

代理和配置

为了让客户端在无需凭证的情况下访问 Git 仓库,Git connectorclass 提供了一个代理服务器,用于自动注入认证信息。

有权限访问该连接器的客户端可以使用该代理服务器访问 Git 仓库,而无需在客户端侧配置凭证。

为了简化使用,Git connectorclass 提供了可以通过 CSI 挂载到 Pod 中的配置信息。在 Pod 中执行 Git 操作时,可以自动使用代理服务完成 Git 操作。

代理地址

创建 Git 连接器时,系统会自动创建一个用于代理访问 Git 仓库的 Service。

系统会将代理地址记录在 status.proxy.httpAddress 字段中。

例如:

apiVersion: connectors.alauda.io/v1alpha1
kind: Connector
metadata:
  name: github-demo
spec:
  # . . .
status:
  conditions:
  # . . .
  proxy:
    httpAddress:
      url: http://c-github-demo.default.svc.cluster.local

配置

基于 Git connectorclass 创建的 Git 连接器提供以下配置:

gitconfig:Git 配置信息。

  • 提供一个 .gitconfig 配置文件,其中 Git 仓库地址将被替换为代理地址。结合 connector-csi-driver,该配置文件将被挂载到 Pod 中,使您无需在客户端侧配置凭证即可通过代理访问 Git 仓库。

Pod 中生成的配置文件示例:

[http]
    extraHeader = Authorization: Basic <base64 encoded token of the service account>
[url "http://c-github-demo.default.svc"]
    insteadOf = https://github.com

更多使用场景可参考 在 Clone Job 中使用 Git 连接器

更多