На мой взгляд, у вас есть 2 варианта:
Как было предложено в предыдущем ответе, с использованием клиентской библиотеки.
Используя шаблон контейнера посланника: контейнеры-посланники проксируют локальное соединение с миром, вы можете прочитать об этом шаблоне подробнее здесь.
Как это решит вашу проблему:
Вместо того, чтобы общаться с сервером API непосредственно из модуля (как если бы вы использовали kubectl
), вы можете запустить kubectl proxy
в контейнере-посланнике вместе с основным контейнером и общаться с сервером API через него.
Вместо того, чтобы напрямую обращаться к серверу API, приложение в основном контейнере может подключаться к послу через HTTP (вместо HTTPS) и позволить прокси-серверу посланника обрабатывать HTTPS-соединение с сервером API, прозрачно заботясь о безопасности. Для этого используются файлы из секретного тома токена по умолчанию (см. Сценарий ниже).
Поскольку все контейнеры в модуле используют один и тот же сетевой интерфейс с обратной связью, ваше приложение может получить доступ к прокси-серверу через порт на локальном хосте.
Как построить такой контейнер?
Dockerfile (использует v1.8):
FROM alpine
RUN apk update && apk add curl && curl -L -O https://dl.k8s.io/v1.8.0/kubernetes-client-linux-amd64.tar.gz && tar zvxf kubernetes-client-linux-amd64.tar.gz kubernetes/client/bin/kubectl && mv kubernetes/client/bin/kubectl / && rm -rf kubernetes && rm -f kubernetes-client-linux-amd64.tar.gz
ADD kubectl-proxy.sh /kubectl-proxy.sh
ENTRYPOINT /kubectl-proxy.sh
Где kubectl-proxy.sh
- это следующий скрипт:
#!/bin/sh
API_SERVER="https://$KUBERNETES_SERVICE_HOST:$KUBERNETES_SERVICE_PORT"
CA_CRT="/var/run/secrets/kubernetes.io/serviceaccount/ca.crt"
TOKEN="$(cat /var/run/secrets/kubernetes.io/serviceaccount/token)"
/kubectl proxy --server="$API_SERVER" --certificate-authority="$CA_CRT" --token="$TOKEN" --accept-paths='^.*'
Все, что вам осталось сделать, это создать этот образ (отправить его в реестр), добавить его в качестве контейнера в модуль приложения и поговорить с ним напрямую через loopback.
По умолчанию прокси kubectl привязывается к порту 8001, и поскольку оба контейнера в модуле используют одни и те же сетевые интерфейсы, включая loopback, вы можете направлять свои запросы на localhost:8001
Благодарим за это книгу Kubernetes в действии (что потрясающе!)
person
omricoco
schedule
30.04.2020