kubernetes как создать новый модуль из существующего модуля

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

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


person jmhostalet    schedule 30.04.2020    source источник


Ответы (2)


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

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

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

person Arghya Sadhu    schedule 30.04.2020
comment
Вам также может потребоваться изучить привязки ролей, роли и учетные записи служб, чтобы предоставить вашему модулю необходимые разрешения для создания того, что ему нужно (если ваш кластер kubernetes поддерживает RBAC). - person RohanP; 30.04.2020

На мой взгляд, у вас есть 2 варианта:

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

  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