暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

第四篇 Etcd存储组件高可用部署

353

写在之前 


最近业务事情较多,没有及时更新,很惭愧,接下来的几天,尽快把这个系列完成。本文档是通过网上大量的学习资料,基于前辈写的很多不错的文档,结合公司实际情况、个人情况等,进行集群部署,本文档只是个人学习总结。


下载并分发软件包


#!/bin/bash
cd /data/k8s/work
source /data/k8s/bin/env.sh
wget https://github.com/etcd-io/etcd/releases/download/v3.3.18/etcd-v3.3.18-linux-amd64.tar.gz
tar -zxf etcd-v3.3.18-linux-amd64.tar.gz

for node_ip in ${ETCD_IPS[@]}
do
  echo ">>> ${node_ip}"
  scp etcd-v3.3.18-linux-amd64/etcd* root@${node_ip}:/opt/k8s/bin
  ssh root@${node_ip} "chmod +x data/k8s/bin/*"
done


创建启动文件模板


#!/bin/bash
cd /data/k8s/work
source /data/k8s/bin/env.sh
cat > etcd.service.template <<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=${ETCD_DATA_DIR}
ExecStart=/data/k8s/bin/etcd \\
  --data-dir=${ETCD_DATA_DIR} \\
  --wal-dir=${ETCD_WAL_DIR} \\
  --name=##NODE_NAME## \\
  --cert-file=/etc/etcd/cert/etcd.pem \\
  --key-file=/etc/etcd/cert/etcd-key.pem \\
  --trusted-ca-file=/etc/kubernetes/cert/ca.pem \\
  --peer-cert-file=/etc/etcd/cert/etcd.pem \\
  --peer-key-file=/etc/etcd/cert/etcd-key.pem \\
  --peer-trusted-ca-file=/etc/kubernetes/cert/ca.pem \\
  --peer-client-cert-auth \\
  --client-cert-auth \\
  --listen-peer-urls=https://##NODE_IP##:2380 \\
  --initial-advertise-peer-urls=https://##NODE_IP##:2380 \\
  --listen-client-urls=https://##NODE_IP##:2379,http://127.0.0.1:2379 \\
  --advertise-client-urls=https://##NODE_IP##:2379 \\
  --initial-cluster-token=k8s-etcd-cluster \\
  --initial-cluster=${ETCD_NODES} \\
  --initial-cluster-state=new \\
  --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


配置解释


配置选项选项说明
wal存放预写式日志,文件中记录了整个数据变化的全部历程,数据的修改在提交前,都要先写入到WAL中
data-dir指定节点的数据存储目录(包括:节点ID、集群ID、集群初始化配置、Snapshot文件等),如果未指定,会写在当前目录
wal-dir存放预写式日志,文件中记录了整个数据变化的全部历程,数据的修改在提交前,都要先写入到WAL中,如果未指定,写在--data-dir目录下面
name节点名称,如果--initial-cluster-state=new这个值为new,哪么--name的参数值必须位于--initial-cluster列表中
cert-file客户端与服务器之间TLS证书文件的路径
key-file客户端与服务器之间TLS密钥文件的路径
trusted-ca-file签名client证书的CA证书,用于验证client证书
peer-cert-file对等服务器TLS证书文件的路径
peer-key-file对等服务器TLS密钥文件的路径
peer-client-cert-auth启用对等客户端证书验证
client-cert-auth启用客户端验证
listen-peer-urls 与集群其它成员之间的通信地址
initial-advertise-peer-urls 通告给集群其它节点,本地的对等URL地址
listen-client-urls 监听本地端口,对外提供服务的地址
advertise-client-urls 客户端URL,用于通告集群的其余部分
initial-cluster-token 集群的token,整个集群中保持一致
initial-cluster 集群中的所有信息节点
initial-cluster-state 初始化集群状态,默认为new
auto-compaction-mode 配置基于时间的三种模式
auto-compaction-retention 设置保留历史时间为1小时
max-request-bytes 服务器将接受的最大客户端请求大小
quota-backend-bytes 当后端大小超过给定的配额时,报警
heartbeat-interval 心跳间隔的时间,单位毫秒
election-timeout 选举超时时间,单位毫秒


服务器配置生成并分发


#!/bin/bash
# 根据模板生成各服务器配置
cd /data/k8s/work
source /data/k8s/bin/env.sh
for (( i=0; i < 3; i++ ))
do
    sed -e "s/##NODE_NAME##/${ETCD_NAMES[i]}/" -e "s/##NODE_IP##/${ETCD_IPS[i]}/" etcd.service.template > etcd-${ETCD_IPS[i]}.service
done

# 分发到etcd集群服务器
for node_ip in ${ETCD_IPS[@]}
do
    echo ">>> ${node_ip}"
    scp etcd-${node_ip}.service root@${node_ip}:/etc/systemd/system/etcd.service
done


远程启动Etcd服务


#!/bin/bash

source /data/k8s/bin/env.sh
for node_ip in ${ETCD_IPS[@]}
do
    echo ">>> ${node_ip}"
    ssh root@${node_ip} "mkdir -p ${ETCD_DATA_DIR} ${ETCD_WAL_DIR}"
    ssh root@${node_ip} "systemctl daemon-reload && systemctl enable etcd && systemctl restart etcd "
done


服务测试


etcd进程状态


#!/bin/bash

cd /data/k8s/work
source /data/k8s/bin/env.sh
for node_ip in ${ETCD_IPS[@]}
do
    echo ">>> ${node_ip}"
    ssh root@${node_ip} "systemctl status etcd|grep -i active"
done

结果如下:

>>> 192.168.16.101
   Active: active (running) since Fri 2019-12-27 10:37:58 CST; 1 weeks 6 days ago
>>> 192.168.16.102
   Active: active (running) since Fri 2019-12-27 10:35:02 CST; 1 weeks 6 days ago
>>> 192.168.16.103
   Active: active (running) since Fri 2019-12-27 10:35:04 CST; 1 weeks 6 days ago


etcd集群健康状态

#!/bin/bash
source /data/k8s/bin/env.sh
for node_ip in ${ETCD_IPS[@]}
do
  echo ">>> ${node_ip}"
  ETCDCTL_API=3 data/k8s/bin/etcdctl \
  --endpoints=https://${node_ip}:2379 \
  --cacert=/etc/kubernetes/cert/ca.pem \
  --cert=/etc/etcd/cert/etcd.pem \
  --key=/etc/etcd/cert/etcd-key.pem endpoint health
done

结果如下:
>>> 192.168.16.101
https://192.168.16.101:2379 is healthy: successfully committed proposal: took = 11.701119ms
>>> 192.168.16.102
https://192.168.16.102:2379 is healthy: successfully committed proposal: took = 16.642322ms
>>> 192.168.16.103
https://192.168.16.103:2379 is healthy: successfully committed proposal: took = 10.666141ms


etcd集群状态

#!/bin/bash
source data/k8s/bin/env.sh
ETCDCTL_API=3 /data/k8s/bin/etcdctl \
  -w table --cacert=/etc/kubernetes/cert/ca.pem \
  --cert=/etc/etcd/cert/etcd.pem \
  --key=/etc/etcd/cert/etcd-key.pem \
  --endpoints=${ETCD_ENDPOINTS} endpoint status

结果如下:
+-----------------------------+------------------+---------+---------+-----------+-----------+------------+
| ENDPOINT |        ID | VERSION | DB SIZE | IS LEADER | RAFT TERM | RAFT INDEX |
+-----------------------------+------------------+---------+---------+-----------+-----------+------------+
| https://etcd01.k8s.vip:2379 | 3a24b6728b5c27ab | 3.3.18 |  3.1 MB | false |         4 | 5511275 |
| https://etcd02.k8s.vip:2379 |  650c1614add8d9a | 3.3.18 |  3.1 MB | true |         4 | 5511275 |
| https://etcd03.k8s.vip:2379 | bac9ebb7f9efb1bd | 3.3.18 |  3.2 MB | false |         4 | 5511275 |
+-----------------------------+------------------+---------+---------+-----------+-----------+------------+


总结


部署思路是下载二进制安装包,分发到服务器,生成启动文件模板,根据之前定义的变量,进行替换并生成各服务器启动文件,再把启动文件分发到各服务器去,最后启动服务并验证。





分享使我快乐


往期文档

Centos7.6内核升级

通俗易懂理解Kubernetes核心组件及原理

第一篇 k8s组件版本及功能简介

第二篇 环境初始化准备

第三篇 PKI基础概念、cfssl工具介绍及kubernetes中证书

文章转载自Linux点滴运维实践,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论