如何利用服务网格ASM使用集群外服务做集群内服务的灾备

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
简介: 本文档指导您如何配置阿里云服务网格(ASM)以实现在多集群环境下,服务间的优先访问及故障转移策略。

使用本文前,请完成前两篇文章的步骤:

完成后,当前的网络拓扑为:

image.png

本文演示的场景如下:

在cluster 1中也有一个httpbin服务。cluster 1中的sleep在本集群httpbin服务正常的情况下,优先访问本集群的httpbin,当本集群httpbin服务不正常时通过出口网关访问cluster 2中的httpbin。示例拓扑如下:

image.png

步骤一:在cluster 1中创建httpbin服务

参考文档:如何部署httpbin应用_服务网格(ASM)-阿里云帮助中心

步骤二:部署虚拟服务

本文要实现的功能是:

  1. 在sleep pod中访问httpbin:8000/headers,优先路由到本集群的httpbin服务,fallback到出口网关。
  2. 出口网关收到fallback流量时,此时请求的host是httpbin,需要在出口网关上配置虚拟服务,将出口网关上host为httpbin的服务转发给cluster 2的httpbin服务。

首先,配置虚拟服务,实现:优先路由到本集群的httpbin服务,fallback到出口网关。使用ASM的kubeconfig,创建如下yaml:

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: httpbin-vs
  namespace: default
spec:
  gateways:
  - egress-gateway
  - mesh
  hosts:
  - httpbin
  - httpbin:8000
  - httpbin.default.svc.cluster.local
  - httpbin.default.svc.cluster.local:8000
  http:
  - match:
    - gateways:
      - mesh
    route:
    - destination:
        host: httpbin
        port:
          number: 8000
      fallback:
        target:
          host: istio-egressgateway.istio-system.svc.cluster.local
          port:
            number: 80
  - match:
    - gateways:
      - egress-gateway
      port: 80
    route:
    - destination:
        host: test.com
        port:
          number: 443
      headers:
        request:
          set:
            host: test.com
      weight: 100

值得注意的是:需要在网关上加一段set请求header的配置,将host header设置为test.com。后面将会解释为什么出现这段配置。

步骤三:发起测试

1. 确保本集群的httpbin pod状态正常,发起测试

使用当前ACK集群的kubeconfig,执行如下命令:

kubectl exec deployment/sleep -it -- curl httpbin.default.svc.cluster.local:8000/status/200 -I
HTTP/1.1 200 OK
server: envoy
date: Thu, 01 Aug 2024 03:16:23 GMT
content-type: text/html; charset=utf-8
access-control-allow-origin: *
access-control-allow-credentials: true
content-length: 0
x-envoy-upstream-service-time: 4

此时查看sleep pod的日志,使用ACK的kubeconfig执行如下命令:

kubectl logs deployment/sleep -c istio-proxy | tail -1
{"authority_for":"httpbin.default.svc.cluster.local:8000","bytes_received":"0","bytes_sent":"0","downstream_local_address":"172.16.168.111:8000","downstream_remote_address":"192.168.36.29:45916","duration":"6","istio_policy_status":"-","method":"HEAD","path":"/status/200","protocol":"HTTP/1.1","request_id":"bee82ed5-a829-4387-90e3-d0e256bc79dc","requested_server_name":"-","response_code":"200","response_flags":"-","route_name":"-","start_time":"2024-08-01T03:18:45.556Z","trace_id":"-","upstream_cluster":"outbound|8000||httpbin.default.svc.cluster.local","upstream_host":"192.168.36.31:80","upstream_local_address":"192.168.36.29:60574","upstream_response_time":"6","upstream_service_time":"6","upstream_transport_failure_reason":"-","user_agent":"curl/8.1.2","x_forwarded_for":"-"}

从这段日志中的upstream_cluster是本集群的httpbin服务。

2. 将本集群httpbin deployment副本数设置为0,发起测试

使用当前ACK集群的kubeconfig,执行如下命令:

kubectl scale deployment httpbin --replicas 0

等待httpbin pod消失,再次执行测试命令:

kubectl exec deployment/sleep -it -- curl httpbin.default.svc.cluster.local:8000/status/200 -I
HTTP/1.1 200 OK
server: envoy
date: Thu, 01 Aug 2024 03:26:20 GMT
content-type: text/html; charset=utf-8
access-control-allow-origin: *
access-control-allow-credentials: true
content-length: 0
x-envoy-upstream-service-time: 4

可以看到访问依然成功,此时查看访问日志:

kubectl logs deployment/sleep -c istio-proxy | tail -1
{"authority_for":"httpbin.default.svc.cluster.local:8000","bytes_received":"0","bytes_sent":"0","downstream_local_address":"172.16.168.111:8000","downstream_remote_address":"192.168.36.29:44738","duration":"5","istio_policy_status":"-","method":"HEAD","path":"/status/200","protocol":"HTTP/1.1","request_id":"548b03c1-c549-4311-a695-b3787f835d29","requested_server_name":"-","response_code":"200","response_flags":"-","route_name":"-","start_time":"2024-08-01T03:26:20.956Z","trace_id":"-","upstream_cluster":"outbound|80||istio-egressgateway.istio-system.svc.cluster.local","upstream_host":"192.168.36.32:80","upstream_local_address":"192.168.36.29:40360","upstream_response_time":"4","upstream_service_time":"4","upstream_transport_failure_reason":"-","user_agent":"curl/8.1.2","x_forwarded_for":"-"}
目录
相关文章
|
1月前
|
运维 Kubernetes 安全
利用服务网格实现全链路mTLS(一):在入口网关上提供mTLS服务
阿里云服务网格(Service Mesh,简称ASM)提供了一个全托管式的服务网格平台,兼容Istio开源服务网格,用于简化服务治理,包括流量管理和拆分、安全认证及网格可观测性,有效减轻开发运维负担。ASM支持通过mTLS提供服务,要求客户端提供证书以增强安全性。本文介绍如何在ASM入口网关上配置mTLS服务并通过授权策略实现特定用户的访问限制。首先需部署ASM实例和ACK集群,并开启sidecar自动注入。接着,在集群中部署入口网关和httpbin应用,并生成mTLS通信所需的根证书、服务器证书及客户端证书。最后,配置网关上的mTLS监听并设置授权策略,以限制特定客户端对特定路径的访问。
109 2
|
1月前
|
Prometheus Kubernetes 监控
打造无缝灾备新境界:运用服务网格ASM,将集群外服务无缝融入集群内服务,铸就高可用性坚盾!
【8月更文挑战第2天】随着微服务架构的应用,服务的高可用性变得至关重要。服务网格如阿里巴巴的ASM提供流量管理、服务发现等功能,支撑高可靠服务系统。本文介绍如何利用ASM实现集群外服务作为集群内服务的灾备方案,确保服务连续性。先决条件包括已部署ASM的Kubernetes集群环境及内外部的关键服务副本。通过定义服务条目、配置虚拟服务和目的地规则,可实现自动或手动故障转移。借助ASM的流量管理能力,确保服务高可用性和业务连续性。
38 10
|
1月前
|
Kubernetes 安全 数据安全/隐私保护
利用服务网格实现全链路mTLS(二):通过出口网关访问外部mTLS服务
阿里云服务网格(Service Mesh,简称ASM)提供了一个全托管式的服务网格平台,兼容Istio开源服务网格,简化服务治理,包括流量管理、服务间通信安全及网格可观测性。ASM出口网关统一管理网格内的出口流量,实现全链路加密通信与精细访问控制。本文介绍如何配置ASM出口网关以管理出口流量并发起mTLS通信,涉及配置ServiceEntry、创建出口网关、设置虚拟服务及目标规则等步骤,最终实现安全可控的mTLS服务访问。
116 3
|
2月前
|
Cloud Native 测试技术 开发者
阿里云服务网格ASM多集群实践(二):高效按需的应用多环境部署与全链路灰度发布
介绍服务网格ASM提出的一种多集群部署下的多环境部署与全链路灰度发布解决方案。
|
4月前
|
负载均衡 安全 网络协议
如何通过计算巢在ACK集群上使用Istio服务网格
本文主要介绍怎么通过计算巢部署Isito服务网格,并介绍了使用示例。
|
4月前
|
存储 机器学习/深度学习 负载均衡
模型服务网格:云原生下的模型服务管理
模型服务网格:云原生下的模型服务管理
78459 5
模型服务网格:云原生下的模型服务管理
|
11月前
|
监控 安全 大数据
阿里服务的ASM、MSE和ARMS都有其各自的应用场景
阿里服务的ASM、MSE和ARMS都有其各自的应用场景
337 39
|
10月前
|
负载均衡 安全 Cloud Native
[大厂实践] 零配置服务网格与按需集群发现
[大厂实践] 零配置服务网格与按需集群发现
77 0
|
11月前
|
安全 数据安全/隐私保护 开发者
实现安全的服务通信:探索如何使用服务网格来确保服务间的安全通信
实现安全的服务通信:探索如何使用服务网格来确保服务间的安全通信
100 0
|
11月前
|
Kubernetes 监控 Go
在Kubernetes上安装和配置Istio:逐步指南,展示如何在Kubernetes集群中安装和配置Istio服务网格
在Kubernetes上安装和配置Istio:逐步指南,展示如何在Kubernetes集群中安装和配置Istio服务网格
191 0