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

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

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

    15 минут

    Требования

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

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

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

    Шаги выполнения

    Шаг 1: Генерация токена ServiceAccount

    Сгенерируйте токен ServiceAccount для k8s-коннектора для выполнения операций.

    1. Создайте ServiceAccount и свяжите с ним clusterrole, который должен иметь необходимые разрешения, соответствующие вашим сценариям использования для k8s-коннектора. Следуйте руководству по Creating a ServiceAccount and binding a clusterrole.
    2. Сгенерируйте токен ServiceAccount для k8s-коннектора. Следуйте руководству по ServiceAccount tokens.

    Шаг 2: Создание Namespace

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

    kubectl create ns k8s-connector-demo

    Шаг 3: Создание учетных данных K8S и коннектора

    Создайте Secret с учетными данными k8s и ресурс kubernetes connector. Для более подробной информации о создании и настройке коннекторов обратитесь к 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

    Проверьте, что коннектор находится в статусе "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

    Шаг 4: Создание Job для выполнения операций Kubectl

    Создайте job, которая использует коннектор для выполнения операций в 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-коннектора
    • configuration.names: установлено в "kubeconfig", что ссылается на конкретный шаблон конфигурации, определённый в kubernetes connectorClass. Этот шаблон используется для генерации файла ".kubeconfig" с соответствующими настройками аутентификации.

    Шаг 5: Проверка работы

    Проверьте логи job, чтобы убедиться, что операции kubectl выполнены успешно:

    kubectl logs -f job/k8s-access -n k8s-connector-demo

    Вы должны увидеть успешное выполнение операций kubectl и список всех pod в кластере без какой-либо секретной конфигурации в job.

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

    kubernetes-коннектор работает следующим образом:

    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 в коннекторе с именем 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. Статус коннектора: убедитесь, что коннектор находится в состоянии "Ready":

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

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

    Дополнительное чтение

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

    References