kubernetes集群问题排查

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 本文CSDN博客地址:http://blog.csdn.net/huwh_/article/details/71308301 1. 查看系统Event事件 [plain] view plain copy kubectl describe pod  --namespace=   该命令可以显示Pod创建时的配置定义、状态等信息和最近的Event事件,事件信息可用于排错。

版权声明:本文为博主原创文章,未经博主允许不得转载。如需转载请联系本人,并标明出处和作者。

本文CSDN博客地址:http://blog.csdn.net/huwh_/article/details/71308301


1. 查看系统Event事件

[plain]  view plain  copy
  1. kubectl describe pod <PodName> --namespace=<NAMESPACE>  

该命令可以显示Pod创建时的配置定义、状态等信息和最近的Event事件,事件信息可用于排错。例如当Pod状态为Pending,可通过查看Event事件确认原因,一般原因有几种:

  • 没有可用的Node可调度
  • 开启了资源配额管理并且当前Pod的目标节点上恰好没有可用的资源
  • 正在下载镜像(镜像拉取耗时太久)

kubectl describe还可以查看其它k8s对象:NODE,RC,Service,Namespace,Secrets。

1.1. Pod

kubectl describe pod <PodName> --namespace=<NAMESPACE>

1.2. NODE

kubectl describe NODE

[plain]  view plain  copy
  1. Name:           runtime2.foshan2.wae.haplat.net  
  2. Labels:         kubernetes.io/hostname=runtime2.foshan2.wae.haplat.net,namespace/test=true  
  3. CreationTimestamp:  Fri, 01 Apr 2016 17:34:16 +0800  
  4. Phase:  
  5. Conditions:  
  6.   Type      Status  LastHeartbeatTime           LastTransitionTime          Reason              Message  
  7.   ────      ──────  ─────────────────           ──────────────────          ──────              ───────  
  8.   Ready     True    Sat, 08 Apr 2017 14:15:41 +0800     Sun, 26 Mar 2017 08:58:04 +0800     KubeletReady            kubelet is posting ready status  
  9.   OutOfDisk     False   Sat, 08 Apr 2017 14:15:41 +0800     Fri, 01 Apr 2016 17:34:16 +0800     KubeletHasSufficientDisk    kubelet hassufficient disk space available  
  10. Addresses:  221.5.100.100,221.5.100.100  
  11. Capacity:  
  12.  memory:    134975102976  
  13.  pods:      40  
  14.  cpu:       32  
  15. System Info:  
  16.  Machine ID:            120de474f77e4d75a670a74eea6d1e45  
  17.  System UUID:           1C929431-8D94-11E1-BD1D-001E6744D094  
  18.  Boot ID:           2a154beb-86e4-40e3-acce-4f83b1ea5ed2  
  19.  Kernel Version:        3.10.0-229.20.1.el7.x86_64  
  20.  OS Image:          CentOS Linux 7 (Core)  
  21.  Container Runtime Version: docker://1.8.2-el7.centos  
  22.  Kubelet Version:       v1.1.1-wae2-12  
  23.  Kube-Proxy Version:        v1.1.1-wae2-12  
  24. ExternalID:         runtime2.foshan2.wae.haplat.net  
  25. Non-terminated Pods:        (6 in total)  
  26.   Namespace         Name                    CPU Requests    CPU Limits  Memory Requests     Memory Limits  
  27.   ─────────         ────                    ────────────    ──────────  ───────────────     ─────────────  
  28.   acp               acp-ui-1-4-0-16j3a          4 (12%)     4 (12%)     8589934592 (6%)     8589934592 (6%)  
  29.   acp               acp-ui-1-4-1-kou20          4 (12%)     4 (12%)     8589934592 (6%)     8589934592 (6%)  
  30.   acp               acp-ui-api-1-4-0-u3w4f          4 (12%)     4 (12%)     8589934592 (6%)     8589934592 (6%)  
  31.   cloud-eye         cloud-eye-dim2-1-6-6-1-9g16i        4 (12%)     4 (12%)     34359738368 (25%)   34359738368 (25%)  
  32.   cloud-wst         cloud-wst-ceba-1-12-0-1-hjdk2       2 (6%)      2 (6%)      8589934592 (6%)     8589934592 (6%)  
  33.   cms-fd            cms-fd-schedule-3-9-1-3-wzqa1       8 (25%)     8 (25%)     21474836480 (15%)   21474836480 (15%)  
  34. Allocated resources:  
  35.   (Total limits may be over 100%, i.e., overcommitted. More info: http://releases.k8s.io/HEAD/docs/user-guide/compute-resources.md)  
  36.   CPU Requests  CPU Limits  Memory Requests     Memory Limits  
  37.   ────────────  ──────────  ───────────────     ─────────────  
  38.   26 (81%)  26 (81%)    90194313216 (66%)   90194313216 (66%)  
  39. No events.  

1.3. RC

kubectl describe rc --namespace=rmp

 
[plain]  view plain  copy
  1. [root@node5 ~]# kubectl describe rc --namespace=rmp  
  2. Name:       rmp-web-2-15-3-1  
  3. Namespace:  rmp  
  4. Image(s):   registry.wae.haplat.net/rmp/rmp-web:2.15.3-1  
  5. Selector:   app=rmp-web,appVersion=2.15.3-1  
  6. Labels:     app=rmp-web,appVersion=2.15.3-1,env=product,zone=foshan2  
  7. Replicas:   1 current / 1 desired  
  8. Pods Status:    1 Running / 0 Waiting / 0 Succeeded / 0 Failed  
  9. No volumes.  
  10. No events.  

1.4. NAMESPACE

kubectl describe NAMESPACE

[plain]  view plain  copy
  1. [root@node5 ~]# kubectl describe NAMESPACE  
  2. Name:   acp  
  3. Labels: <none>  
  4. Status: Active  
  5. Resource Quotas  
  6.  Resource       Used        Hard  
  7.  ---            ---     ---  
  8.  cpu            24      20  
  9.  memory         51539607552 53687091200  
  10.  persistentvolumeclaims 0       10  
  11.  pods           6       10  
  12.  replicationcontrollers 6       10  
  13.  resourcequotas     1       1  
  14.  secrets        2       10  
  15.  services       6       10  
  16. No resource limits.  

1.5. Service

kubectl describe Service --namespace=rmp

 
[plain]  view plain  copy
  1. [root@node5 ~]# kubectl describe Service --namespace=rmp  
  2. Name:           rmp-web-2-15-3-1  
  3. Namespace:      rmp  
  4. Labels:         app=rmp-web,appVersion=2.15.3-1,waeEnv=product,waeZone=foshan2  
  5. Selector:       app=rmp-web,appVersion=2.15.3-1  
  6. Type:           ClusterIP  
  7. IP:         10.254.201.163  
  8. Port:           port-l7-tcp-80  80/TCP  
  9. Endpoints:      10.0.68.240:80  
  10. Session Affinity:   None  
  11. No events.  

2. 查看容器日志

1、查看指定pod的日志

kubectl logs <pod_name>

kubectl logs -f <pod_name> #类似tail -f的方式查看

2、查看上一个pod的日志

kubectl logs -p <pod_name>

3、查看指定pod中指定容器的日志

kubectl logs <pod_name> -c <container_name>

[root@node5 ~] # kubectl logs --help
Print the logs  for  a container  in  a pod. If the pod has only one container, the container name is optional.
Usage:
   kubectl logs [-f] [-p] POD [-c CONTAINER] [flags]
Aliases:
   logs, log
 
Examples:
# Return snapshot logs from pod nginx with only one container
$ kubectl logs nginx
# Return snapshot of previous terminated ruby container logs from pod web-1
$ kubectl logs -p -c ruby web-1
# Begin streaming the logs of the ruby container in pod web-1
$ kubectl logs -f -c ruby web-1
# Display only the most recent 20 lines of output in pod nginx
$ kubectl logs -- tail =20 nginx
# Show all logs from pod nginx written in the last hour
$ kubectl logs --since=1h nginx

3. 查看k8s服务日志

3.1. journalctl

Linux系统上systemd系统来管理kubernetes服务,并且journal系统会接管服务程序的输出日志,可以通过systemctl status <xxx>或journalctl -u <xxx> -f来查看kubernetes服务的日志。

其中kubernetes组件包括:

kube-apiserver    
kube-controller-manager Pod扩容相关或RC相关  
kube-scheduler Pod扩容相关或RC相关  
kubelet Pod生命周期相关:创建、停止等  
etcd    

3.2. 日志文件

也可以通过指定日志存放目录来保存和查看日志

  • --logtostderr=false:不输出到stderr
  • --log-dir=/var/log/kubernetes:日志的存放目录
  • --alsologtostderr=false:设置为true表示日志输出到文件也输出到stderr
  • --v=0:glog的日志级别
  • --vmodule=gfs*=2,test*=4:glog基于模块的详细日志级别

4. 常见问题

4.1. Pod状态一直为Pending

kubectl describe <pod_name> --namespace=<NAMESPACE>

查看该POD的事件。

  • 正在下载镜像但拉取不下来(镜像拉取耗时太久)[一般都是该原因]
  • 没有可用的Node可调度
  • 开启了资源配额管理并且当前Pod的目标节点上恰好没有可用的资源

解决方法:

  1. 查看该POD所在宿主机与镜像仓库之间的网络是否有问题,可以手动拉取镜像
  2. 删除POD实例,让POD调度到别的宿主机上

4.2. Pod创建后不断重启

kubectl get pods中Pod状态一会running,一会不是,且RESTARTS次数不断增加。

一般原因为容器启动命令不是阻塞式命令,导致容器运行后马上退出。

非阻塞式命令:

  • 本身CMD指定的命令就是非阻塞式命令
  • 将服务启动方式设置为后台运行

解决方法:

1、将命令改为阻塞式命令(前台运行),例如:zkServer.sh start-foreground

2、Java运行程序的启动脚本将 nohup xxx &的nobup和&去掉,例如:

nohup $JAVA_HOME/bin/java $JAVA_OPTS -cp $CLASSPATH com.cnc.open.processor.Main &

改为:

$JAVA_HOME/bin/java $JAVA_OPTS -cp $CLASSPATH com.cnc.open.processor.Main


文章参考:

《Kubernetes权威指南》

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。 &nbsp; &nbsp; 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
4月前
|
资源调度 Kubernetes 调度
从单集群到多集群的快速无损转型:ACK One 多集群应用分发
ACK One 的多集群应用分发,可以最小成本地结合您已有的单集群 CD 系统,无需对原先应用资源 YAML 进行修改,即可快速构建成多集群的 CD 系统,并同时获得强大的多集群资源调度和分发的能力。
131 9
|
4月前
|
资源调度 Kubernetes 调度
从单集群到多集群的快速无损转型:ACK One 多集群应用分发
本文介绍如何利用阿里云的分布式云容器平台ACK One的多集群应用分发功能,结合云效CD能力,快速将单集群CD系统升级为多集群CD系统。通过增加分发策略(PropagationPolicy)和差异化策略(OverridePolicy),并修改单集群kubeconfig为舰队kubeconfig,可实现无损改造。该方案具备多地域多集群智能资源调度、重调度及故障迁移等能力,帮助用户提升业务效率与可靠性。
|
6月前
|
存储 Kubernetes 监控
K8s集群实战:使用kubeadm和kuboard部署Kubernetes集群
总之,使用kubeadm和kuboard部署K8s集群就像回归童年一样,简单又有趣。不要忘记,技术是为人服务的,用K8s集群操控云端资源,我们不过是想在复杂的世界找寻简单。尽管部署过程可能遇到困难,但朝着简化复杂的目标,我们就能找到意义和乐趣。希望你也能利用这些工具,找到你的乐趣,满足你的需求。
549 33
|
6月前
|
Kubernetes 开发者 Docker
集群部署:使用Rancher部署Kubernetes集群。
以上就是使用 Rancher 部署 Kubernetes 集群的流程。使用 Rancher 和 Kubernetes,开发者可以受益于灵活性和可扩展性,允许他们在多种环境中运行多种应用,同时利用自动化工具使工作负载更加高效。
317 19
|
6月前
|
人工智能 分布式计算 调度
打破资源边界、告别资源浪费:ACK One 多集群Spark和AI作业调度
ACK One多集群Spark作业调度,可以帮助您在不影响集群中正在运行的在线业务的前提下,打破资源边界,根据各集群实际剩余资源来进行调度,最大化您多集群中闲置资源的利用率。
|
9月前
|
Prometheus Kubernetes 监控
OpenAI故障复盘 - 阿里云容器服务与可观测产品如何保障大规模K8s集群稳定性
聚焦近日OpenAI的大规模K8s集群故障,介绍阿里云容器服务与可观测团队在大规模K8s场景下我们的建设与沉淀。以及分享对类似故障问题的应对方案:包括在K8s和Prometheus的高可用架构设计方面、事前事后的稳定性保障体系方面。
|
6月前
|
Prometheus Kubernetes 监控
OpenAI故障复盘丨如何保障大规模K8s集群稳定性
OpenAI故障复盘丨如何保障大规模K8s集群稳定性
193 0
OpenAI故障复盘丨如何保障大规模K8s集群稳定性
|
8月前
|
缓存 容灾 网络协议
ACK One多集群网关:实现高效容灾方案
ACK One多集群网关可以帮助您快速构建同城跨AZ多活容灾系统、混合云同城跨AZ多活容灾系统,以及异地容灾系统。
|
7月前
|
运维 分布式计算 Kubernetes
ACK One多集群Service帮助大批量应用跨集群无缝迁移
ACK One多集群Service可以帮助您,在无需关注服务间的依赖,和最小化迁移风险的前提下,完成跨集群无缝迁移大批量应用。
|
9月前
|
Kubernetes Ubuntu 网络安全
ubuntu使用kubeadm搭建k8s集群
通过以上步骤,您可以在 Ubuntu 系统上使用 kubeadm 成功搭建一个 Kubernetes 集群。本文详细介绍了从环境准备、安装 Kubernetes 组件、初始化集群到管理和使用集群的完整过程,希望对您有所帮助。在实际应用中,您可以根据具体需求调整配置,进一步优化集群性能和安全性。
593 13

推荐镜像

更多