阿里云服务网格(Alibaba Cloud Service Mesh,简称ASM)提供了一个全托管式的服务网格平台,兼容于社区Istio开源服务网格,用于简化服务的治理,包括服务调用之间的流量路由与拆分管理、服务间通信的认证安全以及网格可观测性能力,从而极大地减轻开发与运维的工作负担。本文是关于服务网格ASM流量治理相关的workshop。
前提条件
- 创建至少一个ASM实例,并添加至少一个ACK集群到该实例中。详情请参见创建ASM实例和添加集群到ASM实例。
- 在ACK控制台获取ACK的kubeconfig 和ASM控制台获取ASM的kubeconfig
环境准备参考:
第一步:在ASM控制台,创建网格实例:
第二步:添加kubernetes集群到服务网格ASM
实践内容
本文用到的workshop用到的相关资源
1.部署应用并注入Sidecar代理
(1) 在ASM控制台开启Sidecar的自动注入或者
使用kubectl --kubeconfig asm_kubeconfig label default istio-injection = enabled
(2) 部署应用
kubectl --kubeconfig ack_kubeconfig apply -f app.yaml
今天演示应用的部署架构,包括产品服务、增值服务(包括三个版本)、产品详情、风格转换服务四个多语言开发的应用,包括一个Ingress 入口网关和一个外部服务,并且通过服务网格ASM注入了Sidecar代理。
应用增值服务V1
关于增值服务V2
关于增值服务V3
接下来的操作都可以使用ASM控制台或者Kubectl完成。
2.部署入口网关访问应用
使用控制台一键部署网关访问我们的应用。
部署网关
新增网关规则
使用ASM控制台或者Kubectl
kubectl --kubeconfig asm_kubeconfig apply -f gateway.yaml
apiVersion: networking.istio.io/v1alpha3 kind: Gateway metadata: name: demo-default-gateway spec: selector: istio: ingressgateway servers: - port: number: 80 name: http protocol: HTTP hosts: - "*"
新增虚拟服务
使用ASM控制台或者Kubectl
kubectl --kubeconfig asm_kubeconfig apply -f gateway_virtualservice.yaml
apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: demo spec: hosts: - "*" gateways: - demo-default-gateway http: - match: - uri: exact: /productpage - uri: exact: /login - uri: exact: /logout - uri: prefix: /static - uri: prefix: /api/v1/products route: - destination: host: productpage.default.svc.cluster.local port: number: 9080
3.基于ASM完成蓝绿和灰度发布
kubectl --kubeconfig asm_kubeconfig apply -f addedvalues_DestinationRule.yaml
apiVersion: networking.istio.io/v1beta1 kind: DestinationRule metadata: name: addedvalues spec: host: addedvalues subsets: - name: v1 labels: version: v1 - name: v2 labels: version: v2 - name: v3 labels: version: v3
50%流量到addedvaluesV1,50%流量到addedvaluesV2
kubectl --kubeconfig asm_kubeconfig apply -f addedvalues_VirtualService_v1_50_v2_50.yaml
apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: addedvalues spec: hosts: - addedvalues http: - route: - destination: host: addedvalues subset: v1 weight: 50 - destination: host: addedvalues subset: v2 weight: 50
100%流量到addedvaluesV2
kubectl --kubeconfig asm_kubeconfig apply -f addedvalues_VirtualService_v1_0_v2_100.yaml
apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: addedvalues spec: hosts: - addedvalues http: - route: - destination: host: addedvalues subset: v1 weight: 0 - destination: host: addedvalues subset: v2 weight: 100
4.支持多种流量治理能力以故障注入为例
故障注入使得调用ddedvalues服务时返回400
kubectl --kubeconfig asm_kubeconfig apply -f addedvalues_VirtualService_v1_v2_fault.yaml
apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: addedvalues spec: hosts: - addedvalues http: - fault: abort: httpStatus: 400 percentage: value: 100 route: - destination: host: addedvalues subset: v1 weight: 50 - destination: host: addedvalues subset: v2 weight: 50
将yunqi开头的用户流量切到addedvaluesV3
kubectl --kubeconfig asm_kubeconfig apply -f addedvalues_VirtualService_v3.yaml
apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: addedvalues spec: hosts: - addedvalues http: - match: - headers: end-user: prefix: yunqi route: - destination: host: addedvalues subset: v3 weight: 100 - fault: abort: httpStatus: 400 percentage: value: 100 route: - destination: host: addedvalues subset: v1 weight: 50 - destination: host: addedvalues subset: v2 weight: 50
4. 服务网格ASM可观测性开箱即用
在服务网格SM控制台功能设置页面一键开启可观测性能力,具体可以参考ASM对应的文档。
Mesh访问日志详细记录
Mesh访问日志监控中心
网格Prometheus监控指标
调用拓扑和调用链路
5. 服务网格ASM支持零信任安全
(1)控制服务访问,只允许default下应用查询addedvalues
各种零信任安全能力也支持kubectl或者表单操作
kubectl --kubeconfig asm_kubeconfig apply -f addedvalues_AuthorizationPolicy_allow.yaml
apiVersion: security.istio.io/v1beta1 kind: AuthorizationPolicy metadata: name: allow-default namespace: default spec: selector: matchLabels: app: addedvalues action: ALLOW rules: - from: - source: namespaces: - default to: - operation: methods: - GET
(2)在Sidecar管理控制访问外部服务
可以在服务网格ASM中设置对外部服务的访问策略OutboundTrafficPolicy,用于配置对外部服务(即未在Istio的内部服务注册表中定义的服务)的访问策略。
- 如果该选项设置为ALLOW_ANY,则Sidecar代理允许对未知服务的透传通过。优点是直接透传对外部服务的访问,缺点是失去了对外部服务流量的网格层面的监视和控制。
- 如果该选项设置为REGISTRY_ONLY,则Sidecar代理将阻止任何没有在网格中定义了HTTP服务或服务条目的主机
设置REGISTRY_ONLY后由于V3依赖了外部服务,所以V3无法访问,加入下面的ServiceEntry后访问正常。
kubectl --kubeconfig asm_kubeconfig apply -f ServiceEntry.yaml
apiVersion: networking.istio.io/v1alpha3 kind: ServiceEntry metadata: name: external-svc-styletransfer spec: hosts: - apply.mcard.boc.cn location: MESH_EXTERNAL ports: - number: 443 name: https protocol: HTTPS resolution: NONE
(3)还有很多其他功能,大家可以参考服务网格ASM的官方文章,包括控制入口网关的访问,OPA策略等等。
6.服务网格ASM生命周期管理
阿里云服务网格(Alibaba Cloud Service Mesh,简称ASM)提供了一个全托管式的服务网格平台,兼容于社区Istio开源服务网格,标准统一,并且可以实现控制平面的平滑升级和数据面的热升级能力。
控制平面一键平滑升级
数据平面升级
数据平面可以选择应用发布滚动升级到当前控制面对应的数据面最新版本。
同时服务网格ASM也支持数据平面的热升级能力,也在10月份在ASM控制台上推出。
欢迎使用服务网格ASM和加入服务网格ASM用户交流群,有什么问题欢迎沟通交流。