使用原生Service域名跨集群服务访问

ACK One多集群Service支持通过MultiClusterService实现用原生Service域名跨集群服务访问。无需修改业务代码、业务PodDNSConfig配置或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连接集群。具体操作,请参见获取集群KubeConfig并通过kubectl工具连接集群

基于MultiClusterService的多集群服务架构

image

Consumer Cluster中,通过Client Pod访问Provider Cluster中的Service流程如下:

  1. Provider Cluster中创建service1及应用Pod,在Consumer Cluster中创建要提供服务的service1

  2. 在舰队中创建MultiClusterService(与Service1同名同namespace),并配置Provider ClusterConsumer Cluster。

  3. Consumer Cluster中创建Client Pod,可以通过原生Service域名访问到Provider Cluster中的Service1Pods。

说明

本文以命令行方式介绍如何部署应用及服务,您也可以通过舰队中GitOps应用分发功能,将资源下发到关联集群。

步骤一:在Provider Cluster中部署Service1服务

  1. 使用Provider ClusterKubeConfig,通过以下示例内容,创建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 ClusterKubeConfig,通过以下示例内容,创建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。

    • MultiClusterServicenamenamespace需与要提供跨集群访问的服务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 ClusterKubeConfig,通过以下示例内容,创建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 Clusterservice1服务。

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

    预期输出:

    This is cluster-provider!