服务
将集群中运行的应用程序暴露在单个向外的端点后面,即使工作负载被拆分到多个后端。
在Kubernetes中,服务是一种公开作为一个或多个运行的网络应用程序的方法豆荚在集群中。
Kubernetes中服务的一个关键目标是,您不需要修改现有的应用程序使用不熟悉的服务发现机制。您可以在Pods中运行代码,无论这是为云计算世界设计的代码,还是你已经装箱的旧应用程序。您使用服务来提供这组Pod以便客户端可以与之交互。
如果您使用部署要运行应用程序,部署可以动态创建和销毁Pods。从这一刻到下一刻,你不知道这些吊舱中有多少是工作和健康的;你甚至可能不知道那些健康的豆荚叫什么名字。库伯内特斯豆荚被创造和毁灭以匹配集群的所需状态。吊舱是短暂的资源(你不应该期望单个吊舱可靠耐用)。
每个Pod都有自己的IP地址(Kubernetes希望网络插件能够确保这一点)。对于集群中的给定部署时间可能与稍后运行该应用程序的Pods集不同。
这导致了一个问题:如果某组Pod(称为“后端”)提供集群中其他Pod(称为“前端”)的功能,前端如何发现并跟踪要连接的IP地址到,以便前端可以使用工作负载的后端部分?
输入服务.
Kubernetes的服务
服务API是Kubernetes的一部分,它是一个抽象,可以帮助您公开网络上的Pods。每个Service对象定义一组逻辑端点(通常这些端点是Pods)以及关于如何访问这些Pods的策略。
例如,考虑使用运行的无状态图像处理后端3个副本。这些副本是可替换的-前端不关心哪个后端他们使用。虽然组成后端集的实际Pod可能会更改,但前端客户不需要知道这一点,也不需要保持跟踪后端集本身。
服务抽象支持这种解耦。
服务所针对的Pod集合通常是确定的由选择器就是你定义。要了解定义服务端点的其他方法,看见服务没有选择器.
如果您的工作负载使用HTTP,您可以选择使用进入控制网络流量达到该工作量。入口不是服务类型,但它是您的入口点集群。Ingress允许您将路由规则合并到单个资源中,因此可以公开工作负载的多个组件,分别在集群,位于单个侦听器后面。
这个网关Kubernetes的API提供超越入口和服务的额外功能。您可以将网关添加到群集-它是一系列扩展API,使用自定义资源定义-然后使用这些配置对集群中运行的网络服务的访问。
云主动服务发现
如果您能够在应用程序中使用Kubernetes API进行服务发现,您可以查询API服务器用于匹配EndpointSlice。Kubernetes更新服务的EndpointSlices服务中的Pods组发生变化时。
对于非本机应用程序,Kubernetes提供了放置网络端口或加载的方法在应用程序和后端Pods之间进行平衡。
无论哪种方式,您的工作负载都可以使用这些服务发现找到它想要连接的目标的机制。
定义服务
服务是指对象(与Pod或ConfigMap是对象的方式相同)。您可以创建,使用Kubernetes API查看或修改服务定义。通常情况下您使用的工具库贝特尔
为您进行这些API调用。
例如,假设您有一组Pod,每个Pod都在TCP端口9376上侦听并标记为app.kubernetes.io/name=我的应用程序
。您可以将服务定义为发布该TCP侦听器:
api版本: 第1版
友善的: 服务
元数据:
名称: 我的服务
规范:
选择器:
app.kubernetes.io/name公司: 我的应用程序
端口:
-协议: 传输控制协议
港口: 80
目标端口: 9376
应用此清单将创建名为“my-Service”的新服务,默认为群集IP服务类型.服务以任何Pod上的TCP端口9376为目标app.kubernetes.io/name:MyApp
标签。
Kubernetes为该服务分配一个IP地址(群集IP),虚拟IP地址机制使用的。有关该机制的更多详细信息,阅读虚拟IP和服务代理.
该服务的控制器持续扫描匹配其选择器,然后对服务的端点切片。
服务对象的名称必须有效RFC 1035标签名称.
注:
服务可以映射任何进来的港口
到目标端口
。默认情况下为了方便起见目标端口
设置为与港口
字段。端口定义
Pods中的端口定义有名称,您可以在目标端口
服务的属性。例如,我们可以绑定目标端口
以以下方式向吊舱端口提供服务:
api版本: 第1版
友善的: 豆荚
元数据:
名称: nginx公司
标签:
app.kubernetes.io/name公司: 代理
规范:
容器:
-名称: nginx公司
形象: nginx:稳定
端口:
-集装箱港口: 80
名称: http-web-svc网址
---
api版本: 第1版
友善的: 服务
元数据:
名称: nginx服务
规范:
选择器:
app.kubernetes.io/name应用程序: 代理
端口:
-名称: 服务端口名称
协议: 传输控制协议
港口: 80
目标端口: http-web-svc网址
即使服务中有混合的Pod使用单个配置的名称,具有相同的网络协议,可通过不同的端口号。这为部署和发展提供了很大的灵活性您的服务。例如,您可以更改Pods公开的端口号在后端软件的下一个版本中,不会破坏客户端。
服务的默认协议是传输控制协议; 你也可以使用任何其他支持的协议.
由于许多服务需要公开多个端口,Kubernetes支持多端口定义用于单个服务。每个端口定义可以具有相同的协议
或另一个。
没有选择器的服务
通过选择器,服务最常见的对Kubernetes Pods的抽象访问,但当与相应的端点切片对象,并且在没有选择器的情况下,服务可以抽象其他类型的后端,包括在集群之外运行的那些。
例如:
- 您希望在生产中有一个外部数据库集群,但在使用自己的数据库的测试环境。
- 您希望将您的服务指向另一个命名空间或在另一个群集上。
- 您正在将工作负载迁移到Kubernetes。在评估方法时,你在Kubernetes只运行了一部分后台。
在这些场景中,您可以定义服务没有指定选择器以匹配吊舱。例如:
api版本: 第1版
友善的: 服务
元数据:
名称: 我的服务
规范:
端口:
-名称: http协议
协议: 传输控制协议
港口: 80
目标端口: 9376
由于此服务没有选择器,因此相应的EndpointSlice(和旧端点)对象不会自动创建。您可以映射服务通过添加EndpointSlice,将其添加到运行的网络地址和端口对象。例如:
api版本: 发现.k8s.io/v1
友善的: 端点切片
元数据:
名称: 我的服务-1 #按照惯例,使用服务的名称
#作为EndpointSlice名称的前缀
标签:
#您应该设置“kubernetes.io/service-name”标签。
#设置其值以匹配服务的名称
kubernetes.io/服务名称: 我的服务
地址类型: IPv4协议
端口:
-名称: http协议 #应与上面定义的服务端口的名称匹配
应用程序协议: http协议
协议: 传输控制协议
港口: 9376
端点:
-地址:
-"10.4.5.6"
-地址:
-"10.1.2.3"
自定义端点切片
当您创建端点切片对象,您可以对EndpointSlice使用任意名称。命名空间中的每个EndpointSlice都必须具有唯一名称。通过设置kubernetes.io/服务名称
标签在该EndpointSlice上。
注:
端点IP不能是:环回(IPv4为127.0.0.0/8,IPv6为::1/128),或链路本地(对于IPv4为169.254.0.0/16和224.0.0.0/24,对于IPv6为fe80::/64)。
端点IP地址不能是其他Kubernetes服务的群集IP,因为kube-proxy公司不支持虚拟IP作为目的地。
对于您自己或在自己的代码中创建的EndpointSlice,您还应该为标签选择一个值endpointslice.kubernetes.io/管理人
.如果您创建自己的控制器代码来管理EndpointSlice,请考虑使用值类似于“my-domain.example/name-of-controller”
。如果您使用第三个party工具,使用全小写的工具名称并更改空格等标点到破折号(-
).如果人们直接使用工具,例如库贝特尔
要管理EndpointSlice,使用描述此手动管理的名称,例如“员工”
或“群集管理员”
.你应该避免使用保留值“控制器”
,用于标识EndpointSlice由Kubernetes自己的控制飞机管理。
不使用选择器访问服务
在不使用选择器的情况下访问服务的工作方式与使用选择器的工作方式相同。在例子对于没有选择器的服务,流量路由到中定义的两个端点之一EndpointSlice清单:到端口9376上10.1.2.3或10.4.5.6的TCP连接。
注:
Kubernetes API服务器不允许代理未映射到的端点豆荚。行动,如kubectl端口转发服务/<service-name>forwardedPort:servicePort
服务没有由于此约束,选择器将失败。这将阻止Kubernetes API服务器从用作代理到端点,调用方可能没有被授权访问。一个外部名称
服务是没有选择器,并使用DNS名称。有关更多信息,请参阅外部名称第节。
端点切片
功能状态: Kubernetes v1.21[稳定]
端点切片是指表示子集(a片)服务的支持网络端点。
Kubernetes集群跟踪每个EndpointSlice代表的端点数量。如果服务的端点太多,达到了阈值,那么Kubernetes添加了另一个空的EndpointSlice并存储新的端点信息那里。默认情况下,Kubernetes在现有的EndpointSlice之后创建一个新的Endpoint Slice它们都包含至少100个端点。Kubernetes不制作新的EndpointSlice直到需要添加额外的端点。
请参见端点切片了解更多有关此API的信息。
终点
在Kubernetes API中终点(资源类型为复数)定义网络端点列表,通常由服务引用以定义流量可以发送到哪些Pod。
EndpointSlice API是Endpointes的推荐替代品。
产能过剩端点
Kubernetes限制了可以容纳在单个端点中的端点数量对象。当服务有1000多个支持端点时,Kubernetes截断Endpoints对象中的数据。因为服务可以链接对于多个EndpointSlice,仅支持1000个端点限制影响旧版端点API。
在这种情况下,Kubernetes最多选择1000个可能的后端端点来存储到Endpoints对象中,并设置注释在端点上:endpoints.kubernetes.io/over-capacity:已截断
.如果后端Pods的数量低于1000,控制平面也会删除该注释。
流量仍然发送到后端,但任何依赖于传统端点API最多只能向1000个可用的支持端点发送流量。
相同的API限制意味着您无法手动更新端点以使其具有1000个以上的端点。
应用程序协议
功能状态: Kubernetes v1.20[稳定]
这个应用程序协议
字段提供了为指定应用程序协议的方法每个服务端口。这用作实现提供的提示为他们理解的协议提供更丰富的行为。此字段的值由相应的端点和EndpointSlice对象。
此字段遵循标准Kubernetes标签语法。有效值为以下值之一:
协议 | 说明 |
---|
kubernetes.io/h2c | 明文上的HTTP/2,如中所述副本请求7540 |
kubernetes.io/ws | 明文上的WebSocket,如中所述副本请求6455 |
kubernetes.io/wss | TLS上的WebSocket,如中所述副本请求6455 |
多端口服务
对于某些服务,您需要公开多个端口。Kubernetes允许您在Service对象上配置多个端口定义。为服务使用多个端口时,必须提供所有端口名称所以这些是明确的。例如:
api版本: 第1版
友善的: 服务
元数据:
名称: 我的服务
规范:
选择器:
app.kubernetes.io/name应用程序: 我的应用程序
端口:
-名称: http协议
协议: 传输控制协议
港口: 80
目标端口: 9376
-名称: https(https)
协议: 传输控制协议
港口: 443
目标端口: 9377
注:
与Kubernetes一样姓名通常,端口的名称只能包含小写字母数字字符和-
。端口名必须还以字母数字字符开始和结束。
例如,名称公元前123年
和网状物
是有效的,但123_公元前
和-网络
不是。
服务类型
对于应用程序的某些部分(例如前端),您可能希望公开服务到外部IP地址,该地址可以从您的外部访问集群。
Kubernetes服务类型允许您指定所需的服务类型。
可用的类型
价值观及其行为是:
群集IP
- 在群集内部IP上公开服务。选择此值使服务只能从群集中访问。这是如果未显式指定
类型
用于服务。您可以使用进入或a网关. 节点端口
- 在每个节点的IP上的静态端口(
节点端口
).为了使节点端口可用,Kubernetes设置了一个群集IP地址,与您请求的服务相同类型:ClusterIP
. 负载平衡器
- 使用外部负载平衡器对外公开服务。库伯内特斯不直接提供负载平衡组件;您必须提供一个,或者您可以将Kubernetes集群与云提供商集成。
外部名称
- 将服务映射到的内容
外部名称
字段(例如,到主机名api.foo.bar示例
). 映射配置集群的要返回的DNS服务器中国名称
使用该外部主机名值进行记录。没有设立任何形式的代理。
这个类型
服务API中的字段设计为嵌套功能-每个级别添加到上一个。然而,这种嵌套设计有一个例外。你可以定义一个负载平衡器
服务提供者禁用负载平衡器节点端口
分配.
类型:ClusterIP
此默认服务类型从IP地址池中分配一个IP地址您的集群已为此目的保留。
服务的其他几种类型构建在群集IP
键入为基础。
如果您定义的服务具有.spec.clusterIP规范
设置为“无”
然后Kubernetes不分配IP地址。请参见无头服务了解更多信息。
选择您自己的IP地址
您可以指定自己的群集IP地址作为服务
创造请求。为此,请将.spec.clusterIP规范
字段。例如,如果您已经有一个您希望重用的现有DNS条目,或旧系统其被配置用于特定的IP地址并且难以重新配置。
您选择的IP地址必须是中的有效IPv4或IPv6地址服务群集-ip范围
为API服务器配置的CIDR范围。如果您尝试使用无效的群集IP
地址值,API服务器将返回422 HTTP状态代码,以指示存在问题。
阅读避免碰撞了解Kubernetes如何帮助降低两种不同服务的风险和影响两者都试图使用相同的IP地址。
类型:节点端口
如果您设置类型
字段到节点端口
,Kubernetes控制飞机从指定的范围分配端口--服务-节点-端口-范围
标志(默认值:30000-32767)。每个节点将该端口(每个节点上的相同端口号)代理到您的服务中。您的服务报告其.spec.ports[*]节点端口
字段。
使用NodePort可以自由设置自己的负载平衡解决方案,配置Kubernetes不完全支持的环境,甚至直接公开一个或多个节点的IP地址。
对于节点端口服务,Kubernetes额外分配一个端口(TCP、UDP或SCTP与服务协议匹配)。群集中的每个节点都配置自身侦听指定端口并将流量转发到其中一个就绪端口与该服务关联的端点。您可以联系类型:节点端口
通过使用适当的协议(例如:TCP)和适当的端口(分配给该服务)。
选择您自己的端口
如果需要特定的端口号,可以在节点端口
字段。控制平面将为您分配该端口或报告API事务失败。这意味着您需要自己处理可能发生的端口冲突。您还必须使用有效的端口号,该端口号在配置的范围内用于NodePort。
以下是的服务的清单示例类型:节点端口
规定NodePort值(本例中为30007):
api版本: 第1版
友善的: 服务
元数据:
名称: 我的服务
规范:
类型: 节点端口
选择器:
app.kubernetes.io/name公司: 我的应用程序
端口:
-港口: 80
#默认情况下,为了方便起见,“targetPort”设置为
#与“端口”字段的值相同。
目标端口: 80
#可选字段
#默认情况下,为了方便起见,Kubernetes控制平面
#将从某个范围分配端口(默认值:30000-32767)
节点端口: 30007
保留Nodeport范围以避免冲突
功能状态: Kubernetes v1.29[稳定]
将端口分配给NodePort服务的策略适用于自动分配和手动分配场景。当用户想要创建NodePort服务时使用特定端口时,目标端口可能与已分配的另一个端口冲突。
为了避免这个问题,NodePort服务的端口范围被分为两个频带。默认情况下,动态端口分配使用上层频带,一旦上层已经筋疲力尽。然后,用户可以从较低的频带进行分配,从而降低端口冲突的风险。
的自定义IP地址配置类型:节点端口
服务
您可以在群集中设置节点,以使用特定的IP地址为节点端口提供服务服务。如果每个节点都连接到多个网络(例如:一个网络用于应用程序流量,另一个网络则用于节点和控制平面)。
如果要指定特定IP地址来代理端口,可以将--节点端口地址
kube代理或等效的标志节点端口地址
的字段kube-proxy配置文件到特定IP块。
此标志采用以逗号分隔的IP块列表(例如。10.0.0.0/8
,192.0.2.0/25
)指定kube-proxy应视为此节点本地的IP地址范围。
例如,如果您使用--节点端口地址=127.0.0.0/8
标志,kube proxy只为NodePort服务选择环回接口。的默认值--节点报告地址
是一个空列表。这意味着kube-proxy应该考虑NodePort的所有可用网络接口。(这也与早期的Kubernetes版本兼容。)
注:
此服务可见为<NodeIP>:规范端口[*].nodePort
和.spec.clusterIP:规范端口[*].port
.如果--节点报告地址
kube-proxy或等效字段的标志在kube-proxy配置文件中设置,<节点IP>
将是已筛选的节点IP地址(或可能的IP地址)。类型:负载平衡器
支持外部负载平衡器的云上提供商,将类型
字段到负载平衡器
为您的服务提供负载平衡器。负载平衡器的实际创建是异步进行的,并且有关提供的平衡器的信息发布在服务的.状态.loadBalancer
字段。例如:
api版本: 第1版
友善的: 服务
元数据:
名称: 我的服务
规范:
选择器:
app.kubernetes.io/name公司: 我的应用程序
端口:
-协议: 传输控制协议
港口: 80
目标端口: 9376
集群IP: 10月171.239日
类型: 负载平衡器
地位:
负载平衡器:
进入:
-知识产权: 192.0.2.127
来自外部负载平衡器的流量直接指向后端Pods。云提供者决定如何进行负载平衡。
要实现的服务类型:负载平衡器
,Kubernetes通常开始通过做出等同于您请求服务的更改类型:节点端口
。云控制器管理器组件然后配置外部负载平衡器将流量转发到指定的节点端口。
您可以将负载平衡服务配置为省略分配节点端口,前提是云提供程序实现支持这一点。
一些云提供程序允许您指定负载均衡器IP
。在这些情况下,将创建负载平衡器使用特定于用户的负载均衡器IP
。如果负载均衡器IP
字段未指定,负载平衡器使用临时IP地址设置。如果指定负载均衡器IP
但您的云提供商不支持该功能负载平衡器IP
字段,您集合被忽略。
注:
这个.规范.负载均衡器IP
服务字段在Kubernetes v1.24中被弃用。
该字段未被指定,其含义因实现而异。它也不能支持双重网络。在未来的API版本中,可能会删除此字段。
如果您正在与支持指定负载平衡器IP地址的提供程序集成对于通过(特定于提供者的)注释的服务,您应该切换到这样做。
如果您正在为与Kubernetes的负载平衡器集成编写代码,请避免使用此字段。您可以与集成网关而不是服务,或者您可以在服务上定义您自己的(特定于提供商的)注释,以指定等效的详细信息。
节点活动性对负载平衡器流量的影响
负载平衡器健康检查对现代应用程序至关重要。他们习惯于确定负载平衡器应该使用哪个服务器(虚拟机或IP地址)将流量调度到。Kubernetes API没有定义健康检查的方式为Kubernetes管理的负载平衡器实现,而不是云提供商(以及实现集成代码的人员)决定行为。加载在支持外部交通政策
服务字段。
具有混合协议类型的负载平衡器
功能状态: Kubernetes v1.26[稳定]
默认情况下,对于服务的LoadBalancer类型,当定义了多个端口时,所有端口必须具有相同的协议,并且该协议必须是受支持的协议由云提供商提供。
功能门混合协议LB服务
(从v1.24开始,kube-apiserver默认启用)允许使用定义了多个端口时,LoadBalancer服务类型的不同协议。
注:
可用于负载平衡服务的协议集由您的云提供商;他们可能会施加超出Kubernetes API强制执行范围的限制。禁用负载平衡器NodePort分配
功能状态: Kubernetes v1.24[稳定]
您可以选择禁用服务的节点端口分配类型:负载平衡器
,通过设置田地规范分配负载平衡节点端口
到假
。这应仅用于负载平衡器实现其将流量直接路由到pod,而不是使用节点端口。默认情况下,规范分配负载平衡节点端口
是真的
和类型LoadBalancer Services将继续分配节点端口。如果规范分配负载平衡节点端口
设置为假
在具有分配的节点端口的现有服务上,这些节点端口将不自动取消分配。必须显式删除节点端口
每个服务端口中的条目以取消这些节点端口的分配。
指定负载平衡器实现的类
功能状态: Kubernetes v1.24[稳定版]
对于具有的服务类型
设置为负载平衡器
,的.spec.LoadBalancer类
领域允许您使用云提供程序默认值以外的负载平衡器实现。
默认情况下,.spec.LoadBalancer类
未设置,并且负载平衡器
如果使用--防云装置
成分标志。
如果您指定.spec.LoadBalancer类
,假设负载平衡器与指定类匹配的实现正在监视服务。任何默认负载平衡器实现(例如云提供商)将忽略设置了此字段的服务。规范.负载平衡类
可以在类型为的服务上设置负载平衡器
只有。一旦设置,就无法更改。的价值规范.负载平衡类
必须是标签样式标识符,带有可选前缀,例如“内部真空阀
“或”example.com/internal-vip
”。未前缀的名称保留给最终用户。
指定负载平衡器状态的IPMode
功能状态: Kubernetes v1.30[测试版]
作为Kubernetes 1.30的Beta功能,一特征门命名负载平衡IPMode
允许您设置.status.loadBalancer.ingress.ip模式
对于具有的服务类型
设置为负载平衡器
.这个.status.loadBalancer.ingress.ip模式
指定负载平衡器IP的行为方式。只有当.status.loadBalancer.ingress.ip
字段也已指定。
有两个可能的值.status.loadBalancer.ingress.ip模式
:“VIP”和“代理”。默认值为“VIP”,表示将流量传递到节点目标设置为负载平衡器的IP和端口。将其设置为“代理”时有两种情况,具体取决于负载平衡器的方式从云提供商交付流量:
- 如果流量被发送到节点,然后DNAT发送到pod,那么目的地将被设置为节点的IP和节点端口;
- 如果流量直接发送到吊舱,则目的地将设置为吊舱的IP和端口。
服务实现可以使用此信息来调整流量路由。
内部负载平衡器
在混合环境中,有时需要路由来自同一内部服务的流量(虚拟)网络地址块。
在分支DNS环境中,您需要两个服务才能路由两个外部以及到端点的内部流量。
要设置内部负载平衡器,请向服务添加以下注释之一取决于您使用的云服务提供商:
元数据:
名称: 我的服务
注释:
networking.gke.io/负载均衡器类型: “内部”
元数据:
名称: 我的服务
注释:
service.beta.kubernetes.io/aws-内部负载平衡器: “正确”
元数据:
名称: 我的服务
注释:
service.beta.kubernetes.io/azure-load-balancer-internal公司: “正确”
元数据:
名称: 我的服务
注释:
service.kubernetes.io/ibm-load-balancer-cloud-provider-ip类型: “私人”
元数据:
名称: 我的服务
注释:
service.beta.kubernetes.io/openstack-internal-load-balancer: “正确”
元数据:
名称: 我的服务
注释:
service.beta.kubernetes.io/cce-内部负载平衡器-vpc: “正确”
元数据:
注释:
服务.kubernetes.io/qcloud-loadbalancer-internal-subnetid: 子网-xxxxx
元数据:
注释:
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-地址类型: “内部网”
元数据:
名称: 我的服务
注释:
service.beta.kubernetes.io/oci-load-balancer-internal公司: 真的
类型:外部名称
ExternalName类型的服务将服务映射到DNS名称,而不是典型的选择器,例如我的服务
或卡桑德拉
。使用指定这些服务规范外部名称
参数。
例如,此服务定义映射这个我的服务
中的服务触头
命名空间到my.database.example.com
:
api版本: 第1版
友善的: 服务
元数据:
名称: 我的服务
命名空间: 触头
规范:
类型: 外部名称
外部名称: my.database.example.com
注:
A服务类型:外部名称
接受IPv4地址字符串,但将该字符串视为由数字组成的DNS名称,不作为IP地址(然而,互联网不允许在DNS中使用此类名称)。具有类似IPv4的外部名称的服务DNS服务器无法解析地址。
如果要将服务直接映射到特定IP地址,请考虑使用无头服务.
查找主机时my-service.prod.svc.cluster本地
,群集DNS服务返回一个中国名称
用值记录my.database.example.com
.访问我的服务
工作方式与其他服务相同,但关键重定向发生在DNS级别而不是通过代理或转发。如果以后决定将数据库移动到集群中可以启动其Pod,添加适当的选择器或端点,并更改服务类型
.
注意:
对于一些常见协议(包括HTTP和HTTPS),使用ExternalName可能会遇到问题。如果使用ExternalName,则集群内客户端使用的主机名与ExternalName引用的名称。
对于使用主机名的协议,这种差异可能会导致错误或意外响应。HTTP请求将具有主持人:
源服务器无法识别的标头;TLS服务器将无法提供与客户端连接的主机名匹配的证书。
无头服务
有时您不需要负载平衡和单个服务IP。在在这种情况下,您可以创建术语无头服务,通过显式指定“无”
用于群集IP地址(.spec.clusterIP规范
).
您可以使用无头服务与其他服务发现机制接口,与Kubernetes的实现无关。
对于无头服务,不分配群集IP,kube-proxy不处理这些服务,平台没有为它们进行负载平衡或代理。
无头服务允许客户端直接连接到它喜欢的任何Pod。无头服务不会使用配置路由和数据包转发虚拟IP地址和代理; 相反,无头服务报告通过内部DNS记录提供的各个吊舱的端点IP地址,通过集群的DNS服务.要定义无头服务,可以使用.规范.类型
设置为ClusterIP(这也是类型
),你还可以设置.spec.clusterIP规范
至无。
字符串值None是一种特殊情况,与保留.spec.clusterIP规范
字段未设置。
如何自动配置DNS取决于服务是否定义了选择器:
带选择器
对于定义选择器的无头服务,端点控制器创建在Kubernetes API中执行EndpointSlice,并修改DNS配置以返回直接指向支持服务的Pod的A或AAAA记录(IPv4或IPv6地址)。
没有选择器
对于不定义选择器的无头服务,控制平面会不创建EndpointSlice对象。但是,DNS系统查找并配置或者:
- 的DNS CNAME记录
类型:外部名称
服务。 - 服务就绪端点的所有IP地址的DNS A/AAAA记录,适用于除
外部名称
.- 对于IPv4端点,DNS系统创建A记录。
- 对于IPv6端点,DNS系统创建AAAA记录。
当定义没有选择器的无头服务时港口
必须匹配目标端口
.
发现服务
对于在集群内运行的客户机,Kubernetes支持以下两种主要模式查找服务:环境变量和DNS。
环境变量
当Pod在Node上运行时,kubelet会添加一组环境变量针对每个活动服务。它补充道{SVCNAME}_SERVICE_HOST(服务器名称)
和{SVCNAME}_服务器端口
变量,其中,服务名称为大写,破折号转换为下划线。
例如,服务再供体
它公开TCP端口6379分配的群集IP地址10.0.0.11,生成以下环境变量:
REDIS_PRIMARY_SERVICE_HOST公司=10.0.0.11REDIS_PRIMARY_SERVICE_PORT公司=6379
REDIS_PRIMARY_PORT(红色_原始_端口)=tcp://10.0.0.11:6379协议REDIS_PRIMARY_PORT_6379_TCP公司=tcp://10.0.0.11:6379协议REDIS_PRIMARY_PORT_6379_TCP_PROTO公司=tcp协议REDIS_PRIMARY_PORT_6379_TCP_PORT公司=6379
REDIS_PRIMARY_PORT_6379_TCP_ADDR公司=10.0.0.11
注:
当您有一个需要访问服务的Pod,并且您正在使用将端口和群集IP发布到客户端的环境变量方法播客,您必须创建服务之前客户端Pods出现。否则,这些客户端Pod将不会填充其环境变量。
如果您只使用DNS来发现服务的群集IP,则无需担心这个订购问题。
Kubernetes还支持并提供与Docker兼容的变量发动机”旧容器链接“功能。你可以阅读makeLink变量
看看这在Kubernetes中是如何实现的。
域名服务器
您可以(而且几乎总是应该)为Kubernetes设置DNS服务使用附加组件.
群集软件DNS服务器(如CoreDNS)监视Kubernetes API的新服务并为每个服务创建一组DNS记录。如果已启用DNS在整个集群中,所有Pod都应该能够自动解决服务的DNS名称。
例如,如果您有一个名为我的服务
在Kubernetes命名空间my-ns(我的编号)
、控制平面和DNS服务一起工作为创建DNS记录我的服务.my-ns
.中的吊舱my-ns(我的编号)
命名空间应该能够通过执行名称查找来找到服务我的服务
(我的服务.my-ns
也会起作用)。
其他命名空间中的Pod必须将名称限定为我的服务.my-ns
。这些名称将解析为为服务分配的群集IP。
Kubernetes还支持命名端口的DNS SRV(服务)记录。如果我的服务.my-ns
服务具有名为的端口http协议
协议设置为传输控制协议
,您可以对执行DNS SRV查询_网址:http_tcp.my-服务.my-ns
去发现的端口号http协议
以及IP地址。
Kubernetes DNS服务器是访问外部名称
服务。您可以找到有关外部名称
中的分辨率服务和播客的DNS.
虚拟IP寻址机制
阅读虚拟IP和服务代理解释Kubernetes提供的机制用于公开具有虚拟IP地址的服务。
交通政策
您可以设置.spec.internalTrafficPolicy(内部交通政策)
和规范.外部交通政策
字段控制Kubernetes如何将流量路由到健康(“就绪”)后端。
请参见交通政策了解更多详细信息。
交通分布
功能状态: Kubernetes v1.30〔阿尔法〕
这个规范.流量分配
场提供了另一种影响交通的方式Kubernetes服务中的路由。交通政策注重严格语义保证,流量分配允许您表达偏好(例如路由到拓扑上更接近的端点)。这有助于优化性能、成本或可靠性。如果您有启用了服务流量分配
特征大门为您的集群及其所有节点。在Kubernetes 1.30中支持以下字段值:
首选关闭
- 指示将流量路由到拓扑端点的首选项靠近客户。对“拓扑近似”的解释可能不同的实现会有所不同,并且可能包含相同的端点节点、机架、区域甚至区域。设置此值将提供实现允许进行不同的权衡,例如优化接近度荷载的均匀分布。如果是这样,用户不应设置此值权衡是不可接受的。
如果未设置该字段,则实现将应用其默认路由策略。
请参见交通分发对于更多详细信息
会话粘性
如果要确保将来自特定客户端的连接传递给每次使用相同的Pod,您可以根据客户端的IP地址。阅读会话关联了解更多信息。
外部IP
如果有外部IP路由到一个或多个群集节点,Kubernetes Services可以暴露在这些外部IP
。当网络流量到达群集时外部IP(作为目标IP)和与该服务、规则和路由匹配的端口Kubernetes配置的确保流量路由到其中一个端点用于该服务。
定义服务时,可以指定外部IP
对于任何服务类型.在下面的示例中,名为“我的服务”
客户端可以使用TCP访问,在"198.51.100.32:80"
(计算自.规范.外部IP[]
和.spec.ports[].port
).
api版本: 第1版
友善的: 服务
元数据:
名称: 我的服务
规范:
选择器:
app.kubernetes.io/name公司: 我的应用程序
端口:
-名称: http协议
协议: 传输控制协议
港口: 80
目标端口: 49152
外部IP:
-198.51.100.32
注:
Kubernetes不管理外部IP
; 这些是责任群集管理员的。API对象
服务是Kubernetes RESTAPI中的顶级资源。您可以找到更多详细信息关于服务API对象.
接下来是什么
了解更多有关服务及其如何融入Kubernetes的信息:
- 按照将应用程序与服务连接起来辅导的。
- 阅读进入,其中将来自集群外部的HTTP和HTTPS路由公开给内部的服务你的集群。
- 阅读网关,对的扩展Kubernetes提供了比Ingress更多的灵活性。
有关更多上下文,请阅读以下内容: