# [2020.05.18] ETCD cluster
[toc]
>[name=weng yichiun]
###### tags: `ETCD`
- 3個node做cluster
- 開啟tls功能
- 三台vm各自用docker
- 192.168.56.131-133
```=
/etc/hosts
127.0.0.1 localhost
127.0.1.1 k8s_etcd03
192.168.56.131 k8s_etcd01
192.168.56.132 k8s_etcd02
192.168.56.133 k8s_etcd03
```
## 憑證
### CA
```=
mkdir -p /etc/etcd-certs/
cd /etc/etcd-certs/
cfssl print-defaults config > ca-config.json
cfssl print-defaults csr > ca-csr.json
vim ca-config.json
```
- ca-config
:::spoiler ca-config.json
```json=
{
"signing": {
"default": {
"expiry": "438000h"
},
"profiles": {
"server": {
"expiry": "438000h",
"usages": [
"signing",
"key encipherment",
"server auth"
]
},
"client": {
"expiry": "438000h",
"usages": [
"signing",
"key encipherment",
"client auth"
]
},
"peer": {
"expiry": "438000h",
"usages": [
"signing",
"key encipherment",
"client auth",
"server auth"
]
}
}
}
}
```
:::
- ca-csr
```=
vim ca-csr.json
```
:::spoiler ca-csr.json
```json=
{
"CN": "etcd",
"key": {
"algo": "ecdsa",
"size": 256
}
}
```
:::
- 產生CA
```=
cfssl gencert -initca ca-csr.json | cfssljson -bare ca -
```
- 產生三個檔案
- ca.csr, 證書請求文件,實際上是cfssl的一個中間文件,由上述配置文件生成,其中的關鍵信息是通信實體的基本信息和一對公私密鑰,這些內容將用於簽發證書。
- ca.pem, 證書文件,即上面提到的根CA證書,需要保存到所有服務器和客戶端上,用於驗證通信過程中交互的證書。與CA證書是自簽證書,其實就是用證書請求文件中的私鑰對其他信息包括公鑰簽名的過程。
- ca-key.pem, 私鑰文件,可用於驗證ca.pem, 日常通信不會使用,應該離線保存。
```
root@k8s_etcd03:/etc/kubernetes/etcd2# ll
total 28
drwxr-xr-x 2 root root 4096 May 12 12:18 ./
drwxr-xr-x 4 root root 4096 May 11 12:03 ../
-rw-r--r-- 1 root root 582 May 12 12:16 ca-config.json
-rw-r--r-- 1 root root 387 May 12 12:18 ca.csr
-rw-r--r-- 1 root root 176 May 12 12:17 ca-csr.json
-rw------- 1 root root 227 May 12 12:18 ca-key.pem
-rw-r--r-- 1 root root 664 May 12 12:18 ca.pem
```
### 建立server cert
- gen server cert
```=
cfssl print-defaults csr > server.json
vim server.json
```
:::spoiler server.json
```json=
{
"CN": "etcd",
"hosts": [
"192.168.56.131",
"192.168.56.132",
"192.168.56.133",
"127.0.0.1",
"localhost",
"etcd"
],
"key": {
"algo": "ecdsa",
"size": 256
},
"names": [
{
"C": "US",
"L": "CA",
"ST": "San Francisco"
}
]
}
```
:::
- gen cert , private key
```
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=server server.json | cfssljson -bare server
```
```
root@k8s_etcd03:/etc/etcd-certs# ll
total 44
drwxr-xr-x 2 root root 4096 May 12 15:04 ./
drwxr-xr-x 4 root root 4096 May 11 12:03 ../
-rw-r--r-- 1 root root 577 May 12 15:01 ca-config.json
-rw-r--r-- 1 root root 347 May 12 15:01 ca.csr
-rw-r--r-- 1 root root 87 May 12 15:01 ca-csr.json
-rw------- 1 root root 227 May 12 15:01 ca-key.pem
-rw-r--r-- 1 root root 591 May 12 15:01 ca.pem
-rw-r--r-- 1 root root 481 May 12 15:04 server.csr
-rw-r--r-- 1 root root 278 May 12 15:04 server.json
-rw------- 1 root root 227 May 12 15:04 server-key.pem
-rw-r--r-- 1 root root 721 May 12 15:04 server.pem
```
### 建立client cert
```
cfssl print-defaults csr > client.json
vim client.json
```
:::spoiler client.json
```
{
"CN": "etcd-client",
"key": {
"algo": "ecdsa",
"size": 256
}
}
```
:::
```
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=client client.json | cfssljson -bare client
```
### 建立peer之間的cert
```
cfssl print-defaults csr > etcd01-peer-csr.json
vim etcd01-peer-csr.json
```
:::spoiler etcd01-peer-csr.json
```
{
"CN": "etcd01-peer",
"hosts": [
"192.168.56.131",
"192.168.56.132",
"192.168.56.133",
"127.0.0.1",
"localhost",
"etcd"
],
"key": {
"algo": "ecdsa",
"size": 256
},
"names": [
{
"C": "US",
"L": "CA",
"ST": "San Francisco"
}
]
}
```
:::
- gen
```=
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=peer etcd01-peer-csr.json | cfssljson -bare etcd01-peer
-rw-r--r-- 1 root root 489 May 15 16:18 etcd01-peer.csr
-rw-r--r-- 1 root root 315 May 15 16:13 etcd01-peer-csr.json
-rw------- 1 root root 227 May 15 16:18 etcd01-peer-key.pem
-rw-r--r-- 1 root root 745 May 15 16:18 etcd01-peer.pem
```
## cluster node
- 3台vm各自安裝docker
```=
sudo apt install docker.io -y
docker pull quay.io/coreos/etcd:v3.3.13
```
- 跟node1 拿server憑證, ca,peer憑證
```
scp webuser@node_01:/etc/etcd-certs/server*.pem /etc/etcd-certs/
scp webuser@node_01:/etc/etcd-certs/ca*.pem /etc/etcd-certs/
scp webuser@node_01:/etc/etcd-certs/etcd01*.pem /etc/etcd-certs/
```
### docker-compose yaml
#### node1 192.168.56.131
```=
version: '3'
services:
etcd:
image: quay.io/coreos/etcd:v3.3.13
network_mode: "host"
volumes:
- /etc/etcd-certs/:/etc/etcd-certs/
- /root/etcd_cluster/:/etcd-data/
environment:
- ETCD_NAME=etcd_01
- ETCD_DATA_DIR=/etcd-data/
- ETCD_INITIAL_CLUSTER=etcd_01=https://192.168.56.131:2380,etcd_02=https://192.168.56.132:2380,etcd_03=https://192.168.56.133:2380
- ETCD_INITIAL_CLUSTER_STATE=new
- ETCD_INITIAL_CLUSTER_TOKEN=ycw-etcd-token
- ETCD_LISTEN_CLIENT_URLS=https://192.168.56.131:2379,https://127.0.0.1:2379
- ETCD_ADVERTISE_CLIENT_URLS=https://192.168.56.131:2379
- ETCD_LISTEN_PEER_URLS=https://192.168.56.131:2380
- ETCD_INITIAL_ADVERTISE_PEER_URLS=https://192.168.56.131:2380
- ETCD_CERT_FILE=/etc/etcd-certs/server.pem
- ETCD_KEY_FILE=/etc/etcd-certs/server-key.pem
- ETCD_TRUSTED_CA_FILE=/etc/etcd-certs/ca.pem
- ETCD_CLIENT_CERT_AUTH
- ETCD_CLIENT_CRL_FILE=/etc/etcd-certs/client.pem
- ETCD_PEER_CERT_FILE=/etc/etcd-certs/etcd01-peer.pem
- ETCD_PEER_KEY_FILE=/etc/etcd-certs/etcd01-peer-key.pem
- ETCD_PEER_TRUSTED_CA_FILE=/etc/etcd-certs/ca.pem
- ETCD_PEER_CLIENT_CERT_AUTH
ports:
- "2379:2379"
- "2380:2380"
container_name: etcd
```
#### node2 192.168.56.132
```=
version: '3'
services:
etcd:
image: quay.io/coreos/etcd:v3.3.13
network_mode: "host"
volumes:
- /etc/etcd-certs/:/etc/etcd-certs/
- /root/etcd_cluster/:/etcd-data/
environment:
- ETCD_NAME=etcd_02
- ETCD_DATA_DIR=/etcd-data/
- ETCD_INITIAL_CLUSTER=etcd_01=https://192.168.56.131:2380,etcd_02=https://192.168.56.132:2380,etcd_03=https://192.168.56.133:2380
- ETCD_INITIAL_CLUSTER_STATE=new
- ETCD_INITIAL_CLUSTER_TOKEN=ycw-etcd-token
- ETCD_LISTEN_CLIENT_URLS=https://192.168.56.132:2379,https://127.0.0.1:2379
- ETCD_ADVERTISE_CLIENT_URLS=https://192.168.56.132:2379
- ETCD_LISTEN_PEER_URLS=https://192.168.56.132:2380
- ETCD_INITIAL_ADVERTISE_PEER_URLS=https://192.168.56.132:2380
- ETCD_CERT_FILE=/etc/etcd-certs/server.pem
- ETCD_KEY_FILE=/etc/etcd-certs/server-key.pem
- ETCD_TRUSTED_CA_FILE=/etc/etcd-certs/ca.pem
- ETCD_CLIENT_CERT_AUTH
- ETCD_CLIENT_CRL_FILE=/etc/etcd-certs/client.pem
- ETCD_PEER_CERT_FILE=/etc/etcd-certs/etcd01-peer.pem
- ETCD_PEER_KEY_FILE=/etc/etcd-certs/etcd01-peer-key.pem
- ETCD_PEER_TRUSTED_CA_FILE=/etc/etcd-certs/ca.pem
- ETCD_PEER_CLIENT_CERT_AUTH
ports:
- "2379:2379"
- "2380:2380"
container_name: etcd
```
#### node3 192.168.56.133
```=
version: '3'
services:
etcd:
image: quay.io/coreos/etcd:v3.3.13
network_mode: "host"
volumes:
- /etc/etcd-certs/:/etc/etcd-certs/
- /root/etcd_cluster/:/etcd-data/
environment:
- ETCD_NAME=etcd_03
- ETCD_DATA_DIR=/etcd-data/
- ETCD_INITIAL_CLUSTER=etcd_01=https://192.168.56.131:2380,etcd_02=https://192.168.56.132:2380,etcd_03=https://192.168.56.133:2380
- ETCD_INITIAL_CLUSTER_STATE=new
- ETCD_INITIAL_CLUSTER_TOKEN=ycw-etcd-token
- ETCD_LISTEN_CLIENT_URLS=https://192.168.56.133:2379,https://127.0.0.1:2379
- ETCD_ADVERTISE_CLIENT_URLS=https://192.168.56.133:2379
- ETCD_LISTEN_PEER_URLS=https://192.168.56.133:2380
- ETCD_INITIAL_ADVERTISE_PEER_URLS=https://192.168.56.133:2380
- ETCD_CERT_FILE=/etc/etcd-certs/server.pem
- ETCD_KEY_FILE=/etc/etcd-certs/server-key.pem
- ETCD_TRUSTED_CA_FILE=/etc/etcd-certs/ca.pem
- ETCD_CLIENT_CERT_AUTH
- ETCD_CLIENT_CRL_FILE=/etc/etcd-certs/client.pem
- ETCD_PEER_CERT_FILE=/etc/etcd-certs/etcd01-peer.pem
- ETCD_PEER_KEY_FILE=/etc/etcd-certs/etcd01-peer-key.pem
- ETCD_PEER_TRUSTED_CA_FILE=/etc/etcd-certs/ca.pem
- ETCD_PEER_CLIENT_CERT_AUTH
ports:
- "2379:2379"
- "2380:2380"
container_name: etcd
```
### 運行
- 三台啟動
`docker-compose up -d`
- 對任何一台put/set(看版本) 3.4以後是put
```=
docker exec -it etcd etcdctl --cert-file /etc/etcd-certs/client.pem --key-file /etc/etcd-certs/client-key.pem -ca-file /etc/etcd-certs/ca.pem --endpoints https://127.0.0.1:2379 set foo bar
```
- get
```=
docker exec -it etcd etcdctl --cert-file /etc/etcd-certs/client.pem --key-file /etc/etcd-certs/client-key.pem -ca-file /etc/etcd-certs/ca.pem --endpoints https://127.0.0.1:2379 get foo
docker exec -it etcd etcdctl --cert-file /etc/etcd-certs/client.pem --key-file /etc/etcd-certs/client-key.pem -ca-file /etc/etcd-certs/ca.pem --endpoints https://192.168.56.132:2379 get foo
```
## one node
```=
etcd --name test_01 --data-dir /root/etcd-dir --listen-client-urls https://192.168.254.129:2379,https://127.0.0.1:2379 --advertise-client-urls https://192.168.254.129:2379 --ca-file=/etc/etcd-certs/ca.pem --client-cert-auth --trusted-ca-file=/etc/etcd-certs/ca.pem --cert-file=/etc/etcd-certs/server.pem --key-file=/etc/etcd-certs/server-key.pem
etcdctl --cert-file /etc/etcd-certs/client.pem --key-file /etc/etcd-certs/client-key.pem -ca-file /etc/etcd-certs/ca.pem -endpoints https://192.168.254.129:2379 cluster-health
```