背景信息
ASM企业版实例中,兼容 Istio,支持多个Kubernetes集群统一流量管理,为容器应用服务提供一致性的通信控制。基于服务网格最新的“数据面KubeAPI访问”能力,能够通过数据面集群的KubeConfig来管理Istio资源。和云效Flow集成后,可以享受DevOps、GitOps带来的应用发布的便利性,还能够利用Istio细粒度的流量管控能力来实现蓝绿发布,保障上线的稳定性。
前提条件
创建Istio版本为1.12.4.50及以上的ASM实例。
创建容器服务Kubernetes (ACK) 集群。
将ACK集群添加到ASM实例。
Service/VirtualService/DestinationRule同名。
Deployment的labels内包含有Service的全部selector labels,如:
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
run: spring-boot-sample
name: spring-boot-sample
spec:
replicas: 2
selector:
matchLabels:
run: spring-boot-sample
template:
metadata:
labels:
run: spring-boot-sample
spec:
containers:
- image: ${IMAGE}
name: app
---
apiVersion: v1
kind: Service
metadata:
name: spring-boot-service
labels:
test: test
labele2: label
spec:
ports:
- name: http
port: 8080
protocol: TCP
targetPort: 8080
- name: https
port: 443
protocol: TCP
targetPort: 443
selector:
run: spring-boot-sample
sessionAffinity: None
type: ClusterIP
实践1:流水线部署应用
目标:以Istio 在ASM实例关联的集群中部署应用为例,我们将首页的标题文字进行更换。代码提交后,执行阿里云云效流水线,生成镜像,自动将应用的流量管理(VirtualService、Gateway、DestinationRule)相关的资源创建或更新到阿里云服务网格 ASM 集群中,将应用程序编排(Deployment、Service)创建或更新到阿里云容器服务平台ACK集群中。
创建流水线如下。流水线源配置为GitHub仓库,测试地址为https://github.com/AliyunContainerService/asm-labs,您也可以fork出来,然后进行个性化修改。分支选择flow-demo。
执行的步骤如下:
流水线流程配置
将镜像仓库地址为替换为您的地址空间:registry.cn-hangzhou.aliyuncs.com/{your_name_space}/productpage:${DATETIME}。这里我们使用DATETIME作为版本号。Dockerfile路径为productpage/Dockerfile。在Kubernetes发布的Kubectl发布中,设置变量ProductpageImage为前面配置的镜像仓库地址,在代码仓库的YAML文件中,productpage的镜像被设置为了${ProductpageImage}与其对应。
添加数据面集群并注入 Sidecar 代理
在阿里云服务网格ASM控制台,进入ASM实例后,在集群与工作负载管理中,添加希望流水线配置的ACK容器服务实例。并在全局命名空间中,为选定的命名空间(如default)启用 Sidecar 自动注入。
创建ASM网关
为了方便的访问我们流水线部署出的应用程序,需要创建ASM网关来作为访问入口,端口设置为 80。
执行流水线
查看部署效果
在ACK集群中,确认镜像能够成功拉去并且启动正常,如拉取个人私有镜像失败,请参考使用免密组件拉取容器镜像。
复制前面创建的ASM网关的地址,在浏览器中输入http://{ASM网关地址}/productpage,可以看到我们修改的标题已生效。
当前显示界面固定为reviews-v1版本。
实践2:蓝绿发布
阿里云服务网格ASM和云效集成,提供了蓝绿发布的能力。从而让用户可以更安全的基于Istio的流量管理策略实现应用的安全发布。
目标:在完成“实践1:流水线部署应用”的前提下,通过蓝绿发布,将reviews版本从原来的v1更新为v2版本。
创建新的流水线
如实践1配置流水线源,创建阶段ASM蓝绿发布。这里我们设置镜像为reviews-v2版本的镜像:docker.io/istio/examples-bookinfo-reviews-v2:1.16.4。灰度初始化流量为0%,并且只有带特定cookie标识的用户能够访问到蓝绿版本。
执行
在云效 Flow中,蓝绿发布前需要明确指明使用哪个版本的工作负载,将其他的版本的工作负载全部清空,确保流量只流入稳定版(reviews-v1)。
此时,在阿里云服务网格ASM控制台查看虚拟服务状态。此时状态如下所示。
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
name: reviews
namespace: default
spec:
hosts:
- reviews
http:
- match:
- headers:
cookie:
regex: ^(.*?;)?(gray=true)(;.*)?$
route:
- destination:
host: reviews
subset: v20220622103841
- route:
- destination:
host: reviews
subset: v1
weight: 100
- destination:
host: reviews
subset: v20220622103841
目标规则如下所示。
apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
name: reviews
namespace: default
spec:
host: reviews
subsets:
- labels:
version: v1
name: v1
- labels:
version: v20220622103841
name: v20220622103841
测试验证
因为reviews服务是由后端服务productpage来调用的,不方便携带特定 token 来进行灰度测试。
修改header中cookie设置,改为使用end-user的登录信息,设定只要登录用户名称为asm,则显示灰度版本。
复制前面创建的ASM网关的地址,在浏览器中输入http://{ASM网关地址}/productpage,点击右上角进行登录,输入用户名称为asm,密码任意输入。如果是未登录状态,则显示v1版本的reviews信息。
继续发布
在通过了灰度版本的测试之后,将全部的流量转为新版本(reviews-v2)。点击继续发布,完成发布。
发布完成后,未登录时也显示reviews-v2的版本。
发布完成后,reviews虚拟服务的状态。
总结
在Kubernetes中Service与多个版本的Deployment实例通过Label进行关联。蓝绿发布开始,云效 Flow会基于当前的Deployment实例创建一个新版本的应用Deployment实例。等待蓝环境创建完成后通过更新ASM的VirtualService和DestinationRule资源对象,进一步控制流量与特定版本Deployment实例之间的路由策略。
根据发布设置,可以修改VirtualService确定蓝/绿环境的流量权重。用户也可以设置灰度标,确定哪些流量会直接进入到蓝环境中。在人工验证完成后,完成发布将所有流量切流到蓝环境,并且将原有的绿环境实例移除。
作为业内首个全托管Istio兼容的ASM,一开始从架构上就保持了与社区、业界趋势的一致性,控制平面的组件托管在阿里云侧,与数据面侧的用户集群独立。ASM产品是基于社区Istio定制实现的,在托管的控制面侧提供了用于支撑精细化的流量管理和安全管理的组件能力。通过托管模式,解耦了Istio组件与所管理的Kubernetes集群的生命周期管理,使得架构更加灵活,提升了系统的可伸缩性。从2022年4月1日起,ASM正式推出商业化版本, 提供了更丰富的能力、更大的规模支持及更完善的技术保障,更好地满足不同需求场景。