Kube-exec-controller#

Kube-exec-controller — это компонент DropApp, предназначенный для обработки и предотвращения случаев контейнерного дрейфа (container drift) в кластере. Контейнерный дрейф возникает, когда состояние контейнера отличается от исходного образа, вследствие выполнения команд, таких как kubectl exec, attach, cp и других интерактивных запросов. Kube-exec-controller запускается как Deployment и может использоваться в конфигурации ValidatingWebhookConfiguration для отслеживания и удаления взаимодействующих pod через заданный интервал.

Применение Kube-exec-controller в DropApp c локальным реестром образов#

Если кластер DropApp развернут локально и не имеет доступа в Интернет, настройте загрузку образов из существующего локального реестра при развертывании Kube-exec-controller.

Предварительные условия#

Перед началом развертывания убедитесь, что выполнены следующие условия:

  • локальный реестр доступен в сети кластера DropApp;

  • образ Kube-exec-controller находится в реестре;

  • известен полный путь к образу в реестре (например, <local_registry_name>/kube-exec-controller:v1.0).

Сценарии развертывания Kube-exec-controller#

Развертывание приложения и конфигурации#

Подготовьте манифесты YAML для разворачивания приложений и конфигурирования валидирующих вебхуков.

  1. Создайте файл deployment.yaml следующего содержания:

    deployment.yaml
     apiVersion: apps/v1
     kind: Deployment
     metadata:
       name: kube-exec-controller
     spec:
       replicas: 1
       selector:
         matchLabels:
           app: kube-exec-controller
       template:
         metadata:
           labels:
             app: kube-exec-controller
         spec:
           containers:
             - name: kube-exec-controller
               image: <local_registry_name>/kube-exec-controller:v1.0 # Замените на адрес своего реестра
               ports:
                 - containerPort: 8443
               env:
                 - name: LOG_LEVEL
                   value: "info"
               args:
                 - "--log-level=$LOG_LEVEL"
               volumeMounts:
                 - mountPath: /certs
                   name: cert-volume
           volumes:
             - name: cert-volume
               secret:
                 secretName: kube-exec-controller-secret
    
     ---
    
     apiVersion: v1
     kind: Service
     metadata:
       name: kube-exec-controller
       namespace: kube-system
     spec:
       selector:
         app: kube-exec-controller
       ports:
         - protocol: TCP
           port: 443
           targetPort: 8443
       type: ClusterIP
    
  2. Создайте файл webhook.yaml следующего содержания:

    apiVersion: admissionregistration.k8s.io/v1
    kind: ValidatingWebhookConfiguration
    metadata:
      name: kube-exec-controller-webhook
    webhooks:
    - name: validate.pod.box.com
      rules:
      - operations: ["CREATE"]
        apiGroups: [""]
        apiVersions: ["v1"]
        resources: ["pods"]
      clientConfig:
        caBundle: $(CA_BUNDLE_BASE64_ENCODED)
        service:
          name: kube-exec-controller
          namespace: kube-system
          path: "/validate-pod"
    

Замените переменную $(CA_BUNDLE_BASE64_ENCODED) базовым значением соответствующего сертификата. Это значение должно быть получено заранее и закодировано в base64.

Загрузка образа в локальный реестр#

Убедитесь, что образ Kube-exec-controller загружен в локальный реестр. Используйте следующие команды, если образ отсутствует:

docker pull <local_registry_name>.local/kube-exec-controller:v1.0
docker tag <local_registry_name>.local/kube-exec-controller:v1.0 <local_registry_name>/kube-exec-controller:v1.0
docker push <local_registry_name> .local/kube-exec-controller:v1.0

Установка Kube-exec-controller#

  1. Разверните контроллер и необходимые ресурсы:

    kubectl apply -f deployment.yaml
    kubectl apply -f webhook.yaml
    
  2. Проверьте успешность развертывания компонентов:

    kubectl get deployment,pods,services -n kube-system
    

    Пример вывода:

    NAME                           READY   UP-TO-DATE   AVAILABLE   AGE
    deployment.apps/kube-exec-controller   1/1         1            1           1m
    
    NAME                                    READY   STATUS    RESTARTS   AGE
    pod/kube-exec-controller-6ffdd6dcdf-wlqvm   1/1     Running   0          1m
    
    NAME                             TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
    service/kubernetes               ClusterIP   00.00.0.1       <none>        443/TCP   10m
    service/kube-exec-controller     ClusterIP   None            <none>        8443/TCP  1m
    

Тестирование функциональности контроллера#

  1. Выполните команду kubectl exec для проверки функциональности контроллера:

    • Запустите nginx-test

    kubectl run nginx-test --image=nginx
    
    • Проверьте функциональность контроллера

    kubectl exec nginx-test -- ls /
    
  2. Проверьте наличие новых меток на pod:

kubectl get pod nginx-test --show-labels

В поле вывода появится новая метка времени последнего взаимодействия с pod.

Создание тестового pod и тестирование взаимодействия#

Приведенный пример показывает, как Kube-exec-controller добавляет метаданные и события взаимодействия в pod.

  1. Создайте простой pod Nginx для тестирования:

    kubectl run test --image=nginx
    
  2. Проверьте возможность отправки интерактивных команд:

    kubectl exec test -- touch new-file
    
  3. Проверьте метаданные pod и убедитесь, что добавленные изменения присутствуют:

    kubectl get pod --show-labels
    
  4. Проверьте выходную информацию на наличие новых меток:

    test 1/1 Running 0 2s box.com/podInitialInteractionTimestamp=1634408037,box.com/podInteractorUsername=dapp-admin,box.com/podTTLDuration=2m0s,run=test
    
  5. Проверьте информацию о pod с именем test командой:

    kubectl describe pod test
    

Использование утилиты kubectl pi#

Команда kubectl pi, выводит сведения о взаимодействиях с pods и продлевает срок службы pods перед их удалением.

  • Для получения информации о взаимодействии с pod используйте команду:

    kubectl pi get
    

    Пример вывода:

    POD-NAME            INTERACTOR              POD-TTL   EXTENSION   EXTENSION-REQUESTER   EVICTION-TIME
    test                dapp-admin              2m0s                      2021-10-16T18:06:44Z
    
  • Для продления срока службы pod используйте команду:

    kubectl pi extend --duration=1m
    

    Примечание

    Срок службы pod продлевается заданием необходимого временного интервала путем изменения значения параметра --duration, где 1m - это 1 минута.

    Пример сообщения об успешном продлении срока службы pod:

    Successfully extended the termination time of pod/test with a duration=1m
    

    После повторного запроса информации командой kubectl pi get вывод изменится соответствующим образом.

Команды для управления Kube-exec-controller#

Запуск Kube-exec-controller#

Команда запуска сервиса с возможностью настройки различных параметров:

kube-exec-controller --help

Примеры параметров:

Параметр

Описание

-api-server

Адрес API сервера Kubernetes

-cert-path

Путь к сертификату TLS

-key-path

Путь к ключу TLS

-log-level

Уровень ведения журнала (debug, info, warn, error)

-ttl-seconds

Время жизни pod перед удалением

Команда kubectl pi#

Утилита для просмотра информации о взаимодействии pod и продления его жизненного цикла:

kubectl pi --help

Основные сценарии использования:

Команды

Описание

kubectl pi get

Получение информации обо всех взаимодействиях pod

kubectl pi extend

Продление срока службы pod

Примеры использования:

  • Для просмотра информации о конкретном pod введите:

    kubectl pi get <pod-name> -n <namespace>
    

    Где:

    • <pod-name> – имя нужного pod;

    • <namespace> – название namespace.

  • Продлить срок жизни pod на 1 минуту

    kubectl pi extend --duration=1m <pod-name> -n <namespace>