现在为了更好的控制k8s的流量,一般都通过istio来进行管理,当我们的服务是部署在多个集群时候,通过istio来访问多集群的应用,更加方便,现在各个云厂商都有托管的istio产品,通常只要不通集群之间内网打通,就可以通过istio来管理多个集群,从而实现多集群的访问。
下面我们说说如何在腾讯云上来通过服务网格来访问不通集群的应用。
环境配置 这里我们通过服务网格来访问eks集群和tke集群的不通版本ngin服务。eks集群和tke集群是同一个vpc,可直接通过关联到同一个服务网格,如果您的集群是不同地域和vpc,可以通过云联网打通,然后关联到同一个服务网格。
服务网格实例:1.10版本
eks集群:1.20版本
tke集群:1.18版本
服务网格关联好集群后,在对应的namespace打上labelistio.io/rev=1-10-3,来实现pod的sidecar自动注入。这里测试的命名空间都是weixnie,后续部署的yaml请根据实际即可。
eks集群部署nginx的v1版本 通过下面yaml部署nginx的v1版本到eks集群。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 apiVersion: v1 data: index.html: I am v1 version kind: ConfigMap metadata: name: index-v1 namespace: weixnie --- apiVersion: apps/v1 kind: Deployment metadata: labels: app: nginx version: v1 name: nginx-v1 namespace: weixnie spec: replicas: 1 selector: matchLabels: app: nginx version: v1 template: metadata: labels: app: nginx version: v1 spec: containers: - image: nginx imagePullPolicy: Always name: nginx-v1 resources: limits: cpu: 500m memory: 1Gi requests: cpu: 250m memory: 256Mi volumeMounts: - mountPath: /usr/share/nginx/html/index.html name: vol subPath: index.html dnsPolicy: ClusterFirst imagePullSecrets: - name: qcloudregistrykey restartPolicy: Always volumes: - configMap: defaultMode: 420 name: index-v1 name: vol --- apiVersion: v1 kind: Service metadata: name: nginx-v1 namespace: weixnie labels: app: nginx service: nginx spec: ports: - port: 80 name: http selector: app: nginx
tke集群部署nginx的v2版本 通过下面yaml部署nginx的v2版本到tke集群。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 apiVersion: v1 data: index.html: I am v2 version kind: ConfigMap metadata: name: index-v2 namespace: weixnie --- apiVersion: apps/v1 kind: Deployment metadata: labels: app: nginx version: v2 name: nginx-v2 namespace: weixnie spec: replicas: 1 selector: matchLabels: app: nginx version: v2 template: metadata: labels: app: nginx version: v2 spec: containers: - image: nginx imagePullPolicy: Always name: nginx-v2 resources: limits: cpu: 500m memory: 1Gi requests: cpu: 250m memory: 256Mi volumeMounts: - mountPath: /usr/share/nginx/html/index.html name: vol subPath: index.html dnsPolicy: ClusterFirst imagePullSecrets: - name: qcloudregistrykey restartPolicy: Always volumes: - configMap: defaultMode: 420 name: index-v2 name: vol --- apiVersion: v1 kind: Service metadata: name: nginx-v2 namespace: weixnie labels: app: nginx service: nginx spec: ports: - port: 80 name: http selector: app: nginx
配置gateway 我们在其中一个集群配置一个ingressgateway来提供访问
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 apiVersion : networking.istio.io/v1alpha3 kind : Gateway metadata : name : weixnie namespace : weixnie spec : servers : - port: number : 8888 name : HTTP-8888-1zqa protocol : HTTP hosts : - '*' selector : app : istio-ingressgateway istio : ingressgateway
配置VirtualService 创建VirtualService,并关联gateway,配置route,设置v1和v2版本的权重分别为50。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 apiVersion : networking.istio.io/v1alpha3 kind : VirtualService metadata : name : weixnie-vs-test namespace : weixnie spec : hosts : - '*' gateways : - weixnie/weixnie http : - route: - destination: host : nginx-v1.weixnie.svc.cluster.local port : number : 80 weight : 20 - destination: host : nginx-v2.weixnie.svc.cluster.local port : number : 80 weight : 80
测试 我们直接通过ingressgateway的公网ip来访问下服务,看下请求是不是20%走到v1版本,80%走到v2版本
1 2 3 4 5 6 7 8 9 10 11 [root@master ~] # for i in {1 ..10 };do curl 1.1 xx.xx .xx :8888 ; echo "" ; doneI am v2 versionI am v1 versionI am v2 versionI am v1 versionI am v2 versionI am v2 versionI am v2 versionI am v2 versionI am v2 versionI am v2 version
从测试结果看,是符合预期,说明我们通过istio来访问不同集群的服务是正常的。