通过istio实现多集群访问

现在为了更好的控制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.1xx.xx.xx:8888 ; echo "" ; done
I am v2 version
I am v1 version
I am v2 version
I am v1 version
I am v2 version
I am v2 version
I am v2 version
I am v2 version
I am v2 version
I am v2 version

从测试结果看,是符合预期,说明我们通过istio来访问不同集群的服务是正常的。


通过istio实现多集群访问
https://www.niewx.cn/2022/06/03/Multi-cluster-access-through-istio/
作者
VashonNie
发布于
2022年6月3日
许可协议