k8s 證書配置大全

Kubernetes 證書配置大全

證書是網絡通訊的安全的要素,是現代網絡通訊的基本配置。各類遠程調用的安全都離不開非對稱加密提供的保障。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

  • 若是指定了cert或certificate, 將生成basename.pem。
  • 若是指定了key 或private_key,則將生成basename-key.pem。
  • 若是指定了csr 或certificate_request,則將生成basename.csr。
  • 若是 指定了bundle, 則將生成basename-bundle.pem。
  • 若是指定了ocspResponse, 則將生成basename-response.der。
    您能夠傳遞-stdout輸出編碼內容到標準輸出,而不是保存到文件。

驗證證書有效期

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

  • ca.pem - 私有CA根證書
  • kubernetes.pem - 與 node 通訊的,
  • kube-proxy.pem - k8s 與容器通訊的
  • admin.pem - kubectl 管理用

生成證書請求

在生成證書過程當中須要有四類文件api

  • *.csr - 證書請求文件,base64格式,有-----BEGIN CERTIFICATE REQUEST-----標識
  • *csr.json - 證書請求文件,是上面格式的再封裝,便於傳給cfssl,json格式,大括號開始
  • *-key.pem - 私匙文件,base64格式,有-----BEGIN RSA PRIVATE KEY-----標識
  • *.pem - 證書文件,base64格式,能夠用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

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
相關文章
相關標籤/搜索