一、etcd高可用拓撲選項
默認情況下,kubeadm 在每個控制平面節(jié)點上運行一個本地 etcd 實例。也可以使用外部的 etcd 集群,并在不同的主機上提供 etcd 實例。
可以設置HA集群:
- 使用堆疊控制控制平面節(jié)點,其中 etcd 節(jié)點與控制平面節(jié)點共存
- 使用外部 etcd 節(jié)點,其中 etcd 在與控制平面不同的節(jié)點上運行
1.堆疊(Stacked)etcd 拓撲
堆疊(Stacked)HA 集群是一種這樣的拓撲, 其中 etcd 分布式數據存儲集群堆疊在 kubeadm 管理的控制平面節(jié)點上,作為控制平面的一個組件運行。
每個控制平面節(jié)點運行 kube-apiserver、kube-scheduler 和 kube-controller-manager 實例。 kube-apiserver 使用負載均衡器暴露給工作節(jié)點。
每個控制平面節(jié)點創(chuàng)建一個本地 etcd 成員(member),這個 etcd 成員只與該節(jié)點的 kube-apiserver 通信。 這同樣適用于本地 kube-controller-manager 和 kube-scheduler 實例。
這種拓撲將控制平面和 etcd 成員耦合在同一節(jié)點上。相對使用外部 etcd 集群, 設置起來更簡單,而且更易于副本管理。
然而,堆疊集群存在耦合失敗的風險。如果一個節(jié)點發(fā)生故障,則 etcd 成員和控制平面實例都將丟失, 并且冗余會受到影響。你可以通過添加更多控制平面節(jié)點來降低此風險。
因此,你應該為 HA 集群運行至少三個堆疊的控制平面節(jié)點。
這是 kubeadm 中的默認拓撲。當使用 kubeadm init 和 kubeadm join --control-plane 時, 在控制平面節(jié)點上會自動創(chuàng)建本地 etcd 成員。
2.外部 etcd 拓撲
具有外部 etcd 的 HA 集群是一種這樣的拓撲, 其中 etcd 分布式數據存儲集群在獨立于控制平面節(jié)點的其他節(jié)點上運行。
就像堆疊的 etcd 拓撲一樣,外部 etcd 拓撲中的每個控制平面節(jié)點都會運行 kube-apiserver、kube-scheduler 和 kube-controller-manager 實例。 同樣,kube-apiserver 使用負載均衡器暴露給工作節(jié)點。但是 etcd 成員在不同的主機上運行, 每個 etcd 主機與每個控制平面節(jié)點的 kube-apiserver 通信。
這種拓撲結構解耦了控制平面和 etcd 成員。因此它提供了一種 HA 設置, 其中失去控制平面實例或者 etcd 成員的影響較小,并且不會像堆疊的 HA 拓撲那樣影響集群冗余。
但此拓撲需要兩倍于堆疊 HA 拓撲的主機數量。 具有此拓撲的 HA 集群至少需要三個用于控制平面節(jié)點的主機和三個用于 etcd 節(jié)點的主機。
二、準備工作
- 三個可以通過 2379 和 2380 端口相互通信的主機。本文檔使用這些作為默認端口。 不過,它們可以通過 kubeadm 的配置文件進行自定義。
- 每個主機必須安裝 systemd 和 bash 兼容的 shell。
- 每臺主機必須安裝有容器運行時、kubelet 和 kubeadm。
- 每個主機都應該能夠訪問 Kubernetes 容器鏡像倉庫 (registry.k8s.io), 或者使用 kubeadm config images list/pull 列出/拉取所需的 etcd 鏡像。 本指南將把 etcd 實例設置為由 kubelet 管理的靜態(tài) Pod。
- 一些可以用來在主機間復制文件的基礎設施。例如 ssh 和 scp 就可以滿足此需求。
三、建立集群
一般來說,是在一個節(jié)點上生成所有證書并且只分發(fā)這些必要的文件到其它節(jié)點上。
1.將 kubelet 配置為 etcd 的服務管理器。
說明:必須在要運行 etcd 的所有主機上執(zhí)行此操作。
由于 etcd 是首先創(chuàng)建的,因此你必須通過創(chuàng)建具有更高優(yōu)先級的新文件來覆蓋 kubeadm 提供的 kubelet 單元文件。
cat << EOF > /etc/systemd/system/kubelet.service.d/kubelet.conf
# 將下面的 "systemd" 替換為你的容器運行時所使用的 cgroup 驅動。
# kubelet 的默認值為 "cgroupfs"。
# 如果需要的話,將 "containerRuntimeEndpoint" 的值替換為一個不同的容器運行時。
#
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
authentication:
anonymous:
enabled: false
webhook:
enabled: false
authorization:
mode: AlwaysAllow
cgroupDriver: systemd
address: 127.0.0.1
containerRuntimeEndpoint: unix:///var/run/containerd/containerd.sock
staticPodPath: /etc/kubernetes/manifests
EOF
cat << EOF > /etc/systemd/system/kubelet.service.d/20-etcd-service-manager.conf
[Service]
ExecStart=
ExecStart=/usr/bin/kubelet --config=/etc/systemd/system/kubelet.service.d/kubelet.conf
Restart=always
EOF
systemctl daemon-reload
systemctl restart kubelet
檢查 kubelet 的狀態(tài)以確保其處于運行狀態(tài):
systemctl status kubelet
2.為 kubeadm 創(chuàng)建配置文件。
使用以下腳本為每個將要運行 etcd 成員的主機生成一個 kubeadm 配置文件。
# 使用你的主機 IP 更新 HOST0、HOST1 和 HOST2 的 IP 地址
export HOST0=10.0.0.6
export HOST1=10.0.0.7
export HOST2=10.0.0.8
# 使用你的主機名更新 NAME0、NAME1 和 NAME2
export NAME0="infra0"
export NAME1="infra1"
export NAME2="infra2"
# 創(chuàng)建臨時目錄來存儲將被分發(fā)到其它主機上的文件
mkdir -p /tmp/${HOST0}/ /tmp/${HOST1}/ /tmp/${HOST2}/
HOSTS=(${HOST0} ${HOST1} ${HOST2})
NAMES=(${NAME0} ${NAME1} ${NAME2})
for i in "${!HOSTS[@]}"; do
HOST=${HOSTS[$i]}
NAME=${NAMES[$i]}
cat << EOF > /tmp/${HOST}/kubeadmcfg.yaml
---
apiVersion: "kubeadm.k8s.io/v1beta3"
kind: InitConfiguration
nodeRegistration:
name: ${NAME}
localAPIEndpoint:
advertiseAddress: ${HOST}
---
apiVersion: "kubeadm.k8s.io/v1beta3"
kind: ClusterConfiguration
etcd:
local:
serverCertSANs:
- "${HOST}"
peerCertSANs:
- "${HOST}"
extraArgs:
initial-cluster: ${NAMES[0]}=https://${HOSTS[0]}:2380,${NAMES[1]}=https://${HOSTS[1]}:2380,${NAMES[2]}=https://${HOSTS[2]}:2380
initial-cluster-state: new
name: ${NAME}
listen-peer-urls: https://${HOST}:2380
listen-client-urls: https://${HOST}:2379
advertise-client-urls: https://${HOST}:2379
initial-advertise-peer-urls: https://${HOST}:2380
EOF
done
3.生成證書頒發(fā)機構。
如果你已經擁有 CA,那么唯一的操作是復制 CA 的 crt 和 key 文件到 etc/kubernetes/pki/etcd/ca.crt 和 /etc/kubernetes/pki/etcd/ca.key。 復制完這些文件后繼續(xù)下一步,“為每個成員創(chuàng)建證書”。
如果你還沒有 CA,則在 $HOST0(你為 kubeadm 生成配置文件的位置)上運行此命令。
kubeadm init phase certs etcd-ca
這一操作創(chuàng)建如下兩個文件:
- /etc/kubernetes/pki/etcd/ca.crt
- /etc/kubernetes/pki/etcd/ca.key
4.為每個成員創(chuàng)建證書。
kubeadm init phase certs etcd-server --config=/tmp/${HOST2}/kubeadmcfg.yaml
kubeadm init phase certs etcd-peer --config=/tmp/${HOST2}/kubeadmcfg.yaml
kubeadm init phase certs etcd-healthcheck-client --config=/tmp/${HOST2}/kubeadmcfg.yaml
kubeadm init phase certs apiserver-etcd-client --config=/tmp/${HOST2}/kubeadmcfg.yaml
cp -R /etc/kubernetes/pki /tmp/${HOST2}/
# 清理不可重復使用的證書
find /etc/kubernetes/pki -not -name ca.crt -not -name ca.key -type f -delete
kubeadm init phase certs etcd-server --config=/tmp/${HOST1}/kubeadmcfg.yaml
kubeadm init phase certs etcd-peer --config=/tmp/${HOST1}/kubeadmcfg.yaml
kubeadm init phase certs etcd-healthcheck-client --config=/tmp/${HOST1}/kubeadmcfg.yaml
kubeadm init phase certs apiserver-etcd-client --config=/tmp/${HOST1}/kubeadmcfg.yaml
cp -R /etc/kubernetes/pki /tmp/${HOST1}/
find /etc/kubernetes/pki -not -name ca.crt -not -name ca.key -type f -delete
kubeadm init phase certs etcd-server --config=/tmp/${HOST0}/kubeadmcfg.yaml
kubeadm init phase certs etcd-peer --config=/tmp/${HOST0}/kubeadmcfg.yaml
kubeadm init phase certs etcd-healthcheck-client --config=/tmp/${HOST0}/kubeadmcfg.yaml
kubeadm init phase certs apiserver-etcd-client --config=/tmp/${HOST0}/kubeadmcfg.yaml
# 不需要移動 certs 因為它們是給 HOST0 使用的
# 清理不應從此主機復制的證書
find /tmp/${HOST2} -name ca.key -type f -delete
find /tmp/${HOST1} -name ca.key -type f -delete
5.復制證書和 kubeadm 配置。
證書已生成,現在必須將它們移動到對應的主機。
USER=ubuntu
HOST=${HOST1}
scp -r /tmp/${HOST}/* ${USER}@${HOST}:
ssh ${USER}@${HOST}
USER@HOST $ sudo -Es
root@HOST $ chown -R root:root pki
root@HOST $ mv pki /etc/kubernetes/
6.確保已經所有預期的文件都存在
$HOST0 所需文件的完整列表如下:
/tmp/${HOST0}
└── kubeadmcfg.yaml
---
/etc/kubernetes/pki
├── apiserver-etcd-client.crt
├── apiserver-etcd-client.key
└── etcd
├── ca.crt
├── ca.key
├── healthcheck-client.crt
├── healthcheck-client.key
├── peer.crt
├── peer.key
├── server.crt
└── server.key
在 $HOST1 上:
$HOME
└── kubeadmcfg.yaml
---
/etc/kubernetes/pki
├── apiserver-etcd-client.crt
├── apiserver-etcd-client.key
└── etcd
├── ca.crt
├── healthcheck-client.crt
├── healthcheck-client.key
├── peer.crt
├── peer.key
├── server.crt
└── server.key
在 $HOST2 上:
$HOME
└── kubeadmcfg.yaml
---
/etc/kubernetes/pki
├── apiserver-etcd-client.crt
├── apiserver-etcd-client.key
└── etcd
├── ca.crt
├── healthcheck-client.crt
├── healthcheck-client.key
├── peer.crt
├── peer.key
├── server.crt
└── server.key
7.創(chuàng)建靜態(tài) Pod 清單。
既然證書和配置已經就緒,是時候去創(chuàng)建清單了。 在每臺主機上運行 kubeadm 命令來生成 etcd 使用的靜態(tài)清單。文章來源:http://www.zghlxwxcb.cn/news/detail-631933.html
root@HOST0 $ kubeadm init phase etcd local --config=/tmp/${HOST0}/kubeadmcfg.yaml
root@HOST1 $ kubeadm init phase etcd local --config=$HOME/kubeadmcfg.yaml
root@HOST2 $ kubeadm init phase etcd local --config=$HOME/kubeadmcfg.yaml
8.可選:檢查集群運行狀況。
如果 etcdctl 不可用,你可以在容器鏡像內運行此工具。 你可以使用 crictl run 這類工具直接在容器運行時執(zhí)行此操作,而不是通過 Kubernetes。文章來源地址http://www.zghlxwxcb.cn/news/detail-631933.html
ETCDCTL_API=3 etcdctl \
--cert /etc/kubernetes/pki/etcd/peer.crt \
--key /etc/kubernetes/pki/etcd/peer.key \
--cacert /etc/kubernetes/pki/etcd/ca.crt \
--endpoints https://${HOST0}:2379 endpoint health
...
https://[HOST0 IP]:2379 is healthy: successfully committed proposal: took = 16.283339ms
https://[HOST1 IP]:2379 is healthy: successfully committed proposal: took = 19.44402ms
https://[HOST2 IP]:2379 is healthy: successfully committed proposal: took = 35.926451ms
- 將 ${HOST0} 設置為要測試的主機的 IP 地址。
到了這里,關于Kubernetes(K8s)從入門到精通系列之十:使用 kubeadm 創(chuàng)建一個高可用 etcd 集群的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!