Kubernetes证书认证

3
我正在尝试使用证书对本地托管的 Kubernetes 集群(v1.6.4)进行身份验证。这是在使用 Jenkins 的 Kubernetes 插件 的情况下进行的。
我正在按照 Kubernetes 插件 README 文件中的 Minikube 指南进行操作,并将其调整为适合我的场景。
  1. Convert the client certificate to 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. In Jenkins, create credentials using a certificate

    1. Kind: Certificate
    2. Certificate: Upload PKCS#12 certificate and upload file kubernetes.pfx
    3. Password: jenkins (as specified during certificate creation)
  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: paste the contents of /etc/kubernetes/pki/ca.crt.
    3. Disable https certificate check: checked because the test setup does not have a signed certificate
    4. Kubernetes Namespace: tried both default and kubernetes-plugin
    5. Credentials: CN=kube-apiserver (i.e. the credentials created above)
现在当我点击测试连接时,Jenkins Web UI 显示以下错误信息:

连接到 https://10.179.1.121:6443 失败: 执行 GET 失败:https://10.179.1.121:6443/api/v1/namespaces/kubernetes-plugin/pods。消息:未经授权。

Jenkins 日志显示以下消息:

Sep 05, 2017 10:22:03 AM io.fabric8.kubernetes.client.Config tryServiceAccount

WARNING: Error reading service account token from: [/var/run/secrets/kubernetes.io/serviceaccount/token]. Ignoring.

不幸的是,文档大多限于运行在 Minikube 和 Google Cloud Engine 上的 Kubernetes,但我并没有看到前者和本地托管的 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身份验证文档似乎没有涵盖这种情况。

1个回答

0

警告:读取服务帐户令牌时出错表示用于加密ServiceAccount令牌的密钥在kube-apiserver(--service-account-key-file)和kube-controller-manager(--service-account-private-key-file)之间不同。如果您的kube-apiserver命令行没有指定--service-account-key-file,则使用--tls-private-key-file的值,我怀疑这是问题所在。

我建议始终明确设置kube-apiserver --service-account-key-file以匹配kube-controller-manager --service-account-private-key-file的值。


我使用kubeadm创建了集群,因此没有手动调整这些参数。有什么建议可以在不重启kube-apiserver的情况下解决这个问题吗? - Carsten

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接