04 部署 etcd 组件
etcd 是一个高度一致的分布式键值存储,它提供了一种可靠的方式来存储需要由分布式系统或机器集群访问的数据。它可以优雅地处理网络分区期间的领导者选举,即使在领导者节点中也可以容忍机器故障。
更多内容请移步 etcd 官网详阅。
4.1 获取二进制软件包
在本地主机上操作。
从 GitHub 下载二进制软件包,这里整理了一个 v3.5.2 版本的软件包,里面只包含了 3 个文件:etcd、etcdctl、etcdutl。
官方GitHub:etcd
这里将软件包存放在 /data/k8s-deploy/software
,后面其他组件的软件包也存放在此目录。
解压之后将这些文件分发到 3 台服务器上。
cd /data/k8s-deploy/software
wget https://github.com/pjgmow/etcd/releases/download/v3.5.2/etcd-v3.5.2-linux-amd64.tar.gz
tar xf etcd-v3.5.2-linux-amd64.tar.gz && cd etcd-v3.5.2-linux-amd64
#K8S_HOST=(k8s-master-01 k8s-master-02 k8s-master-03)
#for h in ${K8S_HOST[@]};do scp etcd* root@$h:/usr/local/bin/;done
scp etcd* root@k8s-master-01:/usr/local/bin/
scp etcd* root@k8s-master-02:/usr/local/bin/
scp etcd* root@k8s-master-03:/usr/local/bin/
4.2 生成服务配置文件
在本地主机上操作。
k8s-deploy 提供了 etcd 的配置文件模板,文件中有几个内容需要修改:
__ETCD_NAME__:节点名称,每台服务器要使用不同的名称
__ETCD_DATA_DIR__:etcd 数据存储的目录
__INITIAL_ADVERTISE_PEER_URLS__:告知集群其他节点的 URL
__ADVERTISE_CLIENT_URLS__:告知客户端的 URL, 也就是对外提供服务的 URL
__INITIAL_CLUSTER__:集群中所有节点
__INITIAL_CLUSTER_STATE__:集群状态,new 为新创建集群,existing 为已存在的集群
__INITIAL_CLUSTER_TOKEN__:集群 ID
通过 etcd.yaml 模板来生成 k8s-master-01 的配置文件。
ETCD_NAME=k8s-etcd-01
ETCD_DATA_DIR=/var/lib/etcd/default.etcd
INITIAL_ADVERTISE_PEER_URLS=https://192.168.3.201:2380
ADVERTISE_CLIENT_URLS=https://192.168.3.201:2379
INITIAL_CLUSTER=k8s-etcd-01=https://192.168.3.201:2380,k8s-etcd-02=https://192.168.3.202:2380,k8s-etcd-03=https://192.168.3.203:2380
INITIAL_CLUSTER_STATE=new
INITIAL_CLUSTER_TOKEN=k8s-etcd-cluster
cd /data/k8s-deploy/config
cp etcd.yaml etcd.yaml.k8s-master-01
sed -i "s#__ETCD_NAME__#${ETCD_NAME}#" ./etcd.yaml.k8s-master-01
sed -i "s#__ETCD_DATA_DIR__#${ETCD_DATA_DIR}#" ./etcd.yaml.k8s-master-01
sed -i "s#__INITIAL_ADVERTISE_PEER_URLS__#${INITIAL_ADVERTISE_PEER_URLS}#" ./etcd.yaml.k8s-master-01
sed -i "s#__ADVERTISE_CLIENT_URLS__#${ADVERTISE_CLIENT_URLS}#" ./etcd.yaml.k8s-master-01
sed -i "s#__INITIAL_CLUSTER__#${INITIAL_CLUSTER}#" ./etcd.yaml.k8s-master-01
sed -i "s#__INITIAL_CLUSTER_STATE__#${INITIAL_CLUSTER_STATE}#" ./etcd.yaml.k8s-master-01
sed -i "s#__INITIAL_CLUSTER_TOKEN__#${INITIAL_CLUSTER_TOKEN}#" ./etcd.yaml.k8s-master-01
生成 k8s-master-02 的配置文件。
# 有些变量是重复的,这里修改其中几个即可
ETCD_NAME=k8s-etcd-02
INITIAL_ADVERTISE_PEER_URLS=https://192.168.3.202:2380
ADVERTISE_CLIENT_URLS=https://192.168.3.202:2379
cd /data/k8s-deploy/config
cp etcd.yaml etcd.yaml.k8s-master-02
sed -i "s#__ETCD_NAME__#${ETCD_NAME}#" ./etcd.yaml.k8s-master-02
sed -i "s#__ETCD_DATA_DIR__#${ETCD_DATA_DIR}#" ./etcd.yaml.k8s-master-02
sed -i "s#__INITIAL_ADVERTISE_PEER_URLS__#${INITIAL_ADVERTISE_PEER_URLS}#" ./etcd.yaml.k8s-master-02
sed -i "s#__ADVERTISE_CLIENT_URLS__#${ADVERTISE_CLIENT_URLS}#" ./etcd.yaml.k8s-master-02
sed -i "s#__INITIAL_CLUSTER__#${INITIAL_CLUSTER}#" ./etcd.yaml.k8s-master-02
sed -i "s#__INITIAL_CLUSTER_STATE__#${INITIAL_CLUSTER_STATE}#" ./etcd.yaml.k8s-master-02
sed -i "s#__INITIAL_CLUSTER_TOKEN__#${INITIAL_CLUSTER_TOKEN}#" ./etcd.yaml.k8s-master-02
生成 k8s-master-03 的配置文件。
ETCD_NAME=k8s-etcd-03
INITIAL_ADVERTISE_PEER_URLS=https://192.168.3.203:2380
ADVERTISE_CLIENT_URLS=https://192.168.3.203:2379
cd /data/k8s-deploy/config
cp etcd.yaml etcd.yaml.k8s-master-03
sed -i "s#__ETCD_NAME__#${ETCD_NAME}#" ./etcd.yaml.k8s-master-03
sed -i "s#__ETCD_DATA_DIR__#${ETCD_DATA_DIR}#" ./etcd.yaml.k8s-master-03
sed -i "s#__INITIAL_ADVERTISE_PEER_URLS__#${INITIAL_ADVERTISE_PEER_URLS}#" ./etcd.yaml.k8s-master-03
sed -i "s#__ADVERTISE_CLIENT_URLS__#${ADVERTISE_CLIENT_URLS}#" ./etcd.yaml.k8s-master-03
sed -i "s#__INITIAL_CLUSTER__#${INITIAL_CLUSTER}#" ./etcd.yaml.k8s-master-03
sed -i "s#__INITIAL_CLUSTER_STATE__#${INITIAL_CLUSTER_STATE}#" ./etcd.yaml.k8s-master-03
sed -i "s#__INITIAL_CLUSTER_TOKEN__#${INITIAL_CLUSTER_TOKEN}#" ./etcd.yaml.k8s-master-03
配置文件生成之后,将这些文件分发到 3 台服务器上。
不同服务器用的配置文件不同,不要搞错配置文件了。
#K8S_HOST=(k8s-master-01 k8s-master-02 k8s-master-03)
#for h in ${K8S_HOST[@]};do scp etcd.yaml.$h root@$h:/etc/kubernetes/conf/etcd.yaml;done
scp etcd.yaml.k8s-master-01 root@k8s-master-01:/etc/kubernetes/conf/etcd.yaml
scp etcd.yaml.k8s-master-02 root@k8s-master-02:/etc/kubernetes/conf/etcd.yaml
scp etcd.yaml.k8s-master-03 root@k8s-master-03:/etc/kubernetes/conf/etcd.yaml
4.3 生成服务启动管理文件
在本地主机上操作。
k8s-deploy 已提供了服务启动管理文件,不需要修改内容,直接分发到 3 台服务器即可。
cd /data/k8s-deploy/service
#K8S_HOST=(k8s-master-01 k8s-master-02 k8s-master-03)
#for h in ${K8S_HOST[@]};do scp etcd.service root@$h:/etc/systemd/system/;done
scp etcd.service root@k8s-master-01:/etc/systemd/system/
scp etcd.service root@k8s-master-02:/etc/systemd/system/
scp etcd.service root@k8s-master-03:/etc/systemd/system/
4.4 启动 etcd 服务
在本地主机上操作。
建议打开 3 个窗口,然后依次启动 etcd 服务,也可以多窗口同时启动。
服务配置文件和服务启动管理文件都分发之后,分别登录到 3 台服务器上启动 etcd 服务。
systemctl daemon-reload
systemctl enable etcd
systemctl start etcd
systemctl status etcd
4.5 检测 etcd 集群状态
在本地主机上操作。
3 台服务器的 etcd 服务状态都是正常情况下,通过 etcdctl 命令来检测一下集群是否能够正常对外提供服务。
cd /data/k8s-deploy/software/etcd-v3.5.2-linux-amd64
ETCDCTL_API=3 ./etcdctl -w table --endpoints=https://192.168.3.201:2379 \
--cacert=/data/k8s-deploy/tls-csr/ca.pem \
--cert=/data/k8s-deploy/tls-csr/etcd.pem \
--key=/data/k8s-deploy/tls-csr/etcd-key.pem \
member list
执行命令后正常的返回结果如下。