本文为原创内容,若需转载,请联系博主获取授权
# 实际经历:从旧的Linux内核更替到新的Linux内核避坑说明
避坑1:br_netfilter
模块加载
说明:br_netfilter
模块功能主要是负责桥接流量与iptables联动
我们以直接执行命令 modprobe br_netfilter
来加载模块,虽然这个可以满足两者之间的联动,但是这个过程是临时的;如果你在后期过程中加载了其他规则(防火墙规则),可能会导致该 br_netfilter
模块失效,导致集群出现很多网络问题,比如微服务间网络中断、pod间通信、service业务中断;因为在集群中kube-proxy通过iptables(或者ipvs)实现service负载均衡和端口转发;kube-proxy负载集群中管理网络策略,起网络代理作用
因此,临时的br_netfilter
模块不适合长久
解决方式:既然有临时的加载,那就有长久的加载
vim /etc/modules-load.d/k8s.conf
br_netfilter
#使其永久加载生效
systemctl restart systemd-modules-load.service
无论后期引入了什么策略,网桥流量都会被iptables策略处理
避坑2:kebe-proxy中的ipvs模块
说明:kube-proxy开启前设置ipvs前置条件,通常我们都是用的ipv4模块来进行转换的
在旧的Linux系统内核小于5.1.0,nf_conntrack_ipv4
和 nf_conntrack_ipv6
是相互独立的并相互隔开的,因此,Linux系统内核小于5.0,用ipv4来进行转发数据包是可行的。
随时Linux内核的升级,到Linux大于5.1.0, nf_conntrack_ipv4
和 nf_conntrack_ipv6
被合并到 nf_conntrack
模块中,不再单独存在。
比如:当你在内核小于5.1.0使用ipv4来转发数据包时
分析:系统会找不到nf_conntrack_ipv4
模块
解决方式:使用nf_conntrack
模块
避坑3:集群初始化时镜像拉取失败或手动拉取镜像也失败(docker运行时或containerd运行时)
说明:通常集群初始化时会自动拉取镜像,不需要人工干预,当出现卡顿在pull时或者几分钟都不动
比如:
一直卡起不动
连接中断,再次尝试也是这种现象
分析原因:最根本的原因就是docker加速器不可用或者过旧导致出现问题
解决方式:在网上寻找可用的docker加速器,通过反复测试pull来测试加速器的可用性
https://docker.xuanyuan.me
这个是博主一直都在用的加速器
避坑4:k8s版本与pause容器兼容性
说明:通常我们用的pause容器是阿里云的,当k8s版本的升级,会出现pause容器版本与k8s版本不兼容性问题
分析原因:集群初始化已经提示你用的pause版本与k8s版本需要用的pause版本不一直,这会导致容器运行时与kubelet无法通过CRI进行交互
解决方式:修改containerd配置文件,然后重启containerd 
避坑5:集群初始化超时
说明:集群初始化超时是最常见的踩坑问题,博主踩过很多坑,现在将所有影响集群初始化超时的案列举出来
1. docker-ce、docker-ce-cli版本没有匹配k8s版本
比如:直接安装docker-ce
分析:这样安装出来的docker-ce、docker-ce-cli版本默认是仓库中最新版本
解决方式:指定docker-ce、docker-ce-cli版本与k8s版本相兼容的;这个可以在网上找两者兼容的表;博主有自己的一套结论:分享给大家:docker版本与k8s版本相差3个版本,k8s版本始终大于docker版本:如:k8s1.24版本,兼容docker1.21版本
注:时间有点久了,博主有点忘记还有那些因素会影响超时问题,这些问题都是博主刚开始自学k8s的时候出现过的;现在博主有点熟悉k8s了,可能记忆会消退以前的错误;如果你们遇到有什么集群初始化超时的现象,都可以来咨询博主
避坑6:工作节点加入失败之CRI适配器匹配失败
说明:在加入工作节点前,查看CRI适配器是否正确配置,或者集群前未指定CRI适配器
比如:工作节点加入时未指定CRI适配器
分析:我们需要指定正确的CRI适配器,一种是cri-dockerd,一种是cri-containerd
解决方式:在原来的代码后面指定适合的CRI适配器
注:在master集群是也需要单独指定CRI适配器,如有什么不懂的,都可以来询问博主
干货1. 警示iptables -F
使用
说明:iptables -F
是清除自定义所有规则(包括防火墙策略);通常我们在集群前都会执行这个命令,但是这是测试环境下,更方便的提供干净环境的规则,是kube-proxy和CNI插件能够更好的初始化,生产环境下不建议执行iptables -F
,这会导致当下业务出现中断问题;一般情况下,在br_betfilter
模块驱动下或者大多数情况下,k8s主件都会自己生成规则,并自动处理冲突
干货2.关于kubernetes与docker和contained的背景故事
说明:给大家讲个他们之间的背景故事;自己口编的;若有什么不理解的可以咨询博主;
- 14年k8s容器编排技术在Google诞生并设为开源项目,
- 15年CNCF社区成立,Google把k8s项目捐献给CNCF社区,从此。CNCF走向高潮,在全球的影响力度都很好,k8s是CNCF的第一个开源项目,并且k8s的维护都是由CNCF社区维护,不在由Google,但是Google是开源项目的贡献者;
- 15年docker公司开发出docker引擎,其中就有containerd容器和runc;
- 16年docker公司把containerd从docker引擎中分离开,并把两者作为单独项目;
- 17年docker公司正式把containerd作为开源项目捐献给CNCF社区;container正式成为k8s中新一代容器(轻量)
- 19年containerd容器在CNCF社区走向成熟
- 20年k8s宣布弃用dockershim,迁移容器到contained上、CRI-O(原生运行时接口)
- 22年k8s正式废除dockershim,也就是以后的k8s用containerd更加兼容
- 在以后的版本中,contained成为云原生领域中的主流容器
干货3.为什么要单独安装cri-dockerd,而不直接用docker
说明:cri-dockerd的作用是作为交互桥梁在容器运行时和kubelet之间,因为docker本身并不直接支持标准的CRI(容器运行时接口),需要适配器的转换;早期的适配器是dockershim,随着时间的更替,cri-dockerd成为替代dockershim的主流适配器
干货4.用containerd容器作容器运行时时,为什么要指定容器运行时的CRI
说明:k8s在1.24版本起,dockershim被弃用,k8s不在默认调用docker;用containerd作为容器运行时需指定容器运行时接口是containerd
关注博主,博主会定期更新避坑经历