關於etcd的集羣配置可直接參考etcd集羣部署linux
這篇文檔只是在其基礎上增長ssl加密驗證的過程。json
要讓集羣使用ssl,首先須要爲集羣生成ssl證書。curl
咱們使用cfssl系列工具來生成相關證書。工具
curl -s -L -o /opt/kubernetes/bin/cfssl https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 curl -s -L -o /opt/kubernetes/bin/cfssljson https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64 chmod +x /opt/kubernetes/bin/{cfssl,cfssljson}
ca-config.json配置以下:加密
{ "signing": { "default": { "expiry": "175200h" }, "profiles": { "kubernetes": { "expiry": "175200h", "usages": [ "signing", "key encipherment", "server auth", "client auth" ] }, "etcd": { "expiry": "175200h", "usages": [ "signing", "key encipherment", "server auth", "client auth" ] } } } }
字段說明:url
ca-csr.json配置以下:rest
{ "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "CN", "L": "Wuhan", "ST": "Hubei", "O": "k8s", "OU": "System" } ] }
生成ca證書:code
cfssl gencert --initca ca-csr.json | cfssljson --bare ca
執行後會生成三個文件:server
etcd服務端證書用於加密etcd集羣之間的通訊
etcd-csr.json文件內容以下:
{ "CN": "etcd-server", "hosts": [ "localhost", "0.0.0.0", "127.0.0.1", "10.5.12.16", "10.5.12.17", "10.5.12.18" ], "key": { "algo": "rsa", "size": 4096 }, "names": [ { "C": "CN", "L": "Wuhan", "O": "k8s", "OU": "System", "ST": "Hubei" } ] }
生成etcd服務端證書:
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=etcd etcd-csr.json | cfssljson -bare etcd
生成三個文件:etcd.pem, etcd-key.pem, etcd.csr
etcd客戶端證書用於etcd客戶端鏈接etcd時提供驗證方式
etcd-client-csr.json
{ "CN": "etcd-client", "hosts": [ "" ], "key": { "algo": "rsa", "size": 4096 }, "names": [ { "C": "CN", "L": "Wuhan", "ST": "Hubei", "O": "k8s", "OU": "System" } ] }
生成客戶端證書:
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=etcd etcd-client-csr.json | cfssljson -bare etcd-client
生成三個文件:etcd-client.pem, etcd-client-key.pem, etcd-client.csr
最佳實踐: 在實際生產中,爲了簡化etcd的管理,咱們一般不會爲服務端和客戶端各生成一套證書,而是生成一套便可以用於服務端也能夠同時用於客戶端的證書。在咱們上面生成etcd的ca證書的時候,能夠看到etcd-ca-config.json中etcd的證書useags中同時有server auth和client auth。也就是說,基於咱們的ca證書生成的etcd證書自己就能夠同時用於服務端與客戶端。然而,咱們在生成etcd服務端證書的時候,在etcd-server-csr.json中指定了hosts,因此該證書只能被指定的hosts列表中的主機使用,要想全部的客戶端都能使用這個證書。最簡單的方法就是和生成etcd客戶端證書時同樣,直接將hosts留空。反過來,也就是說,咱們能夠直接將生成的etcd客戶端證書用於服務端。
修改後的/opt/kubernetes/cfg/etcd.conf文件內容以下:
ETCD_NAME=etcd1 ETCD_DATA_DIR="/data/etcd" ETCD_LISTEN_CLIENT_URLS="http://10.5.12.16:2379,http://127.0.0.1:2379" ETCD_LISTEN_PEER_URLS="http://10.5.12.16:2380" ETCD_INITIAL_ADVERTISE_PEER_URLS="http://10.5.12.16:2380" ETCD_INITIAL_CLUSTER="etcd1=http://10.5.12.16:2380,etcd2=http://10.5.12.17:2380,etcd3=http://10.5.12.18:2380" ETCD_INITIAL_CLUSTER_STATE="new" ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster" ETCD_ADVERTISE_CLIENT_URLS="http://10.5.12.16:2379" CLIENT_CERT_AUTH="true" ETCD_CA_FILE="/opt/kubernetes/ssl/ca.pem" ETCD_CERT_FILE="/opt/kubernetes/ssl/etcd.pem" ETCD_KEY_FILE="/opt/kubernetes/ssl/etcd-key.pem" PEER_CLIENT_CERT_AUTH="true" ETCD_PEER_CA_FILE="/opt/kubernetes/ssl/ca.pem" ETCD_PEER_CERT_FILE="/opt/kubernetes/ssl/etcd.pem" ETCD_PEER_KEY_FILE="/opt/kubernetes/ssl/etcd-key.pem"
systemctl restart etcd
驗證集羣健康狀態時,須要使用客戶端證書來鏈接etcd集羣:
etcdctl --cert-file=/opt/kubernetes/ssl/etcd-client.pem --key-file=/opt/kubernetes/ssl/etcd-client-key.pem --ca-file=/opt/kubernetes/ssl/ca.pem --endpoints=https://10.5.12.16:2379,https://10.5.12.17:2379,https://10.5.12.18:2379 member list