您可以按下列步骤定位您集群中的问题。

仔细检查所需端口是否已在主机防火墙或 VPC 安全组中打开。

节点是否处于 Ready 状态

请运行以下命令检测:

如果有节点未显示或处于非 Ready 状态,可以检查 容器的日志。登录该节点执行 docker logs kubelet

请运行以下命令检测:

  1. kubectl --kubeconfig kube_config_rancher-cluster.yml get pods --all-namespaces

描述 Pod

  1. kubectl --kubeconfig kube_config_rancher-cluster.yml describe pod POD_NAME -n NAMESPACE

显示 Pod 容器日志

  1. kubectl --kubeconfig kube_config_rancher-cluster.yml logs POD_NAME -n NAMESPACE

如果有 Job 处于非 Completed 状态,可以通过运行以下命令来找出根本原因:

描述 Job

显示 Job 的容器日志

  1. kubectl --kubeconfig kube_config_rancher-cluster.yml logs -l job-name=JOB_NAME -n NAMESPACE

检查 Ingress

Ingress 应该具有正确的 HOSTS(显示已配置的 FQDN)和 ADDRESS (将被路由到的地址)。

  1. kubectl --kubeconfig kube_config_rancher-cluster.yml get ingress --all-namespaces

Kubernetes 集群事件会被存储,可以通过运行以下命令进行检索:

  1. kubectl --kubeconfig kube_config_rancher-cluster.yml get events --all-namespaces

检查 Rancher 容器日志

  1. kubectl --kubeconfig kube_config_rancher-cluster.yml logs -l app=ingress-nginx -n ingress-nginx

检查 Overlay 网络是否正常运行

Pod 可以被调度到集群中的任何主机,这就意味着 NGINX ingress controller 能将请求从 NODE_1 路由到 NODE_2,即,请求是在 Overlay 网络之上流转的。也就是说,如果 Overlay 网络不正常,NGINX ingress controller 就无法把请求路由到 Pod,那么您将遇到间歇性的 TCP/HTTP connection failed 的错误。

您如果要测试集群 Overlay 网络的连通性,可以运行下面的 DaemonSet ,在每个主机上跑起一个 alpine 容器,然后在这些容器之间执行 ping 测试。

    1. kind: DaemonSet
    2. name: alpine
    3. spec:
    4. selector:
    5. matchLabels:
    6. name: alpine
    7. template:
    8. metadata:
    9. labels:
    10. name: alpine
    11. spec:
    12. tolerations:
    13. - effect: NoExecute
    14. key: "node-role.kubernetes.io/etcd"
    15. value: "true"
    16. - effect: NoSchedule
    17. key: "node-role.kubernetes.io/controlplane"
    18. value: "true"
    19. imagePullPolicy: Always
    20. name: alpine
    21. command: ["sh""-c""tail -f /dev/null"]
    22. terminationMessagePath: /dev/termination-log
  1. 执行 kubectl --kubeconfig kube_config_rancher-cluster.yml create -f ds-alpine.yml

  2. 执行 kubectl --kubeconfig kube_config_rancher-cluster.yml rollout status ds/alpine -w 直到返回:daemon set "alpine" successfully rolled out

  3. 运行以下命令,使每个主机上的每个容器相互 ping 通(这是一条单行命令)。

    1. echo "=> Start"; kubectl --kubeconfig kube_config_rancher-cluster.yml get pods -l name=alpine -o jsonpath='{range .items[*]}{@.metadata.name}{" "}{@.spec.nodeName}{"\n"}{end}' | while read spod shost; do kubectl --kubeconfig kube_config_rancher-cluster.yml get pods -l name=alpine -o jsonpath='{range .items[*]}{@.status.podIP}{" "}{@.spec.nodeName}{"\n"}{end}' | while read tip thost; do kubectl --kubeconfig kube_config_rancher-cluster.yml --request-timeout='10s' exec $spod -- /bin/sh -c "ping -c2 $tip > /dev/null 2>&1"; RC=$?; if [ $RC -ne 0 ]; then echo $shost cannot reach $thost; fi; done; done; echo "=> End"
  4. 该命令运行完毕后,代表一切正确的输出如下:

如果在输出中看到错误,则表示在测试的主机之间未打开 Overlay 网络的。

  1. => Start
  2. command terminated with exit code 1
  3. NODE2 cannot reach NODE1
  4. command terminated with exit code 1
  5. NODE3 cannot reach NODE1
  6. command terminated with exit code 1
  7. NODE1 cannot reach NODE2
  8. command terminated with exit code 1
  9. NODE1 cannot reach NODE3