Service

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

apiVersion: v1

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

Service

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


ServiceSpec

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


  • selector (map[string]string)

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

  • ports ([]ServicePort)

    补丁策略:在键 port 上合并

    映射:在合并期间,键 port, protocol 的唯一值将被保留

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

    ServicePort 包含关于服务端口的信息。

    • ports.port (int32),必需

      此服务将要暴露的端口。

    • ports.targetPort (IntOrString)

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

      IntOrString 是一种可以容纳 int32 或字符串的类型。在 JSON 或 YAML 编组和解组时,它会生成或使用内部类型。这允许你拥有一个既可以接受名称也可以接受数字的 JSON 字段。

    • ports.protocol (string)

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

      可能的枚举值

      • "SCTP" 是 SCTP 协议。
      • "TCP" 是 TCP 协议。
      • "UDP" 是 UDP 协议。
    • ports.name (string)

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

    • ports.nodePort (int32)

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

    • ports.appProtocol (string)

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

  • type (string)

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

    可能的枚举值

    • "ClusterIP" 意味着服务只能通过集群 IP 在集群内部访问。
    • "ExternalName" 意味着服务仅包含对外部名称的引用,kubedns 或等效程序将返回该引用作为 CNAME 记录,不涉及任何 Pod 的暴露或代理。
    • "LoadBalancer" 意味着服务将通过外部负载均衡器(如果云提供商支持)暴露,除了 'NodePort' 类型外。
    • "NodePort" 意味着服务将在每个节点的一个端口上暴露,除了 'ClusterIP' 类型外。
  • ipFamilies ([]string)

    原子:将在合并期间被替换

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

    此字段最多可包含两个条目(双栈系列,顺序不限)。如果指定了这些条目,它们必须对应于 clusterIPs 字段的值。clusterIPs 和 ipFamilies 均受 ipFamilyPolicy 字段约束。

  • ipFamilyPolicy (string)

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

    可能的枚举值

    • "PreferDualStack" 表示当集群配置为双栈时,此服务更倾向于双栈。如果集群未配置为双栈,则服务将被分配一个单一的 IPFamily。如果 service.spec.ipFamilies 中未设置 IPFamily,则服务将被分配集群上配置的默认 IPFamily。
    • "RequireDualStack" 表示此服务需要双栈。在单栈集群上使用 IPFamilyPolicyRequireDualStack 将导致验证错误。分配给此服务的 IPFamilies(及其顺序)基于 service.spec.ipFamilies。如果未提供 service.spec.ipFamilies,则将根据它们在集群上的配置方式进行分配。如果 service.spec.ipFamilies 只有一个条目,则 apiserver 将添加另一个 IPFamily。
    • "SingleStack" 表示此服务必须具有单一 IPFamily。分配的 IPFamily 基于集群使用的默认 IPFamily 或 service.spec.ipFamilies 字段所标识的 IPFamily。
  • clusterIP (string)

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

  • clusterIPs ([]string)

    原子:将在合并期间被替换

    ClusterIPs 是分配给此服务的 IP 地址列表,通常是随机分配的。如果手动指定了一个地址,且该地址在范围内(根据系统配置)且未被使用,它将被分配给服务;否则服务创建将失败。除非同时将类型字段更改为 ExternalName(这要求此字段为空)或将类型字段从 ExternalName 更改为其他(在这种情况下,可以选择性地指定此字段,如上所述),否则无法通过更新更改此字段。有效值为 "None"、空字符串 ("") 或有效的 IP 地址。将其设置为 "None" 可创建“无头服务 (headless service)”(无虚拟 IP),当首选直接端点连接且不需要代理时,这很有用。仅适用于 ClusterIP、NodePort 和 LoadBalancer 类型。如果在创建 ExternalName 类型的服务时指定了此字段,则创建将失败。当将服务更新为 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 地址列表,集群中的节点也将接受发往这些 IP 的流量。这些 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

    可能的枚举值

    • "ClientIP" 是基于客户端 IP 的。
    • "None" - 无会话亲和性。
  • loadBalancerIP (string)

    仅适用于服务类型:LoadBalancer。此功能取决于底层云提供商是否支持在创建负载均衡器时指定 loadBalancerIP。如果云提供商不支持此功能,此字段将被忽略。弃用:此字段未充分定义,其含义在不同实现之间有所不同。使用它是不可移植的,并且可能不支持双栈。鼓励用户在可用时使用特定于实现的注解。

  • loadBalancerSourceRanges ([]string)

    原子:将在合并期间被替换

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

  • loadBalancerClass (string)

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

  • externalName (string)

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

  • externalTrafficPolicy (string)

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

    可能的枚举值

    • "Cluster" 将流量路由到所有端点。
    • "Local" 通过仅路由到与接收流量的节点相同的节点上的端点来保留流量的源 IP(如果没有本地端点,则丢弃流量)。
  • internalTrafficPolicy (string)

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

    可能的枚举值

    • "Cluster" 将流量路由到所有端点。
    • "Local" 仅将流量路由到与客户端 Pod 在同一节点上的端点(如果没有本地端点,则丢弃流量)。
  • healthCheckNodePort (int32)

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

  • publishNotReadyAddresses (boolean)

    publishNotReadyAddresses 指示处理此服务端点的任何代理都应忽略任何就绪/未就绪的指示。设置此字段的主要用例是 StatefulSet 的无头服务,为了对等发现目的,将其 Pod 的 SRV DNS 记录传播出去。为服务生成 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 类型的服务自动分配 NodePorts。默认值为 "true"。如果集群负载均衡器不依赖 NodePorts,则可以将其设置为 "false"。如果调用者请求特定的 NodePorts(通过指定值),无论此字段如何,这些请求都将得到尊重。此字段仅可为 LoadBalancer 类型的服务设置,如果类型更改为任何其他类型,它将被清除。

  • trafficDistribution (string)

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

ServiceStatus

ServiceStatus 表示服务的当前状态。


  • conditions ([]Condition)

    Patch 策略:在键 type 上合并

    映射:在合并期间将保留键类型上的唯一值

    当前服务状态

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

    • conditions.lastTransitionTime (Time), required

      lastTransitionTime 是条件从一个状态过渡到另一个状态的最后时间。这应该是在底层条件发生变化时的时间。如果不知道,则使用 API 字段发生变化的时间是可以接受的。

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

    • conditions.message (string), required

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

    • conditions.reason (string), required

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

    • conditions.status (string), required

      条件的 status,可以是 True、False 或 Unknown。

    • conditions.type (string), required

      条件的类型,采用 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" 表示流量被传递到节点或 Pod,目标设置为节点的 IP 和节点端口,或 Pod 的 IP 和端口。服务实现可以使用此信息来调整流量路由。

      • loadBalancer.ingress.ports ([]PortStatus)

        原子:将在合并期间被替换

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

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

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

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

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

          protocol 是在此记录其状态的服务端口的协议。支持的值为:"TCP", "UDP", "SCTP"

          可能的枚举值

          • "SCTP" 是 SCTP 协议。
          • "TCP" 是 TCP 协议。
          • "UDP" 是 UDP 协议。
        • loadBalancer.ingress.ports.error (string)

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

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

ServiceList

ServiceList 持有一个服务列表。


操作


get 读取指定的 Service

HTTP 请求

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

Parameters

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

    Service 的名称

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

    命名空间

  • pretty (在查询中): string

    pretty

响应

200 (Service): OK

401: 未授权

get 读取指定 Service 的状态

HTTP 请求

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

Parameters

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

    Service 的名称

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

    命名空间

  • pretty (在查询中): string

    pretty

响应

200 (Service): OK

401: 未授权

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

HTTP 请求

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

Parameters

响应

200 (ServiceList): OK

401: 未授权

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

HTTP 请求

GET /api/v1/services

Parameters

响应

200 (ServiceList): OK

401: 未授权

create 创建一个 Service

HTTP 请求

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

Parameters

响应

200 (Service): OK

201 (Service): Created

202 (Service): Accepted

401: 未授权

update 替换指定的 Service

HTTP 请求

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

Parameters

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

    Service 的名称

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

    命名空间

  • body: Service,必需

  • dryRun (在查询中): string

    dryRun

  • fieldManager (在查询中): string

    fieldManager

  • fieldValidation (在查询中): string

    fieldValidation

  • pretty (在查询中): string

    pretty

响应

200 (Service): OK

201 (Service): Created

401: 未授权

update 替换指定 Service 的状态

HTTP 请求

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

Parameters

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

    Service 的名称

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

    命名空间

  • body: Service,必需

  • dryRun (在查询中): string

    dryRun

  • fieldManager (在查询中): string

    fieldManager

  • fieldValidation (在查询中): string

    fieldValidation

  • pretty (在查询中): string

    pretty

响应

200 (Service): OK

201 (Service): Created

401: 未授权

patch 对指定的 Service 进行部分更新

HTTP 请求

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

Parameters

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

    Service 的名称

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

    命名空间

  • body: Patch, 必需

  • dryRun (在查询中): string

    dryRun

  • fieldManager (在查询中): string

    fieldManager

  • fieldValidation (在查询中): string

    fieldValidation

  • force (in query): boolean

    force

  • pretty (在查询中): string

    pretty

响应

200 (Service): OK

201 (Service): Created

401: 未授权

patch 对指定 Service 的状态进行部分更新

HTTP 请求

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

Parameters

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

    Service 的名称

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

    命名空间

  • body: Patch, 必需

  • dryRun (在查询中): string

    dryRun

  • fieldManager (在查询中): string

    fieldManager

  • fieldValidation (在查询中): string

    fieldValidation

  • force (in query): boolean

    force

  • pretty (在查询中): string

    pretty

响应

200 (Service): OK

201 (Service): Created

401: 未授权

delete 删除一个 Service

HTTP 请求

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

Parameters

响应

200 (Service): OK

202 (Service): Accepted

401: 未授权

deletecollection 删除 Service 集合

HTTP 请求

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

Parameters

响应

200 (Status): 确定

401: 未授权


最后修改时间 2025 年 10 月 3 日下午 8:48 PST: 更新资源 API 1.34 并包含枚举值 (24e17cbfa6)

本页面是自动生成的。

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