k8s clusterip 方式service负载均衡实现三种方式及原理 您所在的位置:网站首页 k8s的负载均衡 k8s clusterip 方式service负载均衡实现三种方式及原理

k8s clusterip 方式service负载均衡实现三种方式及原理

2024-06-26 20:02| 来源: 网络整理| 查看: 265

ClusterIP:在集群内发布服务,这是k8s默认的ServiceType。通过集群内的ClusterIP在内部发布服务,只能够在集群内部访问服务。

ExternalName:用于集群内不同命名空间内的服务通过名称可直接访问,以及将在k8s集群外部的服务引入到k8s集群内通过服务名称访问场景。需要借助KubeDNS(version >= 1.7)的支持,就是用KubeDNS将该service和ExternalName做一个Map,KubeDNS返回一个CNAME记录。 ExternalName的用途(业务场景),有两个:(1)将k8s集群内在某个namespace内的服务暴露到另外一个namespace内,实现两个不同的namespace之间的不同pod可以通过name的形式访问。假如集群内有两个服务服务a和b,a服务访问b服务。若两个服务都定义在同一个namespaceA下,则a可以通过b的名称http://b/访问b服务,k8s会将http://b/转为http://b.namespaceA.svc.cluster.local/ svc.cluster.local 是整个k8s集群的域),若将b定义在namespaceB访问,则A无法直接通过b的名称http://b/访问服务b,因为b的namespace不是namespaceA。若想仍然通过http://b访问,可以在namespaceA下定义一个type为ExternalName的服务b,其externalName属性的值为b.namespaceB.svc.cluster.local即可,相当于在namespaceA下为定义在namespaceB下的服务b建了一个链接,连接名为b。namespaceA下的ExternalName服务b定义如下:

apiVersion: v1 kind: Service metadata: name: b namespace: namespaceA spec: type: ExternalName externalName: b.namespaceB.svc.cluster.local

  (2)将k8s集群外的服务引入到k8s内部,供内部的pod访问,就像使用集群内的服务一样使用外部服务,利用ExternalName的Service访问的外部服务地址必须是域名,不支持IP地址。举例参见下方k8s集群内部与外部之间互联互通#通过ExternalName Service访问域名方式的外部服务

NodePort:用来对集群外暴露k8s内部的Service。NodePort 服务会路由到 ClusterIP 服务,这个 ClusterIP 服务会自动创建,同时,k8s会在集群内所有node上,为集群内的所有NodePort类型的服务暴露其NodePort,这样集群外部可以连接到集群内任何一个node的ip:nodePort即可以访问该服务。这种方式的缺点比较多:每个端口只能是一种服务;端口范围只能是 30000-32767,不推荐采用这种方式对集群外暴露服务。NodePort 需要借助真实存在的ip,是一个公共的ip,任何人都可以访问,而ClusterIP可以理解成不对外开放,仅限于集群内的节点之间特定的一个范围。

LoadBalancer: 也是用来对集群外暴露k8s内部的Service。使用云提供商的负载局衡器,可以路由到 NodePort 服务和 ClusterIP 服务,这个需要结合具体的云厂商进行操作。所有通往指定的端口的流量都会被转发到对应的服务。它没有过滤条件,没有路由等。这意味着你几乎可以发送任何种类的流量到该服务,像 HTTP,TCP,UDP,Websocket,gRPC 或其它任意种类。这个方式的最大缺点是每一个用 LoadBalancer 暴露的服务都会有它自己的 IP 地址,每个用到的 LoadBalancer 都需要付费,这将是非常昂贵的。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有