本文个人博客地址为:http://www.huweihuang.com/article/kubernetes/kubernetes-troubleshooting/

本文个人博客地址为:https://huweihuang.net/article/kubernetes/kubernetes-troubleshooting/

1. 查看系统Event事件

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>

以下是容器的启动命令非阻塞式导致容器挂掉,被k8s频繁重启所产生的事件。

kubectl describe pod  --namespace=  Events:FirstSeen LastSeen    Count   From            SubobjectPath       Reason      Message───────── ────────    ─────   ────            ─────────────       ──────      ───────7m        7m      1   {scheduler }                    Scheduled   Successfully assigned yangsc-1-0-0-index0 to 10.8.216.197m        7m      1   {kubelet 10.8.216.19}   containers{infra}   Pulled      Container image "gcr.io/kube-system/pause:0.8.0" already present on machine7m        7m      1   {kubelet 10.8.216.19}   containers{infra}   Created     Created with docker id 84f133c324d07m        7m      1   {kubelet 10.8.216.19}   containers{infra}   Started     Started with docker id 84f133c324d07m        7m      1   {kubelet 10.8.216.19}   containers{yangsc0} Started     Started with docker id 3f9f82abb1457m        7m      1   {kubelet 10.8.216.19}   containers{yangsc0} Created     Created with docker id 3f9f82abb1457m        7m      1   {kubelet 10.8.216.19}   containers{yangsc0} Created     Created with docker id fb112e4002f47m        7m      1   {kubelet 10.8.216.19}   containers{yangsc0} Started     Started with docker id fb112e4002f46m        6m      1   {kubelet 10.8.216.19}   containers{yangsc0} Created     Created with docker id 613b119d44746m        6m      1   {kubelet 10.8.216.19}   containers{yangsc0} Started     Started with docker id 613b119d44746m        6m      1   {kubelet 10.8.216.19}   containers{yangsc0} Created     Created with docker id 25cb68d1fd3d6m        6m      1   {kubelet 10.8.216.19}   containers{yangsc0} Started     Started with docker id 25cb68d1fd3d5m        5m      1   {kubelet 10.8.216.19}   containers{yangsc0} Started     Started with docker id 7d9ee8610b285m        5m      1   {kubelet 10.8.216.19}   containers{yangsc0} Created     Created with docker id 7d9ee8610b283m        3m      1   {kubelet 10.8.216.19}   containers{yangsc0} Started     Started with docker id 88b9e8d582dd3m        3m      1   {kubelet 10.8.216.19}   containers{yangsc0} Created     Created with docker id 88b9e8d582dd7m        1m      7   {kubelet 10.8.216.19}   containers{yangsc0} Pulling     Pulling image "gcr.io/test/tcp-hello:1.0.0"1m        1m      1   {kubelet 10.8.216.19}   containers{yangsc0} Started     Started with docker id 089abff050e71m        1m      1   {kubelet 10.8.216.19}   containers{yangsc0} Created     Created with docker id 089abff050e77m        1m      7   {kubelet 10.8.216.19}   containers{yangsc0} Pulled      Successfully pulled image "gcr.io/test/tcp-hello:1.0.0"6m        7s      34  {kubelet 10.8.216.19}   containers{yangsc0} Backoff     Back-off restarting failed docker container

1.2. NODE

kubectl describe node 10.8.216.20

[root@FC-43745A-10 ~]# kubectl describe node 10.8.216.20
Name:           10.8.216.20
Labels:         kubernetes.io/hostname=10.8.216.20,namespace/bcs-cc=true,namespace/myview=true
CreationTimestamp:  Mon, 17 Apr 2017 11:32:52 +0800
Phase:
Conditions:Type     Status  LastHeartbeatTime           LastTransitionTime          Reason              Message────     ──────  ─────────────────           ──────────────────          ──────              ───────Ready    True    Fri, 18 Aug 2017 09:38:33 +0800    Tue, 02 May 2017 17:40:58 +0800    KubeletReady            kubelet is posting ready statusOutOfDisk    False   Fri, 18 Aug 2017 09:38:33 +0800    Mon, 17 Apr 2017 11:31:27 +0800    KubeletHasSufficientDisk    kubelet has sufficient disk space available
Addresses:  10.8.216.20,10.8.216.20
Capacity:cpu:       32memory:   67323039744pods:        40
System Info:Machine ID:         723bafc7f6764022972b3eae1ce6b198System UUID:            4C4C4544-0042-4210-8044-C3C04F595631Boot ID:            da01f2e3-987a-425a-9ca7-1caaec35d1e5Kernel Version:     3.10.0-327.28.3.el7.x86_64OS Image:         CentOS Linux 7 (Core)Container Runtime Version: docker://1.13.1Kubelet Version:     v1.1.1-xxx-13.1+79c90c68bfb72f-dirtyKube-Proxy Version:        v1.1.1-xxx-13.1+79c90c68bfb72f-dirty
ExternalID:         10.8.216.20
Non-terminated Pods:        (6 in total)Namespace           Name                    CPU Requests    CPU Limits  Memory Requests Memory Limits─────────          ────                    ────────────    ──────────  ─────────────── ─────────────bcs-cc         bcs-cc-api-0-0-1364-index0      1 (3%)      1 (3%)      4294967296 (6%) 4294967296 (6%)bcs-cc           bcs-cc-api-0-0-1444-index0      1 (3%)      1 (3%)      4294967296 (6%) 4294967296 (6%)fw               fw-demo2-0-0-1519-index0        1 (3%)      1 (3%)      4294967296 (6%) 4294967296 (6%)myview           myview-api-0-0-1362-index0      1 (3%)      1 (3%)      4294967296 (6%) 4294967296 (6%)myview           myview-api-0-0-1442-index0      1 (3%)      1 (3%)      4294967296 (6%) 4294967296 (6%)qa-ts-dna            ts-dna-console3-0-0-1434-index0     1 (3%)      1 (3%)      4294967296 (6%) 4294967296 (6%)
Allocated resources:(Total limits may be over 100%, i.e., overcommitted. More info: http://releases.k8s.io/HEAD/docs/user-guide/compute-resources.md)CPU Requests   CPU Limits  Memory Requests     Memory Limits────────────   ──────────  ───────────────     ─────────────6 (18%)    6 (18%)     25769803776 (38%)   25769803776 (38%)
No events.

1.3. RC

kubectl describe rc mytest-1-0-0 --namespace=test

[root@FC-43745A-10 ~]# kubectl describe rc mytest-1-0-0 --namespace=test
Name:       mytest-1-0-0
Namespace:  test
Image(s):   gcr.io/test/mywebcalculator:1.0.1
Selector:   app=mytest,appVersion=1.0.0
Labels:     app=mytest,appVersion=1.0.0,env=ts,zone=inner
Replicas:   1 current / 1 desired
Pods Status:    1 Running / 0 Waiting / 0 Succeeded / 0 Failed
No volumes.
Events:FirstSeen    LastSeen    Count   From                SubobjectPath   Reason          Message─────────    ────────    ─────   ────                ─────────────   ──────          ───────20h      19h     9   {replication-controller }           FailedCreate        Error creating: Pod "mytest-1-0-0-index0" is forbidden: limited to 10 pods20h     17h     7   {replication-controller }           FailedCreate        Error creating: pods "mytest-1-0-0-index0" already exists20h      17h     4   {replication-controller }           SuccessfulCreate    Created pod: mytest-1-0-0-index0

1.4. NAMESPACE

kubectl describe namespace test

[root@FC-43745A-10 ~]# kubectl describe namespace test
Name:   test
Labels: <none>
Status: ActiveResource QuotasResource       Used        Hard---         ---     ---cpu          5       20memory            1342177280  53687091200persistentvolumeclaims   0       10pods          4       10replicationcontrollers    8       20resourcequotas        1       1secrets        3       10services      8       20No resource limits.

1.5. Service

kubectl describe service xxx-containers-1-1-0 --namespace=test

[root@FC-43745A-10 ~]# kubectl describe service xxx-containers-1-1-0 --namespace=test
Name:           xxx-containers-1-1-0
Namespace:      test
Labels:         app=xxx-containers,appVersion=1.1.0,env=ts,zone=inner
Selector:       app=xxx-containers,appVersion=1.1.0
Type:           ClusterIP
IP:         10.254.46.42
Port:           port-dna-tcp-35913  35913/TCP
Endpoints:      10.0.92.17:35913
Port:           port-l7-tcp-8080    8080/TCP
Endpoints:      10.0.92.17:8080
Session Affinity:   None
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>

4、kubectl logs的更多使用请参考kubectl logs --help

[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, logExamples:
# 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

5、docker logs

如果有Node机器(即宿主机)的登录权限,可以到出问题的pod所调度到的机器上,通过docker logs的命令查看对应容器的问题原因。

例如:

docker ps -a |grep <container>

docker logs <container_id>

[root@kube-master ~]# docker ps -a |grep redis
ee7398bba500        docker.io/redis@sha256:bb47379e6e0101441dbb1fe585171521e4ee2ebe1ae23f663232f56ac41551de   "docker-entrypoint.sh"   About a minute ago   Exited (1) About a minute ago                       k8s_kubernetes-log-tail-bigdatalog-testappkey_test-add-plugins-403621826-bskfz_test-7da2c1_a5412774-d43f-11e7-98c3-a2642aaa3458_6
5360d15344fb        docker.io/redis@sha256:bb47379e6e0101441dbb1fe585171521e4ee2ebe1ae23f663232f56ac41551de   "docker-entrypoint.sh"   7 minutes ago        Up 7 minutes                                        k8s_kubernetes-log-tail-testagent_test-add-plugins-403621826-bskfz_test-7da2c1_a5412774-d43f-11e7-98c3-a2642aaa3458_0
[root@kube-master ~]#
[root@kube-master ~]# docker logs ee7398bba500
1:C 28 Nov 13:32:29.352 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
1:C 28 Nov 13:32:29.354 # Redis version=4.0.6, bits=64, commit=00000000, modified=0, pid=1, just started
1:C 28 Nov 13:32:29.354 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
1:M 28 Nov 13:32:29.355 # Creating Server TCP listening socket *:6379: bind: Address already in use

以上报错是因为端口冲突问题:bind: Address already in use

3. 查看k8s服务日志

3.1. journalctl

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

其中kubernetes组件包括:

k8s组件
涉及日志内容
备注
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权威指南》

kubernetes集群问题排查相关推荐

  1. k8s技术预研3--使用kubeadm安装、配置Kubernetes集群以及进行故障排查的方法

    一.软硬件环境 采用CentOS7.4 minimual,docker 1.12,kubeadm 1.7.5,etcd 3.0, k8s 1.7.6 本章节以下配置内容需要在全部节点上都做配置.我们这 ...

  2. Kubernetes 集群无损升级实践

    作者:vivo互联网服务器团队-Shu Yingya 一.背景 活跃的社区和广大的用户群,使 Kubernetes 仍然保持3个月一个版本的高频发布节奏.高频的版本发布带来了更多的新功能落地和 bug ...

  3. 记一次 Kubernetes 集群被入侵,服务器变矿机

    近期遇到了一次我们自建 Kubernetes 集群中某台机器被入侵挖矿,后续也找到了原因,所幸只是用来挖矿- 网络安全是个严肃的问题,它总是在不经意间出现,等你反应过来却已经迟了.希望各位读者看完后也 ...

  4. 托管节点池助力用户构建稳定自愈的 Kubernetes 集群

    作者 | 谢瑶瑶(初扬) 来源|阿里巴巴云原生公众号 随着容器技术的不断发展迭代,Kubernetes 已成为云原生时代的标准操作系统,那么如何构建一个稳定自愈的云原生操作系统事关重大.尤其是分布式环 ...

  5. 在大规模 Kubernetes 集群上实现高 SLO 的方法

    作者 | 蚂蚁金服技术专家 姚菁华:蚂蚁金服高级开发工程师 范康 导读:随着 Kubernetes 集群规模和复杂性的增加,集群越来越难以保证高效率.低延迟的交付 pod.本文将分享蚂蚁金服在设计 S ...

  6. 有效可靠地管理大规模 Kubernetes 集群

    作者 | 蚂蚁金服高级技术工程师 沧漠 前言 Kubernetes 以其超前的设计理念和优秀的技术架构,在容器编排领域拔得头筹.越来越多的公司开始在生产环境部署实践 Kubernetes,在阿里巴巴和 ...

  7. 如何专业化监控一个Kubernetes集群?

    简介:本文会介绍 Kubernetes 可观测性系统的构建,以及基于阿里云云产品实现 Kubernetes 可观测系统构建的最佳实践. 作者:佳旭 阿里云容器服务技术专家 引言 Kubernetes ...

  8. 如何部署一个Kubernetes集群

    来源 | 无敌码农 责编 | 寇雪芹 头图 | 下载于视觉中国 在上一篇文章<Kubernetes和Docker的关系是什么?>中,和大家分享了关于Kubernetes的基本系统架构以及关 ...

  9. 查看grafana版本_使用 Prometheus 与 Grafana 为 Kubernetes 集群建立监控与警报机制

    作者 | Gregoire DAYET 策划 | 田晓旭 IT 团队已经明确意识到对基础设施进行监控的必要性.目前市面上存在着大量适用于传统基础设施且历史悠久的解决方案:Nagios.Zabbix 等 ...

  10. Kubernetes 学习总结(19)—— Kubernetes 集群管理平台如何选择?Rancher vs KubeSphere

    前言 Kubernetes(K8s)集群管理平台都是基于 Kubernetes 提供功能,可以说他们是在 K8s 的基础上封装了一层更为友好的操作方式.他们都是为了降低 k8s 集群运维复杂度,降低运 ...

最新文章

  1. Meteor:发布与订阅
  2. 问题集锦(36-40)
  3. 水壶问题 算法导论8.4
  4. 学生签到系统c代码_C语言实现简单学生学籍管理系统
  5. vue制作tab切换(vuex + 动画)
  6. 英语阅读推荐:主题切换控件 ExpressionBuilder
  7. gitlab 修改HTTP连接方式中的IP和端口
  8. 统计学里“P”的故事:蚊子、皇帝的新衣和不育的风流才子
  9. html5游戏开发--动静结合(二)-用地图块拼成大地图 初探lufylegend
  10. Web Service Compression for .NET CF 3.5
  11. 为什么使用多态?实现多态的有哪些方式?
  12. zip gbk java,java 解压 ZIP 中文 乱码 GBK UTF-8 完美解决方案
  13. Android 开源绘画板项目 (ScaleSketchPadDemo)
  14. 浪曦 ASP.net AJAX系列 视频下载
  15. springboot下载resources目录下的文件
  16. The requested URL was not found on this server.
  17. 新手小白~千元左右新手入门值得推荐的十款吉他
  18. 华为第十届 关灯计划
  19. 你从哪里来你是谁你到哪里去_你到底在哪里?
  20. 计算机技术在机械设计中的应用,计算机技术在机械设计制造及其自动化中的应用...

热门文章

  1. shell bash 学习
  2. 基于胡桃夹子优化算法 (NOA)求解单目标优化问题附matlab代码
  3. Python2使用原生库获取Linux服务器网卡ip
  4. [去哪儿]裁减网格纸
  5. 【机哥】基于神经网络的语音合成器
  6. 【面试总结】五年Java开发者小米、阿里面经
  7. 外贸新人如何高效开发国外客户注意事项
  8. 传饿了么前CTO张雪峰已从阿里离职
  9. 年度回忆录(2013.01----2013.12)
  10. 银保监计算机类历年试题,银保监会考试题库:计算机类模拟试题练习(四)答案...