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


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

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

  1. 内网环境下手动部署kubernetes(v1.26.3)高可用集群

    这篇博客主要是记录了手动部署一个高可用的Kubernetes集群的过程.旨在帮助自己及初学者学习kubernetes,并记录下具体的操作过程和总结的知识点.文中可能存在一些问题或不足之处,仅供参考. ...

  2. OpenStack Train Magnum部署Kubernetes(2)--使用OpenStack界面部署虚拟机

    登录OpenStack Dashboard Chrome http://192.168.166.184 admin/admin 上传镜像 项目-计算-镜像 上传cirros镜像 通过界面或者命令行上传 ...

  3. 部署Kubernetes集群(二进制 v1.18.8版)

    第一章 kubernetes 功能介绍 · kubernetes 从入门到实践 · 看云 二进制 部署Kubernetes集群 组件版本 组件 版本 二进制包下载地址 备注 centos 7.8.20 ...

  4. Ubuntu16.04多主机集群上手动部署Kubernetes,配置docker私有registry,配置Kubernetes-dashboard WEB ui

    Ubuntu16.04多主机集群上手动部署Kubernetes,配置docker私有registry,配置Kubernetes-dashboard WEB ui 2017年03月17日 20:51:4 ...

  5. ② kubeadm快速部署Kubernetes集群

    文章目录 1. 安装要求 2. 目标 3. 准备环境 4. 所有节点安装Docker/kubeadm/kubelet 4.1 安装Docker(以一台为例,其他相同) 4.2 添加kubernetes ...

  6. Kubernetes(k8s)集群部署(k8s企业级Docker容器集群管理)系列目录

    0.目录 整体架构目录:ASP.NET Core分布式项目实战-目录 k8s架构目录:Kubernetes(k8s)集群部署(k8s企业级Docker容器集群管理)系列目录 一.感谢 在此感谢.net ...

  7. Kubernetes 生产环境安装部署 基于 Kubernetes v1.14.0 之 etcd集群

    说明:没有明确注明在某台服务器,都是在k8s-operation 工作服务器完成 K8S node 节点数大于2000 节点 k8s-operation 目录规划,工作目录/apps/work/k8s ...

  8. kubeadm部署kubernetes

    kubeadm部署kubernetes kubeadm 部署方式介绍 单master节点环境准备 卸载kubernetes kubeadm init命令文档 kubeadm 部署方式介绍 1.使用ku ...

  9. Kubernetes的四种用户部署场景

    http://www.dockone.io/article/2359 Kubernetes可以作为容器编排引擎.PaaS或者作为云原生应用的核心基础架构被用户部署到生产环境.这些用例并不是相互排斥的. ...

  10. [原]部署kubernetes dashboard(二)

    #######################    以下为声明  ##################### 此文档是之前做笔记在两台机上进行的实践,kubernetes处于不断开发阶段 不能保证每 ...

最新文章

  1. 粒子群(pso)算法详解matlab代码,粒子群(pso)算法详解matlab代码
  2. dedecms--数据库
  3. python安装没有pip选项_python-3.x – 在ubuntu上没有pip的python安装
  4. Makefile的补充学习
  5. Effective java笔记3--类和接口1
  6. DataTable中Compute计算函数
  7. vmstat命令 查看内存、CPU占用
  8. android直播刷礼物特效,Android直播送礼物发消息页面(仿印客直播)
  9. 硬盘数据恢复方法有哪些?希望这些方法能帮助你
  10. 合作模式歌利亚机器人_《歌利亚》画面战斗及机器人制作试玩图文心得 歌利亚好玩吗...
  11. Android 中光线传感器的使用详解
  12. login.keyring的问题
  13. 开源测试平台RunnerGo,测试工程师必备
  14. 如果万物数连,那么建筑应当如何与大数据结合?
  15. C# 开发企业内部微应用接入钉钉获取用户信息
  16. 彻底的理解:WebService到底是什么?
  17. 聊聊网络安全态势感知之一
  18. Joomla目录遍历及远程代码(CVE-2021-23132)--避坑指南
  19. 【项目实战开发】第三章——在线生鲜商城系统
  20. 安卓之ViewFlipper实现渐变视差导航页

热门文章

  1. ElasticSearch全文搜索引擎之整合SpringBoot篇
  2. JDK-阻塞队列、非阻塞队列原理
  3. Mybatis原理解析(一)解析全局xml配置文件生成SqlSessionFactory过程
  4. WLC5520无法通过无线客户端进行网管故障解决
  5. github 新建远程仓库 及 删除远程仓库
  6. 开源,想说爱你不容易
  7. iOS,Core Graphics
  8. ThreadLocal类及常用的线程安全类探究
  9. android 应用程序Activity之间数据传递与共享的几种途径
  10. 中国传媒大学公开课:理解人类传播