kubeadm安裝的集羣,默認etcd是一個單機的容器化的etcd,而且k8s和etcd通訊沒有通過ssl加密和認證,這點是須要改造的。
因此首先咱們須要先部署一個三節點的etcd集羣,二進制部署,systemd守護進程,而且須要生成ca證書。linux
kuberntes 系統使用 etcd 存儲全部數據,此外calico網絡也使用該etcd集羣,本文檔介紹部署一個三節點高可用 etcd 集羣的步驟,分別命名爲etcd-host1
、etcd-host2
、etcd-host3
:git
本文檔用到的變量定義以下:github
$ export NODE_NAME=etcd-host1 # 當前部署的機器名稱(隨便定義,只要能區分不一樣機器便可) $ export NODE_IP=172.16.120.151 # 當前部署的機器 IP $ export NODE_IPS="172.16.120.151 172.16.120.152 172.16.120.153" # etcd 集羣全部機器 IP $ # etcd 集羣間通訊的IP和端口 $ export ETCD_NODES=etcd-host1=https://172.16.120.151:2380,etcd-host2=https://172.16.120.152:2380,etcd-host3=https://172.16.120.153:2380 $
本系列默認使用root用戶操做。json
本文檔使用 CloudFlare 的 PKI 工具集 cfssl 來生成 Certificate Authority (CA) 證書和祕鑰文件,CA 是自簽名的證書,用來簽名後續建立的其它 TLS 證書。api
若是不但願將cfssl工具安裝到部署主機上,能夠在其餘的主機上進行該步驟,生成之後將證書拷貝到部署etcd的主機上便可。本教程就是採起這種方法,在一臺測試機上執行下面操做。瀏覽器
$ wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 $ chmod +x cfssl_linux-amd64 $ mv cfssl_linux-amd64 /usr/local/bin/cfssl $ wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64 $ chmod +x cfssljson_linux-amd64 $ mv cfssljson_linux-amd64 /usr/local/bin/cfssljson $ wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64 $ chmod +x cfssl-certinfo_linux-amd64 $ mv cfssl-certinfo_linux-amd64 /usr/local/bin/cfssl-certinfo $
爲了保證通訊安全,客戶端(如 etcdctl) 與 etcd 集羣、etcd 集羣之間的通訊須要使用 TLS 加密,本節建立 etcd TLS 加密所需的證書和私鑰。安全
建立 CA 配置文件:bash
$ cat > ca-config.json <<EOF { "signing": { "default": { "expiry": "8760h" }, "profiles": { "kubernetes": { "usages": [ "signing", "key encipherment", "server auth", "client auth" ], "expiry": "8760h" } } } } EOF
ca-config.json
:能夠定義多個 profiles,分別指定不一樣的過時時間、使用場景等參數;後續在簽名證書時使用某個 profile;signing
:表示該證書可用於簽名其它證書;生成的 ca.pem 證書中 CA=TRUE
;server auth
:表示 client 能夠用該 CA 對 server 提供的證書進行驗證;client auth
:表示 server 能夠用該 CA 對 client 提供的證書進行驗證;建立 CA 證書籤名請求:網絡
$ cat > ca-csr.json <<EOF { "CN": "kubernetes", "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "CN", "ST": "BeiJing", "L": "BeiJing", "O": "k8s", "OU": "System" } ] } EOF
Common Name
,kube-apiserver 從證書中提取該字段做爲請求的用戶名 (User Name);瀏覽器使用該字段驗證網站是否合法;Organization
,kube-apiserver 從證書中提取該字段做爲請求用戶所屬的組 (Group);生成 CA 證書和私鑰:工具
$ cfssl gencert -initca ca-csr.json | cfssljson -bare ca $ ls ca* ca-config.json ca.csr ca-csr.json ca-key.pem ca.pem $
建立 etcd 證書籤名請求:
$ cat > etcd-csr.json <<EOF { "CN": "etcd", "hosts": [ "127.0.0.1", "${NODE_IP}" ], "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "CN", "ST": "BeiJing", "L": "BeiJing", "O": "k8s", "OU": "System" } ] } EOF
生成 etcd 證書和私鑰:
$ cfssl gencert -ca=ca.pem \ -ca-key=ca-key.pem \ -config=ca-config.json \ -profile=kubernetes etcd-csr.json | cfssljson -bare etcd $ ls etcd* etcd.csr etcd-csr.json etcd-key.pem etcd.pem ca-config.json ca.csr ca-csr.json ca-key.pem ca.pem $ rm etcd.csr etcd-csr.json
將生成好的etcd.pem和etcd-key.pem以及ca.pem三個文件拷貝到目標主機的/etc/etcd/ssl目錄下。
到 https://github.com/coreos/etcd/releases
頁面下載最新版本的二進制文件:
$ wget https://github.com/coreos/etcd/releases/download/v3.2.11/etcd-v3.2.11-linux-amd64.tar.gz $ tar -xvf etcd-v3.2.11-linux-amd64.tar.gz $ mv etcd-v3.2.11-linux-amd64/etcd* /usr/local/bin $
$ mkdir -p /var/lib/etcd # 必須先建立工做目錄 $ cat > etcd.service <<EOF [Unit] Description=Etcd Server After=network.target After=network-online.target Wants=network-online.target Documentation=https://github.com/coreos [Service] Type=notify WorkingDirectory=/var/lib/etcd/ ExecStart=/usr/local/bin/etcd \\ --name=${NODE_NAME} \\ --cert-file=/etc/etcd/ssl/etcd.pem \\ --key-file=/etc/etcd/ssl/etcd-key.pem \\ --peer-cert-file=/etc/etcd/ssl/etcd.pem \\ --peer-key-file=/etc/etcd/ssl/etcd-key.pem \\ --trusted-ca-file=/etc/etcd/ssl/ca.pem \\ --peer-trusted-ca-file=/etc/etcd/ssl/ca.pem \\ --initial-advertise-peer-urls=https://${NODE_IP}:2380 \\ --listen-peer-urls=https://${NODE_IP}:2380 \\ --listen-client-urls=https://${NODE_IP}:2379,http://127.0.0.1:2379 \\ --advertise-client-urls=https://${NODE_IP}:2379 \\ --initial-cluster-token=etcd-cluster-0 \\ --initial-cluster=${ETCD_NODES} \\ --initial-cluster-state=new \\ --data-dir=/var/lib/etcd Restart=on-failure RestartSec=5 LimitNOFILE=65536 [Install] WantedBy=multi-user.target EOF
etcd
的工做目錄和數據目錄爲 /var/lib/etcd
,需在啓動服務前建立這個目錄;--initial-cluster-state
值爲 new
時,--name
的參數值必須位於 --initial-cluster
列表中;$ mv etcd.service /etc/systemd/system/ $ systemctl daemon-reload $ systemctl enable etcd $ systemctl start etcd $ systemctl status etcd $
部署完 etcd 集羣后,在任一 etcd 集羣節點上執行以下命令:
$ etcdctl \ --endpoints=https://172.16.120.151:2379 \ --ca-file=/etc/etcd/ssl/ca.pem \ --cert-file=/etc/etcd/ssl/etcd.pem \ --key-file=/etc/etcd/ssl/etcd-key.pem \ cluster-health
預期結果:
member 71df888fdf6f0bb9 is healthy: got healthy result from https://172.16.120.153:2379 member 73b5207bc2491164 is healthy: got healthy result from https://172.16.120.151:2379 member 7a4ddb7c77253f4b is healthy: got healthy result from https://172.16.120.152:2379
三臺 etcd 的輸出均爲 healthy 時表示集羣服務正常(忽略 warning 信息)。