第 22 章 Service [v1]


描述
服务是一个由代理侦听的本地端口(如 mysql)组成的、指定软件服务的抽象概念,以及决定哪些 Pod 将通过代理发送的请求的选择器。
类型
对象

22.1. 规格

属性类型描述

apiVersion

string

APIVersion 定义对象的这个表示法的版本化的 schema。服务器应该将识别的模式转换为最新的内部值,并可拒绝未识别的值。更多信息: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources

kind

string

kind 是一个字符串值,代表此对象所代表的 REST 资源。服务器可以从客户端向其提交请求的端点推断。无法更新。采用驼峰拼写法 (CamelCase)。更多信息: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds

metadata

ObjectMeta

标准对象元数据。更多信息: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata

spec

object

ServiceSpec 描述了用户在服务上创建的属性。

status

object

ServiceStatus 代表服务的当前状态。

22.1.1. .spec

描述
ServiceSpec 描述了用户在服务上创建的属性。
类型
object
属性类型描述

allocateLoadBalancerNodePorts

布尔值

allocateLoadBalancerNodePorts 定义是否为类型为 LoadBalancer 的服务自动分配 NodePort。默认值为 "true"。如果集群负载均衡器不依赖于 NodePort,则可能会将其设置为 "false"。如果调用者请求特定的 NodePort (通过指定值),无论此字段如何,将遵守这些请求。此字段只能为类型为 LoadBalancer 的服务设置,并在类型改为任何其他类型时清除。

clusterIP

string

ClusterIP 是服务的 IP 地址,通常随机分配。如果手动指定地址,处于范围形式(如每个系统配置一样),但没有使用,则会将其分配给该服务;否则创建服务将失败。此字段不能通过更新来更改,除非类型字段也更改为 ExternalName (要求此字段为空白),或者 type 字段从 ExternalName 更改(在这种情况下,可以选择性地指定此字段,如上述描述)。有效值为 "None", 空字符串("")或一个有效的 IP 地址。把它设置为 "None" make a "headless service" (没有虚拟 IP),当不需要直接端点连接且不需要代理时,这很有用。仅适用于类型 ClusterIP、NodePort 和 LoadBalancer。如果在创建类型为 ExternalName 的 Service 时指定了此字段,则创建将失败。当将 Service 更新为类型为 ExternalName 时,此字段将擦除。更多信息: https://kubernetes.io/docs/concepts/services-networking/service/#virtual-ips-and-service-proxies

clusterIPs

数组(字符串)

clusterIPs 是分配给此服务的 IP 地址列表,通常是随机分配的。如果手动指定地址,处于范围形式(如每个系统配置一样),但没有使用,则会将其分配给该服务;否则创建服务将失败。此字段不能通过更新来更改,除非类型字段也更改为 ExternalName (要求此字段为空),或者 type 字段从 ExternalName 更改(在这种情况下,可以选择性地指定此字段,如上述描述)。有效值为 "None", 空字符串("")或一个有效的 IP 地址。把它设置为 "None" make a "headless service" (没有虚拟 IP),当不需要直接端点连接且不需要代理时,这很有用。仅适用于类型 ClusterIP、NodePort 和 LoadBalancer。如果在创建类型为 ExternalName 的 Service 时指定了此字段,则创建将失败。当将 Service 更新为类型为 ExternalName 时,此字段将擦除。如果没有指定此字段,它将从 clusterIP 字段初始化。如果指定了此字段,客户端必须确保 clusterIPs[0] 和 clusterIP 的值相同。

此字段最多可保留两个条目(双堆栈 IP,以任一顺序)。这些 IP 必须与 ipFamilies 字段的值对应。clusterIPs 和 ipFamilies 都由 ipFamilyPolicy 字段管理。更多信息: https://kubernetes.io/docs/concepts/services-networking/service/#virtual-ips-and-service-proxies

externalIPs

数组(字符串)

externalIPs 是集群中节点也接受此服务的流量的 IP 地址列表。这些 IP 不由 Kubernetes 管理。用户负责确保流量到达具有此 IP 的节点。一个常见的例子是不是 Kubernetes 系统一部分的外部负载均衡器。

externalName

string

ExternalName 是外部引用,发现机制将返回为该服务的别名(例如,DNS CNAME 记录)。不涉及代理。必须是小写 RFC-1123 主机名(https://tools.ietf.org/html/rfc1123),且需要 类型为 "ExternalName"。

externalTrafficPolicy

string

ExternalTrafficPolicy 描述了节点如何在其中一个服务"面向服务的"外部"地址(NodePort、ExternalIP 和 LoadBalancer IP)上接收服务流量。如果设置为"本地",代理将以一种方式配置服务,假设外部负载均衡器负责在节点间平衡服务流量,因此每个节点只会向服务的本地端点发送流量,而不伪装客户端源 IP。(流量错误地发送到没有端点的节点。)默认值 "Cluster" 使用了平均路由到所有端点的标准行为(可能是根据拓扑和其他功能修改)。请注意,从集群内部发送到外部 IP 或 LoadBalancer IP 的流量将始终获得"集群"语义,但从集群中发送到 NodePort 的客户端可能需要在选择节点时考虑流量策略。

可能枚举值: - "Cluster" 将流量路由到所有端点。- "Local" 通过仅路由到与接收流量相同的节点上的端点(如果没有本地端点,则保留流量)。

healthCheckNodePort

整数

HealthCheckNodePort 为服务指定健康检查 nodePort。这仅在将 type 设置为 LoadBalancer 并且 externalTrafficPolicy 设置为 Local 时才适用。如果指定了值,为 in-range,但没有在使用中,它将被使用。如果没有指定,则会自动分配值。外部系统(如负载均衡器)可以使用此端口来确定给定节点是否包含此服务的端点。如果在创建不需要的 Service 时指定了此字段,则创建将失败。当更新 Service 时,将擦除此字段,使其不再需要(例如更改类型)。设置后,不能更新此字段。

internalTrafficPolicy

string

internalTrafficPolicy 描述了节点如何分发它们在 ClusterIP 上接收的服务流量。如果设置为 "Local",代理将假定 pod 只想与与 pod 相同的节点上与服务端点通信,如果没有本地端点,则丢弃流量。默认值 "Cluster" 使用了平均路由到所有端点的标准行为(可能是根据拓扑和其他功能修改)。

可能枚举值: - "Cluster" 将流量路由到所有端点。- "Local" 将流量路由到与客户端 pod 相同的节点上的端点(如果没有本地端点,则丢弃流量)。

ipFamilies

数组(字符串)

ipFamilies 是分配给此服务的 IP 系列(如 IPv4、IPv6)的列表。通常会根据集群配置和 ipFamilyPolicy 字段自动分配此字段。如果手动指定此字段,则集群中提供了请求的系列,并且 ipFamilyPolicy 允许它,否则创建服务将失败。此字段有条件性 :它允许添加或删除二级 IP 系列,但它不允许更改服务的主 IP 系列。有效值为 "IPv4" 和 "IPv6"。此字段只适用于 ClusterIP、NodePort 和 LoadBalancer 类型的服务,并适用于 "headless" 服务。当将 Service 更新为类型为 ExternalName 时,此字段将擦除。

此字段最多可保留两个条目(以任一顺序排列的双栈系列)。如果指定,这些系列必须与 clusterIPs 字段的值对应。clusterIPs 和 ipFamilies 都由 ipFamilyPolicy 字段管理。

ipFamilyPolicy

string

ipFamilyPolicy 代表此 Service 请求或所需的双栈。如果没有提供值,则此字段将设置为 SingleStack。服务可以是"SingleStack" (单一 IP 系列)、"PreferDualStack" (在双栈配置的集群或单堆栈群集上的单个 IP 系列)或"RequireDualStack" (双堆栈配置群集的两个 IP 系列),否则失败。ipFamilies 和 clusterIPs 字段取决于此字段的值。当将服务更新为类型为 ExternalName 时,将擦除此字段。

可能枚举值:- "PreferDualStack" 表示在为双栈配置集群时,该服务首选双栈。如果没有为双栈配置集群,则会为服务分配单个 IPFamily。如果没有在 service.spec.ipFamilies 中设置 IPFamily,则会为该服务分配集群中配置的默认 IPFamily - "RequireDualStack" 表示该服务需要 dual-stack。在单一堆栈集群中使用 IPFamilyPolicyRequireDualStack 将导致验证错误。分配给该服务的 IPFamilies (及其顺序)基于 service.spec.ipFamilies。如果没有提供 service.spec.ipFamilies,则会根据它们在集群中配置的方式进行分配。如果 service.spec.ipFamilies 只有一个条目,则 apiserver - "SingleStack" 将添加备用 IPFamily 表示该服务需要有一个 IPFamily。分配的 IPFamily 基于集群使用的默认 IPFamily,或者由 service.spec.ipFamilies 字段标识

loadBalancerClass

string

loadBalancerClass 是此服务所属的负载均衡器实现的类。如果指定,此字段的值必须是标签式标识符,带有可选前缀,如 "internal-vip" 或 "example.com/internal-vip"。Unprefixed name 为最终用户保留。只有在 Service type 为 'LoadBalancer' 时,才能设置此字段。如果没有设置,则使用默认负载均衡器实施,现在这通常通过云供应商集成来实现,但应该适用于任何默认的实施。如果设置,则会假定负载均衡器实现正在监视具有匹配类的服务。任何默认的负载均衡器实现(如云供应商)都应忽略设置此字段的服务。此字段只能在创建或更新 Service 以键入"LoadBalancer"时设置。设置后,无法更改它。当服务更新为非"LoadBalancer"类型时,将擦除此字段。

loadBalancerIP

string

只适用于 Service Type: LoadBalancer。此功能取决于创建负载均衡器时是否支持指定 loadBalancerIP 底层的 cloud-provider。如果 cloud-provider 不支持该功能,则此字段将被忽略。弃用:此字段是指定的,其含义因实现而异。使用它不可移植,可能不支持双栈。我们鼓励用户在可用时使用特定于实施的注解。

loadBalancerSourceRanges

数组(字符串)

如果平台指定和支持,这将限制通过 cloud-provider 负载平衡器的流量将限制为指定的客户端 IP。如果 cloud-provider 不支持该功能,则此字段将被忽略。更多信息: https://kubernetes.io/docs/tasks/access-application-cluster/create-external-load-balancer/

ports

array

此服务公开的端口列表。更多信息: https://kubernetes.io/docs/concepts/services-networking/service/#virtual-ips-and-service-proxies

ports[]

object

servicePort 包含服务端口的信息。

publishNotReadyAddresses

布尔值

publishNotReadyAddresses 表示处理此服务端点的任何代理,应忽略任何就绪/未就绪的指示。设置此字段的主要用例是 StatefulSet 的无标头服务,用于其 Pod 的 SRV DNS 记录,用于对等发现。为服务生成 Endpoints 和 EndpointSlice 资源的 Kubernetes 控制器会解释它,这意味着即使 Pod 本身没有,所有端点都被视为"就绪"。只有通过 Endpoints 或 EndpointSlice 资源消耗 Kubernetes 生成的端点的代理可以安全地假设此行为。

selector

对象(字符串)

使用与此选择器匹配的标签键和值将服务流量路由到 pod。如果为空或不存在,则假定服务具有管理其端点的外部进程,Kubernetes 将不会被修改。仅适用于类型 ClusterIP、NodePort 和 LoadBalancer。如果 type 是 ExternalName,则忽略。更多信息: https://kubernetes.io/docs/concepts/services-networking/service/

sessionAffinity

string

支持"ClientIP"和"None"。用于维护会话关联。启用基于客户端 IP 的会话关联性。必须是 ClientIP 或 None。默认值为 None。更多信息: https://kubernetes.io/docs/concepts/services-networking/service/#virtual-ips-and-service-proxies

可能枚举值: - "ClientIP" 是基于客户端 IP。- "None" - no session affinity.

sessionAffinityConfig

object

sessionAffinityConfig 代表会话关联性的配置。

trafficDistribution

string

TrafficDistribution 提供了一种方式,用于表达流量如何分发到服务端点的首选项。实现可以使用此字段作为提示,但不一定要保证严格遵循。如果没有设置字段,实施将应用其默认路由策略。如果设置为 "PreferClose",则实现应优先排序地关闭端点(例如,同一区域)。这是一个 alpha 字段,需要启用 ServiceTrafficDistribution 功能。

type

string

Type 决定 Service 的公开方式。默认为 ClusterIP。有效选项包括 ExternalName、ClusterIP、NodePort 和 LoadBalancer。"ClusterIP"分配集群内部 IP 地址,以负载平衡到端点。端点由选择器决定,或者未指定,或者通过手动构建 Endpoints 对象或 EndpointSlice 对象来决定。如果 clusterIP 是"None",则不会分配虚拟 IP,端点作为一组端点发布,而不是虚拟 IP。"NodePort"基于 ClusterIP 构建,并在每个节点上分配一个端口,它们路由到与 clusterIP 相同的端点。"LoadBalancer"在 NodePort 上构建,并创建一个外部负载均衡器(如果当前云支持),它将路由到与 clusterIP 相同的端点。"ExternalName"将该服务别名到指定的 externalName 中。几个其他字段不适用于 ExternalName 服务。更多信息: https://kubernetes.io/docs/concepts/services-networking/service/#publishing-services-service-types

可能枚举值: - "ClusterIP" 表示只能通过集群 IP 在集群中访问服务。- "ExternalName" 表示服务仅由 kubedns 或等外部名称组成,它没有公开或代理涉及的任何 pod。- "LoadBalancer" 表示服务仅通过外部负载均衡器(如果云供应商支持)公开或代理。除了 'NodePort' 类型外,- "NodePort " 意味着除 'ClusterIP' 类型外,服务还会在每个节点的一个端口上公开。

22.1.2. .spec.ports

描述
此服务公开的端口列表。更多信息: https://kubernetes.io/docs/concepts/services-networking/service/#virtual-ips-and-service-proxies
类型
array

22.1.3. .spec.ports[]

描述
servicePort 包含服务端口的信息。
类型
object
必填
  • port
属性类型描述

appProtocol

string

此端口的应用程序协议。这用作实现的提示,以便为它们理解的协议提供更丰富的行为。此字段遵循标准 Kubernetes 标签语法。有效值为:

* 未前缀的协议名称 - 为 IANA 标准服务名称保留(如 RFC-6335 和 https://www.iana.org/assignments/service-names)。

* Kubernetes-defined prefixed name: * 'kubernetes.io/h2c' - HTTP/2 before knowledge overtext as https://www.rfc-editor.org/rfc/rfc9113.html#name-starting-http-2-with-prior- * 'kubernetes.io/ws' - WebSocket over cleartext,如 https://www.rfc-editor.org/rfc/rfc6455 * 'kubernetes.io/wss' - WebSocket over TLS 所述

* 其他协议应使用定义实施的前缀名称,如 mycompany.com/my-custom-protocol。

name

string

此端口在服务内的名称。这必须是 DNS_LABEL。ServiceSpec 中的所有端口都必须具有唯一的名称。在考虑服务的端点时,这必须与 EndpointPort 中的 'name' 字段匹配。如果在这个服务中只定义了一个 ServicePort。

nodePort

整数

当类型为 NodePort 或 LoadBalancer 时,此服务在其上公开的每个节点上的端口。通常由系统分配。如果指定了值( in-range),并且不使用它,则会使用它,否则操作将失败。如果没有指定,如果此服务需要端口,则会分配端口。如果在创建不需要的 Service 时指定了此字段,则创建将失败。当将 Service 更新为不再需要时(例如,将类型从 NodePort 更改为 ClusterIP),将擦除此字段。更多信息: https://kubernetes.io/docs/concepts/services-networking/service/#type-nodeport

port

整数

此服务将由此服务公开的端口。

protocol

string

此端口的 IP 协议。支持"TCP"、"UDP"和"SCTP"。默认为 TCP。

可能枚举值: - "SCTP" 是 SCTP 协议。- "TCP" 是 TCP 协议。- "UDP" 是 UDP 协议。

targetPort

IntOrString

在服务目标的 pod 上访问的端口数量或名称。number 必须在 1 到 65535 之间。名称必须是 IANA_SVC_NAME。如果这是字符串,它将在目标 Pod 的容器端口中查找为命名的端口。如果没有指定,则使用 'port' 字段的值(身份映射)。对于带有 clusterIP=None 的服务,会忽略此字段,并应省略或设置为 'port' 字段。更多信息: https://kubernetes.io/docs/concepts/services-networking/service/#defining-a-service

22.1.4. .spec.sessionAffinityConfig

描述
sessionAffinityConfig 代表会话关联性的配置。
类型
object
属性类型描述

clientIP

object

ClientIPConfig 代表基于客户端 IP 的会话关联性的配置。

22.1.5. .spec.sessionAffinityConfig.clientIP

描述
ClientIPConfig 代表基于客户端 IP 的会话关联性的配置。
类型
object
属性类型描述

timeoutSeconds

整数

timeoutSeconds 指定 ClientIP 类型粘性时间的秒数。如果 ServiceAffinity == "ClientIP",则该值必须是 >0 && wagon86400 (1 天)。默认值为 10800 (3 小时)。

22.1.6. .status

描述
ServiceStatus 代表服务的当前状态。
类型
object
属性类型描述

conditions

数组(条件)

当前服务状态

loadBalancer

object

LoadBalancerStatus 代表负载均衡器的状态。

22.1.7. .status.loadBalancer

描述
LoadBalancerStatus 代表负载均衡器的状态。
类型
object
属性类型描述

ingress

array

Ingress 是一个包含负载均衡器的入口点的列表。为服务预期的流量应发送到这些入口点。

ingress[]

object

LoadBalancerIngress 代表负载均衡器入口点的状态:服务预期的流量应发送到入口点。

22.1.8. .status.loadBalancer.ingress

描述
Ingress 是一个包含负载均衡器的入口点的列表。为服务预期的流量应发送到这些入口点。
类型
array

22.1.9. .status.loadBalancer.ingress[]

描述
LoadBalancerIngress 代表负载均衡器入口点的状态:服务预期的流量应发送到入口点。
类型
object
属性类型描述

hostname

string

为基于 DNS 的负载均衡器入口点设置 hostname (通常是 AWS 负载均衡器)

ip

string

为基于 IP (通常是 GCE 或 OpenStack 负载平衡器)的负载均衡器入站点设置 IP

ipMode

string

ipMode 指定负载均衡器 IP 的行为方式,只能在指定 ip 字段时指定。把它设置为 "VIP" 表示将目的地设置为负载均衡器的 IP 和端口到节点的流量。把它设置为 "Proxy" 表示流量传送到节点或 pod,目的地设置为节点的 IP 和节点端口或 pod 的 IP 和端口。服务实施可能会使用此信息来调整流量路由。

ports

array

ports 是服务端口的记录列表(如果使用),服务中定义的每个端口都应该在其中有一个条目

ports[]

object

 

22.1.10. .status.loadBalancer.ingress[].ports

描述
ports 是服务端口的记录列表(如果使用),服务中定义的每个端口都应该在其中有一个条目
类型
array

22.1.11. .status.loadBalancer.ingress[].ports[]

描述
类型
object
必填
  • port
  • protocol
属性类型描述

错误

string

错误是记录服务端口的问题。错误的格式应遵循以下规则: - 内置错误值应该在此文件中指定,而那些应该使用 CamelCase 名称 - 云供应商特定错误值必须具有符合 foo.example.com/CamelCase 格式的名称。

port

整数

port 是记录状态的服务端口的端口号

protocol

string

protocol 是服务端口的协议,此处记录状态,支持的值有: "TCP", "UDP", "SCTP"

可能枚举值: - "SCTP" 是 SCTP 协议。- "TCP" 是 TCP 协议。- "UDP" 是 UDP 协议。

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.