«Магический» способ ввести файл на контейнеры POD
Я изначально опубликовал эту статью на Середина
Вы когда-нибудь заметили, что когда вы Создать стручки В Кубернетах контейнеры (обычно) содержат аутентификацию Файл токена Расположен в /var/run/secrets/kubernetes.io/serviceacccount/totoken. ? Вы можете попробовать его, запустив следующую команду в вашем кластере:
$ kubectl run busybox --image=busybox --restart=Never -it --rm -- ls -l /var/run/secrets/kubernetes.io/serviceaccount/token # output /var/run/secrets/kubernetes.io/serviceaccount/token
Сбочная Примечание: вы можете на самом деле отказаться от Такого поведения в версиях Куберанес 1.6 +
Давайте теперь представляем, что мы хотим автоматически добавить волшебство «hello.txt» Файл во все (или группу) файловых систем контейнера POD, без явного присоединения объема для каждого спецификации POD. Как мы можем достичь этого?
Чтобы сделать все более веселыми, мы будем использовать кусок ASCII ART (сгенерировано через этот инструмент ) в качестве нашего файла «hello.txt»:
Наш файл hello.txt
Введите входные окна
Один из способов достижения цели, указанной в последнем абзаце, состоит в том, чтобы использовать входные окна Kubernetes. Но что это? Давайте посмотрим на Официальная документация :
Входные веб-кауки являются HTTP обратных вызовов, которые получают запросы в приему и что-то сделают с ними. Вы можете определить два типа приема WebHooks, подтверждающие приему WebHook и мутационной приема WebHook. WebHooks Mutating Accapsisce снят сначала и может изменять объекты, отправленные на сервер API для обеспечения соблюдения пользовательских по умолчанию
Диаграмма ниже, заимствована из этого Kubernetes.io Blog Post Также может помочь нам понять концепцию:
Фазы контроля вступления
Таким образом, то, как мы добавим Magic «Hello.txt» файл для POD контейнеров в этой статье, продлевая Kubernetes через Мутирующее вход WebHook Так что каждый раз, когда мы отправляем запрос на API для создания POD, SPOD SPED Musced перед сохранением для хранения. Затем, когда Kubelet создает наш стручок на рабочие узлы, он должен быть включен файл «Hello.txt», автоматически Отказ Давай попробуем !
Настройка
Я включил весь код и команды для запуска этого проекта в этом Ги Репозиторий Thub . Вы можете использовать его, чтобы следовать.
Первое, что вам нужно, — это и работает кластер Kubernetes. Вы можете использовать Добрый Например, кластер, который запускает ваши кластерные узлы в контейнерах.
Далее мы определяем Configmap который содержит содержимое файла «hello.txt»:
Чтобы построить веб -ook, мы будем использовать довольно простой сервер GO API. Наиболее важной частью нашего кода реализации WebHook является фактическим HTTP-обработчиком:
Код выше, как много кода Kubernetes, использует типы схемы от https://github.com/kubernetes/api и https://github.com/kubernetes/apimachinery Отказ Какой код на самом деле делает:
- Десертиализация ввода ввода AdmissionReview JSON из HTTP-запроса
- Прочитайте спецификацию POD
- Добавьте громкость «Hello-Volume» на наш POD, используя нашу «Hello-Configmap» в качестве источника
- Установите громкость на контейнеры POD
- Построить JSON PATCH Для мутаций, в том числе объема меняется, объемы изменений, и, как бонус, добавляя дополнительный «ярлык к контейнерам.
- Построить ответ JSON, включая наши запрошенные изменения
Я также включал в себя единицу/функциональный тест для обработчика здесь , чтобы убедиться, что это делает то, что призвано.
Небольшое осложнение: TLS
Наш сервер API WebHook должен служить веб-капусту через TLS, и, как мы хотим развернуть его внутри наших кластеров Kubernetes, нам понадобится несколько. Один из способов, которым я нашел, это через небольшое количество программного обеспечения от Новая реликвия , это может справиться с сертификатом WebHook для нас. Я Разведанные Репо, чтобы иметь возможность сделать пару изменений, и ее можно развернуть в качестве работы:
Больше Ямл
После создания изображения контейнера для сервера API WebHook и нажатием его в контейнерный репозиторий, мы развертываем его к кластеру, используя развертывание
И служба Clusterip:
Тогда мы можем создать нашу MutatingWebhookconfiguration, что регистрирует наш веб -ook с сервером API Kubernetes:
В этом последнем манифесте мы просим Kubernetes отправлять все запросы на создание POD, которые соответствуют метку «в пространстве имен (пространство имен, в котором мы развертываем MutatingWebhookconfiggation) к сервису Hello-WebHook-Service, на пути«/Mutate ». Матч-метка не является обязательным, я просто хотел включить его в этот пример, чтобы у нас есть способ обойти мутирующее окно.
Если вам интересно, почему в разделе «ClientConfig» нет ключа «Cabundle», как указано в документы Это потому, что наша задача WebHook-Cert-Setup, определенная ранее, заботится о автоматической добавляющей этого ключа.
WebHook в действии
Наш проект теперь готов к развертыванию в кластере, с небольшим количеством Makefile и Kustomize Trickery:
$ make k8s-deploy # output kustomize build k8s/other | kubectl apply -f - configmap/hello-configmap created service/hello-webhook-service created mutatingwebhookconfiguration.admissionregistration.k8s.io/hello-webhook.leclouddev.com created kustomize build k8s/csr | kubectl apply -f - serviceaccount/webhook-cert-sa created clusterrole.rbac.authorization.k8s.io/webhook-cert-cluster-role created clusterrolebinding.rbac.authorization.k8s.io/webhook-cert-cluster-role-binding created job.batch/webhook-cert-setup created Waiting for cert creation ... kubectl certificate approve hello-webhook-service.default certificatesigningrequest.certificates.k8s.io/hello-webhook-service.default approved kustomize build k8s/csr | kubectl apply -f - serviceaccount/webhook-cert-sa unchanged clusterrole.rbac.authorization.k8s.io/webhook-cert-cluster-role unchanged clusterrolebinding.rbac.authorization.k8s.io/webhook-cert-cluster-role-binding unchanged job.batch/webhook-cert-setup unchanged Waiting for cert creation ... kubectl certificate approve hello-webhook-service.default certificatesigningrequest.certificates.k8s.io/hello-webhook-service.default approved (cd k8s/deployment && \ kustomize edit set image CONTAINER\_IMAGE=quay.io/didil/hello-webhook:0.1.8) kustomize build k8s/deployment | kubectl apply -f - deployment.apps/hello-webhook-deployment created
Давайте посмотрим, работает ли наш мутирующий веб-канал в этой точке, запустив простую Bitebox Image, в том числе наша целевая этикетка совпадения »:
$ kubectl run busybox-1 --image=busybox --restart=Never -l=app=busybox,hello=true -- sleep 3600
Давайте посмотрим, присутствует ли файл в файловой системе контейнера:
$ kubectl exec busybox-1 -it -- sh -c "ls /etc/config/hello.txt" # output /etc/config/hello.txt
И давайте посмотрим на контент:
$ kubectl exec busybox-1 -it -- sh -c "cat /etc/config/hello.txt"
Файл находится в контейнере POD!
Давайте теперь создадим второй POD без специальной этикетки »:
$ kubectl run busybox-2 --image=busybox --restart=Never -l=app=busybox -- sleep 3600 # output pod/busybox-2 created $ kubectl exec busybox-2 -it -- sh -c "ls /etc/config/hello.txt" # output ls: /etc/config/hello.txt: No such file or directory
Как и ожидалось, файл был добавлен только для контейнера Busybox-1, который соответствовал селектору нашей этикетки веб -ook, но не для BusyBox-2.
Давайте проверь, что наша бонусная этикетка «Hello-добавлена» была добавлена для Busybox-1, но не для Busybox-2:
$ kubectl get pod -l=app=busybox -L=hello-added # output NAME READY STATUS RESTARTS AGE HELLO-ADDED busybox-1 1/1 Running 0 3m7s OK busybox-2 1/1 Running 0 53s
Наш мутирующий веб -ook работает! 🎉🦄. 🎊
Вывод
С мутационным приемом WebHooks мы только что исследовали наш первый способ расширить Куберов. Мы не упомянули проверяющие входные окна, но вы также должны проверить, если вам нужна дополнительная проверка для ваших ресурсов, кроме того, что Openapi схемы позволять.
Я надеюсь, что вы найдете эту статью полезную для ваших путешествий Kubernetes, и, пожалуйста, дайте мне знать, если у вас есть какие-либо вопросы или замечания. И обязательно оставаться настроенными: для следующей статьи мы будем обсуждать еще один способ расширить Kubernetes, как мы пытаемся реализовать Оператор Кубернетика Отказ
Оригинал: «https://dev.to/didil/building-a-kubernetes-mutating-admission-webhook-2ph6»