按照笔者的教程,你们应该都可以比较顺畅的完成k8s集群的部署,不过因为环境、配置以及对Linux、k8s的不了解会致使不少问题、异常和故障,这里笔者分享一些处理技巧和思路,以及部分常见的问题,以供你们参考和学习。html
总之,出现问题不要慌,先根据异常、故障症状初步推敲问题的所在,而后结合相关命令、工具、日志推敲出具体问题。其中,具体的日志内容是关键,请务必得到相关异常的详细日志进行诊断,而不是被表象所迷惑,或者根据表象问题(好比“XXXX”pod崩溃了)去猜、搜索或者请教他人。整体上,思路以下图所示:node
若是问题实在没法解决或者没法肯定是哪里的配置以及操做不当引发的,能够试着重置节点以及重置集群。docker
若是出现问题,咱们应该怎么去分析和解决问题呢?下面,笔者将分享一些思路和经验:后端
健康状态检查——初诊api
组件、插件健康状态检查服务器
Kubernetes 组件异常分析网络
节点健康状态检查架构
Pod健康状态检查ide
首先,咱们须要根据表象进行初步诊断,以便沿着线索按图索骥。工具
使用命令:
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
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是否运行正常,可使用如下命令:
kubectl get pods -o wide
若是存在命名空间,须要使用-n参数指定命名空间。如上图所示,Pod为“Running”状态才是正常。
若是Pod运行正常,可是又没法访问(集群内部、外部),这时,咱们须要检查Service是否正常,可以使用如下命令:
kubectl get svc -o wide