(8)二进制文件方式部署Kubernetes高可用集群----------部署高可用ETCD集群

创建高可用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

参数说明:

--cert-file=/opt/kubernetes/ssl/kubernetes.pem \:etcd的公钥

--key-file=/opt/kubernetes/ssl/kubernetes-key.pem \:etcd的私钥

--peer-cert-file=/opt/kubernetes/ssl/kubernetes.pem \:peer节点通讯的公钥

--peer-key-file=/opt/kubernetes/ssl/kubernetes-key.pem \:peer节点通讯的私钥

--peer-trusted-ca-file=/opt/kubernetes/ssl/ca.pem \:peer节点通讯的CA证书

--trusted-ca-file=/opt/kubernetes/ssl/ca.pem:客户端的CA证书

 

 

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"

 

参数说明:

#[Member]

ETCD_NAME="master01":集群的名称

ETCD_DATA_DIR="/var/lib/etcd/default.etcd":指定节点的数据存储目录,该目录需要在启动etcd服务之前进行创建。

ETCD_LISTEN_PEER_URLS=https://192.168.0.143:2380:监听URL,用于与其它节点通讯

ETCD_LISTEN_CLIENT_URLS=https://192.168.0.143:2379:监听URL,用于与客户端通讯

 

#[Clustering]

ETCD_INITIAL_ADVERTISE_PEER_URLS=https://192.168.0.143:2380:告知集群其他节点URL

ETCD_ADVERTISE_CLIENT_URLS=https://192.168.0.143:2379:告知客户端URL,也就是服务URL

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":集群的ID

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 --peer-urls=来加入新的节点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

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节点。


愿你就像早晨八九点钟的太阳,活力十足,永远年轻。

你可能感兴趣的:((8)二进制文件方式部署Kubernetes高可用集群----------部署高可用ETCD集群)