Ephemeral Containers Kubernetes интересная затея для дебага проблем в контейнерах которые кроме исполняемого бинаря не содержат в себе ничего.
Немного информации есть на сайте Kubernetes и несколько примеров можно найти на просторах.
Данная функция эксперементальная, в дебрях описания альф бет версий кубера не разобрался.
Проверялось на Kubernetes v1.16.3
Для того чтобы иметь возможность запустить эфемерный контейнер в поде нужно активировать соответвующие функцию/и через feature-gates.
В общем случае feature-gates это опция с которой должен быть запущен необходимый компонент кубера, ( смотрим в параметрах запущеных процессов через ps ) т.е. один лишь кубелет запущеный с этим параметром скорее всего будет недостаточен, вернее разные фичи требуют активации на соотввующих компонентах кубера.
В зависимости от режима использования кубера, есть следующие варианты
1.
2. разворачиваем кластер добавив в секции
3. На живом кластере
Добавляем в параметры
Чтобы стало похоже на
Рестартуем service kubelet restart
Добавляем в конец списка cmd переменные:
Аналогично правим
После
В namespace kube-system ищем поды содержащие в имени
Удялем эти поды через kubectl delete pod
Они пересоздадутся с параметрами из поправленных файлов.
4. Теоретически есть еще один вариант, но он у меня не заработал
Пробуем подсоединиться к поду-контейнерам.
Небольшой копиаст с сайта кубера.
Делаем ec.json файл в котором example-pod заменяем на имя пода к которому нежно подключится, в image пишем контейнер с отладочными средствами (ubuntu например):
Патчим свойства контенера к которому будем подключаться, не забываем про namespace
Аттачимся и запускаем оболочку в контейнере:
Если сделать «ps auxww» то ничего интересного не получится т.к. нужна поддержка Share Process Namespace.
Немного информации есть на сайте 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.