服務

服務是軟體服務(例如 mysql)的具名抽象概念,由 Proxy 監聽的本機連接埠(例如 3306)和決定哪些 Pod 將回應透過 Proxy 發送之請求的選擇器組成。

apiVersion: v1

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

服務

服務是軟體服務(例如 mysql)的具名抽象概念,由 Proxy 監聽的本機連接埠(例如 3306)和決定哪些 Pod 將回應透過 Proxy 發送之請求的選擇器組成。


ServiceSpec

ServiceSpec 描述使用者在服務上建立的屬性。


  • selector (map[string]string)

    將服務流量路由到具有與此選擇器匹配之標籤鍵和值的 Pod。 如果為空或不存在,則假定服務具有管理其端點的外部程序,Kubernetes 將不會修改。 僅適用於 ClusterIP、NodePort 和 LoadBalancer 類型。 如果類型為 ExternalName,則忽略。 更多資訊:https://kubernetes.dev.org.tw/docs/concepts/services-networking/service/

  • ports ([]ServicePort)

    Patch 策略:在鍵 port 上合併

    Map:在合併期間,將保留鍵 port, protocol 上的唯一值

    此服務公開的連接埠清單。 更多資訊:https://kubernetes.dev.org.tw/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.dev.org.tw/docs/concepts/services-networking/service/#defining-a-service

      IntOrString 是一種可以容納 int32 或字串的類型。 在 JSON 或 YAML 編組和解組中使用時,它會產生或消耗內部類型。 這允許您擁有例如可以接受名稱或數字的 JSON 欄位。

    • ports.protocol (string)

      此連接埠的 IP 協定。 支援 "TCP"、"UDP" 和 "SCTP"。 預設為 TCP。

    • ports.name (string)

      此連接埠在服務中的名稱。 這必須是 DNS_LABEL。 ServiceSpec 中的所有連接埠都必須具有唯一的名稱。 在考慮服務的端點時,這必須與 EndpointPort 中的 'name' 欄位匹配。 如果此服務上僅定義一個 ServicePort,則為選用。

    • ports.nodePort (int32)

      當類型為 NodePort 或 LoadBalancer 時,此服務在其上公開的每個節點上的連接埠。 通常由系統指派。 如果指定的值在範圍內且未使用,則將使用該值,否則操作將失敗。 如果未指定,則如果此服務需要連接埠,則將分配一個連接埠。 如果在建立不需要它的服務時指定此欄位,則建立將失敗。 當更新服務以不再需要它時(例如,將類型從 NodePort 變更為 ClusterIP),此欄位將被清除。 更多資訊:https://kubernetes.dev.org.tw/docs/concepts/services-networking/service/#type-nodeport

    • ports.appProtocol (string)

      此連接埠的應用程式協定。 這用作實作的提示,以便為他們理解的協定提供更豐富的行為。 此欄位遵循標準 Kubernetes 標籤語法。 有效值為以下之一

  • type (字串)

    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.dev.org.tw/docs/concepts/services-networking/service/#publishing-services-service-types

  • ipFamilies ([]字串)

    原子性:在合併期間將被取代

    IPFamilies 是指派給此服務的 IP 系列(例如 IPv4、IPv6)清單。此欄位通常根據叢集配置和 ipFamilyPolicy 欄位自動指派。如果手動指定此欄位,且請求的系列在叢集中可用,且 ipFamilyPolicy 允許,則將使用該系列;否則服務建立將會失敗。此欄位是有條件的可變:它允許新增或移除輔助 IP 系列,但不允許變更 Service 的主要 IP 系列。有效值為 "IPv4" 和 "IPv6"。此欄位僅適用於類型為 ClusterIP、NodePort 和 LoadBalancer 的 Service,且不適用於「無頭」服務。當將 Service 更新為 ExternalName 類型時,此欄位將被清除。

    此欄位最多可容納兩個項目(雙堆疊系列,順序不拘)。這些系列必須對應於 clusterIPs 欄位的值(如果已指定)。clusterIPs 和 ipFamilies 皆受 ipFamilyPolicy 欄位管轄。

  • ipFamilyPolicy (字串)

    IPFamilyPolicy 代表此 Service 請求或要求的雙堆疊特性。如果未提供值,則此欄位將設定為 SingleStack。Service 可以是 "SingleStack"(單一 IP 系列)、"PreferDualStack"(在雙堆疊配置的叢集上為兩個 IP 系列,或在單堆疊叢集上為單一 IP 系列),或 "RequireDualStack"(在雙堆疊配置的叢集上為兩個 IP 系列,否則失敗)。ipFamilies 和 clusterIPs 欄位取決於此欄位的值。當將服務更新為 ExternalName 類型時,此欄位將被清除。

  • clusterIP (字串)

    clusterIP 是服務的 IP 位址,通常是隨機指派的。如果手動指定位址,且該位址在範圍內(依照系統配置),且未使用,則會將其分配給服務;否則服務建立將會失敗。除非 type 欄位也變更為 ExternalName(需要此欄位為空白)或 type 欄位從 ExternalName 變更(在這種情況下,可以選擇性地指定此欄位,如上所述),否則此欄位可能無法透過更新變更。有效值為 "None"、空字串 ("") 或有效的 IP 位址。將此設定為 "None" 會建立「無頭服務」(沒有虛擬 IP),這在偏好直接端點連線且不需要代理時很有用。僅適用於類型 ClusterIP、NodePort 和 LoadBalancer。如果在建立 ExternalName 類型的 Service 時指定此欄位,則建立將會失敗。當將 Service 更新為 ExternalName 類型時,此欄位將被清除。更多資訊:https://kubernetes.dev.org.tw/docs/concepts/services-networking/service/#virtual-ips-and-service-proxies

  • clusterIPs ([]字串)

    原子性:在合併期間將被取代

    ClusterIPs 是指派給此服務的 IP 位址清單,通常是隨機指派的。如果手動指定位址,且該位址在範圍內(依照系統配置),且未使用,則會將其分配給服務;否則服務建立將會失敗。除非 type 欄位也變更為 ExternalName(需要此欄位為空)或 type 欄位從 ExternalName 變更(在這種情況下,可以選擇性地指定此欄位,如上所述),否則此欄位可能無法透過更新變更。有效值為 "None"、空字串 ("") 或有效的 IP 位址。將此設定為 "None" 會建立「無頭服務」(沒有虛擬 IP),這在偏好直接端點連線且不需要代理時很有用。僅適用於類型 ClusterIP、NodePort 和 LoadBalancer。如果在建立 ExternalName 類型的 Service 時指定此欄位,則建立將會失敗。當將 Service 更新為 ExternalName 類型時,此欄位將被清除。如果未指定此欄位,則會從 clusterIP 欄位初始化。如果指定此欄位,用戶端必須確保 clusterIPs[0] 和 clusterIP 具有相同的值。

    此欄位最多可容納兩個項目(雙堆疊 IP,順序不拘)。這些 IP 必須對應於 ipFamilies 欄位的值。clusterIPs 和 ipFamilies 皆受 ipFamilyPolicy 欄位管轄。更多資訊:https://kubernetes.dev.org.tw/docs/concepts/services-networking/service/#virtual-ips-and-service-proxies

  • externalIPs ([]字串)

    原子性:在合併期間將被取代

    externalIPs 是叢集中節點也將接受此服務流量的 IP 位址清單。這些 IP 不由 Kubernetes 管理。使用者負責確保流量到達具有此 IP 的節點。常見範例是不屬於 Kubernetes 系統的外部負載平衡器。

  • sessionAffinity (字串)

    支援 "ClientIP" 和 "None"。用於維護會話親和性。啟用基於用戶端 IP 的會話親和性。必須為 ClientIP 或 None。預設值為 None。更多資訊:https://kubernetes.dev.org.tw/docs/concepts/services-networking/service/#virtual-ips-and-service-proxies

  • loadBalancerIP (字串)

    僅適用於 Service Type: LoadBalancer。此功能取決於底層雲端供應商是否支援在建立負載平衡器時指定 loadBalancerIP。如果雲端供應商不支援此功能,則會忽略此欄位。已棄用:此欄位未充分指定,且其含義在不同實作中有所不同。使用它不具可攜性,且可能不支援雙堆疊。建議使用者在可用時使用特定於實作的註解。

  • loadBalancerSourceRanges ([]字串)

    原子性:在合併期間將被取代

    如果指定且平台支援,這將限制通過雲端供應商負載平衡器的流量將被限制為指定的用戶端 IP。如果雲端供應商不支援此功能,則會忽略此欄位。」更多資訊:https://kubernetes.dev.org.tw/docs/tasks/access-application-cluster/create-external-load-balancer/

  • loadBalancerClass (字串)

    loadBalancerClass 是此 Service 所屬的負載平衡器實作類別。如果指定,此欄位的值必須是標籤樣式的識別符,帶有可選的前綴,例如 "internal-vip" 或 "example.com/internal-vip"。未加前綴的名稱保留給終端使用者。只有在 Service 類型為 'LoadBalancer' 時才能設定此欄位。如果未設定,則使用預設負載平衡器實作,目前通常透過雲端供應商整合完成,但應適用於任何預設實作。如果設定,則假定負載平衡器實作正在監看具有相符類別的 Service。任何預設負載平衡器實作(例如雲端供應商)都應忽略設定此欄位的 Service。只有在建立或更新 Service 為 'LoadBalancer' 類型時才能設定此欄位。一旦設定,就無法變更。當服務更新為非 'LoadBalancer' 類型時,此欄位將被清除。

  • externalName (字串)

    externalName 是探索機制將傳回作為此服務別名的外部參考(例如 DNS CNAME 記錄)。不會涉及代理。必須是小寫的 RFC-1123 主機名稱 (https://tools.ietf.org/html/rfc1123) 且需要 type 為 "ExternalName"。

  • externalTrafficPolicy (字串)

    externalTrafficPolicy 描述節點如何分配它們在 Service 的「面向外部」位址(NodePorts、ExternalIPs 和 LoadBalancer IPs)上接收的服務流量。如果設定為 "Local",則代理將以假設外部負載平衡器將負責平衡節點之間的服務流量的方式配置服務,因此每個節點將僅將流量傳遞到服務的節點本地端點,而不會偽裝用戶端來源 IP。(錯誤地傳送到沒有端點的節點的流量將被丟棄。)預設值 "Cluster" 使用路由到所有端點的標準行為(可能會被拓撲和其他功能修改)。請注意,從叢集內部傳送到 External IP 或 LoadBalancer IP 的流量將始終獲得 "Cluster" 語義,但從叢集內部傳送到 NodePort 的用戶端在選擇節點時可能需要考慮流量策略。

  • internalTrafficPolicy (字串)

    InternalTrafficPolicy 描述節點如何分配它們在 ClusterIP 上接收的服務流量。如果設定為 "Local",則代理將假設 Pod 僅希望與 Pod 所在節點上的服務端點通訊,如果沒有本地端點,則丟棄流量。預設值 "Cluster" 使用路由到所有端點的標準行為(可能會被拓撲和其他功能修改)。

  • healthCheckNodePort (int32)

    healthCheckNodePort 指定服務的健康檢查 nodePort。這僅在 type 設定為 LoadBalancer 且 externalTrafficPolicy 設定為 Local 時適用。如果指定的值在範圍內且未使用,則將使用該值。如果未指定,則將自動分配值。外部系統(例如負載平衡器)可以使用此埠來確定給定節點是否持有此服務的端點。如果在建立不需要此欄位的 Service 時指定此欄位,則建立將會失敗。當更新 Service 以不再需要此欄位時(例如變更類型),此欄位將被清除。設定後,此欄位無法更新。

  • publishNotReadyAddresses (布林值)

    publishNotReadyAddresses 指示任何處理此 Service 端點的代理都應忽略任何就緒/未就緒的指示。設定此欄位的主要使用案例是 StatefulSet 的 Headless 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 (布林值)

    allocateLoadBalancerNodePorts 定義是否將為類型為 LoadBalancer 的服務自動分配 NodePorts。預設值為 "true"。如果叢集負載平衡器不依賴 NodePorts,則可以將其設定為 "false"。如果呼叫者請求特定的 NodePorts(透過指定值),則無論此欄位為何,都會尊重這些請求。此欄位只能為類型為 LoadBalancer 的服務設定,如果類型變更為任何其他類型,則將被清除。

  • trafficDistribution (字串)

    TrafficDistribution 提供了一種表達流量如何分配到 Service 端點的偏好的方式。實作可以使用此欄位作為提示,但不要求保證嚴格遵守。如果未設定此欄位,則實作將應用其預設路由策略。如果設定為 "PreferClose",則實作應優先考慮拓撲上接近的端點(例如,同一區域)。這是一個 beta 欄位,需要啟用 ServiceTrafficDistribution 功能。

ServiceStatus

ServiceStatus 代表服務的目前狀態。


  • conditions ([]Condition)

    修補策略:合併關鍵字 type

    Map: 唯一值將在合併期間保留在關鍵字 type 上

    目前的服務狀態

    Condition 包含此 API 資源目前狀態的單一方面詳細資訊。

    • conditions.lastTransitionTime (時間), 必填

      lastTransitionTime 是條件從一種狀態轉換到另一種狀態的最後時間。這應該是底層條件變更的時間。如果未知,則可以使用 API 欄位變更的時間。

      Time 是 time.Time 的包裝器,支援正確地封送至 YAML 和 JSON。為 time 套件提供的許多工廠方法提供了包裝器。

    • conditions.message (字串), 必填

      message 是人類可讀的消息,指示有關轉換的詳細資訊。這可能是一個空字串。

    • conditions.reason (字串), 必填

      reason 包含一個程式化的識別符,指示條件上次轉換的原因。特定條件類型的生產者可以為此欄位定義預期值和含義,以及這些值是否被視為有保證的 API。該值應為 CamelCase 字串。此欄位不得為空。

    • conditions.status (字串), 必填

      條件的狀態,True、False、Unknown 之一。

    • conditions.type (字串), 必填

      條件的類型,以 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 (字串)

        Hostname 為基於 DNS 的負載平衡器入口點設定(通常為 AWS 負載平衡器)

      • loadBalancer.ingress.ip (字串)

        IP 為基於 IP 的負載平衡器入口點設定(通常為 GCE 或 OpenStack 負載平衡器)

      • loadBalancer.ingress.ipMode (字串)

        IPMode 指定負載平衡器 IP 的行為方式,且僅在指定 ip 欄位時才能指定。將其設定為 "VIP" 表示流量傳遞到節點,目標設定為負載平衡器的 IP 和埠。將其設定為 "Proxy" 表示流量傳遞到節點或 Pod,目標設定為節點的 IP 和節點埠或 Pod 的 IP 和埠。服務實作可以使用此資訊來調整流量路由。

      • loadBalancer.ingress.ports ([]PortStatus)

        原子性:在合併期間將被取代

        Ports 是服務埠記錄的清單。如果使用,則服務中定義的每個埠都應在其中有一個條目

        **

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

          Port 是此處記錄狀態的服務埠的埠號

        • loadBalancer.ingress.ports.protocol (字串), 必填

          Protocol 是此處記錄狀態的服務埠的協定。支援的值為:"TCP"、"UDP"、"SCTP"

        • loadBalancer.ingress.ports.error (字串)

          Error 用於記錄服務埠的問題。錯誤的格式應符合以下規則:- 內建錯誤值應在此檔案中指定,並且應使用 CamelCase 名稱

          • 雲端供應商特定的錯誤值必須具有符合 foo.example.com/CamelCase 格式的名稱。

ServiceList

ServiceList 包含服務清單。


操作


get 讀取指定的 Service

HTTP 請求

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

參數

  • name (在路徑中): 字串, 必填

    Service 的名稱

  • namespace (在路徑中): 字串, 必填

    命名空間

  • pretty (在查詢中): 字串

    pretty

回應

200 (Service): OK

401: 未經授權

get 讀取指定 Service 的狀態

HTTP 請求

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

參數

  • name (在路徑中): 字串, 必填

    Service 的名稱

  • namespace (在路徑中): 字串, 必填

    命名空間

  • pretty (在查詢中): 字串

    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 (在路徑中): 字串, 必填

    Service 的名稱

  • namespace (在路徑中): 字串, 必填

    命名空間

  • body: Service, 必填

  • dryRun (在查詢中): 字串

    dryRun

  • fieldManager (在查詢中): 字串

    fieldManager

  • fieldValidation (在查詢中): 字串

    fieldValidation

  • pretty (在查詢中): 字串

    pretty

回應

200 (Service): OK

201 (Service): 已建立

401: 未經授權

update 取代指定 Service 的狀態

HTTP 請求

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

參數

  • name (在路徑中): 字串, 必填

    Service 的名稱

  • namespace (在路徑中): 字串, 必填

    命名空間

  • body: Service, 必填

  • dryRun (在查詢中): 字串

    dryRun

  • fieldManager (在查詢中): 字串

    fieldManager

  • fieldValidation (在查詢中): 字串

    fieldValidation

  • pretty (在查詢中): 字串

    pretty

回應

200 (Service): OK

201 (Service): 已建立

401: 未經授權

patch 部分更新指定的 Service

HTTP 請求

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

參數

  • name (在路徑中): 字串, 必填

    Service 的名稱

  • namespace (在路徑中): 字串, 必填

    命名空間

  • body: Patch, 必填

  • dryRun (在查詢中): 字串

    dryRun

  • fieldManager (在查詢中): 字串

    fieldManager

  • fieldValidation (在查詢中): 字串

    fieldValidation

  • force (在查詢中): 布林值

    force

  • pretty (在查詢中): 字串

    pretty

回應

200 (Service): OK

201 (Service): 已建立

401: 未經授權

patch 部分更新指定 Service 的狀態

HTTP 請求

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

參數

  • name (在路徑中): 字串, 必填

    Service 的名稱

  • namespace (在路徑中): 字串, 必填

    命名空間

  • body: Patch, 必填

  • dryRun (在查詢中): 字串

    dryRun

  • fieldManager (在查詢中): 字串

    fieldManager

  • fieldValidation (在查詢中): 字串

    fieldValidation

  • force (在查詢中): 布林值

    force

  • pretty (在查詢中): 字串

    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 專案中的其他地方進行。

上次修改時間:2024 年 9 月 5 日上午 6:51 PST:Fix trafficDistribution status in Service v1 (b736d8c92f)