Kubernetes身份验证与证书

问题描述:

我试图使用证书与本地托管的Kubernetes集群(v1.6.4)进行身份验证。 这参与使用Kubernetes plugin for Jenkins的上下文。Kubernetes身份验证与证书

我下面的Minikube准则在Kubernetes-plugin README文件,我适应我的方案:

  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. 在詹金斯,使用创建凭证证书

    1. KindCertificate
    2. CertificateUpload PKCS#12 certificate和上传文件kubernetes.pfx
    3. Passwordjenkins(证书创建期间指定)
  3. Manage Jenkins - >Add new cloud - >Kubernetes
    1. Kubernetes URLhttps://10.179.1.121:6443(如输出由kubectl config view
    2. Kubernetes server certificate key:粘贴/etc/kubernetes/pki/ca.crt的内容。
    3. Disable https certificate check:检查,因为测试装置不具有签名的证书
    4. Kubernetes Namespace:尝试都defaultkubernetes-plugin
    5. CredentialsCN=kube-apiserver

(即上面创建的凭证)现在,当我点击Test Connection,这是Jenkins Web UI中显示的错误消息:

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

詹金斯日志显示此消息:

2017年9月5日上午10时22分03秒io.fabric8.kubernetes.client.Config tryServiceAccount

警告:错误阅读服务帐户令牌来自:[/var/run/secrets/kubernetes.io/serviceaccount/token]。忽略。

的文档,不幸的是,大多局限于Kubernetes上Minikube和谷歌云引擎运行,但我没有看到前者和本地托管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 

This question涉及相关问题,建议使用ServiceAccount或证书,但后者的答案缺乏关于如何将RBAC配置文件与该证书绑定的详细信息。 Kubernetes documentation about authentication似乎没有涵盖这个用例。

警告:错误读取服务帐户令牌指示用于加密令牌ServiceAccount关键是KUBE-API服务器(--service帐户密钥文件)和KUBE控制器的管理器之间是不同的(--service -account-私钥文件)。如果您的kube-apiserver命令行没有指定--service-account-key-file,则使用--tls-private-key-file的值,我怀疑这是问题所在。

我建议总是明确地设置kube-apiserver --service-account-key-file来匹配kube-controller-manager --service-account-private-key-file的值。

+0

我使用kubeadm创建了集群,因此没有手动摆弄这些参数。任何建议,以解决这个问题,而无需重新启动kube-apiserver? – Carsten