2015-06-07 6 views
53

Я использовал, чтобы быть в состоянии скручиватьсяКак получить доступ к Kubernetes api из контейнера для контейнеров?

https://$KUBERNETES_SERVICE_HOST:$KUBERNETES_PORT_443_TCP_PORT/api/v1beta3/namespaces/default/ 

как мой базовый URL, но в kubernetes 0.18.0 это дает мне «несанкционированный». Странно, что если бы я использовал внешний IP-адрес машины API (http://172.17.8.101:8080/api/v1beta3/namespaces/default/), он работает нормально.

+0

Где вы работаете кластер (GCE, AWS, и т.д.) и с помощью какой базовой операционной системы (Debian, CoreOS и т.д.)? –

+0

Vagrant/CoreOS ... я в конечном итоге переместю его в AWS/CoreOS – tslater

+0

Откуда берутся переменные '$ KUBERNETES_SERVICE_HOST' и' $ KUBERNETES_PORT_443_TCP_PORT'? – ruediste

ответ

58

В официальной документации я нашел это:

https://kubernetes.io/docs/tasks/administer-cluster/access-cluster-api/#accessing-the-api-from-a-pod

Видимо, я отсутствовал маркер безопасности, что я не нуждался в предыдущей версии Kubernetes. Из этого я разработал то, что, по моему мнению, является более простым решением, чем запуск прокси-сервера или установка golang на моем контейнере. Смотрите этот пример, который получает информацию, от апи, для текущего контейнера:

KUBE_TOKEN=$(</var/run/secrets/kubernetes.io/serviceaccount/token) 
curl -sSk -H "Authorization: Bearer $KUBE_TOKEN" \ 
     https://$KUBERNETES_SERVICE_HOST:$KUBERNETES_PORT_443_TCP_PORT/api/v1/namespaces/default/pods/$HOSTNAME 

Я также использую включают простой двоичный, JQ (http://stedolan.github.io/jq/download/), для разбора JSON для использования в Баш сценариев.

+5

Для недавно развернутых кластеров вам может потребоваться изменить 'v1beta3' на' v1' –

+4

Обратите внимание, что эта команда curl будет подсоединяться * небезопасно * к apersver (позволяя человеку-в-середине перехватить токен-носитель) , поэтому вы должны использовать его только в том случае, если сеть между контейнером и аппликатором полностью доверена. В противном случае вы должны передать флаг '--cacert' для завивки, чтобы завиток подтвердил сертификат, предоставленный apirusver. –

+0

Мне пришлось использовать 'KUBERNETES_SERVICE_HOST = kubernetes.default',' $ KUBERNETES_443_TCP_PORT = 443', NAMESPACE == $ ( ruediste

39

В каждом модуле автоматически применяется учетная запись службы, которая позволяет ей получить доступ к приятелю. Учетная запись службы предоставляет как учетные данные клиента, так и маркер-носитель, а также сертификат центра сертификации, который использовался для подписания сертификата, представленного айперсером. С этими двумя частями информации, вы можете создать безопасный, проверенное подключение к apisever без использования curl -k (ака curl --insecure):

curl -v --cacert /var/run/secrets/kubernetes.io/serviceaccount/ca.crt -H "Authorization: Bearer $(cat /var/run/secrets/kubernetes.io/serviceaccount/token)" https://kubernetes/ 
+2

Следует отметить, что для того, чтобы оба катетера и токена существовали в учетной записи службы, при запуске репликатор-контроллер должен иметь аргумент '--root-ca-file ='. (это выполняется автоматически в большинстве инсталляторов kubernetes). См. Обсуждение здесь для получения дополнительной информации: https://github.com/kubernetes/kubernetes/issues/10265 – JKnight

+3

Я получал доступ к серверу API из контейнера с другим пространством имен. Таким образом, мне пришлось использовать 'https: // kubernetes.default /' как хост – ruediste

0
curl -v -cacert <path to>/ca.crt --cert <path to>/kubernetes-node.crt --key <path to>/kubernetes-node.key https://<ip:port> 

Моя K8S версия 1.2.0, и в других версиях, как предполагается работать тоже^^

+0

Вышеприведенное правильно, если у вас есть веб-хосты или какой-либо другой RBAC. Это особенно верно> 1.2 k8s –

1

Ибо кто использует Google Container Engine (питание от Kubernetes):

простой вызов https://kubernetes внутри кластера с использованием this kubernetes client for Java работ.

2

Изнутри контейнера сервер kubernetes api можно получить непосредственно на «https://kubernetes.default». По умолчанию для доступа к серверу api используется «учетная запись службы по умолчанию».

Таким образом, нам также необходимо передать «ca cert» и «токен учетной записи службы по умолчанию» для аутентификации с помощью сервера api.

файл сертификата хранится в следующем расположении внутри стручка: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt

и маркер учетной записи службы по умолчанию на: /вар/бега /secrets/kubernetes.io/serviceaccount/token

Вы можете использовать nodejs kubbernetes godaddy client.

let getRequestInfo =() => { 
 
    return { 
 
     url: "https://kubernetes.default", 
 
     ca: fs.readFileSync('/var/run/secrets/kubernetes.io/serviceaccount/ca.crt').toString(), 
 
     auth: { 
 
      bearer: fs.readFileSync('/var/run/secrets/kubernetes.io/serviceaccount/token').toString(), 
 
     }, 
 
     timeout: 1500 
 
    }; 
 
} 
 

 
let initK8objs =() =>{ 
 
    k8obj = getRequestInfo(); 
 
    k8score = new Api.Core(k8obj), 
 
    k8s = new Api.Api(k8obj); 
 
}

4

Использование клиента в Python kubernetes ..

from kubernetes import client, config 

config.load_incluster_config() 
v1_core = client.CoreV1Api() 
+0

Спасибо! Вот небольшой [repo] (https://github.com/omerlh/pod_kube_api_demo) пример, основанный на вашем ответе, чтобы упростить игру с помощью этого кода. –

1

Wget версия:

KUBE_TOKEN=$(</var/run/secrets/kubernetes.io/serviceaccount/token)  
wget -vO- --ca-certificate /var/run/secrets/kubernetes.io/serviceaccount/ca.crt --header "Authorization: Bearer $KUBE_TOKEN" https://$KUBERNETES_SERVICE_HOST:$KUBERNETES_PORT_443_TCP_PORT/api/v1/namespaces/default/pods/$HOSTNAME 
-1

С RBAC включена, учетная запись службы по умолчанию не имеют каких-либо разрешений.

Лучше создайте отдельную учетную запись службы для своих нужд и используйте ее для создания своего контейнера.

spec: 
    serviceAccountName: secret-access-sa 
    containers: 
    ... 

Это хорошо описано здесь https://developer.ibm.com/recipes/tutorials/service-accounts-and-auditing-in-kubernetes/