Kubernetes - как запускать команды kubectl внутри контейнера?

в контейнере внутри стручка, как я могу запустить команду с помощью kubectl? Например, если мне нужно сделать что-то подобное внутри контейнера:

kubectl получить стручки

Я пробовал это : в моем dockerfile у меня есть следующие команды:

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

EDIT: я пытался файл OSX, я исправил его в двоичный файл linux. (исправлено @svenwltr

при создании файла docker это успешно, но когда я запускаю kubectl получить стручки внутри контейнера,

kubectl get pods

Я получаю эту ошибку :

соединение с сервером: было отказано-вы указали правильный хост или порт?

когда я развертывал локально, я столкнулся с этой ошибкой, если моя докер-машина не работала, но внутри контейнера, как может работать докер-машина?

локально, я обойти эту ошибку, выполнив следующие команды: (dev-это имя докер-машины)

docker-machine env dev
eval $(docker-machine env dev)

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

3 ответов


Я бы использовал Kubernetes api, вам просто нужно установить curl, а не kubectl а остальное-отдых.

curl http://localhost:8080/api/v1/namespaces/default/pods

Im работает над командой на одном из моих apiservers. Изменить localhost в to IP-адрес apiserver / dns-имя.

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

чтобы найти конечные точки api, вы можете использовать --v=8 С kubectl.

пример:

kubectl get pods --v=8

ресурсы:

Kubernetes документация по API

обновление для RBAC:

Я предполагаю, что вы уже настроили rbac, создали учетную запись службы для вашего pod и запустите ее. Эта учетная запись службы должна иметь разрешения списка для модулей в требуемом пространстве имен. Для этого необходимо создать роль и привязку роли для этой учетной записи службы.

каждый контейнер в кластере заполняется маркером, который может использоваться для проверки подлинности на сервере API. Чтобы проверить, внутри контейнера выполните:

cat /var/run/secrets/kubernetes.io/serviceaccount/token

, чтобы сделать запрос на apiserver, внутри контейнера выполнить:

curl -ik \
     -H "Authorization: Bearer $(cat /var/run/secrets/kubernetes.io/serviceaccount/token)" \
     https://kubernetes.default.svc.cluster.local/api/v1/namespaces/default/pods

Первый Вопрос

/usr/local/bin/kubectl: cannot execute binary file

похоже, вы загрузили двоичный файл OSX для kubectl. При запуске в Docker вам, вероятно, понадобится Linux:

https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl

Второй Вопрос

если вы запустите kubectl в правильно настроенном кластере Kubernetes он должен иметь возможность подключения к apiserver.

kubectl в основном использует этот код для поиска apiserver и аутентификации: github.com/kubernetes/client-go/rest.InClusterConfig

это значит:

  • хост и порт apiserver хранятся в переменных среды KUBERNETES_SERVICE_HOST и KUBERNETES_SERVICE_PORT.
  • маркер доступа монтируется на var/run/secrets/kubernetes.io/serviceaccount/token.
  • сертификат сервера установлен до /var/run/secrets/kubernetes.io/serviceaccount/ca.crt.

это все данные kubectl необходимо знать, чтобы подключиться к apiserver.

некоторые мысли, почему это может не получится:

  • контейнер не работает в Kubernetes.
    • недостаточно использовать один и тот же хост Docker; контейнер должен выполняться как часть определения pod.
  • доступ ограничен с помощью плагин авторизации (что не является значением по умолчанию).
  • учетные данные учетной записи службы перезаписываются определение pod (spec.serviceAccountName).

немного опоздала на вечеринку здесь, но это мои два цента:

я нашел с помощью kubectl в контейнере намного проще, чем вызов api кластера

(почему? Авто аутентификация!)

скажем, вы развертываете узел.проект JS, которые нужны kubectl использование.

  1. Скачать И Построить kubectl внутри контейнера
  2. создайте приложение, копируя kubectl в контейнер
  3. вуаля! kubectl предоставляет богатый cli для управления кластером kubernetes

полезная документация