• Русский
  • Быстрый старт

    Этот документ поможет вам быстро понять, как создать kubernetes connector для подключения к кластеру Kubernetes и безопасного выполнения операций kubectl без прямой работы с учетными данными.

    Оценочное время чтения

    15 минут

    Требования

    • Кластер Kubernetes с установленной системой Connectors (Operator, Core и компоненты K8S). Подробности об установке этих компонентов смотрите в Installation Guide.
    • Адрес apiserver кластера Kubernetes и bearer token с разрешением на просмотр списка pod в Kubernetes
    • Базовые знания Kubernetes

    Обзор процесса

    ШагОперацияОписание
    1Создать NamespaceСоздать выделенный namespace для демонстрации
    2Настроить K8s учетные данные и ConnectorСоздать секрет для аутентификации и ресурс kubernetes connector
    3Запустить Kubernetes Job для тестированияСоздать job, выполняющий операции kubectl через connector
    4Проверить результатыПроверить успешное выполнение операций kubectl

    Пошаговые действия

    Шаг 1: Создать Namespace

    Создайте выделенный namespace для этой демонстрации:

    kubectl create ns k8s-connector-demo

    Шаг 2: Создать K8S учетные данные и Connector

    Создайте Secret с учетными данными k8s и ресурс kubernetes connector. Более подробную информацию о создании и настройке connectors смотрите в Connectors Quick Start Guide.

    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: Создать Job для выполнения операций Kubectl

    Создайте job, который использует connector для выполнения операций k8s:

    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.

    Что происходит под капотом

    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 совпадает с адресом Kubernetes API сервера, указанным в Connector
    • Дополнительные поля, связанные с прокси, обеспечивают аутентификацию через прокси, например cluster.proxy-url и cluster.certificate-authority-data
    • Файл kubeconfig не содержит оригинальных bearer токенов и монтируется в Pod через Connectors CSI Driver

    Поля конфигурации прокси

    • cluster.proxy-url: адрес прокси-коннектора из поля status.proxy.httpAddress в connector с именем k8s-connector:

      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 содержит информацию для аутентификации прокси:

      • username: в формате <connector-namespace>/<connector-name>, namespace и имя коннектора
      • password: временный ServiceAccount токен, автоматически сгенерированный коннектором (истекает через 30 минут) (не оригинальный токен кластера k8s)
    • cluster.certificate-authority-data: данные сертификата CA для проверки TLS прокси-сервера, клиент должен доверять сертификату прокси-сервера.

    Поток аутентификации

    Pod inspect-k8s-access не содержит оригинальных токенов кластера. Когда kubectl выполняет HTTPS-запросы к Kubernetes API серверу, прокси-сервер перехватывает эти запросы, внедряет учетные данные из k8s-connector и пересылает аутентифицированные запросы на backend API сервер.

    Точка монтирования kubeconfig

    Файл kubeconfig монтируется в Pod через Connectors CSI Driver.

      volumes:
      - name: kubeconfig
        csi:
          readOnly: true
          driver: connectors-csi
          volumeAttributes:
            connector.name: "k8s-connector"
            configuration.names: "kubeconfig"

    Параметры томов смотрите в разделе Using Connectors CSI Driver to mount kubeconfig file в документе Kubernetes Connector Concepts.

    Устранение неполадок

    Если операция kubectl не удалась, проверьте следующее:

    1. Статус Connector: убедитесь, что connector в состоянии "Ready":

      kubectl describe connector k8s-connector -n k8s-connector-demo
    2. Проверьте статус развертывания connectors: убедитесь, что все компоненты развернуты и находятся в состоянии "Ready"

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

    Дополнительные материалы

    После успешного выполнения операций kubectl с помощью kubernetes connector вы можете:

    References