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.

Комментарии (0)