kubermaster1 192.168.4.11 kubermaster2 192.168.4.12 kubermaster3 192.163.4.13
[root@kubermaster1 etcd-v3.2.11-linux-amd64]# cat /etc/redhat-release CentOS Linux release 7.4.1708 (Core)
這裏部署的etcd集羣使用TLS證書對證書通訊進行加密,並開啓基於CA根證書籤名的雙向數字證書認證。node
cd /usr/local/src wget http://redirector.gvt1.com/edgedl/go/go1.9.2.linux-amd64.tar.gz tar -xvf go1.9.2.linux-amd64.tar.gz -C /usr/local
cat >> /etc/profile << EOF #go的安裝路徑 export GOROOT=/usr/local/go #go安裝的工具路徑 export GOPATH=/apps/local/go export PATH=$GOROOT/bin:$PATH EOF source /etc/profile
GOPATH和GOROOT不能相同linux
配置生效git
[root@kubermaster2 bin]# go version go version go1.9.2 linux/amd64
將會用使用cfssl生成所須要的私鑰和證書github
go get -u github.com/cloudflare/cfssl/cmd/...
會在$GOPATH/bin下安裝cfssl, cfssjosn, mkbundle等工具。golang
{ "signing": { "default": { "expiry": "87600h" }, "profiles": { "aspire": { "usages": [ "signing", "key encipherment", "server auth", "client auth" ], "expiry": "87600h" } } } }
ca-config.json中能夠定義多個profile,分別設置不一樣的expiry和usages等參數。如上面的ca-config.json中定義了名稱爲aspire的profile,這個profile的expiry 87600h爲10年,useages中:shell
{ "CN": "aspire", "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "CN", "ST": "BeiJing", "L": "BeiJing", "O": "aspire", "OU": "cloudnative" } ] }
生成CA證書和私鑰json
cfssl gencert -initca ca-csr.json | cfssljson -bare ca ls ca-config.json ca.csr ca-csr.json ca-key.pem ca.pem
建立etcd證書籤名請求配置etcd-csr.jsonapi
{ "CN": "aspire.etcd", "hosts": [ "127.0.0.1", "192.168.4.11", "192.168.4.12", "192.168.4.13", "kubermaster1", "kubermaster2", "kubermaster3" ], "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "CN", "ST": "BeiJing", "L": "BeiJing", "O": "aspire.etcd", "OU": "Operation and maintenance center" } ] }
該"hosts"是能夠使用該證書域名列表。‘CN’,kube-apiserver從證書中提取該字段做爲請求的用戶名 (User Name);瀏覽器使用該字段驗證網站是否合法;瀏覽器
該"names"值其實是名稱對象的列表。每一個名稱對象應至少包含一個「C」,「L」,「O」,「OU」或「ST」值(或這些的任意組合)。這些值是:app
下面生成etcd的證書和私鑰:
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=aspire etcd-csr.json | cfssljson -bare etcd
對生成的證書能夠使用cfssl或openssl查看
$ cfssl-certinfo -cert etcd.pem { "subject": { ... "cloudnative", "aspire" ] }, "serial_number": "555738010691550377350124675225187029254417657480", "sans": [ "kubermaster1", "kubermaster2", "kubermaster3", "127.0.0.1", "192.168.4.11", "192.168.4.12", "192.168.4.13" ], "not_before": "2017-12-18T06:57:00Z", "not_after": "2027-12-16T06:57:00Z", "sigalg": "SHA256WithRSA", "authority_key_id": "DB:5D:58:25:31:D5:2A:D8:DB:C1:EF:C4:68:B4:B0:13:FA:6B:42:C3", "subject_key_id": "6D:9B:6E:6A:F8:40:4D:4C:03:A4:0F:05:58:E1:9A:72:2E:8E:AB:58", "pem": "-----BEGIN CERTIFICATE-----\nMIIETjCCAzagAwIBAgIUYVgnfkNJEfm75Tye3fynwTrvrogwDQYJKoZIhvcNAQEL\nBQAwaTELMAkGA1UEBhMCQ04xEDAOBgNVBAgTB0JlaUppbmcxEDA... " }
將生成的CA證書ca.pem, etcd祕鑰etcd-key.pem, etcd證書etcd.pem拷貝到各節點的/etc/etcd/ssl目錄中
訪問github https://github.com/coreos/etcd/releases 找到最新安裝包並下載
cd /usr/local/src wget https://github.com/coreos/etcd/releases/download/v3.2.11/etcd-v3.2.11-linux-amd64.tar.gz
解壓縮etcd-v3.2.11-linux-amd64.tar.gz,將其中的etcd和etcdctl兩個可執行文件複製到各節點的/usr/bin目錄。
在各節點建立etcd的數據目錄:
mkdir -p /var/lib/etcd
在每一個節點上建立etcd的systemd unit文件/usr/lib/systemd/system/etcd.service,注意替換ETCD_NAME和INTERNAL_IP變量的值:
export ETCD_NAME=kubermaster3 export INTERNAL_IP=192.168.4.13 cat > /usr/lib/systemd/system/etcd.service <<EOF [Unit] Description=etcd server After=network.target After=network-online.target Wants=network-online.target [Service] Type=notify WorkingDirectory=/var/lib/etcd/ EnvironmentFile=-/etc/etcd/etcd.conf ExecStart=/usr/bin/etcd \ --name ${ETCD_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://${INTERNAL_IP}:2380 \ --listen-peer-urls https://${INTERNAL_IP}:2380 \ --listen-client-urls https://${INTERNAL_IP}:2379,https://127.0.0.1:2379 \ --advertise-client-urls https://${INTERNAL_IP}:2379 \ --initial-cluster-token etcd-cluster-1 \ --initial-cluster node1=https://192.168.4.11:2380,node2=https://192.168.4.12:2380,node3=https://192.168.4.13:2380 \ --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
systemctl daemon-reload systemctl enable etcd systemctl start etcd systemctl status etcd
etcdctl \ --ca-file=/etc/etcd/ssl/ca.pem \ --cert-file=/etc/etcd/ssl/etcd.pem \ --key-file=/etc/etcd/ssl/etcd-key.pem \ --endpoints=https://node1:2379,https://node2:2379,https://node3:2379 \ cluster-health 2017-04-24 19:53:40.545148 I | warning: ignoring ServerName for user-provided CA for backwards compatibility is deprecated 2017-04-24 19:53:40.546127 I | warning: ignoring ServerName for user-provided CA for backwards compatibility is deprecated member 4f2f99d70000fc19 is healthy: got healthy result from https://192.168.61.12:2379 member 99a756f799eb4163 is healthy: got healthy result from https://192.168.61.11:2379 member a9aff19397de2e4e is healthy: got healthy result from https://192.168.61.13:2379 cluster is healthy