本篇文章来自《华为云云原生王者之路训练营》钻石系列课程第7课,由华为云容器基础设施团队主任工程师Jimmy主讲,深入讲解Ingress和容器网络CNI在Kubernetes实现方法。
01
Ingress Controller机制剖析
Ingress API接口模型与演进
为K8S集群内服务提供聚合统一的访问入口。除了提供丰富的七层(HTTP)路由功能外,Ingress实现中也提供了丰富服务治理能力,但不同实现(IngressClass)在部署方式和功能特性上存在差异,造成了一些接口上的混乱。
目前,Ingress API的接口模型正在进行一些演进,接口的通用性、表达能力和更清晰的角色划分,驱动Ingress API向Gateway API演进。
Ingress Controller 架构剖析
但对于Ingress Controller整个实现架构与处理流程而言,并没有特别大的变化,这就是采用接口机制和底层实现解耦的好处,如下图所示:
左图为社区开源的Ingress-nginx Controller方案,在业内被广泛使用。其好处是不依赖商用的组件,可以在客户自建或托管的K8s集群中引入Ingress-nginx Controller插件,来实现Ingress的功能。
右图为各大公有云服务商提供的基于自己七层负载均衡Ingress方案,其实现原理与nginx类似,不过其转发代理采用了云服务商提供的标准的七层代理服务,通常称为应用负载均衡的能力。在K8s集群中部署的Ingress Controller一般也是多实例、高可用部署,也存在选组的过程。成为主的控制器,operator会watch API-Server相应配置资源的变化,调用ALB API接口来配置ALB负载均衡和路由匹配规则,转发到相应的service后端,从原理而言与开源社区的方案是一致的。
02
CNI接口机制与插件实现原理
CNI接口与插件能力模型
上节课提到的K8s网络模型方案,这些网络模型是如何与K8s调度编排Master协同工作起来的,实际是通过CNI插件,CNI插件实际是一个接口的标准。
下图为CNI基本实现的模型:
CNI实际是依赖容器运行时调用CNI接口,CNI接口通过容器运行时传给它的参数,这些参数是以.JSON格式生成的,通过标准输入向插件的二进制进程传入配置,配置既可以是保存在磁盘也可以由运行时生成。
CNI 配置样例:
CNI在K8S中是如何工作的?
CNI在K8S中的工作流程如下图所示:
CNI调用过程:
CNI高级特性举例
对于某些特定业务,需要复杂的CNI创建过程,普通的微服务基本创建一个网口就可以达到目标,但一些特殊的场景如通讯、运营商行业的场景需要将流量通过入口传入,通过另外一个网口传出做防火墙控制或流量清洗,则需要多网口方案。
K8s社区也有相应的CNI组件帮助不同的业务来实现这些能力,比较代表性的是multus和Genie。
CNI支持多网口、多网络平面方案:
https://github.com/k8snetworkplumbingwg/multus-cni
https://github.com/cni-genie/CNI-Genie
典型案例如下图:
03
云原生网络最佳实践与典型问题案例
云原生网络最佳实践1-IDC与CCE集群共享DNS方案
某企业APP微服务:
CCE所在的VPC和原有的IDC之间通过专线进行连接。
云原生网络最佳实践2-微服务容器实例访问云数据库等中间件的网络隔离方案
CCE Turbo容器安全组:
K8s容器网络典型问题定位1-源地址保持的“锅”?
容器服务通过ELB访问同集群内的其他服务出现时延陡增异常
K8s容器网络典型问题定位2-时延去哪儿了?
某客户从虚机迁移到CCE容器集群:
感谢您的阅读,也欢迎您发表关于这篇文章的任何建议,关注我,技术不迷茫!