Service

Service 是软件服务的命名抽象(例如,mysql),由代理监听的本地端口(例如 3306)和决定哪些 Pod 响应通过代理发送的请求的选择器组成。

apiVersion: v1

import "k8s.io/api/core/v1"

Service

Service 是软件服务的命名抽象(例如,mysql),由代理监听的本地端口(例如 3306)和决定哪些 Pod 响应通过代理发送的请求的选择器组成。


ServiceSpec

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


  • selector (map[string]string)

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

  • ports ([]ServicePort)

    Patch 策略:按键 port 合并

    Map:合并时将保留键 port, protocol 上的唯一值

    此 Service 暴露的端口列表。更多信息:https://kubernetes.ac.cn/docs/concepts/services-networking/service/#virtual-ips-and-service-proxies

    ServicePort 包含 Service 端口的信息。

    • ports.port (int32),必需

      此 Service 将暴露的端口。

    • ports.targetPort (IntOrString)

      Service 所针对的 Pod 上要访问的端口号或名称。数字必须在 1 到 65535 范围内。名称必须是 IANA_SVC_NAME。如果这是字符串,它将在目标 Pod 的容器端口中作为命名端口查找。如果未指定,则使用 'port' 字段的值(身份映射)。对于 clusterIP=None 的 Service,此字段将被忽略,应省略或设置为与 'port' 字段相等。更多信息:https://kubernetes.ac.cn/docs/concepts/services-networking/service/#defining-a-service

      IntOrString 是一种可以保存 int32 或 string 的类型。在 JSON 或 YAML 编组和解组时,它生成或消耗内部类型。这允许你拥有一个 JSON 字段,例如可以接受名称或数字。

    • ports.protocol (string)

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

    • ports.name (string)

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

    • ports.nodePort (int32)

      当类型为 NodePort 或 LoadBalancer 时,此 Service 在每个节点上暴露的端口。通常由系统分配。如果指定了值,且在范围内并且未被使用,则将使用该值,否则操作将失败。如果未指定,则在 Service 需要时将分配一个端口。如果在创建不需要此字段的 Service 时指定了此字段,则创建将失败。当更新 Service 使其不再需要此字段时(例如,将类型从 NodePort 更改为 ClusterIP),此字段将被清除。更多信息:https://kubernetes.ac.cn/docs/concepts/services-networking/service/#type-nodeport

    • ports.appProtocol (string)

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

  • type (string)

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

  • ipFamilies ([]string)

    原子性:合并时将被替换

    IPFamilies 是为此 Service 分配的 IP 家族列表(例如 IPv4、IPv6)。此字段通常根据集群配置和 ipFamilyPolicy 字段自动分配。如果手动指定此字段,并且请求的家族在集群中可用且 ipFamilyPolicy 允许,则将使用该家族;否则 Service 创建将失败。此字段是条件可变的:它允许添加或移除辅助 IP 家族,但不允许更改 Service 的主要 IP 家族。有效值为 "IPv4" 和 "IPv6"。此字段仅适用于 ClusterIP、NodePort 和 LoadBalancer 类型的 Service,也适用于“无头” Service。当将 Service 更新为 ExternalName 类型时,此字段将被清除。

    此字段最多可以包含两个条目(双栈家族,顺序任意)。如果指定了 clusterIPs 字段,这些家族必须与 clusterIPs 字段的值对应。clusterIPs 和 ipFamilies 都受 ipFamilyPolicy 字段的控制。

  • ipFamilyPolicy (string)

    IPFamilyPolicy 表示此 Service 请求或需要的双栈属性。如果未提供值,则此字段将设置为 SingleStack。Service 可以是 "SingleStack"(单个 IP 家族)、"PreferDualStack"(在双栈配置的集群上使用两个 IP 家族,在单栈集群上使用单个 IP 家族)或 "RequireDualStack"(在双栈配置的集群上必需两个 IP 家族,否则失败)。ipFamilies 和 clusterIPs 字段取决于此字段的值。当将 Service 更新为 ExternalName 类型时,此字段将被清除。

  • clusterIP (string)

    clusterIP 是 Service 的 IP 地址,通常是随机分配的。如果手动指定了地址,且地址在范围内(根据系统配置)并且未被使用,则会分配给 Service;否则 Service 创建将失败。此字段不能通过更新更改,除非 type 字段也同时更改为 ExternalName(这要求此字段为空白)或 type 字段从 ExternalName 更改(在这种情况下,可以可选地指定此字段,如上所述)。有效值为 "None"、空字符串 ("") 或有效 IP 地址。将其设置为 "None" 会创建一个“无头 Service”(无虚拟 IP),当倾向于直接端点连接且不需要代理时很有用。仅适用于 ClusterIP、NodePort 和 LoadBalancer 类型。如果在创建 ExternalName 类型的 Service 时指定了此字段,创建将失败。当将 Service 更新为 ExternalName 类型时,此字段将被清除。更多信息:https://kubernetes.ac.cn/docs/concepts/services-networking/service/#virtual-ips-and-service-proxies

  • clusterIPs ([]string)

    原子性:合并时将被替换

    ClusterIPs 是为此 Service 分配的 IP 地址列表,通常是随机分配的。如果手动指定了地址,且地址在范围内(根据系统配置)并且未被使用,则会分配给 Service;否则 Service 创建将失败。此字段不能通过更新更改,除非 type 字段也同时更改为 ExternalName(这要求此字段为空)或 type 字段从 ExternalName 更改(在这种情况下,可以可选地指定此字段,如上所述)。有效值为 "None"、空字符串 ("") 或有效 IP 地址。将其设置为 "None" 会创建一个“无头 Service”(无虚拟 IP),当倾向于直接端点连接且不需要代理时很有用。仅适用于 ClusterIP、NodePort 和 LoadBalancer 类型。如果在创建 ExternalName 类型的 Service 时指定了此字段,创建将失败。当将 Service 更新为 ExternalName 类型时,此字段将被清除。如果未指定此字段,则将根据 clusterIP 字段进行初始化。如果指定了此字段,客户端必须确保 clusterIPs[0] 和 clusterIP 具有相同的值。

    此字段最多可以包含两个条目(双栈 IP,顺序任意)。这些 IP 必须与 ipFamilies 字段的值对应。clusterIPs 和 ipFamilies 都受 ipFamilyPolicy 字段的控制。更多信息:https://kubernetes.ac.cn/docs/concepts/services-networking/service/#virtual-ips-and-service-proxies

  • externalIPs ([]string)

    原子性:合并时将被替换

    externalIPs 是一个 IP 地址列表,集群中的节点也将接受发往此 Service 的流量。这些 IP 不由 Kubernetes 管理。用户负责确保流量能够到达带有此 IP 的节点。常见的例子是 不属于 Kubernetes 系统的外部负载均衡器。

  • sessionAffinity (string)

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

  • loadBalancerIP (string)

    仅适用于 Service 类型:LoadBalancer。此功能取决于底层云供应商是否支持在创建负载均衡器时指定 loadBalancerIP。如果云供应商不支持此功能,此字段将被忽略。已弃用:此字段定义不明确,其含义因实现而异。使用它缺乏可移植性,并且可能不支持双栈。建议用户在可用时使用特定于实现的注解。

  • loadBalancerSourceRanges ([]string)

    原子性:合并时将被替换

    如果指定并由平台支持,这将限制通过云供应商负载均衡器的流量到指定的客户端 IP。如果云供应商不支持此功能,此字段将被忽略。" 更多信息:https://kubernetes.ac.cn/docs/tasks/access-application-cluster/create-external-load-balancer/

  • loadBalancerClass (string)

    loadBalancerClass 是此 Service 所属的负载均衡器实现类。如果指定,此字段的值必须是一个标签风格的标识符,可以带有可选前缀,例如 "internal-vip" 或 "example.com/internal-vip"。未带前缀的名称保留给终端用户。此字段只能在 Service 类型为 'LoadBalancer' 时设置。如果未设置,则使用默认负载均衡器实现,目前这通常通过云供应商集成完成,但也适用于任何默认实现。如果设置了此字段,则假定存在一个负载均衡器实现正在监听具有匹配类别的 Service。任何默认负载均衡器实现(例如云供应商)应忽略设置了此字段的 Service。此字段只能在创建或将 Service 更新为 'LoadBalancer' 类型时设置。设置后不能更改。当 Service 更新为非 'LoadBalancer' 类型时,此字段将被清除。

  • externalName (string)

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

  • externalTrafficPolicy (string)

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

  • internalTrafficPolicy (string)

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

  • healthCheckNodePort (int32)

    healthCheckNodePort 指定 Service 的健康检查 nodePort。这仅在 type 设置为 LoadBalancer 且 externalTrafficPolicy 设置为 Local 时适用。如果指定了值,且在范围内并且未被使用,则将使用该值。如果未指定,将自动分配一个值。外部系统(例如负载均衡器)可以使用此端口来确定给定节点是否包含此 Service 的端点。如果在创建不需要此字段的 Service 时指定了此字段,创建将失败。当更新 Service 使其不再需要此字段时(例如,更改类型),此字段将被清除。设置后,此字段不能更新。

  • publishNotReadyAddresses (boolean)

    publishNotReadyAddresses 表示任何处理此 Service 端点的代理都应忽略任何就绪/未就绪指示。设置此字段的主要用例是 StatefulSet 的无头 Service 为了对等发现而传播其 Pod 的 SRV DNS 记录。为 Service 生成 Endpoints 和 EndpointSlice 资源的 Kubernetes 控制器将其解释为即使 Pod 本身未就绪,所有端点也被视为“就绪”。仅通过 Endpoints 或 EndpointSlice 资源消费 Kubernetes 生成的端点的代理可以安全地假定此行为。

  • sessionAffinityConfig (SessionAffinityConfig)

    sessionAffinityConfig 包含会话亲和性的配置。

    SessionAffinityConfig 表示会话亲和性的配置。

    • sessionAffinityConfig.clientIP (ClientIPConfig)

      clientIP 包含基于客户端 IP 的会话亲和性配置。

      ClientIPConfig 表示基于客户端 IP 的会话亲和性配置。

      • sessionAffinityConfig.clientIP.timeoutSeconds (int32)

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

  • allocateLoadBalancerNodePorts (boolean)

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

  • trafficDistribution (string)

    TrafficDistribution 提供了一种表达流量如何分发到 Service 端点的偏好的方式。实现可以使用此字段作为提示,但不强制严格遵守。如果未设置此字段,实现将应用其默认路由策略。如果设置为 "PreferClose",实现应优先考虑位于同一可用区中的端点。

ServiceStatus

ServiceStatus 表示 Service 的当前状态。


  • conditions ([]Condition)

    Patch 策略:按键 type 合并

    Map:合并时将保留键 type 上的唯一值

    Service 当前状态

    Condition 包含此 API 资源当前状态某一方面详细信息。

    • conditions.lastTransitionTime (Time),必需

      lastTransitionTime 是条件上次从一种状态转换到另一种状态的时间。这应该是底层条件发生变化的时间。如果未知,则使用 API 字段发生变化的时间也是可以接受的。

      Time 是 time.Time 的一个包装器,支持正确地编组为 YAML 和 JSON。提供了 time 包中许多工厂方法的包装器。

    • conditions.message (string),必需

      message 是一个人类可读的消息,指示转换的详细信息。这可能是一个空字符串。

    • conditions.reason (string),必需

      reason 包含一个程序化标识符,指示条件上次转换的原因。特定条件类型的生产者可以为该字段定义预期值和含义,以及这些值是否被视为有保证的 API。该值应为 CamelCase 字符串。此字段不能为空。

    • conditions.status (string),必需

      条件的状态,以下之一:True、False、Unknown。

    • conditions.type (string),必需

      条件类型,采用 CamelCase 格式或 foo.example.com/CamelCase 格式。

    • conditions.observedGeneration (int64)

      observedGeneration 表示条件基于其设置时的 .metadata.generation。例如,如果当前的 .metadata.generation 是 12,而 .status.conditions[x].observedGeneration 是 9,则该条件与实例的当前状态不符。

  • loadBalancer (LoadBalancerStatus)

    LoadBalancer 包含负载均衡器的当前状态(如果存在)。

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

    • loadBalancer.ingress ([]LoadBalancerIngress)

      原子性:合并时将被替换

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

      LoadBalancerIngress 表示负载均衡器入口点的状态:指向该服务的流量应发送到入口点。

      • loadBalancer.ingress.hostname (string)

        Hostname 用于基于 DNS 的负载均衡器入口点(通常是 AWS 负载均衡器)

      • loadBalancer.ingress.ip (string)

        IP 用于基于 IP 的负载均衡器入口点(通常是 GCE 或 OpenStack 负载均衡器)

      • loadBalancer.ingress.ipMode (string)

        IPMode 指定负载均衡器 IP 的行为方式,并且只有在指定了 ip 字段时才能指定。将其设置为 "VIP" 表示流量被传递到目标地址设为负载均衡器 IP 和端口的节点。将其设置为 "Proxy" 表示流量被传递到目标地址设为节点 IP 和节点端口或 Pod IP 和端口的节点或 Pod。服务实现可以使用此信息调整流量路由。

      • loadBalancer.ingress.ports ([]PortStatus)

        原子性:合并时将被替换

        Ports 是一个服务端口记录列表。如果使用,服务中定义的每个端口都应在此列表中有一个条目

        PortStatus 表示服务端口的错误状况

        • loadBalancer.ingress.ports.port (int32),必需

          Port 是此处记录状态的服务端口的端口号

        • loadBalancer.ingress.ports.protocol (string),必需

          Protocol 是此处记录状态的服务端口的协议。支持的值包括:"TCP"、"UDP"、"SCTP"

        • loadBalancer.ingress.ports.error (string)

          Error 用于记录服务端口的问题。错误格式应遵循以下规则:- 内置错误值应在此文件中指定,并使用 CamelCase 名称

          • 云提供商特定的错误值必须使用符合 foo.example.com/CamelCase 格式的名称。

ServiceList

ServiceList 包含服务列表。


操作


get 读取指定的 Service

HTTP 请求

GET /api/v1/namespaces/{namespace}/services/{name}

参数

  • name (在路径中): string,必需

    Service 的名称

  • namespace (在路径中): string,必需

    命名空间

  • pretty (在查询中): string

    pretty

响应

200 (Service): OK

401: 未授权

get 读取指定 Service 的状态

HTTP 请求

GET /api/v1/namespaces/{namespace}/services/{name}/status

参数

  • name (在路径中): string,必需

    Service 的名称

  • namespace (在路径中): string,必需

    命名空间

  • pretty (在查询中): string

    pretty

响应

200 (Service): OK

401: 未授权

list 列出或监听 Service 类型的对象

HTTP 请求

GET /api/v1/namespaces/{namespace}/services

参数

响应

200 (ServiceList): OK

401: 未授权

list 列出或监听 Service 类型的对象

HTTP 请求

GET /api/v1/services

参数

响应

200 (ServiceList): OK

401: 未授权

create 创建一个 Service

HTTP 请求

POST /api/v1/namespaces/{namespace}/services

参数

响应

200 (Service): OK

201 (Service): 已创建

202 (Service): 已接受

401: 未授权

update 替换指定的 Service

HTTP 请求

PUT /api/v1/namespaces/{namespace}/services/{name}

参数

  • name (在路径中): string,必需

    Service 的名称

  • namespace (在路径中): string,必需

    命名空间

  • body: Service,必需

  • dryRun (在查询中): string

    dryRun

  • fieldManager (在查询中): string

    fieldManager

  • fieldValidation (在查询中): string

    fieldValidation

  • pretty (在查询中): string

    pretty

响应

200 (Service): OK

201 (Service): 已创建

401: 未授权

update 替换指定 Service 的状态

HTTP 请求

PUT /api/v1/namespaces/{namespace}/services/{name}/status

参数

  • name (在路径中): string,必需

    Service 的名称

  • namespace (在路径中): string,必需

    命名空间

  • body: Service,必需

  • dryRun (在查询中): string

    dryRun

  • fieldManager (在查询中): string

    fieldManager

  • fieldValidation (在查询中): string

    fieldValidation

  • pretty (在查询中): string

    pretty

响应

200 (Service): OK

201 (Service): 已创建

401: 未授权

patch 部分更新指定的 Service

HTTP 请求

PATCH /api/v1/namespaces/{namespace}/services/{name}

参数

  • name (在路径中): string,必需

    Service 的名称

  • namespace (在路径中): string,必需

    命名空间

  • body: Patch,必需

  • dryRun (在查询中): string

    dryRun

  • fieldManager (在查询中): string

    fieldManager

  • fieldValidation (在查询中): string

    fieldValidation

  • force (在查询中): boolean

    force

  • pretty (在查询中): string

    pretty

响应

200 (Service): OK

201 (Service): 已创建

401: 未授权

patch 部分更新指定 Service 的状态

HTTP 请求

PATCH /api/v1/namespaces/{namespace}/services/{name}/status

参数

  • name (在路径中): string,必需

    Service 的名称

  • namespace (在路径中): string,必需

    命名空间

  • body: Patch,必需

  • dryRun (在查询中): string

    dryRun

  • fieldManager (在查询中): string

    fieldManager

  • fieldValidation (在查询中): string

    fieldValidation

  • force (在查询中): boolean

    force

  • pretty (在查询中): string

    pretty

响应

200 (Service): OK

201 (Service): 已创建

401: 未授权

delete 删除一个 Service

HTTP 请求

DELETE /api/v1/namespaces/{namespace}/services/{name}

参数

响应

200 (Service): OK

202 (Service): 已接受

401: 未授权

deletecollection 删除 Service 集合

HTTP 请求

DELETE /api/v1/namespaces/{namespace}/services

参数

响应

200 (Status): OK

401: 未授权

此页面是自动生成的。

如果您打算报告此页面的问题,请在问题描述中提及此页面是自动生成的。修复可能需要在 Kubernetes 项目的其他地方进行。

上次修改时间 2025 年 4 月 24 日 9:14 AM PST: v1.33 的 Markdown API 参考 (b84ec30bbb)