Запустите kubectl внутри dockerimage - PullRequest
0 голосов
/ 14 июля 2020

У меня есть приложение с DockerFile. Этот DockerFile должен запускать сценарий оболочки с командами curl и kubectl.

Я разработал dockerFile как

FROM ubuntu:16.04

WORKDIR /build

RUN apt-get update && apt-get install -y curl && apt-get install -y jq
COPY ./ ./
RUN chmod +x script.sh
ENTRYPOINT ["./script.sh"]

Файл script.sh - это то, что содержит команды curl и команду kubectl. .

Если вы видите, что я установил команду curl внутри контейнера docker с помощью команды RUN apt-get update && apt-get install -y curl

Что мне нужно сделать, чтобы запускать команды kubectl? Потому что, когда я создаю и запускаю изображение выше, появляется сообщение об ошибке: kubectl: command not found.

Может ли кто-нибудь помочь мне с этим?

Ответы [ 2 ]

0 голосов
/ 15 июля 2020

Вместо установки с помощью apt-get вы можете загрузить двоичный файл в любое место и использовать его.

Это даст вам больше контроля и снизит вероятность возникновения проблем в будущем.

Шаги по загрузке его из официального репозитория можно найти в документации .

Установите двоичный файл kubectl с помощью curl на Linux

  1. Загрузите последнюю версию с помощью команды:

    curl -LO https://storage.googleapis.com/kubernetes-release/release/`curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt`/bin/linux/amd64/kubectl
    

    Чтобы загрузить определенную версию c, замените часть команды $(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt) на c версия.

    Например, чтобы загрузить версию v1.18.0 на Linux, введите:

    curl -LO https://storage.googleapis.com/kubernetes-release/release/v1.18.0/bin/linux/amd64/kubectl
    
  2. Сделайте двоичный файл kubectl исполняемым.

    chmod +x ./kubectl
    
  3. Переместите двоичный файл в PATH.

    sudo mv ./kubectl /usr/local/bin/kubectl
    
  4. Убедитесь, что установленная вами версия актуальна:

    kubectl version --client
    

Учитывая это, вы можете иметь Dockerfile, подобный этому:

FROM debian:buster
RUN apt update && \
      apt install -y curl && \
      curl -LO https://storage.googleapis.com/kubernetes-release/release/`curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt`/bin/linux/amd64/kubectl && \
      chmod +x ./kubectl && \
      mv ./kubectl /usr/local/bin/kubectl
CMD kubectl get po

Aft Таким образом, мы можем создать модуль, используя следующий манифест:

apiVersion: v1
kind: Pod
metadata:
  name: internal-kubectl
spec:
  containers:
    - name: internal-kubectl
      image: myrep/internal-kubectl:latest
      command: ['sh', '-c', "kubectl get pod; sleep 36000"]

Запуск этого модуля приведет к ошибке, и это произойдет, потому что у вас нет необходимого RBA C правил создано.

Способ сообщить Kubernetes, что мы хотим, чтобы этот модуль имел идентификатор, который может перечислять модули, - это комбинация нескольких разных ресурсов ... Объект идентификации, который мы хотим назначить нашему модулю, будет учетной записью службы. Но сам по себе не имеет разрешений. Вот здесь и появляются роли.

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: modify-pods
rules:
  - apiGroups: [""]
    resources:
      - pods
    verbs:
      - get
      - list
      - delete

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

apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: modify-pods-to-sa
subjects:
  - kind: ServiceAccount
    name: internal-kubectl
roleRef:
  kind: Role
  name: modify-pods
  apiGroup: rbac.authorization.k8s.io

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

apiVersion: v1
kind: Pod
metadata:
  name: internal-kubectl
spec:
  serviceAccountName: internal-kubectl
  containers:
    - name: internal-kubectl
      image: myrep/internal-kubectl:latest
      command: ['sh', '-c', "kubectl get pod; sleep 36000"]

Указав spe c .serviceAccountName, мы перейдем от учетной записи службы по умолчанию к нашей новой учетной записи с правильными разрешениями. . Запустив наш новый модуль, мы должны увидеть правильный результат…

$ kubectl logs internal-kubectl
NAME               READY   STATUS    RESTARTS   AGE
internal-kubectl   1/1     Running   1          5s
0 голосов
/ 15 июля 2020

Вы можете использовать образ kubectl docker как основу и добавлять свои личные скрипты. Проверьте это здесь .

...