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 發布!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM