Рубрики
Uncategorized

Построение Kubernetes Mutating Accriacy WebHook

«Волшебная» способ ввести файл в контейнеры POD, я изначально опубликовал эту статью о медах … Теги с контейнерами, кубератесами, API, Devops.

«Магический» способ ввести файл на контейнеры 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»