1. 程式人生 > 實用技巧 >etcd節點檢查失敗,處理方法

etcd節點檢查失敗,處理方法

一、問題描述

下面節點資訊都是都是為了寫部落格虛構的,跟真實節點資訊大體相同

Kubernetes 叢集中總共有三臺 Master,分別是:

  • k8s-master-2-11
  • k8s-master-2-12
  • k8s-master-2-13

對其中 k8s-master-2-11 Master 節點伺服器進行了核心和軟體升級操作,從而先將其暫時剔出叢集,然後進行升級,完成後準備重新加入到 Kubernetes 叢集,通過 Kubeadm 執行,輸入下面命令:

$ kubeadm join mydlq.club:16443 \
--token 6w0nwi.zag57qgfcdhi76vd \
--discovery-token-ca-cert-hash sha256:efa49231e4ffd836ff996921741c98ac4c5655dc729d7c32aa48c608232f0f08 \
--control-plane --certificate-key a64e9da7346153bd64dba1e5126a644a97fdb63c878bb73de07911d1add8e26b

在執行過程中,輸出下面日誌,提示 etcd 監控檢查失敗:

......
[control-plane] Creating static Pod manifest for "kube-controller-manager"
W0329 00:01:51.364121   19209 manifests.go:214] the default kube-apiserver authorization-mode is "Node,RBAC"; using "Node,RBAC"
[control-plane] Creating static Pod manifest for "kube-scheduler"
W0329 00:01:51.373807   19209 manifests.go:214] the default kube-apiserver authorization-mode is "Node,RBAC"; using "Node,RBAC"
[check-etcd] Checking that the etcd cluster is healthy

error execution phase check-etcd: etcd cluster is not healthy: failed to dial endpoint https://10.8.18.105:2379 
with maintenance client: context deadline exceeded
To see the stack trace of this error execute with --v=5 or higher

根據關鍵資訊 "error execution phase check-etcd" 可知,可能是在執行加入 etcd 時候出現的錯誤,導致 master 無法加入原先的 kubernetes 叢集。

二、分析問題

通過 kubectl 和 kubeadm 資訊分析問題。

1、檢視叢集節點列表

首先通過 Kuberctl 工具檢查一下現有的節點資訊:

$ kubectl get node

NAME              STATUS    ROLES     VERSION
k8s-master-2-12    Ready    master    v1.17.4
k8s-master-2-13    Ready    master    v1.17.4
k8s-node-2-14      Ready    <none>    v1.17.4
k8s-node-2-15      Ready    <none>    v1.17.4
k8s-node-2-16      Ready    <none>    v1.17.4

可以看到,k8s-master-2-11 節點確實不在節點列表中

2、檢視 Kubeadm 配置資訊

在看看 Kubernetes 叢集中的 kubeadm 配置資訊:

$ kubectl describe configmaps kubeadm-config -n kube-system

獲取到的內容如下:

Name:         kubeadm-config
Namespace:    kube-system
Labels:       <none>
Annotations:  <none>
...
ClusterStatus:
----
apiEndpoints:
  k8s-master-2-11:
    advertiseAddress: 192.168.2.11
    bindPort: 6443
  k8s-master-2-12:
    advertiseAddress: 192.168.2.12
    bindPort: 6443
  k8s-master-2-13:
    advertiseAddress: 192.168.2.13
    bindPort: 6443
apiVersion: kubeadm.k8s.io/v1beta2
kind: ClusterStatus

可也看到 k8s-master-2-11 節點資訊還存在與 kubeadm 配置中,說明 etcd 中還儲存著 k8s-master-2-11 相關資訊。

3、分析問題所在及解決方案

因為叢集是通過 kubeadm 工具搭建的,且使用了 etcd 映象方式與 master 節點一起,所以每個 Master 節點上都會存在一個 etcd 容器例項。當剔除一個 master 節點時 etcd 叢集未刪除剔除的節點的 etcd 成員資訊,該資訊還存在 etcd 叢集列表中。

所以,我們需要 進入 etcd 手動刪除 etcd 成員資訊

三、解決問題

1、獲取 Etcd 映象列表

首先獲取叢集中的 etcd pod 列表

$ kubectl get pods -n kube-system | grep etcd

etcd-k8s-master-2-12   1/1   Running   0
etcd-k8s-master-2-13   1/1   Running   0   

2、進入 Etcd 容器並刪除節點資訊

選擇上面兩個 etcd 中任意一個 pod,通過 kubectl 工具進入 pod 內部:

$ kubectl exec -it etcd-k8s-master-2-12 sh -n kube-system

進入容器後,按下面步執行

## 配置環境
$ export ETCDCTL_API=3
$ alias etcdctl='etcdctl --endpoints=https://127.0.0.1:2379 --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/server.crt --key=/etc/kubernetes/pki/etcd/server.key'

## 檢視 etcd 叢集成員列表
$ etcdctl member list

63bfe05c4646fb08, started, k8s-master-2-11, https://192.168.2.11:2380, https://192.168.2.11:2379, false
8e41efd8164c6e3d, started, k8s-master-2-12, https://192.168.2.12:2380, https://192.168.2.12:2379, false
a61d0bd53c1cbcb6, started, k8s-master-2-13, https://192.168.2.13:2380, https://192.168.2.13:2379, false

## 刪除 etcd 叢集成員 k8s-master-2-11
$ etcdctl member remove 63bfe05c4646fb08

Member 63bfe05c4646fb08 removed from cluster ed984b9o8w35cap2

## 再次檢視 etcd 叢集成員列表
$ etcdctl member list

8e41efd8164c6e3d, started, k8s-master-2-12, https://192.168.2.12:2380, https://192.168.2.12:2379, false
a61d0bd53c1cbcb6, started, k8s-master-2-13, https://192.168.2.13:2380, https://192.168.2.13:2379, false

## 退出容器
$ exit

3、通過 kubeadm 命令再次嘗試加入叢集

通過 kubeadm 命令再次嘗試將 k8s-master-2-11 節點加入叢集,在執行前首先進入到 k8s-master-2-11 節點伺服器,執行 kubeadm 的清除命令:

$ kubeadm reset

然後嘗試加入 kubernetes 叢集:

$ kubeadm join mydlq.club:16443 \
--token 6w0nwi.zag57qgfcdhi76vd \
--discovery-token-ca-cert-hash sha256:efa49231e4ffd836ff996921741c98ac4c5655dc729d7c32aa48c608232f0f08 \
--control-plane --certificate-key a64e9da7346153bd64dba1e5126a644a97fdb63c878bb73de07911d1add8e26b

轉載http://www.mydlq.club/article/73/
成功解決了我的問題,謝謝大佬