kubernetes学习笔记4:pod的ip和service的工作机制

pod的IP是真身份证,唯一的,拒绝任何变造nat,pod内的容器共享。这个身份证,实现方法有通过外部路由器,或者自己overlay。

协议层次:需要从l2层(MAC寻址)到l3层(IP寻址)到l4+层(4层协议+端口)。网络拓扑:从容器到宿主机到远端。

容器网络解决方案:接入(veth+bridge,veth+pair,MAC/ipvlan),流控(network policy,felix-iptables,ebtables,ebp-xdp或者hook在数据路径上data path),通道(bgp路由felix bgp agent,直接挂载外网卡)。

service工作机制:k8s为了把service服务进程放入到容器中进行隔离,设计了pod,把service包装到pod中,,使其成为在pod中运行的一个容器,pod和service的关联是通过定义pod的label来连接起来的,service使用这个label,service一旦被创建,K8S会为它创建一个固定的cluster_ip,这样服务发现这个棘手的问题通过service的唯一名称和固定cluster_ip地址做一个dns域名映射即可解决,service是用户侧的负载均衡机制,也就是说VIP到rip的转换在用户侧已经完成了,比不过不需要集中到达某一个nginx或者是一个elb这样的组件来进行决策,它有一组pod组成功能后端,定义一个稳定的虚IP,一般还附赠DNS域名,kube-proxy是核心,它隐藏大量的复杂性,通过APIserver监控pod/service的变化,反馈到lb配置中。

写一个lvs版本的service:第一步绑定VIP到本地,欺骗k8s内核,lvs工作在4层,它不关心IP转发,只有认为IP是自己的才会拆到TCP或udp这一层,通过IP route直接加locale,或者用dummy设备上加IP也可以,第二步为这个IP创建一个ipvs都virtual server,告诉k8s需要为这个IP进行负载均衡分发,和添加参数配置分发策略,virtual server的IP就是cluster IP,使用命令ipvsadm,第三步为这个ipvs server创建real server,使用命令ipvsadm。

clusterIP集群内的一个虚IP,是在service创建后有k8s系统自动创建的,其他pod无法预先知道某个service的cluster IP地址,因此需要一个发现机制来找到这个服务,为此k8s利用Linux的环境变量解决这个问题,根据service的唯一名称,容器从环境变量中获取该service的cluster IP地址和端口号,然后发起tcp/IP连接请求,这个IP会绑定到一堆服务的group pod上,缺点是只能在node内部使用,nodeport供集群外部使用,是service承载在node的静态端口上,端口号与service一一对应,那么集群外的用户通过nodeIP:nodeport调用到service,loadbalancer给云厂商的扩展接口,externalname摒弃内部机制,自己实现,此时一个service会和一个域名一一对应起来,整个负责均衡的工作是外部实现的。

posted @   ppjj  阅读(1888)  评论(0编辑  收藏  举报
(评论功能已被禁用)
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示