《从零搭建生产级K8s集群:踩坑实录与高可用架构最佳实践》(强调生产环境经验,展示工程化思维)

本文为原创内容,若需转载,请联系博主获取授权

 

# 实际经历:从旧的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.0nf_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-cedocker-ce-cli版本没有匹配k8s版本

比如:直接安装docker-ce

    分析:这样安装出来的docker-cedocker-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-proxyCNI插件能够更好的初始化,生产环境下不建议执行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

    关注博主,博主会定期更新避坑经历 

    以上是博主在自学期间的经历分享,还有一下忘记了,希望可以帮助到大家

    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值