前言
按照笔者的教程, 大家应该都能够比较顺畅的完成 k8s 集群的部署, 不过由于环境, 配置以及对 Linux,k8s 的不了解会导致很多问题, 异常和故障, 这里笔者分享一些处理技巧和思路, 以及部分常见的问题, 以供大家参考和学习.
总之, 出现问题不要慌, 先根据异常, 故障症状初步推敲问题的所在, 然后结合相关命令, 工具, 日志推敲出具体问题. 其中, 具体的日志内容是关键, 请务必获得相关异常的详细日志进行诊断, 而不是被表象所迷惑, 或者根据表象问题 (比如 "XXXX"pod 崩溃了) 去猜, 搜索或者请教他人. 总体上, 思路如下图所示:
如果问题实在无法解决或者无法确定是哪里的配置以及操作不当引起的, 可以试着重置节点以及重置集群.
如果出现问题, 我们应该怎么去分析和解决问题呢? 下面, 笔者将分享一些思路和经验:
目录
健康状态检查 -- 初诊
组件, 插件健康状态检查
Kubernetes 组件异常分析
节点健康状态检查
Pod 健康状态检查
健康状态检查 -- 初诊
首先, 我们需要根据表象进行初步诊断, 以便沿着线索按图索骥.
组件, 插件健康状态检查
使用命令:
kubectl get componentstatus
或
kubectl get cs
健康情况下如下图所示:
Kubernetes 组件 (插件) 部分默认基于 systemd 运行, 比如 kubelet,docker 等, 我们需要使用以下命令确保其处于活动 (active) 状态:
systemctl status kubelet docker
而大部分的 Kubernetes 的组件则运行在命名空间为 "kube-system" 的静态 Pod 之中(参见 "kubeadm init" 一节), 我们可以使用以下命令来查看这些 Pod 的状态:
kubectl get pods -o wide -n kube-system
Kubernetes 组件异常分析
k8s 组件主要分为 Master 组件和节点组件, Master 组件对集群做出全局性决策(比如调度), 以及检测和响应集群事件. 如果 Master 组件出现问题, 可能会导致集群不可访问, Kubernetes API 访问出错, 各种控制器无法工作等等. 而节点组件在每个节点上运行, 维护运行的 Pod 并提供 Kubernetes 运行时环境. 如果节点组件出现问题, 可能会导致该节点异常并且该节点 Pod 无法正常运行和结束.
因此, 根据不同的组件, 可能会出现不同的异常.
kube-apiserver 对外暴露了 Kubernetes API, 如果 kube-apiserver 出现异常可能会导致:
集群无法访问, 无法注册新的节点
资源 (Deployment,Service 等) 无法创建, 更新和删除
现有的不依赖 Kubernetes API 的 pods 和 services 可以继续正常工作
etcd 用于 Kubernetes 的后端存储, 所有的集群数据都存在这里. 保持稳定的 etcd 集群对于 Kubernetes 集群的稳定性至关重要. 因此, 我们需要在专用计算机或隔离环境上运行 etcd 集群以确保资源需求. 当 etcd 出现异常时可能会导致:
kube-apiserver 无法读写集群状态, apiserver 无法启动
Kubernetes API 访问出错
kubectl 操作异常
kubelet 无法访问 apiserver, 仅能继续运行已有的 Pod
kube-controller-manager 和 kube-scheduler 分别用于控制器管理和 Pod 的调度, 如果他们出现问题, 则可能导致:
相关控制器无法工作
资源 (Deployment,Service 等) 无法正常工作
无法注册新的节点
Pod 无法调度, 一直处于 Pending 状态
kubelet 是主要的节点代理, 如果节点宕机 (VM 关机) 或者 kubelet 出现异常(比如无法启动), 那么可能会导致:
该节点上的 Pod 无法正常运行, 如果节点关机, 则当前节点上所有 Pod 都将停止运行
已运行的 Pod 无法伸缩, 也无法正常终止
无法启动新的 Pod
节点会标识为不健康状态
副本控制器会在其它的节点上启动新的 Pod
Kubelet 有可能会删掉当前运行的 Pod
CoreDNS(在 1.11 以及以上版本的 Kubernetes 中, CoreDNS 是默认的 DNS 服务器)是 k8s 集群默认的 DNS 服务器, 如果其出现问题则可能导致:
无法注册新的节点
集群网络出现问题
Pod 无法解析域名
kube-proxy 是 Kubernetes 在每个节点上运行网络代理. 如果它出现了异常, 则可能导致:
该节点 Pod 通信异常
节点健康状态检查
我们可以使用以下命令来检查节点状态:
kubectl get nodes
其中,"Ready" 表示节点已就绪, 为正常状态, 反之则该节点出现异常. 节点出现问题, 则 Pod 无法无法调度到该节点.
Pod 健康状态检查
如果是集群应用出现异常, 我们需要检查相关 Pod 是否运行正常, 可以使用以下命令:
kubectl get pods -o wide
如果存在命名空间, 需要使用 - n 参数指定命名空间. 如上图所示, Pod 为 "Running" 状态才是正常.
如果 Pod 运行正常, 但是又无法访问(集群内部, 外部), 这时, 我们需要检查 Service 是否正常, 可使用以下命令:
kubectl get svc -o wide
往期内容链接
Docker+ Kubernetes 已成为云计算的主流(二十五)
容器化之后如何节省云端成本?(二十六)
了解 Kubernetes 主体架构(二十七)
使用 Minikube 部署本地 Kubernetes 集群(二十八)
使用 kubectl 管理 k8s 集群(二十九)
使用 Kubeadm 创建 k8s 集群之部署规划(三十)
使用 Kubeadm 创建 k8s 集群之节点部署(三十一)
来源: https://www.cnblogs.com/codelove/p/11313359.html