服务

一种公开在一组上运行的应用程序的抽象方法豆荚作为一个网络服务。

使用Kubernetes,您不需要修改应用程序来使用不熟悉的服务发现机制。Kubernetes为Pods提供了自己的IP地址和一组Pods的单个DNS名称,并可以跨它们进行负载平衡。

动机

Kubernetes豆荚创建和销毁以匹配集群的状态。豆荚是非永久资源。如果你使用部署为了运行你的应用程序,它可以动态地创建和销毁Pods。

每个Pod都有自己的IP地址,但是在部署中,在某一时刻运行的Pod集可能与稍后运行该应用程序的Pod集不同。

这导致一个问题:如果一些豆荚(称之为“后端”)提供了功能其他豆荚(称之为“前端”)在您的集群,前端如何发现和跟踪IP地址连接,所以,前端可以使用后端负载的一部分?

输入服务

服务资源

在Kubernetes中,服务是一个抽象,它定义了一组Pods的逻辑集合和访问它们的策略(有时这种模式被称为微服务)。服务的目标Pods集合通常由选择器.要了解定义服务端点的其他方法,请参见服务没有选择器

例如,考虑使用3个副本运行的无状态图像处理后端。这些副本是可替换的——前端不关心它们使用哪个后端。虽然组成后端集的实际Pods可能会改变,但前端客户端不需要知道这一点,也不需要自己跟踪后端集。

服务抽象支持这种解耦。

进行服务发现

如果您能在应用程序中使用Kubernetes API进行服务发现,您可以查询API服务器对于端点,每当Service中的Pods集发生更改时,就会更新它们。

对于非本机应用程序,Kubernetes提供了在应用程序和后端Pods之间放置网络端口或负载均衡器的方法。

定义服务

Kubernetes中的Service是一个REST对象,类似于Pod。与所有REST对象一样,您可以这样做帖子一个服务定义到API服务器来创建一个新实例。服务对象的名称必须有效DNS标签名称

例如,假设您有一组Pods,其中每个Pods监听TCP端口9376,并包含一个标签app = myapp.

apiVersionv1.种类服务元数据的名字我的服务规范选择器应用程序MyApp港口-协议TCP港口80发送9376

该规范创建了一个名为“my-service”的新服务对象,它针对任何Pod上的TCP端口9376app = myapp.标签。

Kubernetes为该服务分配一个IP地址(有时称为“集群IP”),由服务代理使用(参见虚拟IPS和服务代理下文)。

服务选择器的控制器持续扫描匹配它的选择器的Pods,然后将任何更新发布到一个名为“my-service”的端点对象。

笔记:服务可以映射任何进入港口到一个发送.默认情况下,为方便起见,发送设置为与港口字段。

Pods中的端口定义有名称,您可以在发送服务的属性。即使使用单个配置的名称在服务中有一个混合服务器,也有效地工作,通过不同的端口号使用相同的网络协议。这为部署和发展服务提供了许多灵活性。例如,您可以更改POD在后续版本的后端软件中公开的端口号,而不会破坏客户端。

服务的默认协议是TCP;您也可以使用任何其他支持的协议

由于许多服务需要曝光多个端口,Kubernetes在服务对象上支持多个端口定义。每个端口定义都可以具有相同的协议,或不同的。

服务,而不选择器

服务通常对Kubernetes Pods进行抽象访问,但它们也可以对其他类型的后端进行抽象。例如:

  • 您希望在生产中有一个外部数据库集群,但在测试环境中使用自己的数据库。
  • 您要将您的服务指向其他服务名称空间或者在另一个集群上。
  • 您正在将工作负载迁移到Kubernetes。在评估方法时,您只运行kubernetes中的后端的一部分。

在这些方案中,您可以定义服务没有POD选择器。例如:

apiVersionv1.种类服务元数据的名字我的服务规范港口-协议TCP港口80发送9376

由于此服务没有选择器,因此不会自动创建相应的endpoint对象。你可以手动将服务映射到它运行的网络地址和端口,方法是手动添加一个endpoint对象:

apiVersionv1.种类终点元数据的名字我的服务子集-地址-知识产权192.0.2.42港口-港口9376

endpoint对象的名称必须是有效的DNS域名

笔记:

端点IPs不得是:Loopback(IPv4的127.0.0.0/8,::1 / 128 for ipv6),或者链接 - 本地(169.254.0.0/16和224.0.0.0/24用于IPv4,FE80 ::/ IPv6)。

Endpoint IP地址不能为其他Kubernetes服务的集群IP,因为Kube-Proxy.不支持虚拟ip作为目的地。

在没有选择器的情况下访问服务的工作原理与它有选择器是一样的。在上面的例子中,流量被路由到YAML中定义的单个端点:192.0.2.42:9376(TCP)。

ExternalName服务是服务的一个特殊情况,它没有选择器,而是使用DNS名称。有关更多信息,请参见ExternalName.小节。

在能力端点

如果端点资源具有超过1000个端点,则Kubernetes v1.21(或更高版本)群集将介绍该端点endpoints.kubernetes。io /产能过剩:警告.该注释表明受影响的endpoint对象容量过大。

endpointslices.

特征状态: Kubernetes v1.21(稳定)

EndpointSlices是一种API资源,可以为端点提供更可伸缩的替代方案。尽管在概念上与端点非常相似,但EndpointSlices允许跨多个资源分布网络端点。默认情况下,一旦EndpointSlice达到100个端点,它就被认为是“完整的”,此时将创建额外的EndpointSlice来存储任何额外的端点。

中详细描述了EndpointSlices提供的附加属性和功能endpointslices.

应用协议

特征状态: Kubernetes v1.20 [稳定]

AppProtocol.字段提供了一种为每个服务端口指定应用程序协议的方法。该字段的值由相应的端点和endpointSlice对象镜像。

该字段遵循标准的Kubernetes标签语法。值应该是IANA标准服务名称或域名前缀名称,如mycompany.com/my-custom-protocol

虚拟IPS和服务代理

Kubernetes集群中的每个节点运行一个Kube-Proxy.Kube-Proxy.负责实现一种形式的虚拟IP服务类型除外ExternalName.

为什么不使用轮循DNS?

一个时常出现的问题是,为什么Kubernetes依赖代理将入站流量转发到后端。还有其他的方法吗?例如,是否可以配置具有多个A值(或IPv6的AAAA)的DNS记录,并依赖轮循名称解析?

使用替代服务的原因有一些:

  • DNS实现的历史悠久,而不是尊重记录TTL,并在它们应该过期后加强名称查找结果。
  • 有些应用程序只进行一次DNS查找,并无限期地缓存结果。
  • 即使应用程序和库确实正确重新分辨率,DNS记录上的低或零TTL也可能对DNS施加高负载,然后难以管理。

用户空间代理模式

在这种模式下,kube-proxy监视Kubernetes的控制平面来添加和删除Service和Endpoint对象。对于每个服务,它会在本地节点上打开端口(随机选择)。与此“代理端口”的任何连接都是由其中一个服务的后端吊舱(如通过端点报告的)。kube-proxy需要SessionAffinity在确定要使用的后端窗格时,将服务设置为帐户。

最后,用户空间代理安装iptables规则,这些规则捕获到服务的流量Clusterip.(是虚拟的)和港口.该规则将流量重定向到代理端口的代理端口,该端口代理后端POD。

默认情况下,用户空间模式下的Kube-Proxy通过循环算法选择后端。

SeruberPace代理服务概述图

iptables代理模式

在这种模式下,kube-proxy监视Kubernetes的控制平面来添加和删除Service和Endpoint对象。对于每个服务,它都安装iptables规则,这些规则捕获到服务的流量Clusterip.港口,并将流量重定向到其中一个服务的后端集。对于每个端点对象,它安装了选择后端POD的iptables规则。

默认情况下,iptables模式下的kube-proxy随机选择后端。

使用iptables来处理流量具有较低的系统开销,因为流量是由Linux netfilter处理的,而不需要在用户空间和内核空间之间切换。这种方法也可能更可靠。

如果kube-proxy以iptables模式运行,并且选中的第一个Pod没有响应,则连接失败。这与用户空间模式不同:在这种情况下,kube-proxy会检测到到第一个Pod的连接失败,并自动用另一个后端Pod重试。

你可以使用pod准备调查来验证后端pod是否正常工作,这样在iptables模式下的kube-proxy只会将测试结果视为正常的后端。这样做意味着你避免通过kube-proxy将流量发送到已知失败的Pod。

IPTABLES代理的服务概述图

IPVS代理模式

特征状态: Kubernetes v1.11(稳定)

IPVS.模式,kube-proxy监视Kubernetes服务和端点,呼叫netlink相应地创建IPVS规则的界面,并定期使用Kubernetes服务和端点同步IPVS规则。此控件循环确保IPVS状态与所需状态匹配。访问服务时,IPV会将流量指向一个后端吊舱。

IPVS代理模式基于与iptables模式类似的netfilter hook函数,但使用哈希表作为底层数据结构,工作在内核空间。这意味着在IPVS模式下的kube-proxy比在iptables模式下的kube-proxy以更低的延迟重定向流量,在同步代理规则时具有更好的性能。与其他代理模式相比,IPVS模式还可以支持更高的网络流量吞吐量。

IPVS为后端Pods提供了更多的流量平衡选项;这些都是:

  • rr.:循环
  • LC.:最小连接数(最小开放连接数)
  • 德赫目的地:哈希
  • SH.来源:哈希
  • SED.:最短预期延迟
  • NQ.:永远不要队列
笔记:

要在IPVS模式下运行kube-proxy,必须在启动kube-proxy之前在节点上启用IPVS。

kube-proxy在IPVS代理模式启动时,用来验证IPVS内核模块是否可用。如果没有检测到IPVS内核模块,则kube-proxy会退回到iptables代理模式。

IPVS代理服务概览图

在这些代理模型中,绑定到服务IP:Port的流量被代理到适当的后端,而客户机不知道任何关于Kubernetes、Services或Pods的信息。

如果要确保每次从特定客户端连接到相同的POD,则可以通过设置基于客户端的IP地址来选择会话关联service.spec.sessionAffinity到“ClientIP”(默认为“None”)。您还可以通过设置设置最大会话保持时间service.spec.sessionAffinityConfig.clientIP.timeoutSeconds适当。(默认值是10800,即3小时)。

多口服务

对于某些服务,您需要公开多个端口。Kubernetes允许您在一个Service对象上配置多个端口定义。当为一个服务使用多个端口时,您必须给出所有端口名称,以便它们是明确的。例如:

apiVersionv1.种类服务元数据的名字我的服务规范选择器应用程序MyApp港口-的名字http协议TCP港口80发送9376-的名字https协议TCP港口443发送9377
笔记:

和kubernetes一样的名字通常,端口的名称必须仅包含小写字母数字字符和-.端口名称也必须以字母数字字符开始和结束。

例如,名字123年,美国广播公司网络是有效的,但123年_abc不是。

选择自己的IP地址

您可以指定您自己的集群IP地址作为服务创建请求。为此,请设置.spec.clusterIP字段。例如,如果您已将您希望重用的现有DNS条目或配置为特定IP地址和难以重新配置的传统系统。

您选择的IP地址必须是一个有效的IPv4或IPv6地址服务群集IP范围为API服务器配置的CIDR范围。如果您尝试使用无效的集群地址值创建服务,API服务器将返回422 HTTP状态代码以指示存在问题。

发现服务

Kubernetes支持2种查找服务环境变量和DNS的主要模式。

环境变量

当Pod在节点上运行时,kubelet为每个活动服务添加一组环境变量。它同时支持Docker链接兼容变量(见makeLinkVariables)更简单{svcname} _service_host{SVCNAME} _SERVICE_PORT变量,服务名称是上壳体和破折号转换为下划线。

例如,服务redis-master揭露TCP端口6379并已分配群集IP地址10.0.0.11,生成以下环境变量:

REDIS_MASTER_SERVICE_HOST10.0.0.11REDIS_MASTER_SERVICE_PORT6379.REDIS_MASTER_PORTtcp: / / 10.0.0.11:6379REDIS_MASTER_PORT_6379_TCPtcp: / / 10.0.0.11:6379REDIS_MASTER_PORT_6379_TCP_PROTOtcpREDIS_MASTER_PORT_6379_TCP_PORT6379.REDIS_MASTER_PORT_6379_TCP_ADDR10.0.0.11
笔记:

当您有一个需要访问服务的Pod,并且您正在使用环境变量方法将端口和集群IP发布到客户机Pod时,您必须创建服务之前客户端Pods就出现了。否则,这些客户机Pods将不会填充它们的环境变量。

如果您只使用DNS来发现服务的群集IP,则无需担心此订购问题。

DNS

您可以(并且几乎总是应该)使用A的Kubernetes群集设置DNS服务添加在

群集的DNS服务器(如Coredns)观察新服务的Kubernetes API,并为每个组成一组DNS记录。如果在整个群集中启用了DNS,则所有POD都应自动通过其DNS名称解析服务。

例如,如果您有一个被调用的Service我的服务Kubernetes命名空间my-ns,控制平面和DNS服务一起创建DNS记录my-service.my-ns.豆荚中my-ns命名空间应该能够通过姓名查找来找到该服务我的服务my-service.my-ns也行)。

其他名称空间中的Pods必须将名称限定为my-service.my-ns.这些名称将解析为为服务分配的集群IP。

Kubernetes还支持命名端口的DNS SRV (Service)记录。如果my-service.my-ns服务有一个名为的港口http将协议设置为TCP,你可以做一个DNS SRV查询_http._tcp.my-service.my-ns发现端口号http,以及IP地址。

Kubernetes DNS服务器是访问的唯一方法ExternalName.服务。你可以找到更多的信息ExternalName.决议在DNS Pods和Services

无头服务

有时您不需要负载均衡和单个服务IP。在这种情况下,您可以通过显式指定创建所谓的“无头”服务“没有任何”为集群IP (.spec.clusterIP)。

您可以使用无头服务与其他服务发现机制交互,而无需绑定到Kubernetes的实现。

无头的服务,集群IP不被分配,kube-proxy不处理这些服务,平台也不为它们做负载均衡或代理。DNS如何自动配置取决于服务是否定义了选择器:

与选择器

对于定义选择器的无头服务,端点控制器创建终点在API中的记录,并修改DNS配置以返回直接指向的记录(IP地址)豆荚支持服务

没有选择器

对于没有定义选择器的headless Services,不创建端点控制器终点记录。然而,DNS系统查找和配置:

  • CNAME记录ExternalName.类型的服务。
  • 的记录。终点对于所有其他类型,与服务共享一个名称。

发布服务(ServiceTypes)

对于应用程序的某些部分(例如,前端)您可能希望将服务公开到群集之外的外部IP地址上。

KubernetesServiceTypes允许您指定所需的服务。默认为Clusterip.

类型他们的价值观和行为是:

  • Clusterip.:在集群内部IP上公开Service。选择此值将使服务只能从集群内访问。这是默认值ServiceType
  • NodePort:在每个节点的IP(静态端口)上公开服务NodePort)。一种Clusterip.服务,到哪个NodePort服务路由,自动创建。你可以联系NodePort从群集外,通过请求服务< NodeIP >: < NodePort >
  • loadbalance:使用云提供商的负载均衡器外部公开服务。NodePortClusterip.自动创建有外部负载均衡器路由的业务。
  • ExternalName.对象的内容映射服务externalName场(例如foo.bar.example.com),返回一个CNAME.用它的值记录。没有设置任何类型的代理。
    笔记:你需要kube-dns版本1.7或CoreDNS版本0.0.8或更高使用ExternalName.类型。

你也可以使用进入公开你的服务。入口不是服务类型,但它充当集群的入口点。它允许您将路由规则合并到单个资源中,因为它可以在同一个IP地址下公开多个服务。

键入nodeport.

如果你设置了类型领域NodePort, Kubernetes控制平面从指定的范围内分配端口——service-node-port-range标志(默认值:30000-32767)。每个节点代理该端口(每个节点上的相同端口号)到您的服务中。您的服务在其中报告分配的端口.spec.ports [*] .nodePort字段。

如果您想指定代理端口的特定IP(s),可以设置--nodeport-addresses.kube-proxy或等效的标记nodeportaddresses.场的Kube-Proxy配置文件到特定的IP块。

该标志接受以逗号分隔的IP块列表(例如。10.0.0.0/8192.0.2.0/25)要指定Kube-Proxy应认为本地节点的IP地址范围。

例如,如果你开始kube-proxy——nodeport-addresses = 127.0.0.0/8标志,Kube-Proxy仅选择NodePort服务的环回接口。默认为--nodeport-addresses.是一个空列表。这意味着kube-proxy应该考虑NodePort的所有可用网络接口。(这也与Kubernetes早期版本兼容)。

如果您想要特定的端口号,则可以指定一个值nodePort字段。控制平面将分配您的端口或报告API事务失败。这意味着您需要自己处理可能的端口碰撞。您还必须使用有效的端口号,其中一个位于为NodePort使用配置的范围内。

使用NodePort可以自由地设置自己的负载平衡解决方案,配置Kubernetes不完全支持的环境,甚至可以直接公开一个或多个节点的ip。

注意,此服务可见为< NodeIP >: spec.ports [*] .nodePort.spec.clusterIP: spec.ports [*] .port.如果--nodeport-addresses.设置kube-proxy标志或kube-proxy配置文件中的等价字段,< NodeIP >将被过滤的节点IP。

例如:

apiVersionv1.种类服务元数据的名字我的服务规范类型NodePort选择器应用程序MyApp港口#默认情况下,为方便起见,“TargetPort”设置为与“端口”字段相同的值。-港口80发送80#可选字段#默认情况下,为了方便,Kubernetes控制平面将分配一个范围内的端口(默认:30000-32767)nodePort30007

类型loadBalancer.

在支持外部负载均衡器的云提供商上,设置类型领域loadbalance为您的服务提供一个负载均衡器。负载均衡器的实际创建是异步进行的,关于所配置的均衡器的信息在服务中发布.status.loadBalancer字段。例如:

apiVersionv1.种类服务元数据的名字我的服务规范选择器应用程序MyApp港口-协议TCP港口80发送9376Clusterip.10.0.171.239类型loadbalance地位loadbalance入口-知识产权192.0.2.127

来自外部负载均衡器的流量被定向到后端Pods。云提供商决定如何实现负载平衡。

一些云提供商允许您指定loadbalancerip..在这些情况下,使用用户指定的负载平衡器创建负载平衡器loadbalancerip..如果loadbalancerip.如果不指定loadBalancer字段,则loadBalancer将使用临时IP地址设置。如果你指定loadbalancerip.但您的云提供商不支持该功能loadbalancerIP您设置的字段被忽略。

笔记:

Azure,如果您想使用用户指定的公共类型loadbalancerip.,首先需要创建静态类型的公共IP地址资源。此公共IP地址资源应在另一个自动创建群集的相同资源组中。例如,MC_myResourceGroup_myAKSCluster_eastus

将分配的IP地址指定为loadBalancerip。确保在云提供程序配置文件中更新了SecurityGroupName。有关故障排除的信息CreatingLoadBalancerFailed许可问题看,使用Azure Kubernetes服务(AKS)负载均衡器的静态IP地址或者在AKS群集中创建载荷票架构与高级网络

混合协议类型的负载均衡器

特征状态: Kubernetes v1.20(α)

默认情况下,对于服务类型的LoadBalancer,当定义了多个端口时,所有端口必须具有相同的协议,且协议必须是云提供商支持的协议。

如果是特征门MixedProtocolLBService为kube-apiserver启用,当定义了多个端口时,允许使用不同的协议。

笔记:可用于LoadBalancer类型服务的协议集仍然由云提供商定义。

禁用负载均衡器NodePort分配

特征状态: Kubernetes v1.20(α)

从v1.20开始,您可以通过设置该字段,选择性地禁用服务类型=LoadBalancer的节点端口分配spec.allocateLoadBalancerNodePorts.这应该只用于将流量直接路由到pods(而不是使用节点端口)的负载均衡器实现。默认情况下,spec.allocateLoadBalancerNodePorts真的和类型LoadBalancer Services将继续分配节点端口。如果spec.allocateLoadBalancerNodePorts被设置为在具有已分配节点端口的现有服务上,这些节点端口将不会被自动取消分配。必须显式地删除nodePorts进入每个服务端口,以取消分配这些节点端口。您必须启用ServiceLBNodePortControl要使用此字段的功能门。

指定负载均衡器实现的类别

特征状态: Kubernetes v1.21(α)

从v1.21开始,您可以选择指定负载均衡器实现的类loadbalance服务类型通过设置字段spec.loadBalancerClass.默认情况下,spec.loadBalancerClass和一个loadbalancetype of Service使用云提供商的默认负载均衡器实现。如果spec.loadBalancerClass,则假定匹配指定类的负载平衡器实现正在监视Services。任何缺省的负载均衡器实现(例如,云提供商提供的负载均衡器)都会忽略设置了此字段的Services。spec.loadBalancerClass可以设置一个服务类型吗loadbalance只要。一定是,它无法改变。的价值spec.loadBalancerClass必须是一个标签样式的标识符,带有一个可选的前缀,例如"内部贵宾”或“example.com/internal-vip“。未预先固定的名称是为最终用户保留的。您必须启用serviceLoadBalancerClass.要使用此字段的功能门。

内部负载均衡器

在混合环境中,有时需要将来自同一个(虚拟)网络地址块内的服务的通信进行路由。

在Split-Horizo​​ n DNS环境中,您需要两个服务能够将外部和内部流量路由到端点。

要设置内部负载均衡器,请根据所使用的云服务提供商向您的服务添加以下注释之一。

选择其中一个标签。

[…]元数据的名字我的服务注释cloud.google.com/load-balancer-type“内部”[…]

[…]元数据的名字我的服务注释service.beta.www.mariaabreu.com/aws-load-balancer-internal.“真正的”[…]

[…]元数据的名字我的服务注释service.beta.www.mariaabreu.com/azure-load-balancer-internal.“真正的”[…]

[…]元数据的名字我的服务注释service.www.mariaabreu.com / ibm-load-balancer-cloud-provider-ip-type“私人”[…]

[…]元数据的名字我的服务注释service.beta.www.mariaabreu.com / openstack-internal-load-balancer“真正的”[…]

[…]元数据的名字我的服务注释service.beta.www.mariaabreu.com / cce-load-balancer-internal-vpc“真正的”[…]

[…]元数据注释service.www.mariaabreu.com / qcloud-loadbalancer-internal-subnetidsubnet-xxxxx.[…]

[…]元数据注释service.beta.www.mariaabreu.com/alibaba-cloud-loadbalancer-address-type.“内联网”[…]

TLS支持AWS

对于在AWS上运行的集群上的部分TLS / SSL支持,可以向loadbalance服务:

元数据的名字我的服务注释service.beta.www.mariaabreu.com/aws-load-balancer-ssl-cert.攻击:aws: acm: us-east-1:123456789012:证书/ 12345678-1234-1234-1234-123456789012

第一个指定要使用的证书的ARN。它可以是来自第三方发行版的证书,该证书是上传到IAM或在AWS证书管理器中创建的第三方。

元数据的名字我的服务注释service.beta.www.mariaabreu.com / aws-load-balancer-backend-protocolssl (https http | | | tcp)

第二个注释指定POD说话的哪个协议。对于HTTPS和SSL,ELB希望POD使用证书通过加密连接验证自身验证。

HTTP和HTTPS选择第7层代理:ELB终止与用户的连接,解析标题,并注入X-Forthed-for转发请求时,带有用户的IP地址的标题(POD仅在其连接的另一端看到ELB的IP地址)。

TCP和SSL选择4层代理:ELB转发流量而不修改报头。

在一个混合使用的环境中,一些端口是安全的,而其他端口是未加密的,你可以使用以下注释:

元数据的名字我的服务注释service.beta.www.mariaabreu.com / aws-load-balancer-backend-protocolhttpservice.beta.www.mariaabreu.com/aws-load-balancer-ssl-ports.“443、8443”

在上面的例子中,如果服务包含三个端口,80443, 和8443.,然后4438443.会使用SSL证书,但是80将是代理HTTP。

从Kubernetes v1.9开始你就可以使用了预定义AWS SSL策略使用HTTPS或SSL侦听器进行服务。要查看哪些策略可供使用,可以使用aws命令行工具:

Aws elb描述-负载均衡-策略——查询“PolicyDescriptions[]。PolicyName”

然后,您可以使用"service.beta.www.mariaabreu.com / aws-load-balancer-ssl-negotiation-policy“注释;例如:

元数据的名字我的服务注释service.beta.www.mariaabreu.com / aws-load-balancer-ssl-negotiation-policy“elbsecuritypolicy - tls - 1 - 2 - 2017 - 01”

代理协议支持AWS

要启用代理协议支持在AWS上运行的集群,您可以使用以下服务注释:

元数据的名字我的服务注释service.beta.www.mariaabreu.com / aws-load-balancer-proxy-protocol“*”

从版本1.3.0开始,该注释的使用适用于ELB代理的所有端口,不能进行其他配置。

elb访问aws上的日志

有几种注释用于管理AWS上的ELB服务的访问日志。

诠释service.beta.www.mariaabreu.com/aws-load-balancer-access-log-enabled.控制是否启用了访问日志。

诠释service.beta.www.mariaabreu.com / aws-load-balancer-access-log-emit-interval控制发布访问日志的时间间隔(分钟)。您可以指定时间间隔为5分钟或60分钟。

诠释service.beta.www.mariaabreu.com / aws-load-balancer-access-log-s3-bucket-name控制存储负载均衡器访问日志的Amazon S3存储桶的名称。

诠释service.beta.www.mariaabreu.com/aws-load-balancer-access-log-s3-bucket-prefix.指定为Amazon S3桶创建的逻辑层次结构。

元数据的名字我的服务注释service.beta.www.mariaabreu.com/aws-load-balancer-access-log-enabled.“真正的”#指定是否为负载均衡器启用访问日志service.beta.www.mariaabreu.com / aws-load-balancer-access-log-emit-interval“60”#发布访问日志的间隔。您可以指定5或60(分钟)的间隔。service.beta.www.mariaabreu.com / aws-load-balancer-access-log-s3-bucket-name“我的桶”#存放访问日志的Amazon S3桶名service.beta.www.mariaabreu.com/aws-load-balancer-access-log-s3-bucket-prefix.“我的桶前缀/刺”#你为Amazon S3桶创建的逻辑层次结构,例如' my-bucket-prefix/prod '

AWS上的连接排水

可以使用注释来管理Classic elb的连接损耗service.beta.www.mariaabreu.com / aws-load-balancer-connection-draining-enabled设置为的值“真正的”.诠释service.beta.www.mariaabreu.com / aws-load-balancer-connection-draining-timeout还可以用于设置最大时间(以秒为单位),以便在注销实例之前保持现有连接打开。

元数据的名字我的服务注释service.beta.www.mariaabreu.com / aws-load-balancer-connection-draining-enabled“真正的”service.beta.www.mariaabreu.com / aws-load-balancer-connection-draining-timeout“60”

其他提炼注释

下面描述了管理Classic Elastic Load balancer的其他注释。

元数据的名字我的服务注释service.beta.www.mariaabreu.com/aws-load-balancer-connection-idleTimeout.“60”负载均衡器关闭连接之前允许空闲(没有数据通过连接发送)的时间,以秒为单位service.beta.www.mariaabreu.com / aws-load-balancer-cross-zone-load-balancing-enabled“真正的”#是否启用跨分区负载均衡service.beta.www.mariaabreu.com / aws-load-balancer-additional-resource-tags“环境=刺激,所有者= devops”一个逗号分隔的键值对列表,将被记录为#eLB中的其他标签。service.beta.www.mariaabreu.com / aws-load-balancer-healthcheck-healthy-threshold后端所需连续成功运行状况检查的次数#被认为是健康的交通。默认为2,必须在2到10之间service.beta.www.mariaabreu.com / aws-load-balancer-healthcheck-unhealthy-threshold“3”#后端所需的不成功健康检查数量#被视为交通不健康。默认为6,必须在2到10之间service.beta.www.mariaabreu.com/aws-load-balancer-healthCheck-Interval.“20”#近似间隔,在秒内,健康检查之间#个人实例。默认为10,必须在5到300之间service.beta.www.mariaabreu.com / aws-load-balancer-healthcheck-timeout“5”没有响应意味着失败的时间量,以秒为单位#健康检查。该值必须小于service.beta.www.mariaabreu.com/aws-load-balancer-healthcheck-interval#价值。默认为5,必须在2到60之间service.beta.www.mariaabreu.com / aws-load-balancer-security-groups“sg-53fae93f”#在ELB上创建的要配置的现有安全组列表。与注释不同# service.beta.kubernetes。io/aws-load-balancer-extra-security-groups,这将取代以前分配给ELB的所有其他安全组,并覆盖创建过程针对此elb的独特生成的安全组##此列表中的第一个安全组ID用作允许传入流量到目标工作节点(服务流量和健康检查)。#如果多个elb配置了相同的安全组ID,只会有一个permit行被添加到工人节点安全组中,这意味着如果你删除了任何一行#对于这些elb,它将删除单个permit行,并阻止共享相同安全组ID的所有elb的访问。#如果使用不当,可能会导致跨服务中断service.beta.www.mariaabreu.com / aws-load-balancer-extra-security-groups“SG-53FAE93F,SG-42EFD82E”#将添加到创建的ELB中的额外安全组列表,这将保留唯一生成的安全组,这将确保每个ELB#具有唯一的安全组ID和匹配许可线,以允许目标工作人员节点(服务流量和健康检查)。#可在此处定义的安全组可以在服务之间共享。service.beta.www.mariaabreu.com / aws-load-balancer-target-node-labels“ingress-gw gw-name =公共api”,#用逗号分隔的键值对列表#选择负载均衡器的目标节点

AWS上的网络负载平衡器支持

特征状态: Kubernetes v1.15(β)

要在AWS上使用网络负载均衡器,请使用注释service.beta.www.mariaabreu.com / aws-load-balancer-type值设置为NLB.

元数据的名字我的服务注释service.beta.www.mariaabreu.com / aws-load-balancer-type“活检”
笔记:NLB仅适用于某些实例类;看看AWS文乐动体育是干嘛的件关于弹性负载均衡的支持实例类型列表。

与传统的弹性负载均衡器不同,网络负载均衡器(nlb)将客户端的IP地址转发给节点。如果一个服务的.spec.externalTrafficPolicy被设置为集群,客户端的IP地址不会传播到终端pod。

通过设置.spec.externalTrafficPolicy当地的,客户端IP地址被传播到终端pod,但这可能导致流量分布不均匀。没有特定LoadBalancer服务pod的节点将无法在自动分配的NLB目标组上进行健康检查.spec.healthCheckNodePort没有收到任何流量。

为了实现甚至流量,使用守护程序或指定一个豆荚anti-affinity不要在同一节点上找到。

您也可以使用NLB服务与内部负载均衡器注解。

为了让客户端流量达到NLB后面的实例,通过以下IP规则修改节点安全组:

规则 协议 港口 iprange(s) IpRange描述
健康检查 TCP NodePort (s) (.spec.healthCheckNodePort.spec.externalTrafficPolicy=当地的 子网CIDR Kubernetes.io/rule/nlb/health=
客户端流量 TCP NodePort (s) .spec.loadBalancerSourceRanges(默认为0.0.0.0/0 Kubernetes.io/rule/nlb/client=
MTU发现 ICMP. 3,4 .spec.loadBalancerSourceRanges(默认为0.0.0.0/0 Kubernetes.io/rule/nlb/mtu=

为了限制哪个客户端IP可以访问网络负载均衡器,请指定loadbalancersourceranges.

规范loadbalancersourceranges.-“143.231.0.0/16”
笔记:如果.spec.loadBalancerSourceRanges不设定,库伯内特允许流量从0.0.0.0/0到节点安全组。如果节点有公网IP地址,请注意,非nlb流量也可以到达修改后的安全组中的所有实例。

其他在腾讯Kubernetes Engine (TKE)上的CLB注释

下面是在TKE上管理云负载均衡器的其他注释。

元数据的名字我的服务注释#绑定带有指定节点的LoadBalancerservice.www.mariaabreu.com/qcloud-loadbalancer-backends-label.键入(value1, value2)#已存在的负载均衡器IDservice.www.mariaabreu.com/tke-existed-lbid :lb-6swtxxxx.# LB自定义参数,目前不支持修改LB类型service.www.mariaabreu.com / service.extensiveParametersLB侦听器的自定义参数service.www.mariaabreu.com/service.listenerParameters.#负载均衡器类型;#有效值:经典(经典云负载平衡器)或应用程序(应用程序云负载平衡器)service.www.mariaabreu.com / loadbalance-typexxxxx#指定公共网络带宽计费方法;#有效值:traffic_postpaid_by_hour(逐个流量)和bandwidth_postpaid_by_hour(符合BAND-BY-BANDWIDTH)。service.www.mariaabreu.com / qcloud-loadbalancer-internet-charge-typexxxxxx.#指定带宽值(值范围:[1,2000] Mbps)。service.www.mariaabreu.com / qcloud-loadbalancer-internet-max-bandwidth-out“10”#设置这个注释后,loadbalancer将只注册节点#在上面运行pod,否则所有节点都将被注册。service.www.mariaabreu.com / local-svc-only-bind-node-with-pod真的

类型ExternalName

ExternalName类型的服务将服务映射到DNS名称,而不是映射到典型的选择器,例如我的服务或者卡桑德拉.您将这些服务指定了这些服务spec.externalName参数。

例如,此服务定义映射到我的服务服务刺激命名空间my.database.example.com.

apiVersionv1.种类服务元数据的名字我的服务名称空间刺激规范类型ExternalName.externalNamemy.database.example.com.
笔记:ExternalName接受IPv4地址字符串,但作为由数字组成的DNS名称,而不是作为IP地址。类似IPv4地址的ExternalNames不会被CoreDNS或ingress-nginx解析,因为ExternalName是用来指定一个规范的DNS名称的。要硬编码IP地址,请考虑使用无头服务

查找主人时my-service.prod.svc.cluster.local.,群集DNS服务返回一个CNAME.记录值my.database.example.com..访问我的服务以与其他服务相同的方式工作,但在DNS级别而不是通过代理或转发时,重定向发生的关键差异。如果您稍后决定将数据库移动到群集,可以启动其POD,添加适当的选择器或端点,并更改服务类型

警告:

对于一些常见协议,包括HTTP和HTTPS,使用ExternalName可能会有问题。如果使用ExternalName,那么集群内客户端使用的主机名与ExternalName引用的名称不同。

对于使用主机名的协议,这种差异可能会导致错误或意外的响应。HTTP请求将有一个主持人:源服务器不能识别的标头;TLS服务器将不能提供与客户机连接到的主机名匹配的证书。

笔记:这一节归功于Kubernetes提示 - 第1部分博客帖子阿伦Komljen

外部IPS.

如果有路由到一个或多个集群节点的外部ip,则Kubernetes Services可以在这些节点上公开externalIPs.使用服务端口上的外部IP(作为目标IP)进入集群的流量将被路由到其中一个服务端点。externalIPs不由Kubernetes管理,并且是群集管理员的责任。

在服务规范中,externalIPs可以与任何ServiceTypes.在下面的例子中,"我的服务“可以通过客户端访问”80.11.12.10:80”(externalIP:端口

apiVersionv1.种类服务元数据的名字我的服务规范选择器应用程序MyApp港口-的名字http协议TCP港口80发送9376externalIPs-80.11.12.10

缺点

为vip使用用户空间代理可以在中小型规模下工作,但是不能扩展到具有数千个服务的非常大的集群。的门户网站的原始设计方案详细报道。

使用用户空间代理掩盖访问服务的数据包的源IP地址。这使得某些类型的网络过滤(防火墙)不可能实现。iptables代理模式并没有掩盖集群内的源ip,但是它仍然会影响通过负载均衡器或节点端口来的客户端。

类型字段被设计为嵌套功能 - 每个级别都会添加到上一个。所有云提供商都没有严格要求这一点(例如,Google Compute引擎不需要分配aNodePort为了使loadbalance但是当前的API需要它。

虚拟IP实现

对于许多想要使用服务的人来说,前面的信息应该足够了。然而,在幕后有很多事情可能值得理解。

避免碰撞

Kubernetes的一个基本理念是,你不应该暴露在可能导致你的行为失败的情况下,而不是因为你自己的错误。对于Service资源的设计,这意味着如果您自己的选择可能与他人的选择相冲突,则不要求您选择自己的端口号。这是孤立的失败。

为了允许您为您的服务选择端口号,我们必须确保没有两个服务可以冲突。Kubernetes通过为每个服务分配自己的IP地址来实现这一点。

为了确保每个服务接收到唯一的IP,内部分配器自动更新全局分配映射etcd在创建每个服务之前。映射对象必须存在于注册表中,以便服务获得IP地址分配,否则创建将失败,并会显示一条消息,指示无法分配IP地址。

在控制平面中,一个后台控制器负责创建该映射(需要支持从使用内存锁的较老版本的Kubernetes迁移)。Kubernetes还使用控制器来检查无效的分配(例如由于管理员的干预),并清理已分配的不再被任何服务使用的IP地址。

服务IP地址

与Pod IP地址不同,Pod IP地址实际上路由到一个固定的目的地,而Service IP实际上不是由单个主机应答的。相反,kube-proxy使用iptables (Linux中的包处理逻辑)来定义虚拟根据需要透明重定向的IP地址。当客户端连接到VIP时,它们的流量将自动传输到适当的端点。实际上填充了服务的虚拟IP地址(和端口)的环境变量和DNS。

kube-proxy支持三种代理模式:用户空间(userspace)、iptables和ipvs,它们的操作略有不同。

用户空间

例如,考虑上面描述的图像处理应用程序。创建后端服务时,Kubernetes主服务器分配一个虚拟IP地址,例如10.0.0.1。假设Service端口是1234,集群中的所有kube-proxy实例都会观察到该Service。当一个代理看到一个新的服务,它打开一个新的随机端口,建立一个iptables重定向从虚拟IP地址到这个新端口,并开始在它上接受连接。

当客户端连接到服务的虚拟IP地址时,iptables规则开始生效,并将数据包重定向到代理自己的端口。“服务代理”选择后端,并开始代理从客户端到后端的流量。

这意味着服务所有者可以选择任何他们想要的端口,而不会有冲突的风险。客户端可以连接到一个IP和端口,而不知道他们实际访问的是哪个Pods。

iptables

同样,考虑上述图像处理应用程序。创建后端服务时,Kubernetes控件平面分配虚拟IP地址,例如10.0.0.1。假设Service端口是1234,集群中的所有kube-proxy实例都会观察到该Service。当代理看到新服务时,它会安装一系列IPTables规则,该规则将虚拟IP地址重定向到每次服务规则。每次服务规则链接到每个端点规则,将流量(使用目标NAT)重定向到后端。

当客户端连接到服务的虚拟IP地址时,iptables规则踢出。选择后端(基于会话亲和力或随机),并且数据包被重定向到后端。与Userspace代理不同,PACKETEL永远不会复制到用户空间,Kube-Proxy不必为虚拟IP地址运行到工作,节点请参阅从未变化的客户端IP地址到达的流量。

当流量通过节点端口或通过负载平衡器进入时,执行相同的基本流程,但在这些情况下,客户端IP确实更改。

IPVS.

iptables操作在大规模集群(例如10,000 Services)中会显著变慢。IPVS是为负载均衡而设计的,基于内核哈希表。通过基于ipvs的kube-proxy,可以实现大量服务的性能一致性。同时,基于ipvs的kube-proxy具有更复杂的负载均衡算法(最小conn、局域性、加权、持久性)。

API对象

服务是Kubernetes REST API中的顶级资源。你可以在下面找到更多关于API对象的细节:服务API对象

支持的协议

TCP

您可以将TCP用于任何类型的服务,并且它是默认的网络协议。

UDP

您可以使用UDP了解大多数服务。对于类型= LoadBalancer服务,UDP支持取决于提供此工具的云提供商。

SCTP

特征状态: Kubernetes v1.20 [稳定]

当使用支持SCTP流量的网络插件时,您可以将SCTP用于大多数服务。对于type=LoadBalancer Services, SCTP支持取决于提供此功能的云提供商。(最不)。

警告

支持多家SCTP协会
警告:

多归属SCTP关联的支持要求CNI插件能够支持为一个Pod分配多个接口和IP地址。

对于多宿主的SCTP关联NAT需要相应的内核模块中的特殊逻辑。

窗户
笔记:基于Windows的节点不支持SCTP。
用户空间kube-proxy
警告:Kube-Proxy在用户空间模式下,不支持SCTP关联的管理。

HTTP

如果云提供商支持它,则可以在LoadBalancer模式下使用服务来设置外部HTTP / HTTPS反向代理,转发到服务的端点。

笔记:你也可以使用进入来公开HTTP/HTTPS服务。

代理协议

如果你的云提供商支持它,你可以在LoadBalancer模式下使用Service来配置Kubernetes之外的负载均衡器,这将转发前缀为代理协议

负载平衡器将发送描述传入连接的初始八位字节序列,类似于此示例

Proxy TCP4 192.0.2.202 10.0.42.7 12345 7 \ r \ n

然后是客户端的数据。

接下来是什么

最后修改4月23日,2021年PM PST 3:48:修复表格格式。(16C4FA797)