當咱們須要進行服務端認證,甚至雙向認證時,咱們須要生成密鑰對和服務信息,並使用ca對公鑰和服務信息進行批准簽發,生成一個證書。node
咱們簡單描述下單向認證和雙向認證的場景流程git
在單向認證場景中:web
在雙向認證的場景中:算法
那麼,咱們若是要開放本身的https服務,或者給kubelet建立可用的客戶端證書,就須要:json
這裏使用方能夠是客戶端(kubelet)或服務端(好比一個咱們本身開發的webhook server)api
k8s集羣部署時會自動生成一個CA(證書認證機構),固然這個CA是咱們自動生成的,並不具備任何合法性。k8s還提供了一套api,用於對用戶自主建立的證書進行認證簽發。服務器
執行下面的命令,生成server.csr和server-key.pem。app
cat <<EOF | cfssl genkey - | cfssljson -bare server { "hosts": [ "my-svc.my-namespace.svc.cluster.local", "my-pod.my-namespace.pod.cluster.local", "192.0.2.24", "10.0.34.2" ], "CN": "kubernetes", "key": { "algo": "ecdsa", "size": 256 }, "names": [ { "C": "CN", "ST": "BeiJing", "L": "BeiJing", "O": "k8s", "OU": "System" } ] } EOF
這裏你能夠修改文件裏的內容,主要是:工具
CN
的內容視爲正式使用者的User Name
ecdsa
算法和rsa
算法,rsa
算法的size通常是2048或1024O
視爲證書使用者所在的Group
這一步生成的server-key.pem是服務端的私鑰,而server.csr則含有公鑰、組織信息、我的信息(域名)。jsonp
執行以下腳本:
cat <<EOF | kubectl apply -f - apiVersion: certificates.k8s.io/v1beta1 kind: CertificateSigningRequest metadata: name: my-svc.my-namespace spec: request: $(cat server.csr | base64 | tr -d '\n') usages: - digital signature - key encipherment - server auth EOF
在k8s集羣中建立一個csr資源。注意要將第一步中建立的server.csr內容進行base64編碼,去掉換行後填入spec.request
中。spec.usages
中填入咱們對證書的要求,包括數字簽名、密鑰加密、服務器驗證。通常填這三個就夠了。
以後咱們經過kubectl describe csr my-svc.my-namespace
能夠看到:
Name: my-svc.my-namespace Labels: <none> Annotations: <none> CreationTimestamp: Tue, 21 Mar 2017 07:03:51 -0700 Requesting User: yourname@example.com Status: Pending Subject: Common Name: my-svc.my-namespace.svc.cluster.local Serial Number: Subject Alternative Names: DNS Names: my-svc.my-namespace.svc.cluster.local IP Addresses: 192.0.2.24 10.0.34.2 Events: <none>
注意到,csr的status是pending,說明尚未被CA認證。在k8s集羣中,若是是node上kubelet建立的CSR,kube-controller-manager會自動進行認證,而咱們手動建立的證書,須要進行手動認證:kubectl certificate approve
也能夠拒絕:kubectl certificate deny
以後咱們再檢查csr,發現已是approved了:
kubectl get csr NAME AGE REQUESTOR CONDITION my-svc.my-namespace 10m yourname@example.com Approved,Issued
咱們能夠經過
kubectl get csr my-svc.my-namespace -o jsonpath='{.status.certificate}' | base64 --decode > server.crt
命令,獲得server的證書。以後你就可使用server.crt和server-key.pem做爲你的服務的https認證