全部產品
Search
文件中心

Container Service for Kubernetes:使用原生Service網域名稱跨叢集服務訪問

更新時間:Mar 14, 2025

ACK One多叢集Service支援通過MultiClusterService實現用原生Service網域名稱跨叢集服務訪問。無需修改業務代碼、業務Pod的DNSConfig配置或CoreDNS配置,直接使用原生Service便可實現跨叢集流量路由。

前提條件

  • 開啟艦隊管理功能

  • 艦隊的Fleet執行個體已添加2個關聯集群(Provider Cluster & Consumer Cluster)。具體操作,請參見管理關聯集群

  • 關聯集群的版本不低於1.22。

  • 關聯集群(Provider Cluster & Consumer Cluster)的Pod CIDR已相互可通。具體操作,請參見多叢集服務概述

    說明

    叢集間的Pod CIDR互連後,請確保叢集的節點池安全性群組已允許存取與之互連叢集的Pod CIDR。

  • 擷取Provider Cluster、Consumer Cluster和艦隊的KubeConfig,並通過kubectl串連叢集。具體操作,請參見通過kubectl、CloudShell或Workbench串連叢集

基於MultiClusterService的多叢集服務架構

在Consumer Cluster中,通過Client Pod訪問Provider Cluster中的Service流程如下:

  1. 在Provider Cluster中建立service1及應用Pod,在Consumer Cluster中建立要提供服務的service1

  2. 在艦隊中建立MultiClusterService(與Service1同名同namespace),並配置Provider Cluster和Consumer Cluster。

  3. 在Consumer Cluster中建立Client Pod,可以通過原生Service網域名稱訪問到Provider Cluster中的Service1的Pods。

說明

本文以命令列方式介紹如何部署應用及服務,您也可以通過艦隊中GitOps應用分發功能,將資源下發到關聯集群。

步驟一:在Provider Cluster中部署Service1服務

  1. 使用Provider Cluster的KubeConfig,通過以下樣本內容,建立web-demo-svc-provider.yaml

    apiVersion: v1
    kind: Service
    metadata:
      name: service1
      namespace: provider-ns
    spec:
      ports:
      - port: 80
        protocol: TCP
        targetPort: 8080
      selector:
        app: web-demo
      sessionAffinity: None
      type: ClusterIP
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: web-demo
      namespace: provider-ns
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: web-demo
      template:
        metadata:
          creationTimestamp: null
          labels:
            app: web-demo
        spec:
          containers:
          - env:
            - name: ENV_NAME
              value: cluster-provider
            image: registry-cn-hangzhou.ack.aliyuncs.com/acs/web-demo:0.5.0
            imagePullPolicy: Always
            name: web-demo
          dnsPolicy: ClusterFirst
          restartPolicy: Always
          schedulerName: default-scheduler
  2. 執行以下命令,部署service1服務及應用Pod。

    kubectl apply -f web-demo-svc-provider.yaml

步驟二:在Consumer Cluster中部署Service1服務

  1. 使用Consumer Cluster的KubeConfig,通過以下樣本內容,建立web-demo-svc-consumer.yaml

    說明

    只需部署Service資源以提供服務網域名稱,無需部署實際的業務Pod。

    apiVersion: v1
    kind: Service
    metadata:
      name: service1
      namespace: provider-ns
    spec:
      ports:
      - port: 80
        protocol: TCP
        targetPort: 8080
      selector:
        app: web-demo
      sessionAffinity: None
      type: ClusterIP
  2. 執行以下命令,部署service1服務。

    kubectl apply -f web-demo-svc-consumer.yaml

步驟三:在艦隊中建立MultiClusterService

  1. 使用艦隊的KubeConfig,通過以下樣本內容,建立multiclusterservice.yaml

    說明
    • 請將 <your consumer cluster id><your provider cluster id> 替換為您關聯的叢集ID。

    • MultiClusterService的namenamespace需與要提供跨叢集訪問的服務service1保持一致。

    apiVersion: networking.one.alibabacloud.com/v1alpha1
    kind: MultiClusterService
    metadata:
       name: service1
       namespace: provider-ns
    spec:
      consumerClusters:
        - name: <your consumer cluster id>
      providerClusters:
        - name: <your provider cluster id>
  2. 執行以下命令,將service1對應的MultiClusterService部署到艦隊。

    kubectl apply -f multiclusterservice.yaml

步驟四:通過Client Pod跨叢集訪問Service1

  1. 使用Consumer Cluster的KubeConfig,通過以下樣本內容,建立client-pod.yaml

    apiVersion: v1
    kind: Pod
    metadata:
      name: curl-client
      namespace: customer-ns
    spec:
      containers:
      - name: curl-client
        image: registry-cn-hangzhou.ack.aliyuncs.com/dev/curl:8.11.1
        command: ["sh", "-c", "sleep 12000"]
  2. 執行以下命令,在Consumer Cluster中部署Client Pod。

    kubectl apply -f client-pod.yaml
  3. 執行以下命令,在Consumer Cluster中,進入Client Pod,並跨叢集訪問Provider Cluster的service1服務。

    kubectl exec -it -ncustomer-ns curl-client -- sh
    
    curl service1.provider-ns

    預期輸出:

    This is cluster-provider!