首页 文章详情

如何设置一个生产级别的高可用etcd集群

边缘计算k3s社区 | 26 2020-09-06 00:19 0 0 0

作者简介

Janakiram MSV是Janakiram & Associates的首席分析师,也是国际信息技术学院的兼职教师。他也是Google Qualified Developer、亚马逊认证解决方案架构师、亚马逊认证开发者、亚马逊认证SysOps管理员和微软认证Azure专业人员。


Janakiram是云原生计算基金会的大使,也是首批Kubernetes认证管理员和Kubernetes认证应用开发者之一。他曾在微软、AWS、Gigaom Research等知名公司工作。


上周的文章中,我们详细介绍了K3s的架构以及部署场景,给尚未了解K3s的朋友提供了一个很好的入门方向。那么,在本文中我们将探索如何配置一个3节点的etcd集群,它将会被用于高可用、多节点的K3s集群中。


etcd是云原生生态中最受欢迎的开源项目之一,它是云原生计算基金会(CNCF)孵化的项目,目前已经成为Kubernetes基础架构的核心构件。


在本教程结束的时候,你将完成部署一个启用了TLS的3节点etcd集群,作为具有多个master的高可用K3s集群的外部数据存储。


首先,请确保你有3个带有静态IP地址的Linux host。在我的实验环境中,我运行着4台Intel NUC迷你电脑,这4台电脑上运行着Ubuntu 18.04,IP地址从10.0.0.60到10.0.0.63不等。我们将在IP地址为10.0.0.60、10.0.0.61和10.0.0.62的主机上安装etcd。你在自己进行实践时务必用你自己的一套地址来替换这些IP地址。


下载etcd二进制文件


在每个Linux host上,运行以下命令以下载和安装最新版本的二进制文件:


ETCD_VER=v3.4.10 DOWNLOAD_URL=https://storage.googleapis.com/etcd rm -f /tmp/etcd-${ETCD_VER}-linux-amd64.tar.gzrm -rf /tmp/etcd-download-test && mkdir -p /tmp/etcd-download-test curl -L ${DOWNLOAD_URL}/${ETCD_VER}/etcd-${ETCD_VER}-linux-amd64.tar.gz -o /tmp/etcd-${ETCD_VER}-linux-amd64.tar.gz tar xzvf /tmp/etcd-${ETCD_VER}-linux-amd64.tar.gz -C /tmp/etcd-download-test --strip-components=1 rm -f /tmp/etcd-${ETCD_VER}-linux-amd64.tar.gz chmod +x /tmp/etcd-download-test/etcdchmod +x /tmp/etcd-download-test/etcdctl  #Verify the downloads/tmp/etcd-download-test/etcd --version/tmp/etcd-download-test/etcdctl version #Move them to the bin foldersudo mv /tmp/etcd-download-test/etcd /usr/local/binsudo mv /tmp/etcd-download-test/etcdctl /usr/local/bin



生成和分发证书


我们将使用Cloudflare的cfssl工具来生成证书和密钥。如果你使用Mac作为你的工作站,你可以使用Homebrew安装它。


brew install cfssl



建立一个名为certs的目录,并运行以下命令为每台主机生成CA证书和server证书及密钥组合。


mkdir certs && cd certs


首先,创建CA证书,它将被所有的etcd server和客户端使用。


echo '{"CN":"CA","key":{"algo":"rsa","size":2048}}' | cfssl gencert -initca - | cfssljson -bare ca -echo '{"signing":{"default":{"expiry":"43800h","usages":["signing","key encipherment","server auth","client auth"]}}}' > ca-config.json


这将生成三个文件——ca-key.pemca.pemca.csr


接下来,我们将为第一个节点生成证书和密钥


export NAME=node-1export ADDRESS=10.0.0.60,$NAMEecho '{"CN":"'$NAME'","hosts":[""],"key":{"algo":"rsa","size":2048}}' | cfssl gencert -config=ca-config.json -ca=ca.pem -ca-key=ca-key.pem -hostname="$ADDRESS" - | cfssljson -bare $NAME


对接下来的两个节点也重复以上步骤。


export NAME=node-2export ADDRESS=10.0.0.61,$NAMEecho '{"CN":"'$NAME'","hosts":[""],"key":{"algo":"rsa","size":2048}}' | cfssl gencert -config=ca-config.json -ca=ca.pem -ca-key=ca-key.pem -hostname="$ADDRESS" - | cfssljson -bare $NAME


export NAME=node-3export ADDRESS=10.0.0.62,$NAMEecho '{"CN":"'$NAME'","hosts":[""],"key":{"algo":"rsa","size":2048}}' | cfssl gencert -config=ca-config.json -ca=ca.pem -ca-key=ca-key.pem -hostname="$ADDRESS" - | cfssljson -bare $NAME


不要忘记用自己的组合替换IP地址以及节点名称。


此时,我们已经为CA和所有三个节点生成了证书和密钥。



现在是时候开始分发证书到集群的每个节点。


运行以下命令,替换用户名和IP地址,将证书复制到相应的节点上。


HOST=10.0.0.60USER=ubuntu scp ca.pem $USER@$HOST:etcd-ca.crtscp node-1.pem $USER@$HOST:server.crtscp node-1-key.pem $USER@$HOST:server.key


SSH进入每个节点,并运行以下命令将证书移动到适当的目录中。


HOST=10.0.0.60USER=ubuntu ssh $USER@$HOSTsudo mkdir -p /etc/etcdsudo mv * /etc/etcdsudo chmod 600 /etc/etcd/server.key


我们完成了每个节点上证书的生成和分发。下一步,我们将为每个节点创建配置文件和Systemd单元文件。


配置和启动etcd集群


在节点1上,在etc/etcd目录中创建一个名为etcd.conf的文件,包含以下内容:


ETCD_NAME=node-1ETCD_LISTEN_PEER_URLS="https://10.0.0.60:2380"ETCD_LISTEN_CLIENT_URLS="https://10.0.0.60:2379"ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"ETCD_INITIAL_CLUSTER="node-1=https://10.0.0.60:2380,node-2=https://10.0.0.61:2380,node-3=https://10.0.0.62:2380"ETCD_INITIAL_ADVERTISE_PEER_URLS="https://10.0.0.60:2380"ETCD_ADVERTISE_CLIENT_URLS="https://10.0.0.60:2379"ETCD_TRUSTED_CA_FILE="/etc/etcd/etcd-ca.crt"ETCD_CERT_FILE="/etc/etcd/server.crt"ETCD_KEY_FILE="/etc/etcd/server.key"ETCD_PEER_CLIENT_CERT_AUTH=trueETCD_PEER_TRUSTED_CA_FILE="/etc/etcd/etcd-ca.crt"ETCD_PEER_KEY_FILE="/etc/etcd/server.key"ETCD_PEER_CERT_FILE="/etc/etcd/server.crt"ETCD_DATA_DIR="/var/lib/etcd"


节点2的文件则使用以下内容:


ETCD_NAME=node-2ETCD_LISTEN_PEER_URLS="https://10.0.0.61:2380"ETCD_LISTEN_CLIENT_URLS="https://10.0.0.61:2379"ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"ETCD_INITIAL_CLUSTER="node-1=https://10.0.0.60:2380,node-2=https://10.0.0.61:2380,node-3=https://10.0.0.62:2380"ETCD_INITIAL_ADVERTISE_PEER_URLS="https://10.0.0.61:2380"ETCD_ADVERTISE_CLIENT_URLS="https://10.0.0.61:2379"ETCD_TRUSTED_CA_FILE="/etc/etcd/etcd-ca.crt"ETCD_CERT_FILE="/etc/etcd/server.crt"ETCD_KEY_FILE="/etc/etcd/server.key"ETCD_PEER_CLIENT_CERT_AUTH=trueETCD_PEER_TRUSTED_CA_FILE="/etc/etcd/etcd-ca.crt"ETCD_PEER_KEY_FILE="/etc/etcd/server.key"ETCD_PEER_CERT_FILE="/etc/etcd/server.crt"ETCD_DATA_DIR="/var/lib/etcd"


最后,为节点3创建配置文件。


ETCD_NAME=node-3ETCD_LISTEN_PEER_URLS="https://10.0.0.62:2380"ETCD_LISTEN_CLIENT_URLS="https://10.0.0.62:2379"ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"ETCD_INITIAL_CLUSTER="node-1=https://10.0.0.60:2380,node-2=https://10.0.0.61:2380,node-3=https://10.0.0.62:2380"ETCD_INITIAL_ADVERTISE_PEER_URLS="https://10.0.0.62:2380"ETCD_ADVERTISE_CLIENT_URLS="https://10.0.0.62:2379"ETCD_TRUSTED_CA_FILE="/etc/etcd/etcd-ca.crt"ETCD_CERT_FILE="/etc/etcd/server.crt"ETCD_KEY_FILE="/etc/etcd/server.key"ETCD_PEER_CLIENT_CERT_AUTH=trueETCD_PEER_TRUSTED_CA_FILE="/etc/etcd/etcd-ca.crt"ETCD_PEER_KEY_FILE="/etc/etcd/server.key"ETCD_PEER_CERT_FILE="/etc/etcd/server.crt"ETCD_DATA_DIR="/var/lib/etcd"


请不要忘记更换你的网络专用IP地址。


配置完成后,我们就可以在每个节点上创建systemd单元文件了。


/lib/system/systemd处创建文件etcd.service,内容如下:


[Unit]Description=etcd key-value storeDocumentation=https://github.com/etcd-io/etcdAfter=network.target [Service]Type=notifyEnvironmentFile=/etc/etcd/etcd.confExecStart=/usr/bin/etcdRestart=alwaysRestartSec=10sLimitNOFILE=40000 [Install]WantedBy=multi-user.target


由于每个节点的配置都被移到了专用文件(/etc/etcd/etcd.conf)中,所以所有节点的单元文件保持不变。


现在我们已经准备好启动服务了。在每个节点上运行下面的命令来启动etcd集群:


sudo systemctl daemon-reloadsudo systemctl enable etcdsudo systemctl start etcd


确保etcd服务已经启动,并且运行中没有出现错误。


sudo systemctl status etcd



测试和验证集群


SSH进入其中一个节点,通过etcd CLI连接到集群。


etcdctl --endpoints https://10.0.0.60:2379 --cert /etc/etcd/server.crt --cacert /etc/etcd/etcd-ca.crt --key /etc/etcd/server.key put foo bar


我们在etcd数据库中插入一个密钥。让我们看看能否找回它。


etcdctl --endpoints https://10.0.0.60:2379 --cert /etc/etcd/server.crt --cacert /etc/etcd/etcd-ca.crt --key /etc/etcd/server.key get foo



接下来,让我们使用API端点(endpoint)来检查集群的健康状态。


curl --cacert /etc/etcd/etcd-ca.crt --cert /etc/etcd/server.crt --key /etc/etcd/server.key https://10.0.0.60:2379/health



最后,让我们确保所有的节点都参与到集群中。


etcdctl --endpoints https://10.0.0.60:2379 --cert /etc/etcd/server.crt --cacert /etc/etcd/etcd-ca.crt --key /etc/etcd/server.key member list



Congratulations!现在你拥有了一个安全、分布式的以及高可用的etcd集群,它已经为生产级K3s集群环境做好了准备。


在下一篇文章中,我将向你详细介绍如何安装和配置一个具有高可用控制平面的4节点K3s集群。欢迎扫描下方二维码,关注公众号,获取K3s的干货教程噢!



推荐阅读


K3s+Ambassador,强大的轻量级K8S解决方案

从架构到部署,全面了解K3s

这应该是最适合国内用户的K3s HA方案



About k3s


k3s 是目前全球用户量最大的 CNCF 认证轻量级 K8S 发行版。自 2019 年 3 月发布以来,备受全球开发者们关注。至今,GitHub Stars 数已超过 13,000,成为了开源社区最受欢迎的边缘计算 K8S 解决方案。


k3s 专为在资源有限的环境中运行 Kubernetes 的研发和运维人员设计,将满足日益增长的在边缘计算环境中运行在 x86、ARM64 和 ARMv7 处理器上的小型、易于管理的 Kubernetes 集群需求。k3s 的发布,为开发者们提供了以“Rancher 2.X + k3s”为核心的从数据中心到云到边到端的 K8S 即服务(Kubernetes-as-a-Service),推动 Kubernetes Everywhere。

扫码添加k3s中文社区助手

加入官方中文技术社区

官网:https://k3s.io

good-icon 0
favorite-icon 0
收藏
回复数量: 0
    暂无评论~~
    Ctrl+Enter