在以前的文章中,咱們詳細介紹了K3s的架構以及部署場景,給還沒有了解K3s的朋友提供了一個很好的入門方向。那麼,在本文中咱們將探索如何配置一個3節點的etcd集羣,它將會被用於高可用、多節點的K3s集羣中。node
etcd是雲原生生態中最受歡迎的開源項目之一,它是雲原生計算基金會(CNCF)孵化的項目,目前已經成爲Kubernetes基礎架構的核心構件。linux
在本教程結束的時候,你將完成部署一個啓用了TLS的3節點etcd集羣,做爲具備多個master的高可用K3s集羣的外部數據存儲。git
首先,請確保你有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地址。github
在每一個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安裝它。json
brew install cfssl
創建一個名爲certs的目錄,並運行如下命令爲每臺主機生成CA證書和server證書及密鑰組合。ubuntu
mkdir certs && cd certs
首先,建立CA證書,它將被全部的etcd server和客戶端使用。api
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單元文件。
在節點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集羣。保持關注喲~!