learning/k8s-advanced/ts/cluster.md
本文主要是关于如何诊断集群出现的问题,此时,假设您已经经过排查,确认当前碰到问题的 root cause(问题的根源)不是应用程序的问题。参考 诊断应用程序。
当您怀疑集群可能有故障时,首先要做的是查看集群中的节点:
kubectl get nodes -o wide
检查是否所有的节点是否都在并且都处于 Ready 状态。对于您怀疑有问题的节点,可以查看节点上的详细信息,以及节点上的事件:
参考 节点 理解节点详细信息的含义
# 将 ${NODE_NAME} 替换成您实际的节点名字
kubectl describe node ${NODE_NAME}
此时,如果还不能确定问题在哪儿,就需要您进一步到相关的机器上查询集群组件的日志了。
如果您参考 www.kuboard.cn 上的 kubernetes 安装文档安装的集群,或者使用 kubeadm 安装的集群,可以按照如下方式查看集群各组件的日志:
执行命令 kubectl get pods -n kube-system 查看所有 kube-system 名称空间下的容器,输出结果如下所示:
NAME READY STATUS RESTARTS AGE
calico-kube-controllers-65b8787765-4sbhj 1/1 Running 2 51d
calico-node-fz5t5 1/1 Running 0 7d22h
calico-node-lpd5d 1/1 Running 1 34d
calico-node-qjfqd 1/1 Running 1 10d
calico-node-zchvg 1/1 Running 6 51d
coredns-67c766df46-cbhf4 1/1 Running 1 8d
coredns-67c766df46-zthsk 1/1 Running 0 7d23h
eip-nfs-cluster-storage-6c9c7d46f4-lmxql 1/1 Running 0 7d23h
eip-nfs-nfs-on-centos-66c4fc8fbd-rd4zh 1/1 Running 0 7d5h
etcd-demo-master-a-1 1/1 Running 0 8d
kube-apiserver-demo-master-a-1 1/1 Running 0 8d
kube-controller-manager-demo-master-a-1 1/1 Running 1 8d
kube-proxy-4xz9h 1/1 Running 1 8d
kube-proxy-5kljb 1/1 Running 1 8d
kube-proxy-wmzlq 1/1 Running 0 7d22h
kube-proxy-z55s9 1/1 Running 1 8d
kube-scheduler-demo-master-a-1 1/1 Running 0 8d
kuboard-7d6b54b946-xmv28 1/1 Running 0 3d3h
kuboard-897b6487d-2bbmz 0/1 Terminating 6 13d
monitor-blackbox-exporter-7b97c74f8f-qcm4z 1/1 Running 0 7d4h
monitor-grafana-7d88f4b5d7-jxphs 1/1 Running 0 7d4h
monitor-kube-state-metrics-555b9cd949-hthlr 2/2 Running 0 7d4h
monitor-prometheus-6768d469b5-cmn9j 1/1 Running 0 7d4h
monitor-prometheus-node-exporter-dsfnl 1/1 Running 0 7d4h
monitor-prometheus-node-exporter-l5dbs 1/1 Running 0 7d4h
monitor-prometheus-node-exporter-t7d24 1/1 Running 0 7d4h
monitor-prometheus-node-exporter-z9ht5 1/1 Running 0 7d4h
其中,kube- 开头的 Pod 都是 Kubernetes 集群的系统级组件,calico- 开头是的 calico 网络插件,etcd- 开头的是 etcd,coredns- 开头的是 DNS 插件。
假设您认为 apiserver 可能有故障,则,可以执行以下命令以查看其日志
kubectl logs -f kube-apiserver-demo-master-a-1 -n kube-system
执行命令 service kubelet status 可查看 kubelet 的运行状态,如下所示:
如果您的 kubelet 运行状态不是 active (running),那么您需要进一步查看 kubelet 的日志。
Redirecting to /bin/systemctl status kubelet.service
● kubelet.service - kubelet: The Kubernetes Node Agent
Loaded: loaded (/usr/lib/systemd/system/kubelet.service; enabled; vendor preset: disabled)
Drop-In: /usr/lib/systemd/system/kubelet.service.d
└─10-kubeadm.conf
Active: active (running) since Wed 2019-10-02 22:06:37 CST; 1 weeks 1 days ago
Docs: https://kubernetes.io/docs/
Main PID: 633 (kubelet)
Tasks: 18
Memory: 213.2M
CGroup: /system.slice/kubelet.service
└─633 /usr/bin/kubelet --bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf --config=/var/lib/kubelet/config.yaml --cgroup-driver=systemd --network-plugin=cni --...
执行命令以下命令可以查看 kubelet 的日志:
journalctl -u kubelet
此处罗列了一部分 kubernetes 集群常见的故障原因以及应对办法:
可能的 Root causes:
具体的故障场景有:
unhealthyAction: 使用 IaaS 供应商提供的自动重启虚拟机的功能
Action: 为 apiserver + etcd 使用 IaaS 供应商提供的稳定可靠的持久化存储
Action: 使用高可用配置,参考 安装Kubernetes高可用
Action:周期性的为 apiserver 的 etcd 所使用的数据卷创建磁盘快照(Snapshot)
Action:使用Deployment/StatefulSet/DaemonSet 等控制器,而不是直接创建 Pod
Action:Kubernetes联邦 (避免将有风险的操作一次性应用到所有集群)