Как работать с кластером k8s в контейнере docker - PullRequest
0 голосов
/ 04 мая 2020

Как контейнер docker running on a docker machine instead of a k8s pod управляет кластером k8s. Например, если мне нужно сделать что-то подобное внутри контейнера:

kubectl get pods

В моем dockerfile я установил kubectl

RUN curl -LO https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl
RUN chmod +x ./kubectl
RUN sudo mv ./kubectl /usr/local/bin/kubectl

когда я запускаю kubectl get pods, результат выглядит следующим образом:

kubectl get pod
error: no configuration has been provided, try setting KUBERNETES_MASTER environment variable

Поэтому я смонтировал config в контейнер docker по команде docker run

docker run -v /root/.kube/config:/root/.kube/config my-images

результат выглядит следующим образом:

kubectl get pod
Error in configuration: 
* unable to read client-cert /root/.minikube/profiles/minikube/client.crt for minikube due to open /root/.minikube/profiles/minikube/client.crt: no such file or directory
* unable to read client-key /root/.minikube/profiles/minikube/client.key for minikube due to open /root/.minikube/profiles/minikube/client.key: no such file or directory
* unable to read certificate-authority /root/.minikube/ca.crt for minikube due to open /root/.minikube/ca.crt: no such file or directory

Кажется, это связано с current-context: minikube в файле конфигурации k8s

Затем снова смонтируйте файл аутентификации, он запустится успешно.

Теперь я могу вызывать команду kubectl get pods или otherwise манипулировать кластером вне контейнера, когда я монтирую -v /root/.kube/config:/root/.kube/config -v /root/.minikube/:/root/.minikube/, однако, это не относится к монтируемым кластерам , созданным kubeadm or otherwise.

Но я хочу иметь возможность монтировать необходимые файлы конфигурации и так далее в контейнер единообразным образом , чтобы я мог использовать та же команда для управления кластером k8s, которая может быть создана с помощью minikube или rancher k3s или kubeadm

В итоге, Я хочу смонтировать единый набор файлов или каталогов для всех случаев кластера k8s, таких как -v file: file -v dir:dir, , для реализации операций на кластере k8s , созданном в любом способ , такой как получение статуса модуля, создание, удаление различных типов ресурсов и т. д.

Мне нужно иметь максимальное разрешение для работы на k8s

Может кто-нибудь сказать мне, что мне нужно делать?

1 Ответ

0 голосов
/ 08 мая 2020

Я думаю, что вы можете установить Docker пользователя при запуске вашего контейнера

Вы можете запустить (в этом примере - образ Ubuntu) с явным идентификатором пользователя и идентификатором группы.

$ docker run -it --rm \
  --mount "type=bind,src=$(pwd)/shared,dst=/opt/shared" \
  --workdir /opt/shared \
  --user "$(id -u):$(id -g)" \
  ubuntu bash

Разница в '–user “$ (id -u): $ (id -g)« »- они сообщают контейнеру, что он должен работать с текущим идентификатором пользователя и идентификатором группы, которые динамически получаются путем подстановки команды bash запустить «id -u» и «id -g» и передать их значения.

Это может быть уже достаточно хорошо. Проблема в том, что пользователь и группа на самом деле не существуют в контейнере. Этот подход работает для команды терминала, но сеанс выглядит прерванным, и вы увидите несколько уродливых сообщений об ошибках, таких как:

"groups: cannot find name for group ID"
"I have no name!"
  - your container, complaining

Пока работает bash, некоторые приложения могут отказаться от запуска, если эти конфиги выглядят подозрительно .

Далее вам нужно правильно настроить и запустить контейнеры Docker, чтобы вам не приходилось бороться с ошибками прав доступа и легко получать доступ к вашим файлам.

Поскольку вы должны создавать не root Пользователь в вашем Dockerfile в любом случае, это хорошая вещь. Вы также можете явно указать идентификатор пользователя и идентификатор группы.

Ниже приведен минимальный Dockerfile, который ожидает получения аргументов во время сборки и создает нового пользователя с именем «user»:

FROM ubuntu

ARG USER_ID
ARG GROUP_ID

RUN addgroup --gid $GROUP_ID user
RUN adduser --disabled-password --gecos '' --uid $USER_ID --gid $GROUP_ID user
USER user

Взгляните: add-user-to-container .

Вы можете использовать этот Dockerfile для создания образа fre sh с использованием uid и gid хоста. Этот образ должен быть создан специально для каждой машины, на которой он будет работать, чтобы убедиться, что все в порядке.

Затем вы можете запустить использовать этот образ для нашей команды. Идентификатор пользователя и идентификатор группы являются правильными без необходимости их указания при запуске контейнера.

$ docker build -t your-image \
  --build-arg USER_ID=$(id -u) \
  --build-arg GROUP_ID=$(id -g) .
$ docker run -it --rm \
  --mount "type=bind,src=$(pwd)/shared,dst=/opt/shared" \
  --workdir /opt/shared \
  your-image bash

Нет необходимости использовать «chown», и вы избавитесь от назойливых ошибок прав доступа. Пожалуйста, взгляните на эту очень интересную статью: kubernetes-management- docker, docker -shared-permissions .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...