kubernetes, как создать новый модуль из существующего модуля - PullRequest
0 голосов
/ 30 апреля 2020

У меня есть следующее сомнение, скажем, у меня есть модуль A kubernetes с n = 1 репликами, и я хочу, чтобы каждые x минут он создавал новый модуль B типа "Job", я могу создать модуль рабочих мест из kubectl без проблем, но как я могу создать экземпляр модуля из другого модуля?

Я мог бы попытаться использовать kubectl на родительском модуле, но я не думаю, что это самый элегантный способ сделать это.

Ответы [ 2 ]

2 голосов
/ 30 апреля 2020

В модуле вы можете использовать любую поддерживаемую клиентскую библиотеку kubernetes для вызова REST API, предоставляемого сервером API kubernetes, для создания модуля.

Клиентская библиотека должна пройти проверку подлинности, чтобы вызвать API kubernetes. Учетная запись службы может использоваться клиентской библиотекой для этого, а учетная запись службы должна иметь RBA C, чтобы иметь возможность создавать модуль, вызывая сервер API kubernetes.

Внутренне kubectl также вызывает REST API, предоставляемый сервером API kubernetes, когда kubectl используется для создания модуля.

0 голосов
/ 30 апреля 2020

По моему мнению, у вас есть 2 варианта здесь:

  1. Как предложено в предыдущем ответе, с использованием клиентской библиотеки.

  2. Использование посла шаблон контейнера: посольские контейнеры прокси локальное соединение с миром, вы можете прочитать об этом шаблоне подробнее здесь .

Как это решит вашу проблему:

Вместо того, чтобы разговаривать с сервером API напрямую из вашего модуля (как вы бы использовали kubectl), вы можете запустить kubectl proxy в контейнере посла после основного контейнера и обмениваться данными с сервером API через it.

Вместо того, чтобы напрямую общаться с сервером 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='^.*'

Все, что вам остается сделать - это создать этот образ (pu sh в реестре), добавить его в качестве контейнера в модуль приложения и напрямую общаться с ним через обратную связь.

По умолчанию прокси-сервер kubectl связывается с портом 8001, и поскольку оба контейнера в модуле используют одни и те же сетевые интерфейсы, включая обратную связь, вы можете указать свои запросы на localhost:8001

Кредит для этого идет к Kubernetes в действии книга (что удивительно!)

...