1. 程式人生 > >kubernetes中網絡報錯問題

kubernetes中網絡報錯問題

kubernetes中網絡報錯問題 cni kubernetes pod

kubernetes中網絡報錯問題

  1. 系統環境
    #系統版本
    cat /etc/redhat-release
    CentOS Linux release 7.4.1708 (Core)
    #kubelet版本
    kubelet --version
    Kubernetes v1.10.0
    #selinux狀態
    getenforce
    Disabled
    #系統防火墻狀態
    systemctl status firewalld
    ● firewalld.service - firewalld - dynamic firewall daemon
    Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
    Active: inactive (dead)
     Docs: man:firewalld(1)
  2. Pod 異常問題
    #dns的Pod 一直處於 Waiting 或 ContainerCreating 狀態
    kubectl get po -n kube-system
    NAME                                    READY     STATUS             RESTARTS   AGE
    kube-dns-86f4d74b45-ffwjf        0/3       ContainerCreating   0          6m
    #查看Pod詳細情況
    kubectl  describe pod kube-dns-86f4d74b45-ffwjf  -n kube-system
    ##我們看到如下信息:
    Error syncing pod
    Pod sandbox changed, it will be killed and re-created.
    ##可以發現,該 Pod 的 Sandbox 容器無法正常啟動,具體原因需要查看 Kubelet 日誌。
    #查看Pod的log
    journalctl -u kubelet
    ##看到如下報錯內容:
    RunPodSandbox from runtime service failed: rpc error: code = 2 desc = NetworkPlugin cni failed to set up pod "kube-dns-86f4d74b45-ffwjf" network: failed to set bridge addr: "cni0" already has an IP address different from 10.244.4.1/24

    ##說明
    這裏的一個Pod中啟動了多個容器,所以,我們使用kubectl logs 命令查看日誌很有局限性,關於kubectl logs的使用,請參考kubernetes中的Pod簡述與實踐和kubernetes中文文檔。

  3. 處理步驟
    #在master節點之外的節點進行操作
    kubeadm reset
    systemctl stop kubelet
    systemctl stop docker
    rm -rf /var/lib/cni/
    rm -rf /var/lib/kubelet/*
    rm -rf /etc/cni/
    ifconfig cni0 down
    ifconfig flannel.1 down
    ifconfig docker0 down
    ip link delete cni0
    ip link delete flannel.1
    ##重啟kubelet
    systemctl restart kubelet
    ##重啟docker
    systemctl restart docker
    #說明
    ##如果上面操作之後還是報相同的錯誤或是如下錯誤:
    "CreatePodSandbox for pod \" kube-dns-86f4d74b45-ffwjf _default(78e796f5-e
    b7c-11e7-b903-b827ebd42d30)\" failed: rpc error: code = Unknown desc = N
    etworkPlugin cni failed to set up pod \" kube-dns-86f4d74b45-ffwjf _default\"
    network: failed to allocate for range 0: no IP addresses available in range set:
    10.244.1.1-10.244.1.254"
    #執行如下操作步驟:
    ##在master主機上
    kubeadm reset
    systemctl stop kubelet
    systemctl stop docker
    rm -rf /var/lib/cni/
    rm -rf /var/lib/kubelet/*
    rm -rf /etc/cni/
    ifconfig cni0 down
    ifconfig flannel.1 down
    ifconfig docker0 down
    ip link delete cni0
    ip link delete flannel.1
    ##重啟kubelet
    systemctl restart kubelet
    ##重啟docker
    systemctl restart docker
    ##初始化
    kubeadm init --kubernetes-version=v1.10.1 --pod-network-cidr=10.244.0.0/16
    --apiserver-advertise-address=10.0.0.39
    ##說明:
    最後給出了將節點加入集群的命令:
    kubeadm join 10.0.0.39:6443 --token 4g0p8w.w5p29ukwvitim2ti 
    --discovery-token-ca-cert-hash sha256:21d0adbfcb409dca97e65564
    1573b2ee51c
    77a212f194e20a307cb459e5f77c8
    這條命令一定保存好,因為後期沒法重現的!!
    ##建立.kube
    rm -rf /root/.kube/
    mkdir -p /root/.kube/
    cp -i /etc/kubernetes/admin.conf /root/.kube/config
    chown root:root /root/.kube/config
    #在node(非master)節點上
    kubeadm reset
    systemctl stop kubelet
    systemctl stop docker
    rm -rf /var/lib/cni/
    rm -rf /var/lib/kubelet/*
    rm -rf /etc/cni/
    ifconfig cni0 down
    ifconfig flannel.1 down
    ifconfig docker0 down
    ip link delete cni0
    ip link delete flannel.1
    ##重啟kubelet
    systemctl restart kubelet
    ##重啟docker
    systemctl restart docker
    ## kubeadm join
    kubeadm join 10.0.0.39:6443 --token 4g0p8w.w5p29ukwvitim2ti 
    --discovery-token-ca-cert-hash sha256:21d0adbfcb409dca97e65564
    1573b2ee51c
    77a212f194e20a307cb459e5f77c8
  4. 總結
    除了以上錯誤,其他可能的原因還有:
    鏡像拉取失敗,比如:
    (1)配置了錯誤的鏡像
    (2)Kubelet 無法訪問鏡像(國內環境訪問 gcr.io 需要特殊處理
    (3)私有鏡像的密鑰配置錯誤
    (4)鏡像太大,拉取超時(可以適當調整 kubelet 的 --image-pull-progress-deadline 和 --runtime-request-timeout 選項)
    CNI 網絡錯誤,一般需要檢查 CNI 網絡插件的配置,比如:
    (1)無法配置 Pod 網絡
    (2)無法分配 IP 地址
    容器無法啟動,需要檢查是否打包了正確的鏡像或者是否配置了正確的容器參數等。
  5. 參考文章
    https://github.com/kubernetes/kubernetes/issues/57280

kubernetes中網絡報錯問題