0%

kubectl命令——故障排查篇

故障排查思路

故障排查的第一步是先给问题分类。
这个问题是哪个资源对象出了问题?pod、service、configmap、…?
参考文档:

Pods排查

查看pod详细信息

1
2
kubectl get pods $pod_name -n $namespace -oyaml
kubectl describe pods $pod_name -n $namespace

查看容器日志

查看容器日志

1
2
3
4
kubectl logs $pod_name -n $namespace 
kubectl logs $pod_name -c $container_name -n $namespace
kubectl logs --tail=100 $pod_name -c $container_name -n $namespace
kubectl logs -f $pod_name -c $container_name -n $namespace

查看crashed容器日志

1
kubectl logs --previous $pod_name -c $container_name -n $namespace

查看容器内部日志

1
2
kubectl exec $pod_name -n $namespace -- cat /var/log/cassandra/system.log
kubectl exec $pod_name -c $container_name -n $namespace -- cat /var/log/cassandra/system.log

Deployment排查

查看deployment信息

1
2
kubectl get deployment $controller_name -n $namespace -oyaml
kubectl describe deployment $controller_name -n $namespace

Service排查

查看service信息

1
2
kubectl get service $service_name -n $namespace
kubectl get service $service_name -n $namespace -oyaml

查看endpoints资源,service选择到了哪些pod和端口

1
kubectl get endpoints $service_name

查看集群信息

查看集群信息

1
2
kubectl cluster-info
kubectl cluster-info dump

查看集群状态

1
2
kubectl get cs
kubectl get componentstatuses
1
2
3
4
NAME                 STATUS      MESSAGE                                                                                       ERROR
controller-manager Unhealthy Get "http://127.0.0.1:10252/healthz": dial tcp 127.0.0.1:10252: connect: connection refused
scheduler Unhealthy Get "http://127.0.0.1:10251/healthz": dial tcp 127.0.0.1:10251: connect: connection refused
etcd-0 Healthy {"health":"true"}

如果看到上面的信息,不要紧张。通过kubeadm安装的k8s集群,都是这样,可以忽略。
如果非要解决,那么可以修改kube-controller-manager.yaml和kube-scheduler.yaml中的command启动参数,添加address参数。

1
2
3
4
5
6
7
8
9
10
11
spec:
containers:
- command:
- kube-scheduler
- --authentication-kubeconfig=/etc/kubernetes/scheduler.conf
- --authorization-kubeconfig=/etc/kubernetes/scheduler.conf
- --bind-address=127.0.0.1
- --kubeconfig=/etc/kubernetes/scheduler.conf
- --leader-elect=true
- --port=0
- --address=127.0.0.1

查看node资源使用

1
kubectl top node

查看集群事件

1
kubectl get ev

容器交互

执行命令

1、登录容器

1
2
3
kubectl exec -it pod-name /bin/bash
kubectl exec -it pod-name -c container-name /bin/bash
kubectl exec -it pod-name -c container-name sh

2、直接执行命令

1
2
3
4
5
6
kubectl exec pod-name env
kubectl exec pod-name -- env
kubectl exec pod-name -it -- env
kubectl exec -n default pod-name -it -- env
# 命令带参数时必须加双横线
kubectl exec pod-name -- sh -c 'echo ${LANG}'

拷贝文件

拷贝pod内容到宿主机

1
kubectl cp $podname:/tmp/$filename .

拷贝宿主机内容到pod

1
kubectl cp $filename $podname:/tmp/

查看IP范围

service cidr

怎样查看一个k8s集群的service ip范围?

1
2
kubeadm config view | grep Subnet
kubectl get pods -n kube-system kube-apiserver-master -oyaml | grep service-cluster-ip-range

pod cidr

怎样查看一个k8s集群的pod ip范围?

1
2
kubeadm config view | grep Subnet
kubectl cluster-info dump | grep -i cidr

如果上面两个方法都找不到,那么还可以通过网络组件的日志来查看,以weave为例。

1
2
docker ps | grep weave
docker logs <weave-container-id> | grep ipalloc-range
  • 本文作者: 好好学习的郝
  • 本文链接: https://www.voidking.com/dev-kubectl-trouble-shooting/
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!源站会及时更新知识点及修正错误,阅读体验也更好。欢迎分享,欢迎收藏~