22

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

 3 years ago
source link: http://dockone.io/article/10789
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

之前的文章 中,我们详细介绍了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.gz

rm -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/etcd

chmod +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 folder

sudo mv /tmp/etcd-download-test/etcd /usr/local/bin

sudo mv /tmp/etcd-download-test/etcdctl /usr/local/bin

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyMjA2ODEz,size_16,color_FFFFFF,t_70#pic_center

生成和分发证书

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

brew install cfssl
watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyMjA2ODEz,size_16,color_FFFFFF,t_70#pic_center

建立一个名为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-1

export ADDRESS=10.0.0.60,$NAME

echo '{"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-2

export ADDRESS=10.0.0.61,$NAME

echo '{"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-3

export ADDRESS=10.0.0.62,$NAME

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

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

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyMjA2ODEz,size_16,color_FFFFFF,t_70#pic_center

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

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

HOST=10.0.0.60

USER=ubuntu



scp ca.pem $USER@$HOST:etcd-ca.crt

scp node-1.pem $USER@$HOST:server.crt

scp node-1-key.pem $USER@$HOST:server.key

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

HOST=10.0.0.60

USER=ubuntu



ssh $USER@$HOST

sudo mkdir -p /etc/etcd

sudo mv * /etc/etcd

sudo chmod 600 /etc/etcd/server.key

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

配置和启动etcd集群

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

ETCD_NAME=node-1

ETCD_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=true

ETCD_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-2

ETCD_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=true

ETCD_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-3

ETCD_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=true

ETCD_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 store

Documentation=https://github.com/etcd-io/etcd

After=network.target



[Service]

Type=notify

EnvironmentFile=/etc/etcd/etcd.conf

ExecStart=/usr/bin/etcd

Restart=always

RestartSec=10s

LimitNOFILE=40000



[Install]

WantedBy=multi-user.target

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

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

sudo systemctl daemon-reload

sudo systemctl enable etcd

sudo systemctl start etcd

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

sudo systemctl status etcd
watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyMjA2ODEz,size_16,color_FFFFFF,t_70#pic_center

测试和验证集群

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
watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyMjA2ODEz,size_16,color_FFFFFF,t_70#pic_center

接下来,让我们使用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
20200925173334603.png#pic_center

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

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
20200925173404172.png#pic_center

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

在下一篇文章中,我将向你详细介绍如何安装和配置一个具有高可用控制平面的4节点K3s集群。保持关注哟~!


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK