操作场景
业务规模增长,为提高网站可用性,电商网站业务团队计划在另一可用区的集群也部署一套网站业务,两套相同的网站业务在两个不同集群同时为用户提供服务。地域感知如下图所示:
?
?操作步骤
两套网站业务在正常运行的情况下,ingress gateway 会优先将流量路由至本地域或可用区的 frontend 服务,即使另一集群中也有 frontend 服务,frontend 服务会优先就近访问相同可用区 user,product,order,cart 服务;order 和 cart 服务也会优先就近访问相同可用区的 stock 服务。
在 Kubernetes 中,Pod 的地域是通过在已部署的节点上的 Region 和 Zone 的标签决定的,Demo 应用 yaml 中已为工作负载设置了相应的 Zone 标签,首先将网站全套服务也部署至另一可用区的集群(子集群):
apiVersion: v1kind: Namespacemetadata:name: baselabels:istio.io/rev: 1-6-9spec:finalizers:- kubernetes---apiVersion: apps/v1kind: Deploymentmetadata:name: frontendnamespace: baselabels:app: frontendspec:replicas: 1selector:matchLabels:app: frontendtemplate:metadata:labels:app: frontendspec:containers:- name: frontendimage: ccr.ccs.tencentyun.com/chloeyhuang/demo:v202007101540imagePullPolicy: Alwaysenv:- name: POD_NAMEvalueFrom:fieldRef:fieldPath: metadata.name- name: REGIONvalue: "guangzhou-zoneB"ports:- containerPort: 80---?apiVersion: v1kind: Servicemetadata:name: frontendnamespace: baselabels:app: frontendspec:ports:- port: 80name: httpselector:app: frontend---?apiVersion: apps/v1kind: Deploymentmetadata:name: product-v1namespace: baselabels:app: productversion: v1spec:replicas: 1selector:matchLabels:app: productversion: v1template:metadata:labels:app: productversion: v1spec:containers:- name: productimage: ccr.ccs.tencentyun.com/zhulei/testproduct1:v1imagePullPolicy: Alwaysenv:- name: POD_NAMEvalueFrom:fieldRef:fieldPath: metadata.name- name: REGIONvalue: "guangzhou-zoneB"ports:- containerPort: 7000---?apiVersion: apps/v1kind: Deploymentmetadata:name: product-v2namespace: baselabels:app: productversion: v2spec:replicas: 1selector:matchLabels:app: productversion: v2template:metadata:labels:app: productversion: v2spec:containers:- name: productimage: ccr.ccs.tencentyun.com/zhulei/testproduct2:v1imagePullPolicy: Alwaysenv:- name: POD_NAMEvalueFrom:fieldRef:fieldPath: metadata.name- name: REGIONvalue: "guangzhou-zoneB"ports:- containerPort: 7000---?apiVersion: v1kind: Servicemetadata:name: productnamespace: baselabels:app: productspec:ports:- port: 7000name: httpselector:app: product---?apiVersion: apps/v1kind: Deploymentmetadata:name: usernamespace: baselabels:app: userspec:replicas: 1selector:matchLabels:app: usertemplate:metadata:labels:app: userspec:containers:- name: userimage: ccr.ccs.tencentyun.com/zhulei/testuser:v1imagePullPolicy: Alwaysenv:- name: POD_NAMEvalueFrom:fieldRef:fieldPath: metadata.name- name: REGIONvalue: "guangzhou-zoneB"ports:- containerPort: 7000---?apiVersion: v1kind: Servicemetadata:name: usernamespace: baselabels:app: userspec:ports:- port: 7000name: httpselector:app: user---?apiVersion: apps/v1kind: Deploymentmetadata:name: stocknamespace: baselabels:app: stockspec:replicas: 1selector:matchLabels:app: stocktemplate:metadata:labels:app: stockspec:containers:- name: stockimage: ccr.ccs.tencentyun.com/zhulei/teststock:v1imagePullPolicy: Alwaysenv:- name: POD_NAMEvalueFrom:fieldRef:fieldPath: metadata.name- name: REGIONvalue: "guangzhou-zoneB"ports:- containerPort: 7000---?apiVersion: v1kind: Servicemetadata:name: stocknamespace: baselabels:app: stockspec:ports:- port: 7000name: httpselector:app: stock---?apiVersion: apps/v1kind: Deploymentmetadata:name: cartnamespace: baselabels:app: cartspec:replicas: 3selector:matchLabels:app: carttemplate:metadata:labels:app: cartspec:containers:- name: cartimage: ccr.ccs.tencentyun.com/zhulei/testcart:v1imagePullPolicy: Alwaysenv:- name: POD_NAMEvalueFrom:fieldRef:fieldPath: metadata.name- name: REGIONvalue: "guangzhou-zoneB"ports:- containerPort: 7000protocol: TCP---?apiVersion: v1kind: Servicemetadata:name: cartnamespace: baselabels:app: cartspec:ports:- name: httpport: 7000protocol: TCPselector:app: carttype: ClusterIP---?apiVersion: apps/v1kind: Deploymentmetadata:name: order-v1namespace: baselabels:app: orderversion: v1spec:replicas: 1selector:matchLabels:app: orderversion: v1template:metadata:labels:app: orderversion: v1spec:containers:- name: orderimage: ccr.ccs.tencentyun.com/zhulei/testorder1:v1imagePullPolicy: Alwaysenv:- name: POD_NAMEvalueFrom:fieldRef:fieldPath: metadata.name- name: REGIONvalue: "guangzhou-zoneB"ports:- containerPort: 7000protocol: TCP---?apiVersion: apps/v1kind: Deploymentmetadata:name: order-v2namespace: baselabels:app: orderversion: v2spec:replicas: 1selector:matchLabels:app: orderversion: v2template:metadata:labels:app: orderversion: v2spec:containers:- name: orderimage: ccr.ccs.tencentyun.com/zhulei/testorder2:v1imagePullPolicy: Alwaysenv:- name: POD_NAMEvalueFrom:fieldRef:fieldPath: metadata.name- name: REGIONvalue: "guangzhou-zoneB"ports:- containerPort: 7000protocol: TCP---?apiVersion: v1kind: Servicemetadata:name: ordernamespace: baselabels:app: orderspec:ports:- name: httpport: 7000protocol: TCPselector:app: ordertype: ClusterIP
部署配置完成后,未配置健康检查时,地域感知不生效,两个可用区的某一服务调用另外的服务是随机访问,不会按照就近访问的原则。
order 服务调用不同可用区的 stock 服务如下图所示:
?
?要开启服务访问的地域感知,需要配置所有服务的健康检查功能,通过将以下 yaml 文件提交至主集群实现:
apiVersion: networking.istio.io/v1alpha3kind: DestinationRulemetadata:name: cartnamespace: basespec:host: carttrafficPolicy:loadBalancer:consistentHash:httpHeaderName: UserIDoutlierDetection:consecutiveErrors: 5interval: 10000msbaseEjectionTime: 30000msmaxEjectionPercent: 10minHealthPercent: 50exportTo:- '*'?---apiVersion: networking.istio.io/v1alpha3kind: DestinationRulemetadata:name: frontendnamespace: basespec:host: frontendtrafficPolicy:outlierDetection:consecutiveErrors: 5interval: 10000msbaseEjectionTime: 30000msmaxEjectionPercent: 10minHealthPercent: 50exportTo:- '*'?---apiVersion: networking.istio.io/v1alpha3kind: DestinationRulemetadata:name: ordernamespace: basespec:host: ordertrafficPolicy:outlierDetection:consecutiveErrors: 5interval: 10000msbaseEjectionTime: 30000msmaxEjectionPercent: 10minHealthPercent: 50subsets:- name: v1labels:version: v1- name: v2labels:version: v2exportTo:- '*'?---apiVersion: networking.istio.io/v1alpha3kind: DestinationRulemetadata:name: productnamespace: basespec:host: producttrafficPolicy:outlierDetection:consecutiveErrors: 5interval: 10000msbaseEjectionTime: 30000msmaxEjectionPercent: 10minHealthPercent: 50subsets:- name: v1labels:version: v1- name: v2labels:version: v2?---apiVersion: networking.istio.io/v1alpha3kind: DestinationRulemetadata:name: stocknamespace: basespec:host: stocktrafficPolicy:outlierDetection:consecutiveErrors: 5interval: 10000msbaseEjectionTime: 30000msmaxEjectionPercent: 10minHealthPercent: 50exportTo:- '*'?---apiVersion: networking.istio.io/v1alpha3kind: DestinationRulemetadata:name: usernamespace: basespec:host: usertrafficPolicy:outlierDetection:consecutiveErrors: 5interval: 10000msbaseEjectionTime: 30000msmaxEjectionPercent: 10minHealthPercent: 50exportTo:- '*'
健康检查配置完成后,由可用区 A 集群的边缘代理网关访问网站服务,浏览商品页面,添加购物车,下单等操作,可用区 A 的边缘代理网关会将流量路由至相同可用区的前端 frontend 服务,前端服务也会地域感知就近调用同一可用区的 user、cart、order、stock 服务;通过可用区 B 的边缘代理网关访问网站业务,请求路由至可用区 B 的前端服务,可用区 B 服务也会就近调用相同可用区的服务。通过 Demo 页面左下角悬浮窗可以查看当前调用服务的可用区信息。地域感知如下图所示:
?
?