多集群运维时,您需要经常切换不同的KubeConfig来操作指定的目标集群,成本高、易出错。ACK One多集群代理服务让您可以通过主控实例的单个KubeConfig实现对多个关联集群的操作,例如部署Deployment,查看Pod状态和日志等。本文介绍如何通过命令行方式和Kubernetes API方式使用多集群代理服务。

前提条件

  • 开发者用户从ACK One控制台获取主控实例的KubeConfig,通过Kubectl连接至主控实例。

  • 主控实例管理员(实例创建者)已配置命名空间和配额。具体操作,请参见管理命名空间与配额

  • 主控实例已添加多个关联集群。具体操作,请参见添加关联集群
  • 安装AMC命令行工具。具体操作,请参见AMC命令行帮助

背景信息

多集群代理服务通过主控实例代理实现,由主控实例代理创建的资源,仅在相应的关联集群中生效。

通过命令行方式使用多集群代理创建应用

  1. 执行以下命令,查看主控实例管理的关联集群,确定应用分发的目标集群。
    kubectl get managedclusters

    预期输出:

    NAME                     HUB ACCEPTED   MANAGED CLUSTER URLS   JOINED   AVAILABLE   AGE
    managedcluster-c5***z9   true                                  True     True        12d
    managedcluster-c1***e5   true                                  True     True        12d
  2. 使用以下内容,创建app.yaml文件。
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: demo
      namespace: demo
      labels:
        app: demo
    spec:
      minReadySeconds: 5
      revisionHistoryLimit: 5
      progressDeadlineSeconds: 60
      strategy:
        rollingUpdate:
          maxUnavailable: 1
        type: RollingUpdate
      selector:
        matchLabels:
          app: demo
      template:
        metadata:
          annotations:
            prometheus.io/scrape: "true"
            prometheus.io/port: "9797"
          labels:
            app: demo
        spec:
          containers:
          - name: demo
            image: registry.cn-hangzhou.aliyuncs.com/acs/rollouts-demo:red
            imagePullPolicy: IfNotPresent
            ports:
            - name: http
              containerPort: 8080
              protocol: TCP
            readinessProbe:
              tcpSocket:
                port: 8080
              initialDelaySeconds: 5
              timeoutSeconds: 5
            resources:
              limits:
                cpu: 2000m
                memory: 512Mi
              requests:
                cpu: 100m
                memory: 64Mi
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: demo-svc
      namespace: demo
    spec:
      selector:
        app: demo
      ports:
        - protocol: TCP
          port: 80
          targetPort: 8080
    ---
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: demo
      namespace: demo
      labels:
        app: demo
    spec:
      rules:
        - host: app.demo.example.com
          http:
            paths:
            - path: /
              pathType: Prefix
              backend:
                service:
                  name: demo-svc
                  port:
                    number: 80
  3. 执行以下命令,在主控实例上部署应用demo
    您需要指定目标集群,下面以主控实例管理的关联集群managedcluster-c1***e5为例说明。
    kubectl amc apply -f app.yaml -m managedcluster-c1***e5

    预期输出:

    Run on ManagedCluster managedcluster-c1***e5
    deployment.apps/demo created
    service/demo-svc created
    ingress.networking.k8s.io/demo created
  4. 查看应用的状态。
    • 执行以下命令,查看Deployment的状态。
      kubectl amc get deployment -n demo -m managedcluster-c1***e5

      预期输出:

      Run on ManagedCluster managedcluster-c1xxxe5
      NAME   READY   UP-TO-DATE   AVAILABLE   AGE
      demo   1/1     1            1           2m48s
    • 执行以下命令,查看Pod的状态。
      kubectl amc get pod -n demo -m managedcluster-c1***e5

      预期输出:

      Run on ManagedCluster managedcluster-c1***e5
      NAME                   READY   STATUS    RESTARTS   AGE
      demo-fdf4b6b7d-vthqj   1/1     Running   0          6m55s
    • 执行以下命令,查看Pod的日志。
      kubectl amc logs demo-fdf4b6b7d-vthqj -n demo -m managedcluster-c1***e5

      预期输出:

      Run on ManagedCluster managedcluster-c1***e5
      2021-12-16 24:00:00 Started server on :8080
    • 执行以下命令,查看Service的状态。
      kubectl amc get service -n demo -m managedcluster-c1***e5

      预期输出:

      Run on ManagedCluster managedcluster-c1***e5
      NAME       TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
      demo-svc   ClusterIP   172.16.17.29   <none>        80/TCP    3m55s
    • 执行以下命令,查看Ingress的状态。
      kubectl amc get ingress -n demo -m managedcluster-c1***e5

      预期输出:

      Run on ManagedCluster managedcluster-c1***e5
      NAME   CLASS    HOSTS                  ADDRESS        PORTS   AG
      demo   <none>   app.demo.example.com   123.56.XX.XX   80      4m10s

通过Kubernetes API方式使用多集群代理

  1. 使用Kubernetes API获取主控实例管理的关联集群列表。
    1. 查看主控实例KubeConfig,从KubeConfig文件中提取cakeyapiserver信息,配置Kubernetes API认证的命令如下:
      cat  $KUBECONFIG |grep client-certificate-data | awk -F ' ' '{print $2}' |base64 -d > client-cert.pem
      cat  $KUBECONFIG |grep client-key-data | awk -F ' ' '{print $2}' |base64 -d > client-key.pem
      APISERVER=`cat  $KUBECONFIG |grep server | awk -F ' ' '{print $2}'`
    2. 使用主控实例的Kubernetes API,获取主控实例管理的关联集群。
      curl --cert client-cert.pem --key client-key.pem -k $APISERVER/apis/cluster.open-cluster-management.io/v1/managedclusters
      说明 主控实例Kubernetes API的URL路径为:/apis/cluster.open-cluster-management.io/v1/managedclusters
  2. 使用主控实例Kubernetes API的代理功能,获取对应关联集群的资源信息。
    curl --cert client-cert.pem --key client-key.pem -k $APISERVER/apis/cluster.core.oam.dev/v1alpha1/clustergateways/<替换为关联集群名称>/proxy/api/v1/namespaces/demo/pods
    说明 主控实例Kubernetes API代理功能的URL路径为:/apis/cluster.core.oam.dev/v1alpha1/clustergateways/<关联集群名称>/proxy/<关联集群资源Kubernetes API URL路径>