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
использование.
- Скачать И Построить
kubectl
внутри контейнера - создайте приложение, копируя
kubectl
в контейнер -
вуаля!
kubectl
предоставляет богатый cli для управления кластером kubernetes