Вместо установки с помощью apt-get вы можете загрузить двоичный файл в любое место и использовать его.
Это даст вам больше контроля и снизит вероятность возникновения проблем в будущем.
Шаги по загрузке его из официального репозитория можно найти в документации .
Установите двоичный файл kubectl с помощью curl на Linux
Загрузите последнюю версию с помощью команды:
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
Сделайте двоичный файл kubectl исполняемым.
chmod +x ./kubectl
Переместите двоичный файл в PATH.
sudo mv ./kubectl /usr/local/bin/kubectl
Убедитесь, что установленная вами версия актуальна:
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