K8S從入門到放棄系列-(2)集群根證書准備


k8s從1.8版本開始,集群中各個組件需要使用TLS證書對通信進行加密,每個k8s集群都需要有獨立的CA證書體系,這里我們采用比較常用的CloudFlare 的 PKI 工具集 cfssl 來生成 Certificate Authority (CA) 證書和秘鑰文件,CA 是自簽名的證書,用來簽名后續創建的其它 TLS 證書。
使用證書的組件如下:
  • etcd:使用 ca.pem、etcd-key.pem、etcd.pem;(etcd對外提供服務、節點間通信(etcd peer)使用同一套證書)
  • kube-apiserver:使用 ca.pem、ca-key.pem、kube-apiserver-key.pem、kube-apiserver.pem;
  • kubelet:使用 ca.pem ca-key.pem;
  • kube-proxy:使用 ca.pem、kube-proxy-key.pem、kube-proxy.pem;
  • kubectl:使用 ca.pem、admin-key.pem、admin.pem;
  • kube-controller-manager:使用 ca-key.pem、ca.pem、kube-controller-manager.pem、kube-controller-manager-key.pem;
  • kube-scheduler:使用ca-key.pem、ca.pem、kube-scheduler-key.pem、kube-scheduler.pem;

1)安裝cfssl

生成證書時可在任一節點完成,這里在k8s-master01主機執行,證書只需要創建一次即可,以后在向集群中添加新節點時只要將 /etc/kubernetes/ssl 目錄下的證書拷貝到新節點上即可。
[root@k8s-master01 ~]# mkdir k8s/cfssl -p
[root@k8s-master01 ~]# cd k8s/cfssl/
[root@k8s-master01 cfssl]# wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64
[root@k8s-master01 cfssl]# chmod +x cfssl_linux-amd64
[root@k8s-master01 cfssl]# cp cfssl_linux-amd64 /usr/local/bin/cfssl
[root@k8s-master01 cfssl]# wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64
[root@k8s-master01 cfssl]# chmod +x cfssljson_linux-amd64
[root@k8s-master01 cfssl]# cp cfssljson_linux-amd64 /usr/local/bin/cfssljson
[root@k8s-master01 cfssl]# wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64
[root@k8s-master01 cfssl]# chmod +x cfssl-certinfo_linux-amd64
[root@k8s-master01 cfssl]# cp cfssl-certinfo_linux-amd64 /usr/local/bin/cfssl-certinfo
2)創建CA根證書

由於維護多套CA實在過於繁雜,這里CA證書用來簽署集群其它組件的證書
這個文件中包含后面簽署etcd、kubernetes等其它證書的時候用到的配置
[root@k8s-master01 ~]# vim /opt/k8s/certs/ca-config.json
{
    "signing": {
      "default": {
        "expiry": "87600h"
    },
    "profiles": {
      "kubernetes": {
        "usages": [
            "signing",
            "key encipherment",
            "server auth",
            "client auth"
        ],
        "expiry": "87600h"
      }
    }
  }
}
  • ca-config.json:可以定義多個 profiles,分別指定不同的過期時間、使用場景等參數;后續在簽名證書時使用某個 profile;
  • signing:表示該證書可用於簽名其它證書;生成的 ca.pem 證書中 CA=TRUE;
  • server auth:表示client可以用該 CA 對server提供的證書進行驗證;
  • client auth:表示server可以用該CA對client提供的證書進行驗證;
  • expiry: 表示證書過期時間,我們設置10年,當然你如果比較在意安全性,可以適當減少
3) 創建 CA 證書簽名請求模板

[root@k8s-master01 ~]# vim /opt/k8s/certs/ca-csr.json
{
  "CN": "kubernetes",
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "CN",
      "ST": "ShangHai",
      "L": "ShangHai",
      "O": "k8s",
      "OU": "System"
    }
  ]
}
4)生成CA證書、私鑰和csr證書簽名請求
該命令會生成運行CA所必需的文件 ca-key.pem(私鑰)和 ca.pem(證書),還會生成 ca.csr(證書簽名請求),用於交叉簽名或重新簽名。
[root@k8s-master01 ~]# cd /opt/k8s/certs/
[root@k8s-master01 certs]# cfssl gencert -initca /opt/k8s/certs/ca-csr.json | cfssljson -bare ca
2019/04/22 15:14:58 [INFO] generating a new CA key and certificate from CSR
2019/04/22 15:14:58 [INFO] generate received request
2019/04/22 15:14:58 [INFO] received CSR
2019/04/22 15:14:58 [INFO] generating key: rsa-2048
2019/04/22 15:14:58 [INFO] encoded CSR
2019/04/22 15:14:58 [INFO] signed certificate with serial number 546879892516414984619692113039590478695154941398

5)分發證書

 可采用scp直接傳輸到所有節點,我這里還是采用ansible

[root@k8s-master01 certs]# ansible k8s-all -m copy -a 'src=/opt/k8s/certs/ca.csr dest=/etc/kubernetes/ssl/'
[root@k8s-master01 certs]# ansible k8s-all -m copy -a 'src=/opt/k8s/certs/ca-key.pem dest=/etc/kubernetes/ssl/'
[root@k8s-master01 certs]# ansible k8s-all -m copy -a 'src=/opt/k8s/certs/ca.pem dest=/etc/kubernetes/ssl/'

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM