Ephemeral Containers Kubernetes первые шаги

от автора

Ephemeral Containers Kubernetes интересная затея для дебага проблем в контейнерах которые кроме исполняемого бинаря не содержат в себе ничего.

Немного информации есть на сайте Kubernetes и несколько примеров можно найти на просторах.

Данная функция эксперементальная, в дебрях описания альф бет версий кубера не разобрался.
Проверялось на Kubernetes v1.16.3

Для того чтобы иметь возможность запустить эфемерный контейнер в поде нужно активировать соответвующие функцию/и через feature-gates.

В общем случае feature-gates это опция с которой должен быть запущен необходимый компонент кубера, ( смотрим в параметрах запущеных процессов через ps ) т.е. один лишь кубелет запущеный с этим параметром скорее всего будет недостаточен, вернее разные фичи требуют активации на соотввующих компонентах кубера.

В зависимости от режима использования кубера, есть следующие варианты

1.

minikube start --feature-gates="EphemeralContainers=true"

2. разворачиваем кластер добавив в секции

apiVersion: kubeadm.k8s.io/v1beta2     kind: InitConfiguration     localAPIEndpoint: {}     nodeRegistration:       kubeletExtraArgs:         "feature-gates": "EphemeralContainers=true" --- apiVersion: kubeadm.k8s.io/v1beta2     kind: ClusterConfiguration     apiServer:       extraArgs:         "feature-gates": "EphemeralContainers=true"     scheduler:       extraArgs:         "feature-gates": "EphemeralContainers=true"     controllerManager:       extraArgs:         "feature-gates": "EphemeralContainers=true" 

3. На живом кластере

/var/lib/kubelet/kubeadm-flags.env

Добавляем в параметры

--feature-gates=EphemeralContainers=true

Чтобы стало похоже на

KUBELET_KUBEADM_ARGS="--cgroup-driver=cgroupfs --feature-gates=EphemeralContainers=true --network-plugin=cni --pod-infra-container-image=k8s.gcr.io/pause:3.1" 

Рестартуем service kubelet restart

/etc/kubernetes/manifests/kube-apiserver.yaml

Добавляем в конец списка cmd переменные:

spec:   containers:   - command:     - --feature-gates=EphemeralContainers=true 

Аналогично правим

kube-scheduler.yaml     kube-controller-manager.yaml

После

kubectl get pods -A

В namespace kube-system ищем поды содержащие в имени

kube-apiserver kube-scheduler    kube-controller-manager

Удялем эти поды через kubectl delete pod
Они пересоздадутся с параметрами из поправленных файлов.

4. Теоретически есть еще один вариант, но он у меня не заработал

kubeadm upgrade plan  --feature-gates EphemeralContainers=true

Пробуем подсоединиться к поду-контейнерам.

Небольшой копиаст с сайта кубера.

Делаем ec.json файл в котором example-pod заменяем на имя пода к которому нежно подключится, в image пишем контейнер с отладочными средствами (ubuntu например):

{     "apiVersion": "v1",     "kind": "EphemeralContainers",     "metadata": {             "name": "example-pod"     },     "ephemeralContainers": [{         "command": [             "sh"         ],         "image": "busybox",         "imagePullPolicy": "IfNotPresent",         "name": "debugger",         "stdin": true,         "tty": true,         "terminationMessagePolicy": "File"     }] } 

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

kubectl replace --raw /api/v1/namespaces/<b>default</b>/pods/<b>example-pod</b>/ephemeralcontainers  -f ec.json 

Аттачимся и запускаем оболочку в контейнере:

kubectl attach -it example-pod -c debugger

Если сделать «ps auxww» то ничего интересного не получится т.к. нужна поддержка Share Process Namespace.


ссылка на оригинал статьи https://habr.com/ru/post/479304/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *