K8S安装过程六:etcd 集群安装

1 ETCD 基本信息介绍

1.1 ETCD 官方定义

etcd is a strongly consistent, distributed key-value store that provides a reliable way to store data that needs to be accessed by a distributed system or cluster of machines. It gracefully handles leader elections during network partitions and can tolerate machine failure, even in the leader node.

1.2 ETCD 集群部署形式

  • 静态发现。启动 etcd 服务的时候,通过参数 --initial-cluster 添加所有的 etcd 节点信息。
  • ETCD 动态发现。通过已经存在的 etcd 集群来管理当前需要部署的 etcd 集群。
  • DNS 动态发现。
    通常 ETCD 集群规模在3个节点或5个节点就能满足很多业务场景的需求。所以,采用静态发现的形式部署ETCD集群相对其他几种方式更容易实现。

2. 安装准备

2.1 机器信息

节点名称 节点IP OS版本 ETCD版本
node1 192.168.0.233 CentOS 7.9 v3.5.4
node2 192.168.0.200 CentOS 7.9 v3.5.4
node3 192.168.0.145 CentOS 7.9 v3.5.4

ETCD 集群采用一主多从的架构。ETCD 集群中任何一个节点都可能成为主节点,节点之间选举主节点采用 Raft 一致性算法。Raft 算法需要一半以上的节点同意才能成为主节点,当节点数量为偶数时,可能会出现两个节点获取同样的票数导致选举失败,所以,ETCD集群节点数量建议采用奇数个。

2.2 环境准备

在上述的三个节点上执行下边的两个过程,主要完成账号的创建与基础开发包的下载更新。

2.2.1 添加用户组与用户

  • 使用 root 账户执行下边的操作
groupadd kube
useradd -d /home/kube -m kube -s /bin/bash -g kube

2.2.2 安装基础开发工具

yum groupinstall -y "Development Tools"

注意:需要在上述三个节点上执行安装准备过程,由于 root 用户的权限太大,所以,不建议使用 root 用户来部署 etcd 集群,后续将会使用 kube 用户部署 etcd。

3. ETCD集群部署

etcd 集群部署主要分为两种方式,一种是使用etcd开源的源代码编译部署,另一种是使用etcd预编译包安装部署。使用源代码部署需要搭建 golang 开发环境,并且可能涉及到国外的依赖代码库下载,如果网络条件不允许的情况下,不建议采用源代码部署。3.1.1 章节主要介绍源代码部署的方式,3.1.2 章节主要介绍预编译包部署方式。建议选择 3.1.2 章节介绍的部署方式。

3.1 节点部署

请在 etcd 服务器节点上执行下面的操作步骤,但注意配置信息中IP地址一定要与节点实际IP地址对应。

3.1.1 etcd 源代码部署模式(不推荐)

3.1.1.1 基本工具准备

yum install git
yum install golang
  • 安装 git 工具
  • 安装 golang SDK

3.1.1.2 获取源代码并编译

cd /opt
su - kube
git clone -b v3.5.4 https://github.com/etcd-io/etcd.git etcd-v3.5.4
cd etcd-v3.5.4
./build.sh
  • 切换到 /opt 目录
  • 切换到 kube 用户,并刷新 kube 用户环境变量变量
  • 使用git工具下载etcd指定版本源代码
  • 进入源代码目录
  • 执行编译脚本。编译过程中涉及到依赖库的下载,所以网络带宽不够大的情况下,需要耗费一定的时间执行编译过程。

3.1.2 etcd 预编译包安装 (推荐)

cd /opt
su - kube
wget https://github.com/etcd-io/etcd/releases/download/v3.5.4/etcd-v3.5.4-linux-amd64.tar.gz
tar -xvf etcd-v3.5.4-linux-amd64.tar.gz 
mv etcd-v3.5.4-linux-amd64 etcd-v3.5.4
rm -rf etcd-v3.5.4-linux-amd64.tar.gz
  • 切换到 /opt 目录
  • 切换到 kube 用户,并刷新 kube 用户的环境变量
  • 下载 etcd 软件包
  • 解压软件包到目录 etcd-v3.5.4 目录
  • 删除etcd压缩包

3.2 环境变量设置

修改 kube 用户的环境变量配置文件。配置文件路径: /home/kube/…bash_profile

ETCD_HOME=/opt/etcd-v3.5.4
PATH=$PATH:$ETCD_HOME
export PATH

3.3 修改 etcd 配置信息

  • 创建 etcd 数据存储目录
mkdir /opt/etcd-v3.5.4/data
  • 创建 etcd 配置文件
cat >/opt/etcd-v3.5.4/etcd.conf <<EOF
#[Member]
ETCD_NAME="etcd1"
ETCD_DATA_DIR="/opt/etcd-v3.5.4/data"
ETCD_LISTEN_PEER_URLS="https://192.168.0.233:2380"
ETCD_LISTEN_CLIENT_URLS="https://192.168.0.233:2379,https://127.0.0.1:2379"
ETCD_CERT_FILE=/etc/kubernetes/ssl/etcd.pem
ETCD_KEY_FILE=/etc/kubernetes/ssl/etcd-key.pem
ETCD_TRUSTED_CA_FILE=/etc/kubernetes/ssl/ca.pem
ETCD_CLIENT_CERT_AUTH=true
ETCD_PEER_CERT_FILE=/etc/kubernetes/ssl/etcd.pem
ETCD_PEER_KEY_FILE=/etc/kubernetes/ssl/etcd-key.pem
ETCD_PEER_TRUSTED_CA_FILE=/etc/kubernetes/ssl/ca.pem

#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="https://192.168.0.233:2380"
ETCD_ADVERTISE_CLIENT_URLS="https://192.168.0.233:2379"
ETCD_INITIAL_CLUSTER="etcd1=https://192.168.0.233:2380,etcd2=https://192.168.0.200:2380,etcd3=https://192.168.0.145:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"
EOF

上边的 ETCD_NAME 变量为节点的名称,不同的节点请给予不同的名称,且在 ETCD_INITIAL_CLUSTER节点中引用了所有节点的地址信息。两者要对应上。其次其中涉及到IP地址要根据实际节点的IP地址进行调整,如上边配置中的 192.168.0.233 要替换成实际节点的IP地址。

  • 在 /usr/lib/systemd/system/etcd.service 目录中创建 etcd.service 文件
cat > /usr/lib/systemd/system/etcd.service <<EOF
[Unit]
Description=Etcd Server
After=network.target
After=network-online.target
Wants=network-online.target
Documentation=https://github.com/coreos

[Service]
Type=notify
WorkingDirectory=/opt/etcd-v3.5.4/data
EnvironmentFile=/opt/etcd-v3.5.4/etcd.conf
ExecStart=/opt/etcd-v3.5.4/etcd \\
  --auto-compaction-mode=periodic \\
  --auto-compaction-retention=1 \\
  --max-request-bytes=33554432 \\
  --quota-backend-bytes=6442450944 \\
  --heartbeat-interval=250 \\
  --election-timeout=2000
Restart=on-failure
RestartSec=5
LimitNOFILE=65536

[Install]
WantedBy=multi-user.target
EOF

3.4 etcd 服务启动

  • 创建 systemctl 服务
systemctl enable etcd
  • 启动 etcd 服务
systemctl start etcd

启动第一个 etcd 节点的时候,命令行会卡住,这个属于正常情况,当启动第二个etcd 节点时,卡住的状态将会消失。也就是当集群内第一个 etcd 节点初次启动时,它会阻塞等待至少另一个节点加入集群。当两个节点都正常的加入集群后,阻塞状态将会消失,服务成功启动。

  • 查看服务状态
systemctl status etcd

4. ETCD 验证

等到所有节点完成 etcd 的安装后,就可以通过下面的方法检查集群内 ETCD 节点的健康状态。

  • 切换到 kube 用户
su - kube
  • 查看 etcd 集群成员
ETCDCTL_API=3 etcdctl --cacert=/etc/kubernetes/ssl/etcd.pem --cert=/etc/kubernetes/ssl/etcd.pem --key=/etc/kubernetes/ssl/etcd-key.pem --endpoints="https://192.168.0.200:2379,https://192.168.0.145:2379,https://192.168.0.233:2379" endpoint status --write-out='table'

显示信息是:
在这里插入图片描述

5. 问题汇总

  • 集群无法启动, 由于某个节点数据出现故障,导致节点无法启动。etcdcel 与 kubectl 客户端工具无法使用,均出现请求 timeout 的情况
解决办法:
1。 删除该节点的数据
$ rm /opt/etcd-v3.5.4/data

2。 设置 ETCD_INITIAL_CLUSTER_STATE="existing"

3。 重启节点
$ systemctl restart etcd

猜你喜欢

转载自blog.csdn.net/hzwy23/article/details/128084797