快速开始

本文档将帮助您快速了解如何创建一个 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 的工作原理:

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

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

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

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

深入阅读

成功使用 kubernetes connector 执行 kubectl 操作后,您可以:

参考资料