多集群運維時,您需要經常切換不同的KubeConfig來操作指定的目標集群,成本高、易出錯。ACK One多集群代理服務讓您可以通過Fleet實例的單個KubeConfig實現對多個關聯集群的操作,例如部署Deployment,查看Pod狀態和日志等。本文介紹如何通過命令行方式和Kubernetes API方式使用多集群代理服務。
前提條件
已從ACK One控制臺獲取Fleet實例的KubeConfig,并通過kubectl連接至Fleet實例。
已開啟艦隊管理功能。具體操作,請參見開啟艦隊管理功能。
艦隊的Fleet實例已添加多個關聯集群。具體操作,請參見添加關聯集群。
已安裝AMC命令行工具。具體操作,請參見AMC命令行幫助。
背景信息
多集群代理服務通過Fleet實例代理實現,由Fleet實例代理創建的資源僅在相應的關聯集群中生效。
通過命令行方式使用多集群代理創建應用
執行以下命令,查看Fleet實例管理的關聯集群,確定應用分發的目標集群。
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
使用以下內容,創建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
執行以下命令,在Fleet實例上部署應用
demo
。您需要指定目標集群,下面以Fleet實例管理的關聯集群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
查看應用的狀態。
執行以下命令,查看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方式使用多集群代理
使用Kubernetes API獲取Fleet實例管理的關聯集群列表。
查看Fleet實例的KubeConfig,從KubeConfig文件中提取
ca
、key
和apiserver
信息,配置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}'`
使用Fleet實例的Kubernetes API,獲取Fleet實例管理的關聯集群。
curl --cert client-cert.pem --key client-key.pem -k $APISERVER/apis/cluster.open-cluster-management.io/v1/managedclusters
說明Fleet實例Kubernetes API的URL路徑為:
/apis/cluster.open-cluster-management.io/v1/managedclusters
。
使用Fleet實例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
說明Fleet實例Kubernetes API代理功能的URL路徑為:
/apis/cluster.core.oam.dev/v1alpha1/clustergateways/<關聯集群名稱>/proxy/<關聯集群資源Kubernetes API URL路徑>
。