Connectors CSI Driver

Overview

Connectors CSI Driver 是基于 Container Storage Interface (CSI) 规范实现的存储驱动,能够将来自 Connector 的配置作为卷挂载到 Kubernetes 工作负载中。主要功能包括:

  • 将配置文件从 Connector 挂载到 Pod 中
  • 支持配置文件中的动态变量渲染,自动注入运行时信息
  • 支持同时挂载多个配置文件

所有配置数据均来自与 Connector 关联的 ConnectorClass 配置

Quick Start

1. 创建 ConnectorClass

首先,创建一个包含 Git 配置的 ConnectorClass:

cat << EOF | kubectl apply -f -
apiVersion: connectors.alauda.io/v1alpha1
kind: ConnectorClass
metadata:
  name: my-git
spec:
  address:
    type: string
  configurations:
  - name: config
    data:
      .gitconfig: |
        this is git config
EOF

2. 创建 Connector

然后,创建一个连接到 GitHub 的 Connector:

cat << EOF | kubectl apply -f -
apiVersion: connectors.alauda.io/v1alpha1
kind: Connector
metadata:
  name: git-connector
spec:
  address: https://github.com
  connectorClassName: my-git
EOF

3. 创建使用 CSI 驱动的 Pod

创建一个挂载配置的 Pod:

cat << EOF | kubectl create -f -
apiVersion: v1
kind: Pod
metadata:
  name: csi-demo
  namespace: default
spec:
  restartPolicy: Never
  containers:
  - name: web
    image: bitnami/git:2.47.1
    imagePullPolicy: IfNotPresent
    command: ["sleep", "3600"]
    volumeMounts:
    - name: git-config
      mountPath: /tmp/config
  volumes:
  - name: git-config
    csi:
      readOnly: true
      driver: connectors-csi
      volumeAttributes:
        connector.name: "git-connector"
        connector.namespace: "default"
        configuration.names: "config"
EOF

验证挂载的文件:

# 列出所有挂载的文件(包括内置配置)
kubectl exec -ti csi-demo -- ls -l /tmp/config

# 查看来自 ConnectorClass 的自定义配置
kubectl exec -ti csi-demo -- cat /tmp/config/.gitconfig

Built-in Configurations

CSI 驱动自动提供内置配置文件,这些文件始终挂载到 Pod 中。

文件名描述
.env环境变量文件,包含 http_proxyhttps_proxyno_proxy,格式为 key=value
http.proxy带认证的 HTTP 正向代理 URL
https.proxy带认证的 HTTPS 正向代理 URL
context.token代理服务的认证令牌
context.proxy.caCertConnectors 代理的 CA 证书
connector.status.proxyAddress代理地址(详见 Connectors Proxy

正向代理使用示例:

# 方案一
export http_proxy=$(cat /{mount-path}/http.proxy)
export https_proxy=$(cat /{mount-path}/https.proxy)

# 方案二
source /{mount-path}/.env

反向代理使用示例:

export TOKEN=$(cat /{mount-path}/context.token)
export SERVER=$(cat /{mount-path}/connector.status.proxyAddress)

{cli} --server $SERVER --token $TOKEN

CSI Volume Parameters

卷参数

参数是否必需描述
readOnly必须为 true
driver必须为 connectors-csi

卷属性

参数是否必需描述
connector.nameConnector 名称
connector.namespaceConnector 命名空间(默认为 Pod 所在命名空间)
configuration.names逗号分隔的配置名称列表(例如 config1,config2),配置名称对应 ConnectorClass 中的配置名称
token.expiration令牌过期时间(默认:30m

示例

挂载单个配置:

volumes:
- name: config
  csi:
    driver: connectors-csi
    readOnly: true
    volumeAttributes:
      connector.name: "my-connector"
      configuration.names: "config1"

挂载多个配置:

volumes:
- name: config
  csi:
    driver: connectors-csi
    readOnly: true
    volumeAttributes:
      connector.name: "my-connector"
      configuration.names: "config1,config2"

注意事项:

  • 如果省略 configuration.names,则只挂载内置配置
  • 当多个配置中存在同名文件时,后面的配置会覆盖前面的文件

Configuration File Rendering

CSI 驱动在挂载配置文件时会进行变量渲染,使用 Go template 语法。

可用变量

变量描述
.connector.status.proxyAddressConnector 的代理地址;详见 connectors-proxy
.connector.spec.*Connector 的 Spec,可以获取 Connector Spec 的所有字段,例如 .connector.spec.address.connector.spec.params
.context.token访问代理服务的认证令牌
.context.proxy.caCert访问 Connectors 代理(正向代理)的 CA 证书;详见 connectors-proxy

内置函数

支持函数请参考 sprig

例如:b64enc:对字符串进行 Base64 编码

关于代理服务

Connectors 为每个 Connector 提供代理服务,允许客户端访问目标资源时无需存储原始凭据。详情请参见 connectors-proxy

Configuration examples

常量内容

apiVersion: connectors.alauda.io/v1alpha1
kind: ConnectorClass
metadata:
  name: my-git
spec:
  address:
    type: string
  configurations:
  - name: config
    data:
      .gitconfig: |
        this is git config

使用 connector.spec.params

下面的 ConnectorClass 定义了一个参数 sslVerify,用于控制 git clone 时的 SSL 验证。

kind: ConnectorClass
metadata:
  name: git
spec:

  params:
  - name: sslVerify
    type: string
    default: "true"

  configurations:
  - name: config
    data:
      .gitconfig: |
        {{ $sslVerify := "true" -}}
        {{- range .connector.spec.params }}{{- if eq .name "sslVerify" }}{{$sslVerify = .value }}{{ end }}{{- end }}
        [http]
          sslVerify = {{ $sslVerify }}

使用代理服务和令牌

下面的 ConnectorClass 提供了一个名为 .gitconfig 的文件,利用代理服务和令牌,在 git clone 时自动注入头部并替换 git URL。

kind: ConnectorClass
metadata:
  name: git
spec:
  configurations:
  - name: config
    data:
      .gitconfig: |
        [http]
            extraHeader = Authorization: Basic {{ printf ":%s" .context.token | b64enc }}
        [url "{{ .connector.status.proxyAddress }}"]
            insteadOf = {{.connector.spec.address}}