首页 > 其他分享 >K8s中的external-traffic-policy

K8s中的external-traffic-policy

时间:2023-04-14 17:47:48浏览次数:42  
标签:容器 报文 traffic external 转发 policy Pod K8s 节点

K8s中的external-traffic-policy是什么?

    【摘要】 external-traffic-policy,顾名思义“外部流量策略”,那这个配置有什么作用呢?以及external是指什么东西的外部呢,集群、节点、Pod?今天我们就来学习一下这个概念吧。

1      什么是external-traffic-policy

在k8s的Service对象(申明一条访问通道)中,有一个“externalTrafficPolicy”字段可以设置。有2个值可以设置:Cluster或者Local。

1)Cluster表示:流量可以转发到其他节点上的Pod。

2)Local表示:流量只发给本机的Pod。

图示一下:

2      这2种模式有什么区别

存在这2种模式的原因就是,当前节点的Kube-proxy在转发报文的时候,会不会保留原始访问者的IP。

2.1      选择(1)Cluster

注:这个是默认模式,Kube-proxy不管容器实例在哪,公平转发。

Kube-proxy转发时会替换掉报文的源IP。即:容器收的报文,源IP地址,已经被替换为上一个转发节点的了。

原因是Kube-proxy在做转发的时候,会做一次SNAT (source network address translation),所以源IP变成了节点1的IP地址。

ps:snat确保回去的报文可以原路返回,不然回去的路径不一样,客户会认为非法报文的。(我发给张三的,怎么李四给我回应?丢弃!)

这种模式好处是负载均衡会比较好,因为无论容器实例怎么分布在多个节点上,它都会转发过去。当然,由于多了一次转发,性能会损失一丢丢。

2.2      选择(2)Local

这种情况下,只转发给本机的容器,绝不跨节点转发。

Kube-proxy转发时会保留源IP。即:容器收到的报文,看到源IP地址还是用户的。

缺点是负载均衡可能不是很好,因为一旦容器实例分布在多个节点上,它只转发给本机,不跨节点转发流量。当然,少了一次转发,性能会相对好一丢丢。

注:这种模式下的Service类型只能为外部流量,即:LoadBalancer 或者 NodePort 两种,否则会报错。

同时,由于本机不会跨节点转发报文,所以要想所有节点上的容器有负载均衡,就需要上一级的Loadbalancer来做了。

不过流量还是会不太均衡,如上图,Loadbalancer看到的是2个后端(把节点的IP),每个Node上面几个Pod对Loadbalancer来说是不知道的。

想要解决负载不均衡的问题:可以给Pod容器设置反亲和,让这些容器平均的分布在各个节点上(不要聚在一起)。

affinity:
  podAntiAffinity:
    preferredDuringSchedulingIgnoredDuringExecution:
    - weight: 100
      podAffinityTerm:
        labelSelector:
          matchExpressions:
           - key: k8s-app
             operator: In
             values:
             - my-app
        topologyKey: kubernetes.io/hostname

像下面这样,负载均衡情况就会好很多~

3      两种模式该怎么选

要想性能(时延)好,当然应该选 Local 模式喽,毕竟流量转发少一次SNAT嘛。

不过注意,选了这个就得考虑好怎么处理好负载均衡问题(ps:通常我们使用Pod间反亲和来达成)。

 如果你是从外部LB接收流量的,那么使用:Local模式 + Pod反亲和,一般是足够的。

 

 

标签:容器,报文,traffic,external,转发,policy,Pod,K8s,节点
From: https://www.cnblogs.com/gaoyuechen/p/17319058.html

相关文章

  • 学习K8S 使用Operator部署管理Nginx
    创建一个KubernetesOperator部署nginx的大致过程如下:确定您要使用的OperatorSDK版本并安装它。使用OperatorSDK命令行创建新的Operator项目。定义CustomResourceDefinition(CRD),即将在Kubernetes中定义的自定义资源规范,以及该资源的状态和操作。例如,定义一个名为......
  • 使用kubeadm安装k8s
    相关链接kubeadm安装官网kubeadm安装k8s完整教程安装配置以下操作是每个节点都要执行的步骤配置hosts将主节点与子节点分别配置hostname如下:hostnamectlset-hostnamemaster#主节点hostnamectlset-hostnamenode1#子节点hostnamectlset-hostnamenode2#子节点在/e......
  • 66、K8S-部署管理-Helm-自定义helm项目
    1、自定义helm项目管理-实践1.1、自定义helm项目1.1.1、创建存放的目录mkdir-p/opt/custom_helm&&cd/opt/custom_helm1.1.2、创建helm项目helmcreatenginx1.2.3、目录的解析custom_helm]#treenginx/nginx/-自动生成的空ch......
  • k8s各组件作用和pod通信原理
    https://www.cnblogs.com/cyh00001/p/16488539.htmlkube-apiserverkube-apiserver负责和etcd交互,提供了k8s各类资源对象的增删改查及watch等HTTPRest接口,这些对象包括pods、services、replicationcontrollers等,APIServer为REST操作提供服务,并为集群的共享状态提供前端......
  • 65、K8S-部署管理-Helm基础知识、安装、入门示例
    Kubernetes学习目录1、基础知识1.1、需求在kubernetes平台上,我们在部署各种各样的应用服务的时候,可以基于手工或者自动的方式对各种资源对象实现伸缩操作,尤其是对于有状态的应用,我们可以结合持久性存储机制实现更大场景的伸缩动作。但是,无论我们怎么操作各种资源对象,问......
  • 深入了解Kubernetes(K8s):现代化容器编排和管理平台
    Kubernetes(简称K8s)是一种开源的容器编排和管理平台,用于自动化应用程序在容器化环境中的部署、扩展、管理和运维。Kubernetes最初由Google开发,并于2014年发布为开源项目,现在由CloudNativeComputingFoundation(CNCF)维护和管理。Kubernetes的设计目标是简化容器应用的部署、管理和......
  • k8s 查看 deployment 管理的所有 pod 日志
    背景k8s可以使用Deployment生成并管理多个pod,如果需要查看某个多pod实例的应用日志,一个一个pod依次排查过去未免太麻烦,需要有一种更高效的方式。实现使用如下命令即可查看一个Deployment的所有pod日志:kubectllogsdeployment/deployment的名字一些可选的命令参......
  • k8s1.27.x 最新版本使用kubeadm 的containerd的方式安装
    标签(空格分隔):kubernetes系列一:k8s1.27.x的概述1.1:k8s1.27.x更新Kubernetesv1.27正式发布,这是2023年的第一个版本!此版本包含60个增强功能。其中18个增强功能进入Alpha阶段,29个进入Beta阶段,13个进入Stable阶段。版本主题和标志Kubernetesv1.27:ChillVibes......
  • k8s 查看 deployment 管理的所有 pod 日志
    背景k8s可以使用Deployment生成并管理多个pod,如果需要查看某个多pod实例的应用日志,一个一个pod依次排查过去未免太麻烦,需要有一种更高效的方式。实现使用如下命令即可查看一个Deployment的所有pod日志:kubectllogsdeployment/deployment的名字一些可选的命令参......
  • Google SRE 定义了四个需要监控 延迟(Latency),流量(Traffic),错误(Errors)和饱和度(Saturati
    GoogleSRE定义了四个需要监控的关键指标。延迟(Latency),流量(Traffic),错误(Errors)和饱和度(Saturation)。正如google sre 所讨论的,如果您只能衡量服务的四个指标,请关注这四个指标。 延迟Latency延迟是服务处理传入请求和发送响应所用时间的度量。测量服务延迟有助于及早发现服......