快速开始
本文档将帮助您快速了解如何创建一个 kubernetes connector,以连接到 kubernetes 集群并安全地执行 kubectl
操作,而无需直接处理凭据。
目录
预计阅读时间
15 分钟
前提条件
- 已安装 Connectors 系统(Operator、Core 和 K8S 组件)的 Kubernetes 集群。有关安装这些组件的详细信息,请参见安装指南。
- kubernetes 集群 apiserver 地址和具有列出 kubernetes pod 权限的 bearer token
- 基础的 Kubernetes 知识
流程概览
步骤 | 操作 | 说明 |
---|
1 | 创建 Namespace | 为演示设置专用的命名空间 |
2 | 配置 K8s 凭据和 Connector | 创建认证 secret 和 kubernetes connector 资源 |
3 | 部署 Kubernetes Job 进行测试 | 创建一个通过 connector 执行 kubectl 操作的 job |
4 | 验证结果 | 验证 kubectl 操作成功执行 |
操作步骤
第 1 步:创建 Namespace
为本次演示创建专用命名空间:
kubectl create ns k8s-connector-demo
第 2 步:创建 K8S 凭据和 Connector
创建包含 k8s 凭据的 Secret 和 kubernetes connector 资源。有关创建和配置 connector 的详细信息,请参阅Connectors 快速开始指南。
cat <<EOF | kubectl apply -n k8s-connector-demo -f -
kind: Secret
apiVersion: v1
metadata:
name: k8s-secret
type: connectors.cpaas.io/bearer-token
stringData:
token: eyJhbGciOiJSUzI1NiIxxxxxxxx # 替换为您的 k8s bearer token
---
apiVersion: connectors.alauda.io/v1alpha1
kind: Connector
metadata:
name: k8s-connector
spec:
connectorClassName: k8s
address: https://192.168.1.100:6443 # 替换为您的 k8s apiserver 地址
auth:
name: bearerTokenAuth
secretRef:
name: k8s-secret
EOF
确认 connector 处于“Ready”状态:
kubectl get connector k8s-connector -n k8s-connector-demo
输出应显示:
NAME CLASS ADDRESS READY AGE
k8s-connector k8s https://192.168.1.100:6443 True 1m
第 3 步:创建执行 Kubectl 操作的 Job
创建一个使用 connector 执行 k8s 操作的 job:
cat <<EOF | kubectl apply -n k8s-connector-demo -f -
apiVersion: batch/v1
kind: Job
metadata:
name: k8s-access
spec:
template:
spec:
restartPolicy: Never
containers:
- name: kubectl
image: bitnami/kubectl:1.30.1 # 替换为包含 kubectl 的镜像
imagePullPolicy: IfNotPresent
env:
- name: KUBECONFIG
value: /opt/kube/kubeconfig
command:
- "kubectl"
args: [ "get", "pods", "-v=5", "--all-namespaces" ] # 替换为您的 kubectl 操作
volumeMounts:
- name: kubeconfig
mountPath: /opt/kube
volumes:
- name: kubeconfig
csi:
readOnly: true
driver: connectors-csi
volumeAttributes:
connector.name: "k8s-connector"
configuration.names: "kubeconfig"
EOF
volumeAttributes 中的关键参数:
connector.name
:您的 kubernetes connector 名称
configuration.names
:设置为 "kubeconfig",引用 kubernetes connectorClass 中定义的特定配置模板。该模板用于生成带有适当认证设置的 ".kubeconfig" 文件。
第 4 步:验证操作
查看 job 日志,确认 kubectl 操作成功执行:
kubectl logs -f job/k8s-access -n k8s-connector-demo
您应看到 kubectl 操作成功完成,并列出集群中所有 pod,且 job 中没有任何 secret 配置。
底层原理
kubernetes connector 的工作原理:
- 创建一个代理服务,位于您的工作负载和目标 k8s 集群之间
- 请求通过代理时注入认证信息
- 为客户端提供
kubeconfig
文件,通过代理执行 kubectl 操作
为演示此机制,我们查看生成的 kubeconfig 文件:
cat <<EOF | kubectl apply -n k8s-connector-demo -f -
apiVersion: v1
kind: Pod
metadata:
name: inspect-k8s-access
spec:
restartPolicy: Never
containers:
- name: kubectl
image: bitnami/kubectl:1.30.1 # 替换为包含 kubectl 的镜像
command: ["sleep", "3600"]
env:
- name: KUBECONFIG
value: /opt/kube/kubeconfig
volumeMounts:
- name: kubeconfig
mountPath: /opt/kube
volumes:
- name: kubeconfig
csi:
readOnly: true
driver: connectors-csi
volumeAttributes:
connector.name: "k8s-connector"
configuration.names: "kubeconfig"
EOF
查看生成的 kubeconfig
文件:
kubectl exec -it inspect-k8s-access -n k8s-connector-demo -- cat /opt/kube/kubeconfig
示例输出:
apiVersion: v1
kind: Config
clusters:
- name: k8s
cluster:
server: https://192.168.1.100:6443
proxy-url: http://k8s-connector-demo%2Fk8s-connector:eyJhbGcxxxx@c-k8s-connector.k8s-connector-demo.svc.cluster.local
certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0xxxxxQo=
contexts:
- name: k8s
context:
cluster: k8s
user: k8s
users:
- name: k8s
user:
token: fake-token
current-context: k8s
关键观察点
server
字段与 Connector 中指定的 Kubernetes API 服务器地址一致
- 额外的代理相关字段启用基于代理的认证,如
cluster.proxy-url
和 cluster.certificate-authority-data
kubeconfig
文件不包含原始 bearer token,通过 Connectors CSI Driver 挂载到 Pod
代理配置字段
-
cluster.proxy-url
:来自名为 k8s-connector
的 connector 的 status.proxy.httpAddress
字段的代理地址:
kubectl get connector k8s-connector -n k8s-connector-demo -o yaml
输出示例:
apiVersion: connectors.alauda.io/v1alpha1
kind: Connector
metadata:
name: k8s-connector
namespace: k8s-connector-demo
spec:
# ...
status:
# ...
proxy:
httpAddress:
url: http://c-k8s-connector.k8s-connector-demo.svc.cluster.local
cluster.proxy-url
包含代理认证信息:
- 用户名:格式为
<connector-namespace>/<connector-name>
,即 connector 的命名空间和名称
- 密码:connector 自动生成的临时 ServiceAccount token(30 分钟后过期)(非原始 k8s 集群 token)
-
cluster.certificate-authority-data
:代理服务器 TLS 验证的 CA 证书数据,客户端应信任代理服务器证书。
认证流程
inspect-k8s-access
pod 不包含原始集群 token。当 kubectl 向 Kubernetes API 服务器发起 HTTPS 请求时,代理服务器拦截请求,从 k8s-connector
注入认证凭据,并将认证后的请求转发给后端 API 服务器。
Kubeconfig 卷
kubeconfig
文件通过 Connectors CSI Driver 挂载到 Pod。
volumes:
- name: kubeconfig
csi:
readOnly: true
driver: connectors-csi
volumeAttributes:
connector.name: "k8s-connector"
configuration.names: "kubeconfig"
有关卷参数,请参阅 Kubernetes Connector Concepts 文档中的使用 Connectors CSI Driver 挂载 kubeconfig 文件。
故障排查
如果您的 kubectl 操作失败,请检查以下内容:
-
Connector 状态:确保 connector 处于“Ready”状态:
kubectl describe connector k8s-connector -n k8s-connector-demo
-
验证 connectors 部署状态:确保所有组件均已部署且处于“Ready”状态
kubectl get pods -n <connector-component-namespace>
深入阅读
成功使用 kubernetes connector 执行 kubectl 操作后,您可以:
参考资料