Kubernetes 集成 KubeEdge 需要注意的問題彙總

作者:朱含

近期小夥伴對在使用 KubeSphere v3.1 上集成邊緣節點有不少疑問,這裏說明下 guide 文檔地址,然後可以把這方面的問題彙總在這裏,方便後續的小夥伴排查問題,也歡迎大家繼續補充。

官方 guide 文檔傳送門

1. IP、端口開放問題

如果使用 ks-installer 安裝,需要激活 KubeEdge 以及配置 master節點對應的外網 IP 地址.

假設集羣 master 節點 IP 192.168.10.7, 需要開放的外網端口如下:

序號 內網IP 內網端口(NodePort) 外網端口
1 192.168.10.7 30000 10000 https協議端口
2 192.168.10.7 30001 10001 Quic協議端口
3 192.168.10.7 30002 10002 cloudhub首次token獲取證書
4 192.168.10.7 30003 10003 cloudstream端口
5 192.168.10.7 30004 10004 tunnel端口(edgestream連接)

外網端口需要防火牆通過。

如果忘記了設置 ks-installer 中 KubeEdge 組件部分中外網訪問 IP,cloudhub 起不來,可以使用以下命令補救:

 kubectl -n kubeedge edit cm cloudcore

2. 獲取邊緣節點日誌、metrics

邊緣節點與 master 節點不在一個局域網的情況較多,因此我們在上面設計使用外網端口通信。另外,由於 KubeEdge 完成 kubectl exec,獲取 logs 以及 metrics 的功能,依賴虛擬 IP 進行相應的 iptable 轉發到 cloudhub 對應的端口,繼而獲取邊緣端的數據,也就是通過 edgemesh 實現,所以邊緣節點綁定的虛擬 IP 和邊緣節點名稱必須是唯一的,要自行按規律維護,注意這個虛擬 IP 不能填邊緣節點內網 IP,最好選擇與內網不衝突的網端,同時要保證 metrics-server 組件處於開啓狀態,需要更新爲 0.4.1 版本以上以適應 KubeEdge(當前版本主要通過 metrics-server 獲取邊緣 metrics)。

3. 如果邊緣節點使用外網 IP 和端口通信,有些 daemonset 的容忍度比較強,比如 Calico,需要給它們 patch 一下,避免調度到邊緣端

#!/bin/bash

NodeSelectorPatchJson='{"spec":{"template":{"spec":{"nodeSelector":{"node-role.kubernetes.io/master": "","node-role.kubernetes.io/worker": ""}}}}}'
NoShedulePatchJson='{"spec":{"template":{"spec":{"affinity":{"nodeAffinity":{"requiredDuringSchedulingIgnoredDuringExecution":{"nodeSelectorTerms":[{"matchExpressions":[{"key":"node-role.kubernetes.io/edge","operator":"DoesNotExist"}]}]}}}}}}}'

edgenode="edgenode"
if [ $1 ]; then
        edgenode="$1"
fi

namespaces=($(kubectl get pods -A -o wide |egrep -i $edgenode | awk '{print $1}' ))
pods=($(kubectl get pods -A -o wide |egrep -i $edgenode | awk '{print $2}' ))
length=${#namespaces[@]}

for((i=0;i<$length;i++));  
do
        ns=${namespaces[$i]}
        pod=${pods[$i]}
        resources=$(kubectl -n $ns describe pod $pod | grep "Controlled By" |awk '{print $3}')
        echo "Patching for ns: $ns, resources: $resources"
        kubectl -n $ns patch $resources --type merge --patch "$NoShedulePatchJson"
        sleep 1
done

4. kubelet cgroup driver: "cgroupfs" is different from docker cgroup driver: "systemd"

原因:kubelet 和 master 端使用的 cgroup 不一致導致

解決辦法:

添加配置 "exec-opts": ["native.cgroupdriver=systemd"], 然後重啓 Docker,systemctl daemon-reload && systemctl restart kubelet

參考描述:

  • kubeedge/kubeedge#1772 (comment) cgroup driver shouldn't be taken care by the keadm, I think this is also true for "kubeadm", all that care about the cgroup driver is actually which cri you are using, for example, in your case, you are using docker, so you just need to update the docker configuration to use "systemd" instead.

5. 邊緣節點和 Kubernetes 在一個局域網時,如何加入 KubeSphere 納管?

如果邊緣節點和 Kubernetes 集羣在一個局域網,可以使用 nodePort 方式加入邊緣節點,默認已開放的 nodeport 端口爲 30000-30004,所以邊緣節點 join 集羣的時候得將外部端口 10000-10004 改爲 30000-30004,也就是將其中的 --cloudcore-ipport=192.168.x.x:10000 --quicport 10001 --certport 10002 --tunnelport 10004 改爲 --cloudcore-ipport=192.168.x.x:30000 --quicport 30001 --certport 30002 --tunnelport 30004,不過需要指出的是,設計是從外網考慮,請明確邊緣節點的應用場景。

更多請參考 guide 指南。

6. 邊緣節點 pod metrics 支持的最低 Docker 版本

目前邊緣端支持的 Docker 版本應該大於等於 v19.3.0,具體原因可參考 https://kubesphere.com.cn/forum/d/4494-kubesphere-v310/8

KubeEdge v1.6.2 已發佈,目前測試該 bug 已經修復,見圖:

邊緣端需要升級到 v1.6.2,也可以添加以下配置進行修改:

apiVersion: v1
kind: ConfigMap
metadata:
  name: edge-watcher-config
  namespace: kubeedge
data:
  version: v1.6.2
  region: zh

7. node metrics 不正常顯示排除指南

  • 檢查metrics-server服務是否正常 檢查 metrics-server deployment 是否正常,版本是否符合要求(v0.4.1 以上),查看 kubectl top 是否異常,如果異常,可以重啓, 或者手動安裝:

    kubectl apply  -f       https://raw.githubusercontent.com/kubesphere/ks-installer/master/roles/metrics-server/files/metrics-server/metrics-server.yaml
    
  • 其他節點都有 metrics,只有邊緣節點沒有 metrics

    • 檢查 iptables 是否建立正確的轉發, 用以下命令查看 iptables pod 部署在哪個 node:
    kubectl get pods -n kubeedge -o wide
    
    • 在對應node上獲取10350的nat轉發規則, 確認轉發目的地在k8s master or node ip上

    • 如果轉發目的地不對,可以用下面的做法:

    kubectl -n kubeedge edit cm edge-watcher
    

    修改完後需要重啓edge-watcher-controller-manager deployment

8. 證書問題

kubectl delete secret casecret cloudcoresecret -n kubeedge

需要重啓 cloudcore。

本文由博客一文多發平臺 OpenWrite 發佈!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章