2、常见问题


您可以按照以下步骤定位集群错误。

  • 检查防火墙是否放行了所需的端口,所需端口列表访问端口需求;

  • 所有节点都应该存在并处于Ready状态;

运行以下命令查询节点状态:

  1. kubectl --kubeconfig kube_config_rancher-cluster.yml get nodes

image-20180719143000678

如果输出结果中未显示节点或节点未处于Ready状态,则需要检查kubelet容器的日志记录。

  • 登录节点运行以下命令

docker logs kubelet.

  • 所有的pods/jobs 应该是Running/Completed状态;

通过以下命令检查pods/jobs状态:

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

image-20180719143121419

  • 如果pod不是Running状态, 需要通过以下命令进一步查询问题:

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

Pod container logs

  1. kubectl --kubeconfig kube_config_rancher-cluster.yml logs POD_NAME -n NAMESPACE
  • 如果job不是Completed状态, 通过以下命令检查问题:

    • Describe job
  1. kubectl --kubeconfig kube_config_rancher-cluster.yml describe job JOB_NAME -n NAMESPACE
  1. -

Logs from the containers of pods of the job

  1. kubectl --kubeconfig kube_config_rancher-cluster.yml logs -l job-name=JOB_NAME -n NAMESPACE
  • 列出所有Kubernetes集群事件

可以通过以下命令查询存储的Kubernetes cluster事件:

  1. kubectl --kubeconfig kube_config_rancher-cluster.yml get events --all-namespaces
  • 检查Rancher容器日志:
  1. kubectl --kubeconfig kube_config_rancher-cluster.yml logs -l app=cattle -n cattle-system
  • 检查NGINX ingress controller日志
  1. kubectl --kubeconfig kube_config_rancher-cluster.yml logs -l app=ingress-nginx -n ingress-nginx
  • 检查overlay网络是否正常运行

可以将pod运行到多台主机上,通过nginx ingress把请求路由到多个节点上。路由请求将会通过overlay网络通信,如果overlay网络没有正常运行,nginx ingress无法路由请求到Pod。

要测试overlay网络,可以通过DaemonSet定义一组全局服务,这将在每个主机上运行一个容器(alpine为例),我们将使用这些容器去ping其他主机上的容器。

  • 保存以下代码为 ds-alpine.yml
  1. apiVersion: apps/v1
  2. kind: DaemonSet
  3. metadata:
  4. name: alpine
  5. spec:
  6. selector:
  7. matchLabels:
  8. name: alpine
  9. template:
  10. metadata:
  11. labels:
  12. name: alpine
  13. spec:
  14. tolerations:
  15. - effect: NoExecute
  16. key: "node-role.kubernetes.io/etcd"
  17. value: "true"
  18. - effect: NoSchedule
  19. key: "node-role.kubernetes.io/controlplane"
  20. value: "true"
  21. containers:
  22. - image: alpine
  23. imagePullPolicy: Always
  24. name: alpine
  25. command: ["sh", "-c", "tail -f /dev/null"]
  26. terminationMessagePath: /dev/termination-log
  • 通过执行 kubectl —kubeconfig kube_config_rancher-cluster.yml create -f ds-alpine.yml 运行服务;

  • 等到kubectl —kubeconfig kube_config_rancher-cluster.yml rollout status ds/alpine -w返回daemon set "alpine" successfully rolled out

  • 运行以下kubectl命令,让每个主机上的容器分别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"
  • 当命令运行完毕后,正常的overlay网络将会输出以下内容:
  1. => Start
  2. => End

如果在输出结果中看到错误,则表明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
  10. => End