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

Раньше я мог ломаться

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

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

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

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

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

     KUBE_TOKEN=$( 

    Я также использую простой двоичный файл jq ( http://stedolan.github.io/jq/download/ ) для синтаксического анализа json для использования в сценариях bash.

    У каждого модуля есть автоматическая прикладная учетная запись, которая позволяет ей получить доступ к кукурузе. Учетная запись службы предоставляет как учетные данные клиента, так и маркер-носитель, а также сертификат центра сертификации, который использовался для подписания сертификата, представленного айперсером. С помощью этих двух частей информации вы можете создать безопасное, аутентифицированное соединение с аписером, не используя curl -k (aka 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/ 

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

     from kubernetes import client, config config.load_incluster_config() v1_core = client.CoreV1Api() 

    Версия wget:

     KUBE_TOKEN=$( 

    Для тех, кто использует Google Container Engine (работает на Kubernetes):

    Простой вызов https://kubernetes из кластера с использованием этого клиента kubernetes для Java работает.

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

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

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

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

    Вы можете использовать clientjs 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); } 
     curl -v -cacert /ca.crt --cert /kubernetes-node.crt --key /kubernetes-node.key https:// 

    Моя версия k8s – 1.2.0, а в других версиях она тоже должна работать ^ ^

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

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

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

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

    Я столкнулся с этой проблемой при попытке получить доступ к API изнутри модуля с помощью кода Go. Ниже приводится то, что я реализовал, чтобы получить эту работу, если кто-то столкнется с этим вопросом, желающим использовать Go тоже.

    В этом примере используется ресурс pod, для которого вы должны использовать библиотеку client-go если вы работаете с родными объектами кубернетов. Код более полезен для тех, кто работает с CustomResourceDefintions.

     serviceHost := os.GetEnv("KUBERNETES_SERVICE_HOST") servicePort := os.GetEnv("KUBERNETES_SERVICE_PORT") apiVersion := "v1" // For example namespace := default // For example resource := "pod" // For example httpMethod := http.MethodGet // For Example url := fmt.Sprintf("https://%s:%s/apis/%s/namespaces/%s/%s", serviceHost, servicePort, apiVersion, namespace, resource) u, err := url.Parse(url) if err != nil { panic(err) } req, err := http.NewRequest(httpMethod, u.String(), bytes.NewBuffer(payload)) if err != nil { return err } caToken, err := ioutil.ReadFile("/var/run/secrets/kubernetes.io/serviceaccount/token") if err != nil { panic(err) // cannot find token file } req.Header.Set("Content-Type", "application/json") req.Header.Set("Authorization", fmt.Sprintf("Bearer %s", string(caToken))) caCertPool := x509.NewCertPool() caCert, err := ioutil.ReadFile("/var/run/secrets/kubernetes.io/serviceaccount/ca.crt") if err != nil { return panic(err) // Can't find cert file } caCertPool.AppendCertsFromPEM(caCert) client := &http.Client{ Transport: &http.Transport{ TLSClientConfig: &tls.Config{ RootCAs: caCertPool, }, }, } resp, err := client.Do(req) if err != nil { log.Printf("sending helm deploy payload failed: %s", err.Error()) return err } defer resp.Body.Close() // Check resp.StatusCode // Check resp.Status 

    У меня была аналогичная проблема с auth на GKE, где скрипты python внезапно бросали исключения. Решение, которое сработало для меня, состояло в том,

     apiVersion: rbac.authorization.k8s.io/v1beta1 kind: ClusterRoleBinding metadata: name: fabric8-rbac subjects: - kind: ServiceAccount # Reference to upper's `metadata.name` name: default # Reference to upper's `metadata.namespace` namespace: default roleRef: kind: ClusterRole name: cluster-admin apiGroup: rbac.authorization.k8s.io 

    для получения дополнительной информации введите ссылку здесь

    Самое важное дополнение к уже упомянутым выше деталям заключается в том, что модуль, из которого вы пытаетесь получить доступ к серверу API, должен иметь возможности RBAC для этого.

    Каждый объект в системе k8s идентифицируется служебной учетной записью (например, учетной записью пользователя, используемой для пользователей). На основе возможностей RBAC заполняется токен учетной записи службы (/var/run/secrets/kubernetes.io/serviceaccount/token). Связывание kube-api (например, pykube) может использовать этот токен в качестве входа при создании соединения с серверами kube-api. Если у pod есть правильные возможности RBAC, pod сможет установить соединение с сервером kube-api.

    Interesting Posts
    Давайте будем гением компьютера.