在之前的文章 https://mp.weixin.qq.com/s/11rf8dd2zBAKty4lYYn1sA 中, 我们详细介绍了 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
生成和分发证书
我们将使用 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.pem,ca.pem 和 ca.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 和所有三个节点生成了证书和密钥.
现在是时候开始分发证书到集群的每个节点.
运行以下命令, 替换用户名和 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
测试和验证集群
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 集群. 保持关注哟~!
来源: http://dockone.io/article/10789