本文档采用自动化机器翻译技术翻译。 尽管我们力求提供准确的译文,但不对翻译内容的完整性、准确性或可靠性作出任何保证。 若出现任何内容不一致情况,请以原始 英文 版本为准,且原始英文版本为权威文本。

Kubernetes 资源

本页面列出的命令/步骤可用于检查最重要的 Kubernetes 资源,并适用于 Rancher 启动的 Kubernetes 集群。

确保您配置了正确的 kubeconfig(例如,export KUBECONFIG=$PWD/kube_config_cluster.yml 用于 Rancher HA),或者通过 UI 使用嵌入式 kubectl。

节点

获取节点

运行以下命令并检查以下内容:

  • 您的集群中的所有节点应列出,确保没有遗漏。

  • 所有节点应具有 Ready 状态(如果不在 Ready 状态,请使用 docker logs kubelet 检查该节点上的 kubelet 容器日志)

  • 检查所有节点是否报告正确的版本。

  • 检查 OS/内核/Docker 值是否如预期显示(可能您可以将问题与升级的 OS/内核/Docker 相关联)

kubectl get nodes -o wide

示例输出:

NAME             STATUS   ROLES          AGE   VERSION   INTERNAL-IP      EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION      CONTAINER-RUNTIME
controlplane-0   Ready    controlplane   31m   v1.13.5   138.68.188.91    <none>        Ubuntu 18.04.2 LTS   4.15.0-47-generic   docker://18.9.5
etcd-0           Ready    etcd           31m   v1.13.5   138.68.180.33    <none>        Ubuntu 18.04.2 LTS   4.15.0-47-generic   docker://18.9.5
worker-0         Ready    worker         30m   v1.13.5   139.59.179.88    <none>        Ubuntu 18.04.2 LTS   4.15.0-47-generic   docker://18.9.5

获取节点条件

运行以下命令以列出具有 节点条件 的节点

kubectl get nodes -o go-template='{{range .items}}{{$node := .}}{{range .status.conditions}}{{$node.metadata.name}}{{": "}}{{.type}}{{":"}}{{.status}}{{"\n"}}{{end}}{{end}}'

运行以下命令以列出具有 节点条件 且处于活动状态的节点,因为这些节点可能会阻止正常操作。

kubectl get nodes -o go-template='{{range .items}}{{$node := .}}{{range .status.conditions}}{{if ne .type "Ready"}}{{if eq .status "True"}}{{$node.metadata.name}}{{": "}}{{.type}}{{":"}}{{.status}}{{"\n"}}{{end}}{{else}}{{if ne .status "True"}}{{$node.metadata.name}}{{": "}}{{.type}}{{": "}}{{.status}}{{"\n"}}{{end}}{{end}}{{end}}{{end}}'

示例输出:

worker-0: DiskPressure:True

Kubernetes 领导者选举

Kubernetes 控制器管理器领导者

领导者通过领导者选举过程确定。在确定领导者后,领导者(holderIdentity)将保存在 kube-controller-manager 端点中(在此示例中为 controlplane-0)。

kubectl -n kube-system get endpoints kube-controller-manager -o jsonpath='{.metadata.annotations.control-plane\.alpha\.kubernetes\.io/leader}'
{"holderIdentity":"controlplane-0_xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx","leaseDurationSeconds":15,"acquireTime":"2018-12-27T08:59:45Z","renewTime":"2018-12-27T09:44:57Z","leaderTransitions":0}>

Kubernetes 调度器领导者

领导者通过领导者选举过程确定。在确定领导者后,领导者(holderIdentity)将保存在 kube-scheduler 端点中(在此示例中为 controlplane-0)。

kubectl -n kube-system get endpoints kube-scheduler -o jsonpath='{.metadata.annotations.control-plane\.alpha\.kubernetes\.io/leader}'
{"holderIdentity":"controlplane-0_xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx","leaseDurationSeconds":15,"acquireTime":"2018-12-27T08:59:45Z","renewTime":"2018-12-27T09:44:57Z","leaderTransitions":0}>

Ingress 控制器

默认的 Ingress 控制器是 Traefik,并作为 DaemonSet 部署在 traefik 名称空间中。Pods 仅调度到具有 worker 角色的节点。

检查所有节点上 pods 是否在运行:

kubectl -n traefik get pods -o wide

示例输出:

kubectl -n traefik get pods -o wide
NAME                                    READY     STATUS    RESTARTS   AGE       IP               NODE
default-http-backend-797c5bc547-kwwlq   1/1       Running   0          17m       x.x.x.x          worker-1
traefik-4qd64                           1/1       Running   0          14m       x.x.x.x          worker-1
traefik-8wxhm                           1/1       Running   0          13m       x.x.x.x          worker-0

如果 pod 无法运行(状态不是 Running,就绪状态未显示 1/1 或您看到重启次数过高),请检查 pod 详细信息、日志和名称空间事件。

Pod 详细信息

kubectl -n traefik describe pods -l app=traefik

Pod 容器日志

以下命令可以显示所有标记为 "app=traefik" 的 pods 的日志,但由于 kubectl logs 命令的限制,它只会显示 10 行日志。有关更多信息,请参见 --tailkubectl logs -h

kubectl -n traefik logs -l app=traefik

如果需要完整日志,请在尾部命令中指定 pod 名称:

kubectl -n traefik logs <pod name>

名称空间事件

kubectl -n traefik get events

调试日志记录

要启用调试日志记录:

kubectl -n traefik patch ds traefik --type='json' -p='[{"op": "add", "path": "/spec/template/spec/containers/0/args/-", "value": "--v=5"}]'

检查配置

在每个 pod 中检索生成的配置:

kubectl -n traefik get pods -l app=traefik --no-headers -o custom-columns=.NAME:.metadata.name | while read pod; do kubectl -n traefik exec $pod -- cat /etc/nginx/nginx.conf; done

Rancher 代理

与集群的通信(通过 cattle-cluster-agent 访问 Kubernetes API)以及与节点的通信(通过 cattle-node-agent 进行集群配置)是通过 Rancher 代理完成的。

cattle-node-agent

检查每个节点上是否存在cattle-node-agent pods,状态是否为*运行中*,并且重启次数不高:

kubectl -n cattle-system get pods -l app=cattle-agent -o wide

示例输出:

NAME                      READY     STATUS    RESTARTS   AGE       IP                NODE
cattle-node-agent-4gc2p   1/1       Running   0          2h        x.x.x.x           worker-1
cattle-node-agent-8cxkk   1/1       Running   0          2h        x.x.x.x           etcd-1
cattle-node-agent-kzrlg   1/1       Running   0          2h        x.x.x.x           etcd-0
cattle-node-agent-nclz9   1/1       Running   0          2h        x.x.x.x           controlplane-0
cattle-node-agent-pwxp7   1/1       Running   0          2h        x.x.x.x           worker-0
cattle-node-agent-t5484   1/1       Running   0          2h        x.x.x.x           controlplane-1
cattle-node-agent-t8mtz   1/1       Running   0          2h        x.x.x.x           etcd-2

检查特定cattle-node-agent pod或所有cattle-node-agent pods的日志:

kubectl -n cattle-system logs -l app=cattle-agent

cattle-cluster-agent

检查cattle-cluster-agent pod是否存在于集群中,状态是否为*运行中*,并且重启次数不高:

kubectl -n cattle-system get pods -l app=cattle-cluster-agent -o wide

示例输出:

NAME                                    READY     STATUS    RESTARTS   AGE       IP           NODE
cattle-cluster-agent-54d7c6c54d-ht9h4   1/1       Running   0          2h        x.x.x.x      worker-1

检查cattle-cluster-agent pod的日志:

kubectl -n cattle-system logs -l app=cattle-cluster-agent

作业和 Pods

检查 pods 或作业的状态是否为 运行中/已完成

要检查,请运行以下命令:

kubectl get pods --all-namespaces

如果 pod 不在 运行中 状态,可以通过运行以下命令深入挖掘根本原因:

描述 pod

kubectl describe pod POD_NAME -n NAMESPACE

Pod 容器日志

kubectl logs POD_NAME -n NAMESPACE

如果作业不在 已完成 状态,可以通过运行以下命令深入挖掘根本原因:

描述作业

kubectl describe job JOB_NAME -n NAMESPACE

作业中 Pod 的容器日志

kubectl logs -l job-name=JOB_NAME -n NAMESPACE

被驱逐的Pod

Pod 可以因收到 驱逐信号而被驱逐。

检索被驱逐 Pod 的列表(Pod 名称和命名空间):

kubectl get pods --all-namespaces -o go-template='{{range .items}}{{if eq .status.phase "Failed"}}{{if eq .status.reason "Evicted"}}{{.metadata.name}}{{" "}}{{.metadata.namespace}}{{"\n"}}{{end}}{{end}}{{end}}'

要删除所有被驱逐的 Pod:

kubectl get pods --all-namespaces -o go-template='{{range .items}}{{if eq .status.phase "Failed"}}{{if eq .status.reason "Evicted"}}{{.metadata.name}}{{" "}}{{.metadata.namespace}}{{"\n"}}{{end}}{{end}}{{end}}' | while read epod enamespace; do kubectl -n $enamespace delete pod $epod; done

检索被驱逐 Pod、调度节点及原因的列表:

kubectl get pods --all-namespaces -o go-template='{{range .items}}{{if eq .status.phase "Failed"}}{{if eq .status.reason "Evicted"}}{{.metadata.name}}{{" "}}{{.metadata.namespace}}{{"\n"}}{{end}}{{end}}{{end}}' | while read epod enamespace; do kubectl -n $enamespace get pod $epod -o=custom-columns=NAME:.metadata.name,NODE:.spec.nodeName,MSG:.status.message; done

作业未完成

如果您启用了Istio,并且在您部署的作业未完成时遇到问题,您需要使用这些步骤将注释添加到您的Pod中。

由于Istio边车无限期运行,即使任务已完成,作业也不能被视为完成。这是一种临时解决方法,将禁用对注释 Pod 的任何进出流量的 Istio。请注意,这可能不允许您继续使用作业进行集成测试,因为该作业将无法访问服务网格。