Я пытаюсь пройти аутентификацию в локальном кластере Kubernetes (v1.6.4) с помощью сертификата. Это происходит в контексте использования подключаемого модуля Kubernetes для Jenkins.
Я следую рекомендациям для Minikube из файла README для Kubernetes-plugin, который я адаптировал для своего сценария. :
Преобразуйте клиентский сертификат в 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
В Jenkins создайте учетные данные с помощью сертификата
Kind
:Certificate
Certificate
:Upload PKCS#12 certificate
и загрузите файлkubernetes.pfx
Password
:jenkins
(как указано при создании сертификата)
Manage Jenkins
->Add new cloud
->Kubernetes
Kubernetes URL
:https://10.179.1.121:6443
(as output bykubectl config view
)Kubernetes server certificate key
: вставьте содержимое/etc/kubernetes/pki/ca.crt
.Disable https certificate check
: проверено, поскольку тестовая установка не имеет подписанного сертификатаKubernetes Namespace
: пробовали иdefault
, иkubernetes-plugin
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 об аутентификации, похоже, не охватывает этот вариант использования.