通過ACK One的服務網格功能,您可以實現多集群的一站式應用分發和流量治理。本文介紹如何通過ACK One Fleet實例完成關聯集群之間的應用分發和流量治理。
前提條件
ACK One Fleet實例已開啟服務網格。具體操作,請參見開啟服務網格。
已添加至少一個關聯集群。具體操作,請參見添加關聯集群。
已從ACK One控制臺獲取Fleet實例的KubeConfig,并通過kubectl連接至Fleet實例。
背景信息
本文示例通過使用ACK One Fleet實例的KubeConfig,在多個關聯集群上部署Rollouts應用,同時下發相應的流量治理規則,從而完成多個版本之間的流量切換。關于多集群管理應用分發的更多信息,請參見應用分發。
本文示例操作示意如下圖所示。
圖中①表示用戶可以部署相應的Kubernetes原生應用到關聯集群,例如Deployment、Service、ConfigMap等。
圖中②表示用戶可以通過ACK One Fleet實例下發流量治理相關的規則到關聯集群,不需要使用服務網格ASM的KubeConfig,目前支持的有:
Destinationrules
Envoyfilters
Gateways
Serviceentries
Sidecars
Virtualservices
Workloadentries
Workloadgroups
圖中③表示用戶通過訪問網關地址訪問應用,應用最終根據所部署的流量規則呈現相應的結果。
操作步驟
執行以下命令,在default命名空間開啟自動注入。
kubectl label namespace default istio-injection=enabled
創建資源。
使用以下內容,創建podinfo-meta.yaml文件,包含應用相關的Kubernetes原生資源。
apiVersion: v1 kind: Service metadata: name: podinfo labels: app: podinfo service: podinfo spec: selector: app: podinfo ports: - protocol: TCP port: 80 targetPort: 8080 --- apiVersion: apps/v1 kind: Deployment metadata: name: podinfo-green labels: app: podinfo version: green spec: replicas: 4 minReadySeconds: 5 revisionHistoryLimit: 5 progressDeadlineSeconds: 60 strategy: rollingUpdate: maxUnavailable: 1 type: RollingUpdate selector: matchLabels: app: podinfo version: green template: metadata: labels: app: podinfo version: green spec: containers: - name: podinfod image: registry.cn-hangzhou.aliyuncs.com/acs/rollouts-demo:green imagePullPolicy: IfNotPresent ports: - name: http containerPort: 8080 protocol: TCP readinessProbe: tcpSocket: port: 8080 initialDelaySeconds: 5 timeoutSeconds: 5 --- apiVersion: apps/v1 kind: Deployment metadata: name: podinfo-blue labels: app: podinfo version: blue spec: replicas: 4 minReadySeconds: 5 revisionHistoryLimit: 5 progressDeadlineSeconds: 60 strategy: rollingUpdate: maxUnavailable: 1 type: RollingUpdate selector: matchLabels: app: podinfo version: blue template: metadata: labels: app: podinfo version: blue spec: containers: - name: podinfod image: registry.cn-hangzhou.aliyuncs.com/acs/rollouts-demo:blue imagePullPolicy: IfNotPresent ports: - name: http containerPort: 8080 protocol: TCP readinessProbe: tcpSocket: port: 8080 initialDelaySeconds: 5 timeoutSeconds: 5
執行以下命令,在Fleet實例上添加資源。
kubectl apply -f podinfo-meta.yaml
執行以下命令,獲取Fleet實例已添加的關聯集群信息。
關于AMC命令行更多信息,請參見AMC命令行幫助。
kubectl amc get managedclusters
預期輸出:
Name Alias HubAccepted c5f4110f2ad88499583fc76cc568a**** ack-hy-01 true c7f78dd3b09a146b8b750b4c1c51d**** ack-hy-02 true
創建應用。
使用以下內容,創建podinfo-app.yaml文件,定義開源KubeVela Application podinfo,實現多集群分發。
使用上一步獲取的關聯集群ID替換如下
<clusterid1>
和<clusterid2>
。apiVersion: core.oam.dev/v1beta1 kind: Application metadata: name: podinfo namespace: default annotations: app.oam.dev/publishVersion: version1 spec: components: - name: podinfo type: ref-objects properties: objects: - apiVersion: apps/v1 kind: Deployment name: podinfo-blue - apiVersion: apps/v1 kind: Deployment name: podinfo-green - apiVersion: v1 kind: Service name: podinfo policies: - type: topology name: podinfo-clusters properties: clusters: ["<clusterid1>","<clusterid2>"] # 定義下發的目標集群,如需更新目標集群,可在此字段新增或修改。
執行如下命令,在Fleet實例上部署應用
podinfo
。kubectl apply -f podinfo-app.yaml
創建Istio網關。
使用以下內容,創建podinfo-gateway.yaml文件。
apiVersion: networking.istio.io/v1alpha3 kind: Gateway metadata: name: podinfo-gateway spec: selector: istio: ingressgateway servers: - port: number: 80 name: http protocol: HTTP hosts: - "*"
執行以下命令,在Fleet實例上部署Istio網關。
kubectl apply -f podinfo-gateway.yaml
創建虛擬服務。
使用以下內容,創建virtual-service-all-blue.yaml文件。
apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: podinfo spec: hosts: - "*" gateways: - podinfo-gateway http: - match: - uri: prefix: / route: - destination: host: podinfo subset: blue port: number: 80
執行以下命令,在Fleet實例上部署虛擬服務。
kubectl apply -f virtual-service-all-blue.yaml
創建目標規則。
使用以下內容,創建destination-rule-all.yaml文件。
apiVersion: networking.istio.io/v1alpha3 kind: DestinationRule metadata: name: podinfo spec: host: podinfo trafficPolicy: outlierDetection: baseEjectionTime: 30s consecutiveErrors: 7 interval: 30s subsets: - name: blue labels: version: blue - name: green labels: version: green
執行以下命令,在Fleet實例上部署目標規則。
kubectl apply -f destination-rule-all.yaml
執行以下命令,獲取ASM網關地址。
AMC命令行更多信息,請參見AMC命令行幫助。
kubectl amc get svc -n istio-system -m <關聯集群>
預期輸出:
Run on ManagedCluster c5f4110f2ad88499583fc76cc568a**** (ack-hy-01) NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE istio-ingressgateway LoadBalancer 10.12.1**.*** 47.113.***.*** 80:30315/TCP,443:32***/TCP 47h Run on ManagedCluster c7f78dd3b09a146b8b750b4c1c51d**** (ack-hy-02) NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE istio-ingressgateway LoadBalancer 10.75.9**.*** 47.113.***.*** 80:32101/TCP,443:30***/TCP 47h
在瀏覽器中訪問http://<網關IP>/。
使用上一步獲取的
EXTERNAL-IP
替換<網關IP>
,訪問頁面如下所示,此時僅展示blue
版本。創建虛擬服務,分配不同的流量比例。
使用以下內容,創建virtual-service-green-blue-80-20.yaml文件。
以下示例中
green
版本權重為80,blue
版本權重為20。apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: podinfo spec: hosts: - "*" gateways: - podinfo-gateway http: - match: - uri: prefix: / route: - destination: host: podinfo subset: green port: number: 80 weight: 80 - destination: host: podinfo subset: blue port: number: 80 weight: 20
執行以下命令,在Fleet實例上部署虛擬服務。
kubectl apply -f virtual-service-green-blue-80-20.yaml
繼續在瀏覽器中訪問http://<網關IP>/。
可看到應用
green
和blue
的版本會按照80%和20%流量比例呈現。