Kubernetes认证与证书

时间:2017-09-05 10:36:20

标签: authentication ssl jenkins kubernetes kubernetes-security

我正在尝试使用证书对本地托管的Kubernetes群集(v1.6.4)进行身份验证。 这参与了使用Kubernetes plugin for Jenkins

的上下文

我在Kubernetes-plugin README文件中遵循了Minikube的指南,我根据自己的情况进行了调整:

  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. 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. 的内容
    4. Disable https certificate check:已检查,因为测试设置没有签名证书
    5. Kubernetes Namespace:同时尝试了defaultkubernetes-plugin
    6. CredentialsCN=kube-apiserver(即上面创建的凭据)
  4. 现在,当我点击Test Connection时,这是Jenkins Web UI中显示的错误消息:

      

    连接到https://10.179.1.121:6443时出错:执行失败:GET at: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

         

    警告:从以下位置读取服务帐户令牌时出错:[/ var / run / secrets / kubernetes.io / servicesaccount / token]。忽略。

    遗憾的是,该文档主要限于在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
    

    This question处理相关问题,建议使用ServiceAccount或证书,但后一种方法的答案缺少有关如何将RBAC配置文件与该证书绑定的详细信息。 Kubernetes documentation about authentication似乎不包括此用例。

1 个答案:

答案 0 :(得分:0)

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

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