證書是網絡通訊的安全的要素,是現代網絡通訊的基本配置。各類遠程調用的安全都離不開非對稱加密提供的保障。node
cfssl 是 CloudFlare 開源的一款PKI/TLS工具。 CFSSL 包含一個命令行工具(cfssl, cfssljson)用於簽名,驗證而且捆綁TLS證書的 HTTP API 服務。 使用Go語言編寫。與 OpenSSL 相比,cfssl 使用起來更簡單。git
Github 地址: https://github.com/cloudflare...
官網地址: https://pkg.cfssl.org/github
若是有golang環境,用go安裝很簡單golang
$ go get -u github.com/cloudflare/cfssl/cmd/cfssl $ go get -u github.com/cloudflare/cfssl/cmd/cfssljson
cfssljson 實用程序shell
大部分 cfssl 的輸出爲 JSON 格式。cfssljson 能夠將輸出拆分出來爲獨立的key,certificate,CSR 和 bundle文件。該工具須要指定參數,-f
指定輸入文件,後接一個參數,指定生成的文件的基本名稱。若是輸入文件名是 -
(默認值),則 cfssljson 從標準輸入讀取。它如下列方式將 JSON 文件中的鍵映射到文件名:json
cfssl certinfo -cert /etc/kubernetes/ssl/ca.pem |grep not_after cfssl certinfo -cert /etc/kubernetes/ssl/admin.pem |grep not_after cfssl certinfo -cert /etc/kubernetes/ssl/kubernetes.pem |grep not_after cfssl certinfo -cert /etc/kubernetes/ssl/kube-proxy.pem |grep not_after
證書分四類bootstrap
在生成證書過程當中須要有四類文件api
-----BEGIN CERTIFICATE REQUEST-----
標識cfssl
,json格式,大括號開始-----BEGIN RSA PRIVATE KEY-----
標識cfssl certinfo -cert 文件名
查看有效期,有-----BEGIN CERTIFICATE-----
標識以上四種文件,前兩類是中間產物,事後能夠不保留,後兩個須要配置到系統中 (一般是主從結點的/etc/kubernetes/ssl
目錄下)。瀏覽器
中間文件和生成的文件最好放在一塊兒安全
cat > ca-csr.json << 'HERE' { "CN": "kubernetes", "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "CN", "ST": "BeiJing", "L": "BeiJing", "O": "k8s", "OU": "System" } ] } HERE
部分字段說明:
「CN」:Common Name,kube-apiserver 從證書中提取該字段做爲請求的用戶名 (User Name);瀏覽器使用該字段驗證網站是否合法;
「O」:Organization,kube-apiserver 從證書中提取該字段做爲請求用戶所屬的組 (Group);
其餘幾類證書請求相似
cfssl gencert -initca ca-csr.json | cfssljson -bare ca
須要把生成的證書複製到所有 master和 node 結點。
scp *.pem yourname@yournode:/etc/kubernetes/ssl/
在 master 結點上生成~/.kube/config
便於kubectl
平常交互使用
KUBE_APISERVER="https://192.168.122.100:6443" #這裏換成你的 master 結點 IP kubectl config set-cluster kubernetes \ --certificate-authority=/etc/kubernetes/ssl/ca.pem \ --embed-certs=true \ --server=${KUBE_APISERVER} kubectl config set-credentials admin \ --client-certificate=/etc/kubernetes/ssl/admin.pem \ --embed-certs=true \ --client-key=/etc/kubernetes/ssl/admin-key.pem kubectl config set-context kubernetes \ --cluster=kubernetes \ --user=admin kubectl config use-context kubernetes ls ~/.kube/config
結點間通訊用的證書配置
cd /etc/kubernetes kubectl config set-cluster kubernetes \ --certificate-authority=/etc/kubernetes/ssl/ca.pem \ --embed-certs=true \ --server=${KUBE_APISERVER} \ --kubeconfig=bootstrap.kubeconfig kubectl config set-credentials kubelet-bootstrap \ --token=${BOOTSTRAP_TOKEN} \ --kubeconfig=bootstrap.kubeconfig kubectl config set-context default \ --cluster=kubernetes \ --user=kubelet-bootstrap \ --kubeconfig=bootstrap.kubeconfig kubectl config use-context default --kubeconfig=bootstrap.kubeconfig kubectl config set-cluster kubernetes \ --certificate-authority=/etc/kubernetes/ssl/ca.pem \ --embed-certs=true \ --server=${KUBE_APISERVER} \ --kubeconfig=kube-proxy.kubeconfig kubectl config set-credentials kube-proxy \ --client-certificate=/etc/kubernetes/ssl/kube-proxy.pem \ --client-key=/etc/kubernetes/ssl/kube-proxy-key.pem \ --embed-certs=true \ --kubeconfig=kube-proxy.kubeconfig kubectl config set-context default \ --cluster=kubernetes \ --user=kube-proxy \ --kubeconfig=kube-proxy.kubeconfig kubectl config use-context default --kubeconfig=kube-proxy.kubeconfig kubectl create clusterrolebinding kubelet-bootstrap \ --clusterrole=system:node-bootstrapper \ --user=kubelet-bootstrap
在配置好kubelet-bootstrap.kubeconfig
後,重啓結點,結點會向master申請證書。
master結點上運行
kubectl get certificatesigningrequests
會發現如下相似的輸出
NAME AGE REQUESTOR CONDITION node-csr-dAxCUJNZ4 22m kubelet-bootstrap Pending
經過如下命令,受權頒發給節點證書
kubectl certificate approve node-csr-dAxCUJNZ4
經過後正常後會輸出
certificatesigningrequest "node-csr-dAxCUJNZ4" approved