1.k8s中service访问异常的常见问题
1).service没有正确匹配到后端的pod标签
(1).service匹配的label标签没有匹配上后面的pod(导致访问不到界面)
(2).service匹配的label标签匹配到后面其他错误的pod(导致访问的别的界面)
2).kube-proxy服务故障导致service无法提供服务
kube-proxy是什么:
Service为一组相同的pod提供了统一的入口,起到负载均衡的效果。Service具有这样的功能,真是kube-proxy的功劳,kube-proxy是一个代理,安装在每一个k8s节点,当我们暴露一个service的时候,kube-proxy会在iptables中追加一些规则,为我们实现路由与负载均衡的功能。
kube-proxy的两种转发规则: iptables(DNAT规则转发到后台pod)和ipvs
故障现象:
service的标签选择器正常,pod也正常,但是访问service的ip时,还是代理不到pod,就需要检查kube-proxy组件。
解决思路:
(1).查看相应node节点kube-proxy服务是否正常。
(2).查看相应node节点上kube-proxy相关日志,有没有报错,资源不足,如:cpu/内存/磁盘
(3)查看相应node节点上系统日志中有没有关于kube-proxy的日志报错.
#cat /var/log/messages[kube-proxy] |grep kube-proxy或 kubectl logs pod名 |grep kube-proxy
解决方法:
(1).扩容节点资源,增加服务器或者虚拟机的cpu和内存。
(2).修改kube-proxy的yaml中的limit资源限制,限制可使用的cpu和内存。
2.k8s中pod删除失败的解决
故障现象:在k8s中,可能会产生很多垃圾pod,也就是有些pod虽然是running状态,可是其所调度到的k8s的node节点已经从k8s集群删除了,但是pod还是在这个node上,没有被驱逐,针对这种情况就需要把pod删除。
故障问题:删除pod时候,pod一直处于terminate状态,很长时间无法删除。
解决方案:
可以通过如下方法添加参数强制删除pod,–force --grace-period=0, grace-period表示过渡存活期,默认30s,在删除pod之前运行pod慢慢终止其上的容器进程,从而优雅退出,0表示立即终止pod.
#kubectl delete pod pod名 --force --grace-period=0
3.k8s中命名空间的强制删除
虽然pod可以强制删除,但是可能命名空间还是处于terminate状态,无法删除。
解决方法:
(1).强制删除命名空间
#kubectl delete ns 命名空间 --force --grace-period=0
(2).获取namespace的json文件,删除相关内容
#kubectl get ns 命名空间 -o json > /root/xx.json
#vim /root/xx.json
删除spec下的”finalizers”:[ 和”kubernetes” 内容
调用api-server接口进行删除:
打开一个新的终端,或者把下面的命令放到后台执行: # kubectl proxy --port=8081
调用接口删除:
#curl -k -H “Content-Type: application/json” -X PUT --data-binary @xx.json
127.0.0.1:8081/api/v1/namespaces/命名空间名/finalize
如果kubectl get ns 命名空间 -o json的结果中”spec”:{}中为空了,但是metadata部分还有finalizers字段,需要将里面相关finalizers的内容也删除。
#kubectl edit ns 命名空间
进去后,直接删除相关finalizers的内容即可,保存退出后,出入Terminating状态的ns便没有了。
4.k8s中跨主机连接不通(pod和pod)
1).pause容器概念:
Pause容器,又叫Infra容器,Pause容器对应的镜像属于k8s平台的一部分,除了pause容器,每个pod还包含一个或者多个紧密相关的用户业务容器。
2).pause容器的作用:
(1).pod里的多个业务容器共享pause容器的ip,共享pause容器挂载的volume,这样简化了业务容器之间的通信问题,也解决了容器之间的问题件共享问题。
(2).pod中的容器共享同一个ip地址。故同一个pod中container可以做到直接通过localhost直接通信。
3).同一个节点多个pod通信机制:
pause容器启动之前,会为容器创建虚拟一对ethernet接口,一个保留在宿主机vethxxx(插在网桥上),一个保留在容器网络命名空间内,并重命名为eth0。两个虚拟接口的两端,从一端进入,从另一端出来。任何pod连接到该网桥的pod都可以收发数据。
4).跨节点pod通信机制:
跨节点pod通信,相当于创建一个整个集群公用的 [网桥] ,然后把集群中所有的pod连接起来,就可以通信了。
5).跨主机连接不通(pod和pod)的故障排查方法:
(1).排查宿主机网络是否正常,在宿主机上ping baidu.com,或tcpdump抓包看是否丢包.
(2).查看k8s中的网络插件是否正常,查看网络组件calico或flannel的日志。