全部產品
Search
文件中心

Container Service for Kubernetes:通過命令列管理多叢集服務實現Kubernetes服務的跨叢集訪問

更新時間:Aug 03, 2024

通過多叢集服務,讓您無需建立負載平衡,即可實現Kubernetes服務的跨叢集訪問。本文通過樣本介紹如何在Fleet執行個體上建立ServiceExport、ServiceImport等資源來管理多叢集服務,實現Kubernetes服務的跨叢集訪問。

前提條件

概述

通過多叢集服務實現Kubernetes服務的跨叢集訪問,打破了多叢集服務訪問的邊界。多叢集服務樣本如下圖所示。

多叢集服務

  1. 管理員在服務提供者叢集(ACK Cluster 1)和服務消費者叢集(ACK Cluster 2)中,建立應用相關資源,包含Namespace、Deployment和Service;建立多叢集Service資源,包括ServiceExport和ServiceImport。

  2. 多叢集艦隊Fleet監聽子叢集的ServiceExport和ServiceImport資源,同步多叢集Service對應的Endpoint資訊。

  3. 在服務消費者叢集ACK Cluster 2上,Client Pod可跨叢集訪問服務提供者叢集ACK Cluster 1上的Service1。

步驟一:建立服務提供者相關資源

如果您的服務提供者叢集ACK Cluster 1已經部署了Kubernetes服務和相關資源,可以跳過此步驟。

  1. 在服務提供者叢集ACK Cluster 1上,執行以下命令,建立服務提供者命名空間。

    樣本的命名空間為provider-ns

    kubectl create ns provider-ns
  2. 在服務提供者叢集ACK Cluster 1上,建立服務提供者Kubernetes服務和相關的Deployment等資源。

    1. 使用以下內容,建立一個app-meta.yaml檔案。

      apiVersion: v1       # 服務提供者。
      kind: Service
      metadata:
        name: service1
        namespace: provider-ns
      spec:
        ports:
        - name: http
          port: 80
          protocol: TCP
          targetPort: 8080
        selector:
          app: web-demo
        sessionAffinity: None
        type: ClusterIP
      ---
      apiVersion: apps/v1
      kind: Deployment
      metadata:
        labels:
          app: web-demo
        name: web-demo
        namespace: provider-ns
      spec:
        replicas: 2
        selector:
          matchLabels:
            app: web-demo
        template:
          metadata:
            labels:
              app: web-demo
          spec:
            containers:
            - image: acr-multiple-clusters-registry.cn-hangzhou.cr.aliyuncs.com/ack-multiple-clusters/web-demo:0.4.0
              name: web-demo
              env:
              - name: ENV_NAME
                value: cluster1-beijing
    2. 執行以下命令,在服務提供者叢集ACK Cluster 1中建立資源。

      kubectl apply -f app-meta.yaml
    3. 執行以下命令,在服務提供者叢集ACK Cluster 1中建立ServiceExport資源,指定需要開放多叢集訪問的Kubernetes服務。

      apiVersion: multicluster.x-k8s.io/v1alpha1
      kind: ServiceExport
      metadata:
        name: service1           # 名稱與待開放的Kubernetes服務名稱相同。
        namespace: provider-ns   # 與待開放的Kubernetes服務在同一個命名空間。

      具體參數說明如下:

      參數

      說明

      metadata.name

      待開放的Kubernetes服務名稱。

      metadata.namespace

      待開放的Kubernetes服務所在的命名空間。

步驟二:配置消費者叢集

  1. 在服務消費者叢集ACK Cluster 2上,執行以下命令,建立服務提供者命名空間。

    樣本的命名空間為provider-ns

    kubectl create ns provider-ns
  2. 在服務消費者叢集ACK Cluster 2中,使用以下內容,建立ServiceImport資源。

    apiVersion: multicluster.x-k8s.io/v1alpha1
    kind: ServiceImport
    metadata:
      name: service1           
      namespace: provider-ns   
    spec:
      ports:                   # 與待開放的Kubernetes服務ports相同。
      - name: http
        port: 80
        protocol: TCP
      type: ClusterSetIP

    以上範例程式碼中ServiceImport的spec欄位僅定義了部分參數。關於spec完整的參數說明如下表所示。

    參數

    說明

    metadata.name 

    服務名稱,需要與待開放的Kubernetes服務名稱相同。

    metadata.namespace

    服務命名空間。需要與待開放的Kubernetes服務命名空間一致。

    spec. ports. name

    Port名稱。需要與待開放的Kubernetes服務相應欄位一致。

    spec. ports. protocol

    協議。需要與待開放的Kubernetes服務相應欄位一致。

    spec. ports. appProtocol

    應用協議。需要與待開放的Kubernetes服務相應欄位一致。

    spec. ports. port

    Port。需要與待開放的Kubernetes服務相應欄位一致。

    spec. ips

    服務VIP。由Fleet執行個體分配,無需填寫。

    spec. type

    支援ClusterSetIPHeadless

    當待開放的Kubernetes服務的ClusterIPNone時,表示服務為Headless服務,設定typeHeadless

    否則,設定typeClusterSetIP

    spec. sessionAffinity

    會話關聯,支援ClientIPNone。需要與待開放的Kubernetes服務相應欄位一致。

    spec. sessionAffinityConfig

    會話關聯配置。需要與待開放的Kubernetes服務相應欄位一致。

步驟三:訪問多叢集服務

在服務消費者叢集Cluster 2中的Client Pod可以通過以下兩種方式訪問服務提供者叢集ACK Cluster 1中的Service 1。

方式一:通過新的Service名稱訪問

服務消費者叢集ACK Cluster 2建立ServiceImport後,Fleet執行個體會在服務消費者叢集ACK Cluster 2中,建立一個以amcs-為首碼的Kubernetes服務代表多叢集Service。

在服務消費者叢集ACK Cluster 2的Client Pod中,可以通過訪問amcs-service1.provider-ns來訪問服務提供者叢集ACK Cluster 1中的Service 1。

  1. 在服務消費者叢集ACK Cluster 2上執行以下命令,擷取相關Service資訊。

    kubectl get service -n provider-ns

    預期輸出:

    NAME            TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
    amcs-service1   ClusterIP   172.xx.xx.xx   <none>        80/TCP    26m
  2. 在服務消費者叢集ACK Cluster 2的Client Pod上執行以下命令,訪問服務提供者叢集ACK Cluster 1中的Service 1。

    curl amcs-service1.provider-ns

方式二:通過新的Service網域名稱訪問

  1. 在服務消費者叢集Cluster 2中安裝或升級CoreDNS,版本要求1.9.3及以上。具體操作,請參見CoreDNS管理組件

  2. 修改CoreDNS組件的配置Corefile。

    1. 執行如下命令,修改CoreDNS組件的ConfigMap檔案。

      kubectl edit configmap coredns -n kube-system
    2. 在Corefile檔案中新增一行配置項multicluster clusterset.local,支援多叢集服務網域名稱解析。

      apiVersion: v1
      data:
        Corefile: |
          .:53 {
              errors
              health {
                 lameduck 15s
              }
              ready
              multicluster clusterset.local    #增加配置項,支援多叢集服務網域名稱解析。
              kubernetes cluster.local in-addr.arpa ip6.arpa {
      
                pods verified
                ttl 30
                fallthrough in-addr.arpa ip6.arpa
              }
              ...
          }
      kind: ConfigMap
      metadata:
        name: coredns
        namespace: kube-system
                                      
  3. 在服務消費者叢集Cluster 2的Client Pod上執行如下命令,訪問服務提供者叢集Cluster 1中的Service 1。

    curl service1.provider-ns.svc.clusterset.local
  4. (可選)通過修改服務消費者叢集Cluster 2中Client Pod的dnsConfig.searches,訪問多叢集服務。

    1. 在Client Pod的dnsConfig.searches欄位中增加搜尋clusterset.local的網域名稱。

      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: client-pod
        namespace: consumer-ns
      spec:
        ...
        template:
          ...
          spec:
            dnsPolicy: "ClusterFirst"    
            dnsConfig:                   
              searches:                        #dnsConfig,增加搜尋clusterset.local網域名稱。
                - svc.clusterset.local
                - clusterset.local
                - consumer-ns.svc.cluster.local
                - svc.cluster.local
                - cluster.local
            containers:
            - name: client-pod
              ...
    2. 執行如下命令,訪問多叢集服務。

      curl service1.provider-ns

相關文檔

除了命令列方式,您也可以通過控制台方式管理多叢集服務。具體操作,請參見通過控制台管理多叢集服務