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:
connectors: "default/git-connector"
configuration.names: "config"
EOF
验证挂载的文件:
# 列出所有挂载的文件(包括内置配置)
kubectl exec -ti csi-demo -- ls -l /tmp/config
# 查看来自 ConnectorClass 的自定义配置
kubectl exec -ti csi-demo -- cat /tmp/config/.gitconfig
内置配置
CSI Driver 会自动提供内置配置文件,这些文件始终挂载到 Pod 中。
正向代理使用示例:
# 方案一
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 卷参数
卷参数
卷属性
示例
挂载单个配置:
volumes:
- name: config
csi:
driver: connectors-csi
readOnly: true
volumeAttributes:
connectors: "my-connector"
configuration.names: "config1"
挂载多个配置:
volumes:
- name: config
csi:
driver: connectors-csi
readOnly: true
volumeAttributes:
connectors: "my-connector"
configuration.names: "config1,config2"
挂载多个 Connector 用于代理认证:
volumes:
- name: config
csi:
driver: connectors-csi
readOnly: true
volumeAttributes:
connectors: "namespace1/connector1,namespace2/connector2"
configuration.names: "config1,config2"
注意:
- 如果省略
configuration.names,则只挂载内置配置
- 当多个配置包含同名文件时,后面的配置会覆盖前面的
connectors 参数用于指定多个 Connector 以挂载配置
多个 Connector
Connectors CSI Driver 支持使用多个 Connector 进行配置。可以通过 connectors 卷属性指定多个 Connector,格式为 namespace/name 或 name;若省略命名空间,则使用 Pod 所在命名空间。多个 Connector 之间用逗号分隔。
volumes:
- name: config
csi:
driver: connectors-csi
readOnly: true
volumeAttributes:
connectors: "namespace1/connector1,namespace2/connector2"
configuration.names: "config1,config2"
当指定多个 Connector 时,CSI Driver 会基于 configuration.names 属性合并配置文件。合并行为详见 配置合并 部分。
WARNING
对可列出的 Connector 数量没有严格限制;但建议避免指定过多 Connector,以防请求头过大及其他代理相关问题。
配置合并
当指定多个 Connector 时,CSI Driver 会根据 configuration.names 属性合并所有指定 Connector 的配置文件。
处理配置文件时有多种情况,以下描述各情况的行为。
相同配置名称
对于具有相同配置名称的 Connector,当指定多个 Connector 时,它们的配置数据会合并为单个配置文件。
配置模板应支持渲染多个 Connector 的数据,以便单个文件包含多个 Connector 特定的数据集。
例如:
apiVersion: connectors.alauda.io/v1alpha1
kind: ConnectorClass
metadata:
name: multi-connector
spec:
configurations:
- name: config
data:
.multi-connector-config: |
{{- range .connectors }}
# Configuration for Connector: {{ .name }}
param_name = {{ .name }}
param_value = {{ .spec.address }}
{{- end }}
上述示例中,配置文件 .multi-connector-config 会包含 connectors 卷属性中每个 Connector 的配置段。
kubectl exec -ti pod-name -- ls -l /mount-path/
# 输出:
# - .multi-connector-config
WARNING
如果合并的 Connector 来自不同的 ConnectorClass,且存在同名配置文件,则后面的 ConnectorClass 配置会覆盖前面的。因此建议在此场景下使用不同的配置文件名以避免冲突。
不同配置名称
当指定的 Connector 具有不同的配置名称时,CSI Driver 会分别挂载所有配置。
apiVersion: connectors.alauda.io/v1alpha1
kind: ConnectorClass
metadata:
name: connector-a
spec:
configurations:
- name: config-a
data:
config.xml: |
{{- range .connectors }}
# Configuration for Connector: {{ .name }}
param_name = {{ .name }}
param_value = {{ .spec.address }}
{{- end }}
---
apiVersion: connectors.alauda.io/v1alpha1
kind: ConnectorClass
metadata:
name: connector-b
spec:
configurations:
- name: config-b
data:
settings.json: |
{"connectors": [
{{- range .connectors }}
{"name": "{{ .name }}", "address": "{{ .spec.address }}"},
{{- end }}
]}
当同时挂载多个 Connector 和配置名称时:
- name: config
csi:
driver: connectors-csi
readOnly: true
volumeAttributes:
connectors: "namespace-a/connector-a,namespace-b/connector-b"
configuration.names: "config-a,config-b"
挂载的卷将包含 config.xml 和 settings.json,每个文件均填充对应 Connector 的数据。
kubectl exec -ti pod-name -- ls -l /mount-path/
# 输出:
# - config.xml
# - settings.json
配置文件渲染
CSI Driver 在挂载配置文件时会进行变量渲染,使用 Go template 语法。
可用变量
内置函数
支持的函数请参考 sprig
例如:b64enc:字符串的 Base64 编码
关于代理服务
Connectors 为每个 Connector 提供代理服务,允许客户端访问目标资源时无需存储原始凭据。详情请参见 connectors-proxy。
配置示例
固定内容
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 }}
{{- range .connectors }}
[url "{{ .status.proxyAddress }}"]
insteadOf = {{.spec.address}}
{{- end }}