Service
apiVersion: v1
import "k8s.io/api/core/v1"
Service
Service 是软件服务的命名抽象(例如,mysql),由代理监听的本地端口(例如 3306)和决定哪些 Pod 响应通过代理发送的请求的选择器组成。
apiVersion: v1
kind: Service
metadata (ObjectMeta)
标准对象的元数据。更多信息:https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata
spec (ServiceSpec)
Spec 定义了 Service 的行为。更多信息:https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status
status (ServiceStatus)
最近观察到的 Service 状态。由系统填充。只读。更多信息:https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status
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
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 标签语法。有效值可以是:
未带前缀的协议名称 - 保留用于 IANA 标准服务名称(根据 RFC-6335 和 https://www.iana.org/assignments/service-names)。
Kubernetes 定义的带前缀的名称
- 'kubernetes.io/h2c' - 如 https://www.rfc-editor.org/rfc/rfc9113.html#name-starting-http-2-with-prior- 中所述,基于明文的 HTTP/2 预知
- 'kubernetes.io/ws' - 如 https://www.rfc-editor.org/rfc/rfc6455 中所述,基于明文的 WebSocket
- 'kubernetes.io/wss' - 如 https://www.rfc-editor.org/rfc/rfc6455 中所述,基于 TLS 的 WebSocket
其他协议应使用实现定义的带前缀的名称,例如 mycompany.com/my-custom-protocol。
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 包含会话亲和性的配置。
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 是一个服务端口记录列表。如果使用,服务中定义的每个端口都应在此列表中有一个条目
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 包含服务列表。
apiVersion: v1
kind: ServiceList
metadata (ListMeta)
标准列表元数据。更多信息:https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds
items ([]Service),必需
服务列表
操作
get
读取指定的 Service
HTTP 请求
GET /api/v1/namespaces/{namespace}/services/{name}
参数
响应
200 (Service): OK
401: 未授权
get
读取指定 Service 的状态
HTTP 请求
GET /api/v1/namespaces/{namespace}/services/{name}/status
参数
响应
200 (Service): OK
401: 未授权
list
列出或监听 Service 类型的对象
HTTP 请求
GET /api/v1/namespaces/{namespace}/services
参数
namespace (在路径中): string,必需
allowWatchBookmarks (在查询中): boolean
continue (在查询中): string
fieldSelector (在查询中): string
labelSelector (在查询中): string
limit (在查询中): integer
pretty (在查询中): string
resourceVersion (在查询中): string
resourceVersionMatch (在查询中): string
sendInitialEvents (在查询中): boolean
timeoutSeconds (在查询中): integer
watch (在查询中): boolean
响应
200 (ServiceList): OK
401: 未授权
list
列出或监听 Service 类型的对象
HTTP 请求
GET /api/v1/services
参数
allowWatchBookmarks (在查询中): boolean
continue (在查询中): string
fieldSelector (在查询中): string
labelSelector (在查询中): string
limit (在查询中): integer
pretty (在查询中): string
resourceVersion (在查询中): string
resourceVersionMatch (在查询中): string
sendInitialEvents (在查询中): boolean
timeoutSeconds (在查询中): integer
watch (在查询中): boolean
响应
200 (ServiceList): OK
401: 未授权
create
创建一个 Service
HTTP 请求
POST /api/v1/namespaces/{namespace}/services
参数
namespace (在路径中): string,必需
body: Service,必需
dryRun (在查询中): string
fieldManager (在查询中): string
fieldValidation (在查询中): string
pretty (在查询中): string
响应
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
fieldManager (在查询中): string
fieldValidation (在查询中): string
pretty (在查询中): string
响应
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
fieldManager (在查询中): string
fieldValidation (在查询中): string
pretty (在查询中): string
响应
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
fieldManager (在查询中): string
fieldValidation (在查询中): string
force (在查询中): boolean
pretty (在查询中): string
响应
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
fieldManager (在查询中): string
fieldValidation (在查询中): string
force (在查询中): boolean
pretty (在查询中): string
响应
200 (Service): OK
201 (Service): 已创建
401: 未授权
delete
删除一个 Service
HTTP 请求
DELETE /api/v1/namespaces/{namespace}/services/{name}
参数
name (在路径中): string,必需
Service 的名称
namespace (在路径中): string,必需
body: DeleteOptions
dryRun (在查询中): string
gracePeriodSeconds (在查询中): integer
ignoreStoreReadErrorWithClusterBreakingPotential (在查询中): boolean
pretty (在查询中): string
propagationPolicy (在查询中): string
响应
200 (Service): OK
202 (Service): 已接受
401: 未授权
deletecollection
删除 Service 集合
HTTP 请求
DELETE /api/v1/namespaces/{namespace}/services
参数
namespace (在路径中): string,必需
body: DeleteOptions
continue (在查询中): string
dryRun (在查询中): string
fieldSelector (在查询中): string
gracePeriodSeconds (在查询中): integer
ignoreStoreReadErrorWithClusterBreakingPotential (在查询中): boolean
labelSelector (在查询中): string
limit (在查询中): integer
pretty (在查询中): string
propagationPolicy (在查询中): string
resourceVersion (在查询中): string
resourceVersionMatch (在查询中): string
sendInitialEvents (在查询中): boolean
timeoutSeconds (在查询中): integer
响应
200 (Status): OK
401: 未授权
此页面是自动生成的。
如果您打算报告此页面的问题,请在问题描述中提及此页面是自动生成的。修复可能需要在 Kubernetes 项目的其他地方进行。