Аутентификация Kubernetes с сертификатом

Я пытаюсь пройти аутентификацию в локальном кластере Kubernetes (v1.6.4) с помощью сертификата. Это происходит в контексте использования подключаемого модуля Kubernetes для Jenkins.

Я следую рекомендациям для Minikube из файла README для Kubernetes-plugin, который я адаптировал для своего сценария. :

  1. Преобразуйте клиентский сертификат в PKCS:

    $ sudo openssl pkcs12 -export -out kubernetes.pfx -inkey /etc/kubernetes/pki/apiserver.key -in /etc/kubernetes/pki/apiserver.crt -certfile /etc/kubernetes/pki/ca.crt -passout pass:jenkins
    
  2. В Jenkins создайте учетные данные с помощью сертификата

    1. Kind: Certificate
    2. Certificate: Upload PKCS#12 certificate и загрузите файл kubernetes.pfx
    3. Password: jenkins (как указано при создании сертификата)
  3. Manage Jenkins -> Add new cloud -> Kubernetes
    1. Kubernetes URL: https://10.179.1.121:6443 (as output by kubectl config view)
    2. Kubernetes server certificate key: вставьте содержимое /etc/kubernetes/pki/ca.crt.
    3. Disable https certificate check: проверено, поскольку тестовая установка не имеет подписанного сертификата
    4. Kubernetes Namespace: пробовали и default, и kubernetes-plugin
    5. Credentials: CN=kube-apiserver (т.е. учетные данные, созданные выше)

Теперь, когда я нажимаю Test Connection, в веб-интерфейсе Jenkins отображается следующее сообщение об ошибке:

Ошибка подключения к https://10.179.1.121:6443: сбой при выполнении: GET at: https://10.179.1.121:6443/api/v1/namespaces/kubernetes-plugin/pods. Сообщение: неавторизованный.

Журналы Jenkins показывают это сообщение:

5 сентября 2017 г. 10:22:03 io.fabric8.kubernetes.client.Config tryServiceAccount

ПРЕДУПРЕЖДЕНИЕ. Ошибка чтения токена учетной записи службы из: [/var/run/secrets/kubernetes.io/serviceaccount/token]. Игнорирование.

К сожалению, документация в основном ограничена Kubernetes, работающим на Minikube, и Google Cloud Engine, но я не вижу концептуальной разницы между первым и локально размещенным кластером Kubernetes.

Следующий вызов Curl для тестирования приводит к совершенно другому сообщению об ошибке:

$ curl --insecure --cacert /etc/kubernetes/pki/ca.crt --cert kubernetex.pfx:secret https://10.179.1.121:6443
User "system:anonymous" cannot get  at the cluster scope. 

Более подробный:

$ curl -v --insecure --cacert /etc/kubernetes/pki/ca.crt --cert kubernetex.pfx:secret https://10.179.1.121:6443
* About to connect() to 10.179.1.121 port 6443 (#0)
*   Trying 10.179.1.121...
* Connected to 10.179.1.121 (10.179.1.121) port 6443 (#0)
* Initializing NSS with certpath: sql:/etc/pki/nssdb
* skipping SSL peer certificate verification
* NSS: client certificate not found: kubernetex.pfx
* SSL connection using TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
* Server certificate:
*   subject: CN=kube-apiserver
*   start date: Jun 13 11:33:55 2017 GMT
*   expire date: Jun 13 11:33:55 2018 GMT
*   common name: kube-apiserver
*   issuer: CN=kubernetes
> GET / HTTP/1.1
> User-Agent: curl/7.29.0
> Host: 10.179.1.121:6443
> Accept: */*
> 
< HTTP/1.1 403 Forbidden
< Content-Type: text/plain
< X-Content-Type-Options: nosniff
< Date: Tue, 05 Sep 2017 10:34:23 GMT
< Content-Length: 57
< 
* Connection #0 to host 10.179.1.121 left intact

Я также создал ServiceAccount:

$ kubectl describe serviceaccount --namespace=kubernetes-plugin 
Name:       default
Namespace:  kubernetes-plugin
Labels:     <none>
Annotations:    <none>

Image pull secrets: <none>

Mountable secrets:  default-token-6qwj1

Tokens:             default-token-6qwj1



Name:       jenkins
Namespace:  kubernetes-plugin
Labels:     <none>
Annotations:    <none>

Image pull secrets: <none>

Mountable secrets:  jenkins-token-1d623

Tokens:             jenkins-token-1d623

Этот вопрос касается связанной проблемы и рекомендует использовать либо ServiceAccount или сертификат, но в ответе на последний подход отсутствуют подробности о том, как привязать профиль RBAC к этому сертификату. Документация Kubernetes об аутентификации, похоже, не охватывает этот вариант использования.


person Carsten    schedule 05.09.2017    source источник


Ответы (1)


ПРЕДУПРЕЖДЕНИЕ: ошибка чтения токена учетной записи службы указывает на то, что ключ, используемый для шифрования токенов ServiceAccount, отличается в kube-apiserver (--service-account-key-file) и kube-controller-manager (- служебный-аккаунт-закрытый-ключ-файл). Если в вашей командной строке kube-apiserver не указано --service-account-key-file, тогда используется значение --tls-private-key-file, и я подозреваю, что это проблема.

Я бы посоветовал всегда явно устанавливать kube-apiserver --service-account-key-file в соответствии со значением kube-controller-manager --service-account-private-key-file.

person Keith Burdis    schedule 05.09.2017
comment
Я создал кластер с помощью kubeadm, поэтому мне не нужно вручную изменять эти параметры. Есть какие-нибудь рекомендации, как исправить это без перезапуска kube-apiserver? - person Carsten; 08.09.2017