大鹏一日同风起,扶摇直上九万里。这篇文章主要讲述线上k8s集群利用服务拓扑流量路由策略来设置定向流量?相关的知识,希望能为你提供帮助。
k8s 服务拓扑设置定向流量有哪些常见场景?
面试官:"说说你对Kubernetes 网络模型的理解?设计这种网络模型有什么好处?"
面试官:"Kubernetes 网络主要解决哪四方面的问题?"
面试官:"k8s利用服务拓扑的流量路由策略来设置定向流量,拓扑键的匹配规则是什么?"
面试官:"日常使用拓扑键有什么约束?"
面试官:"简单说说服务拓扑设置定向流量有哪些常见场景?试举例说明?"
文章图片
囧么肥事-胡说八道
文章图片
【线上k8s集群利用服务拓扑流量路由策略来设置定向流量()】
文章图片
文章图片
说说你对Kubernetes 网络模型的理解?设计这种网络模型有什么好处?
集群网络系统是 Kubernetes 的核心部分,Kubernetes 的宗旨就是在应用之间共享机器。
要解决的问题?
通常来说,共享机器需要两个应用之间不能使用相同的端口,但是在多个应用开发者之间 去大规模地协调端口是件很困难的事情,尤其是还要让用户暴露在他们控制范围之外的集群级别的问题上。
动态分配端口也会给系统带来很多复杂度 - 每个应用都需要设置一个端口的参数, 而 API 服务器还需要知道如何将动态端口数值插入到配置模块中,服务也需要知道如何找到对方等等。
针对这些问题,Kubernetes设计了一种干净的、向后兼容的网络模型,即
IP-per-pod
模型。怎么说?首先,Kubernetes 强制规定了一种简单粗暴的网络模型设计基础原则:每个 Pod 都拥有一个独立的 IP 地址。
Kubernetes 强制要求所有网络设施都满足以下基本要求(从而排除了有意隔离网络的策略):
节点上的 Pod 可以不通过 NAT 和其他任何节点上的 Pod 通信
节点上的代理(比如:系统守护进程、kubelet)可以和节点上的所有 Pod 通信
文章图片
另外,对于支持在主机网络中运行
Pod
的平台(比如:Linux):运行在节点主机网络里的 Pod 可以不通过 NAT 和所有节点上的 Pod 通信
这意味着什么?
意味着 k8s 假定所有 Pod 都在一个可以直接连通的、扁平的网络空间中
也就是说,无论容器运行在集群中的哪个节点,所有容器之间都能通过一个扁平的网络平面进行通信。不管它们是否运行在同一个 Node节点 (宿主机) 上,都要求它们可以直接通过对方的 IP 进行访问。每一个 Pod 都有它自己的IP地址, 好处就是你不需要再显式地在
Pod
之间创建链接, 几乎不需要处理容器端口到主机端口之间的映射。文章图片
Kubernetes 网络主要解决哪四方面的问题?
首先,k8s的架构体系决定了在K8S上的网络通信四大类:
- 第一类:高度耦合的容器之间的通信:同一个Pod内的多个容器之间通过本地回路(loopback)通信。
- 第二类:Pod之间的通信:集群网络在不同 pod 之间通过Pod IP地址进行通信。
- 第三类:Pod和Service之间的通信:Pod IP地址和Service IP进行通信,两者并不属于同一网络,使用 Services 来发布仅供集群内部使用的服务,实现方式是通过IPVS或iptables规则转发。
- 第四类:Service和集群外部客户端之间的通信,Service 允许对外暴露 Pods 中运行的应用程序,以支持来自于集群外部的访问,实现方式:Ingress、NodePort、Loadbalance
在说拓扑键的匹配规则之前,先了解下什么是服务拓扑的流量路由策略?
服务拓扑(Service Topology)可以让一个服务基于集群的 Node 拓扑进行流量路由。
默认情况下,发往
ClusterIP
或者 NodePort
服务的流量可能会被路由到服务的任一后端的地址。Kubernetes 1.7 允许将“外部”流量路由到接收到流量的 节点上的 Pod。对于
ClusterIP
服务,无法完成同节点优先的路由,你也无法配置集群优选路由到同一可用区中的端点。流量路由拓扑策略理解
通过在 Service 上配置
topologyKeys
,对源和目的之间的标签匹配,可以基于来源节点和目标节点的标签来定义流量路由策略。对于拓扑键,可以根据节点间彼此“较近”和“较远” 来定义节点集合,可以基于符合自身需求的任何度量值来定义标签,来匹配定向流量。
文章图片
使用服务拓扑,拓扑键的匹配规则是什么?
如果集群启用了
ServiceTopology
特性, 你就可以在 Service 规约中设定 topologyKeys
字段,从而控制其流量路由。 此字段是 Node
标签的优先顺序字段,将用于在访问这个 Service
时对端点进行排序。 流量会被定向到第一个标签值和源 Node
标签值相匹配的 Node
。 如果这个 Service
没有匹配的后端 Node
,那么第二个标签会被使用做匹配, 以此类推,直到没有标签。如果没有匹配到,流量会被拒绝,就如同这个
Service
根本没有后端。 换言之,系统根据可用后端的第一个拓扑键来选择端点。 如果这个字段被配置了而没有后端可以匹配客户端拓扑,那么这个 Service
对那个客户端是没有后端的,链接应该是失败的。 这个字段配置为 "*"
意味着任意拓扑。 这个通配符值如果使用了,那么只有作为配置值列表中的最后一个才有用。如果
topologyKeys
没有指定或者为空,就没有启用这个拓扑约束。拓扑键有什么约束?
拓扑键的约束,其实就是使用拓扑键需要注意规避的一些原则,在规则上更好的实现流量控制:
- 服务拓扑和
externalTrafficPolicy=Local
是不兼容的,所以Service
不能同时使用这两种特性。 但是在同一个集群的不同Service
上是可以分别使用这两种特性的,只要不在同一个Service
上就可以。 - 有效的拓扑键目前只有:
kubernetes.io/hostname
、topology.kubernetes.io/zone
和topology.kubernetes.io/region
,但是未来会推广到其它的Node
标签。 - 拓扑键必须是有效的标签,并且最多指定16个。
- 通配符:
"*"
,如果要用,则必须是拓扑键值的最后一个值。
文章图片
简单说说服务拓扑设置定向流量有哪些常见场景?试举例说明?
在一个集群中,其
Node
的标签被打为其主机名,区域名和地区名。 那么就可以设置 Service
的 topologyKeys
的值,控制流量路由。文章图片
以下是使用服务拓扑功能的一些经典的常见示例
- 第一种:仅路由到节点本地端点,如果节点上不存在端点,流量则被丢弃,只定向到同一个
Node
上的端点,Node
上没有端点存在时就失败: 配置["kubernetes.io/hostname"]
。 - 第二种:首先节点本地端点,如果节点本地端点不存在,则回退到集群范围端点:配置[" kubernetes.io/hostname" , " *" ]
- 第三种:偏向定向到同一个
Node
上的端点,回退同一区域的端点上,然后是同一地区, 其它情况下就失败。 例如,数据局部性很重要的情况下或许就很有用:配置["kubernetes.io/hostname", "topology.kubernetes.io/zone", "topology.kubernetes.io/region"]
。 - 第四种:偏向于同一区域,但如果此区域中没有可用的终结点,则回退到任何可用的终结点: 配置
["topology.kubernetes.io/zone", "*"]
。 - 第五种:仅地域或区域端点,首选地域端点而不是区域端点的一种服务, 如果以上两种范围内均不存在端点, 流量则被丢弃。配置:[" topology.kubernetes.io/zone" , " topology.kubernetes.io/region" ]
- 第六种:优先选择节点本地端点、地域端点,然后是区域端点,最后才是集群范围端点。配置:
["kubernetes.io/hostname", "topology.kubernetes.io/zone", "topology.kubernetes.io/region", "*"]
。
文章图片
推荐阅读
- Linux 内核进程优先级与调度策略 ② ( 获取调度策略对应的进程优先级函数 | sched_get_priority_max 函数 | sched_get_priority_min 函数 )
- [wgcloud-agent]2022/04/08 19:57:37 hostUtil.go:99: GetHostTemperatures err( 发生意外。 (拒绝访问 ))
- 开发环境Ubuntu 安装 Visual Studio Code 开发环境 ( 下载 Visual Studio Code 安装器 | Ubuntu 安装 deb 包 )
- DolphinDB 函数化编程案例教程
- 用户组管理及用户权限
- Samba的使用教程
- 开发环境Ubuntu 中使用 VSCode 开发 C/C++ ⑤ ( tasks.json 中的 args 数组配置分析 | 编译并执行 C++ 程序 )
- 如何计算磁盘IOPS
- Linux 内核 内存管理RCU 机制 ⑤ ( RCU 层次架构概念 | RCU 层次架构源码解析 | RCU 层次架构每层最多叶子数 | RCU 层次架构每个叶子 CPU 数量 )