创建高可用etcd集群
Etcd服务作为kubernetes集群的主数据库,保存了整个kubernetes集群的所有服务信息状态,Etcd主数据库需要在kubernetes各服务之前安装和启动。Etcd服务挂了,kubernete集群也将挂掉。这里,我们将Etcd服务部署在master01、master02、master03这三个节点上做高可用,Etcd集群采用Raft算法选举Leader, 由于Raft算法在做决策时需要多数节点的投票,所以Etcd一般部署集群推荐奇数个节点,推荐的数量为1、3、5或者7个节点构成一个集群(当然数量1时,即单节点)。
官方地址 https://github.com/coreos/etcd/releases
etcd 集群节点规划:
hostname | IP地址 | 节点说明 |
master01 | 192.168.0.143 | 主节点(复用node节点) |
master02 | 192.168.0.144 | 主节点 |
maste03 | 192.168.0.145 | 主节点 |
下面以master01节点(192.168.0.143)为例 ,部署ETCD主数据库。
1.1 关于TLS证书
需要为etcd集群创建加密通信的TLS证书,这里复用以前床架你的kubernetes证书:
admin.pem admin-key.pem ca.pem ca-key.pem kube-proxy.pem kube-proxy-key.pem kubernetes.pem kubernetes-key.pem |
- kubernetes证书的host字段列表中必须宝行上面三台机器的IP和集群虚IP(如果没有配置,后期可以重新匹配好,再重新生成kubernete证书和私钥),否则后续证书校验会失败。
1.2 下载etcd二进制文件
etcd作为kubernetes的存储数据库,使用二进制方式独立安装的时候需注意:
wget https://github.com/coreos/etcd/releases/download/v3.1.5/etcd-v3.1.5-linux-amd64.tar.gz
tar –xvf etcd-v3.1.5-linux-amd64.tar.gz mv etcd-v3.1.5-linux-amd64/etcd* /usr/local/bin
#当然,我们可以自己指定安装目录,但是需要配置对应的环境变量,具体操作如下: mv etcd-v3.1.5-linux-amd64/etcd* /opt/kubernetes/bin #配置对应的环境变量,修改文件 vi /etcd/profile,然后加入环境变量: export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/opt/kubernetes/bin 这样就可以开心的使用etcdctl命令了。。。 |
1.3 创建etcd的服务启动文件
路径:/usr/lib/systemd/system
etcd服务启动文件:etcd.service
[Unit] Description=Etcd Server After=network.target After=network-online.target Wants=network-online.target
[Service] Type=notify EnvironmentFile=-/opt/kubernetes/config/etcd ExecStart=/opt/kubernetes/bin/etcd \ --name=${ETCD_NAME} \ --data-dir=${ETCD_DATA_DIR} \ --listen-peer-urls=${ETCD_LISTEN_PEER_URLS} \ --listen-client-urls=${ETCD_LISTEN_CLIENT_URLS},http://127.0.0.1:2379 \ --advertise-client-urls=${ETCD_ADVERTISE_CLIENT_URLS} \ --initial-advertise-peer-urls=${ETCD_INITIAL_ADVERTISE_PEER_URLS} \ --initial-cluster=${ETCD_INITIAL_CLUSTER} \ --initial-cluster-token=${ETCD_INITIAL_CLUSTER_TOKEN} \ --initial-cluster-state=${ETCD_INITIAL_CLUSTER_STATE} \ --cert-file=/opt/kubernetes/ssl/kubernetes.pem \ --key-file=/opt/kubernetes/ssl/kubernetes-key.pem \ --peer-cert-file=/opt/kubernetes/ssl/kubernetes.pem \ --peer-key-file=/opt/kubernetes/ssl/kubernetes-key.pem \ --trusted-ca-file=/opt/kubernetes/ssl/ca.pem \ --peer-trusted-ca-file=/opt/kubernetes/ssl/ca.pem Restart=on-failure LimitNOFILE=65536
[Install] WantedBy=multi-user.target
|
1.4 创建etcd的参数配置文件
路径:/opt/kubernetes/config
etcd参数配置文件:etcd
#[Member] ETCD_NAME="master01" ETCD_DATA_DIR="/var/lib/etcd/default.etcd" ETCD_LISTEN_PEER_URLS="https://192.168.0.143:2380" ETCD_LISTEN_CLIENT_URLS="https://192.168.0.143:2379"
#[Clustering] ETCD_INITIAL_ADVERTISE_PEER_URLS="https://192.168.0.143:2380" ETCD_ADVERTISE_CLIENT_URLS="https://192.168.0.143:2379" ETCD_INITIAL_CLUSTER="master01=https://192.168.0.143:2380,master02=https://192.168.0.144:2380,master03=https://192.168.0.145:2380" ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster" ETCD_INITIAL_CLUSTER_STATE="existing"
|
1.5 分发etcd文件
我们这次要配置一个具有3个节点的ETCD集群,因此我们可以复用上边配置好的etcd文件,只需修改一下其中的部分参数即可。
先向剩余节点上分发etcd文件:
#分发etcd参数配置文件 [root@master01 config]# scp etcd 192.168.0.144:/opt/kubernetes/config/ [root@master01 config]# scp etcd 192.168.0.144:/opt/kubernetes/config/ #分发etcd服务启动文件 [root@master01 system]# scp etcd.service 192.168.0.144:/usr/lib/systemd/system [root@master01 system]# scp etcd.service 192.168.0.145:/usr/lib/systemd/system |
1.6 etcd高可用问题
在实现etcd高可用集群部署前,我们需要思考以下几个问题:
【1】etcd启动状态时,数据记录如何处理?
在etcd参数配置文件中有几个关键参数:
ETCD_DATA_DIR="/var/lib/etcd/default.etcd":指定节点的数据存储目录,该目录需要在启动etcd服务之前进行创建。
ETCD_INITIAL_CLUSTER_STATE,它表示当前集群的状态。关于这个参数我们其实最常用的就两种状“new”和“existing”。
- 集群状态为new时,每当etcd服务开启,kubernetes集群等于是开启了一个etcd新的服务,etcd的数据记录从服务启动这一刻开始,然后存储在ETCD_DATA_DIR指定的节点数据存储目录下,如果存储目录原先已有数据,也会将其覆盖掉,更新为最新数据记录。
- 当集群状态为existing时,每当开启etcd服务,kubernetes集群不会从服务开启的这一刻去记录存储数据,而是先从ETCD_DATA_DIR指定的节点数据目录下读取已有存储的数据,并以该数据为原子数据,正式开启etcd服务。
【2】如何保证etcd集群的高可用性?
了解到上面两个参数用途后,我们就可以去部署etcd高可用集群,当然,我们先把原始数据一并擦除掉,在开启master01节点的etcd服务时,master01上etcd服务参数ETCD_INITIAL_CLUSTER_STAT=“new”,保证我们先开启一个etcd服务,并以此为数据记录,依次#etcd member add <masterName> --peer-urls=<masterIP>来加入新的节点etcd服务,后边再启动其他ETCD服务时,kubernetes会自动同步存储数据,保证三台机器上etcd数据一致。
1.7 etcd集群高可用部署
这里我们开始着手部署ETCD高可用集群,基于前边关于etcd配置内容,这里我们逐一在三台master节点进行配置。
1.7.1 master01节点上部署etcd
【1】参数配置文件
路径:/opt/kubernetes/config
etcd参数配置文件:
#[Member] ETCD_NAME="master01" ETCD_DATA_DIR="/var/lib/etcd/default.etcd" ETCD_LISTEN_PEER_URLS="https://192.168.0.143:2380" ETCD_LISTEN_CLIENT_URLS="https://192.168.0.143:2379"
#[Clustering] ETCD_INITIAL_ADVERTISE_PEER_URLS="https://192.168. 0.143:2380" ETCD_ADVERTISE_CLIENT_URLS="https://192.168. 0.143:2379" ETCD_INITIAL_CLUSTER="master01=https://192.168. 0.143:2380" ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster" ETCD_INITIAL_CLUSTER_STATE="new" |
首先,我们配置master01节点上etcd,集群节点ETCD_INITIAL_CLUSTER="master01=https://192.168. 0.143:2380",这里我们只配置当前etcd所在主机的节点地址;集群状态ETCD_INITIAL_CLUSTER_STATE="new"先设置为new,这样相当于重新开启的etcd服务为最新的节点服务,/var/lib/etcd/default.etcd目录下存储的数据为最新的,无污染数据。关于etcd的服务文件,三台机器均可以复用上边1.2节内容,不再赘述。
然后开启etcd:
#systemctl daemon-reload #systemctl start etcd #systemctl enable etcd #systemctl status etcd |
使用#etcdctl member list查看一下etcd集群现在状态:
[root@master01 bin]# etcdctl member list a6a9938eeb55321c, started, master01, https://192.168.0.143:2380, https://192.168.0.143:2379 |
这个时候集群只能看到master01节点,接下来我们需要将master02和master03节依次加入集群中:
1.7.2 新加入master02节点到集群
在加入master02节点前,我们需要配置一下master02节点上etcd的参数配置文件:
#[Member] ETCD_NAME="master02" ETCD_DATA_DIR="/var/lib/etcd/default.etcd" ETCD_LISTEN_PEER_URLS="https://192.168.0.144:2380" ETCD_LISTEN_CLIENT_URLS="https://192.168.0.144:2379"
#[Clustering] ETCD_INITIAL_ADVERTISE_PEER_URLS="https://192.168. 0.144:2380" ETCD_ADVERTISE_CLIENT_URLS="https://192.168. 0.144:2379" ETCD_INITIAL_CLUSTER="master01=https://192.168. 0.143:2380,master02=https://192.168. 0.144:2380" ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster" ETCD_INITIAL_CLUSTER_STATE="existing" |
我们发现,master02节点上集群地址和master01上有不同,这里我们将143和144这两台机器的地址均配进去了,且集群状态为existing,这样操作是因为,master01上已经开启etcd服务了,历史数据已经存储下来,master02节点加入时,不必再重新覆盖历史记录,加入到集群后,etcd新节点加入的数据记录将由kubernetes集群自动同步,只要启动master02上etcd服务后,两台机器的etcd数据将会同步,因此,状态改为existing直接使用历史记录即可。
这里,我们在master01主机上使用如下命令:
加入master02节点:
#etcdctl member add master02 --peer-urls="htps://192.168.0.144:2380" |
查看节点:
#etcd member list
a6a9938eeb55321c, started, master01, https://192.168.0.143:2380, https://192.168.0.143:2379
f1349996cc39ffdc, unstarted, , https://192.168.0.144:2379
这时,我们需要开启master02上的etcd服务,让集群将master01和master02机器进行同步。
1.7.3 新加入master03节点到集群
在加入master03节点前,我们需要配置一下master03节点上etcd的参数配置文件:
#[Member] ETCD_NAME="master03" ETCD_DATA_DIR="/var/lib/etcd/default.etcd" ETCD_LISTEN_PEER_URLS="https://192.168.0.145:2380" ETCD_LISTEN_CLIENT_URLS="https://192.168.0.145:2379"
#[Clustering] ETCD_INITIAL_ADVERTISE_PEER_URLS="https://192.168.0.145:2380" ETCD_ADVERTISE_CLIENT_URLS="https://192.168.0.145:2379" ETCD_INITIAL_CLUSTER="master01=https://192.168.0.143:2380,master02=https://192.168.0.144:2380,master03=https://192.168.0.145:2380" ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster" ETCD_INITIAL_CLUSTER_STATE="existing" |
部署原理同上,这里我们需要开启master03上的etcd服务,让集群将master01、master02和master03机器数据进行同步。
1.7.4 移除节点
移除节点,命令:
# etcdctl member remove <master_ID> |
1.7.5 注意事项
- 配置kubernetes各个组件时,优先做好节点规划、TLS证书创建和etcd服务配置这几项,然后再进行下一步其它组件部署;
- 三台机器上etcd数据存储均在各自的/var/lib/etcd/default.etcd目录下,且该出处目录先于etcd服务开启前创建,非异常情况下,尽量不要动这个文件夹下的数据;
- 如果需要移除节点,然后重新加入集群,步骤:1、remove移除目标节点;2、擦除节目标点上数据存储目录;3、如果需要重新加入到集群时,必须先擦除目标节点的etcd上存储的数据记录,然后再重启目标节点上的etcd服务;
- 如果反向操作上述步骤,集群将出现异常,etcd服务也会异常。
1.8 验证一下集群服务
[root@master01 bin]# etcdctl member list a6a9938eeb55321c, started, master01, https://192.168.0.143:2380, https://192.168.0.143:2379 f1349996cc39ffdc, started, master02, https://192.168.0.144:2380, https://192.168.0.144:2379 2848385346d30eb, started, master03, https://192.168.0.145:2380, https://192.168.0.145:2379 |
最后,因为我们不需要每次使用集群的时候都开启最新的etcd服务,因此,将三台机器上的etcd集群状态保持一致,即existing,这样集群每次启动都会去历史数据里边读取,并依次将数据同步到三台机器的存储目录下。
而且,为了保持三台机器高可用性和故障时节点自由选举特性,我们需要将三台机器的IP地址均加入到集群中,这里就需要保持ETCD_INITIAL_CLUSTER="master01=https://192.168.0.143:2380,master02=https://192.168.0.144:2380,master03=https://192.168.0.145:2380"在三台节点上是保持一致的。只需修改master01和master02上etcd参数配置文件即可。
通过上述部署操作,我们实现etcd高可用集群部署。之后系列中,我们将部署master节点。