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 для разворачивания приложений и конфигурирования валидирующих вебхуков.
Создайте файл
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Создайте файл
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#
Разверните контроллер и необходимые ресурсы:
kubectl apply -f deployment.yaml kubectl apply -f webhook.yamlПроверьте успешность развертывания компонентов:
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
Тестирование функциональности контроллера#
Выполните команду
kubectl execдля проверки функциональности контроллера:Запустите nginx-test
kubectl run nginx-test --image=nginxПроверьте функциональность контроллера
kubectl exec nginx-test -- ls /Проверьте наличие новых меток на pod:
kubectl get pod nginx-test --show-labels
В поле вывода появится новая метка времени последнего взаимодействия с pod.
Создание тестового pod и тестирование взаимодействия#
Приведенный пример показывает, как Kube-exec-controller добавляет метаданные и события взаимодействия в pod.
Создайте простой pod Nginx для тестирования:
kubectl run test --image=nginxПроверьте возможность отправки интерактивных команд:
kubectl exec test -- touch new-fileПроверьте метаданные pod и убедитесь, что добавленные изменения присутствуют:
kubectl get pod --show-labelsПроверьте выходную информацию на наличие новых меток:
test 1/1 Running 0 2s box.com/podInitialInteractionTimestamp=1634408037,box.com/podInteractorUsername=dapp-admin,box.com/podTTLDuration=2m0s,run=testПроверьте информацию о 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 сервера Kubernetes |
|
Путь к сертификату TLS |
|
Путь к ключу TLS |
|
Уровень ведения журнала ( |
|
Время жизни pod перед удалением |
Команда kubectl pi#
Утилита для просмотра информации о взаимодействии pod и продления его жизненного цикла:
kubectl pi --help
Основные сценарии использования:
Команды |
Описание |
|---|---|
|
Получение информации обо всех взаимодействиях pod |
|
Продление срока службы 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>