随着互联网和移动互联网的快速发展,快速迭代和频繁上线的需求越来越高,因此,在实现产品发布时,如何灵活地实现版本的发布和回滚,就成为了业务开发和 DevOps 的重要课题。 Kubernetes 集群作为目前业内使用最广泛的容器化集群管理工具之一,在容器应用部署、更新、扩容等方面有着很强的支持能力。而通过 Deployment 实现灰度发布,也是 Kubernetes 集群中的一种常见的技术方案。
什么是灰度发布
灰度发布(Gray Release)又称灰度测试、灰度上线,是指在软件的发布阶段,将用户分成不同的群体进行测试或者发布。具体而言,就是将业务流量在产品的不同版本之间、不同分组和不同时间上进行分配和控制,以达到在不影响大规模用户的前提下实现业务运转的目标。这其中包含了很多的技术方案,其中通过 Kubernetes 集群中的 Deployment 实现灰度发布是目前较为流行的一种方案。
Kubernetes Deployment 简介
Deployment 是 Kubernetes 用来进行容器化应用的一种资源对象,它与 ReplicaSet 一起协作,实现了容器应用的部署、缩容、扩容等操作。在 Deployment 中,我们可以定义应用所需的 Pod 副本数、容器镜像、网络配置等等参数。当 Deployment 更新时,ReplicaSet 会自动执行滚动升级,按照配置更新一部分 Pod,直到所有 Pod 更新完成,从而实现灰度发布。
Kubernetes Deployment 中的灰度发布
在 Kubernetes 集群中,我们可以通过 Deployment 进行灰度发布。例如,一个应用有两个版本:版本 A 和版本 B。在灰度发布中,我们将流量分配到两种版本上,假设需要将流量由 100% 逐渐调整到 50% 的比例上,具体步骤如下:
- Creaet deployment and Ready RBAC:
// javascriptcn.com 代码示例 apiVersion: apps/v1 kind: Deployment metadata: name: app-a labels: app: app-a spec: replicas: 5 selector: matchLabels: app: app-a template: metadata: labels: app: app-a spec: containers: - name: app-a image: XXXXXXXXXXXXXXXXXX/app-a:v1.0 ports: - containerPort: 5000 --- apiVersion: apps/v1 kind: Deployment metadata: name: app-b labels: app: app-b spec: replicas: 5 selector: matchLabels: app: app-b template: metadata: labels: app: app-b spec: containers: - name: app-b image: XXXXXXXXXXXXXXXXXX/app-b:v1.0 ports: - containerPort: 5000
- 创建 service:
// javascriptcn.com 代码示例 apiVersion: v1 kind: Service metadata: name: app-service spec: selector: app: app-a ports: - name: http protocol: TCP port: 5000 targetPort: 5000
- 创建 Ingress:
// javascriptcn.com 代码示例 apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: app-ingress spec: rules: - host: app.com http: paths: - path: /app pathType: Prefix backend: service: name: app-service port: name: http
- 配置灰度发布策略:
// javascriptcn.com 代码示例 apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: app-ingress spec: rules: - host: app.com http: paths: - path: /app pathType: Prefix backend: service: name: app-service port: name: http # 灰度发布策略 mode=percentage,value=50代表 50% annotations: nginx.ingress.kubernetes.io/canary: "true" nginx.ingress.kubernetes.io/canary-by-header: "user-agent" nginx.ingress.kubernetes.io/canary-by-header-value: "app/version=a" nginx.ingress.kubernetes.io/canary-mode: "annotation" nginx.ingress.kubernetes.io/canary-weight: "50"
在以上的配置中,我们通过添加了 canary-mode、canary-weight、canary-by-header-value 等 Annotation,来实现容器应用的灰度发布。其中 canary-mode 表示灰度发布模式,可以为 headers、cookie 或者 percentage。canary-weight 表示权重比例,canary-by-header-value 表示请求头中 app/version=a 的请求会被分配到 app-a 的版本中,对于请求头中没有该字段的请求,根据权重进行分配。
灰度发布的好处
灰度发布不仅可以在保证版本上线质量的同时,减小版本回退和灾难恢复时间,还可以有效降低灾难风险,确保应用的正常运转。另外,使用灰度发布,还可以通过较小的代价渐进式地提升业务运维效率,减少运维的压力,在快速迭代的应用场景下非常适用。
总结
灰度发布在实现版本的上线、更新、回滚等方面,有着很大的优势,对于业务开发和 DevOps 完全能够满足需求。通过 Kubernetes 集群中的 Deployment 实现灰度发布,不仅可以提高应用发布的质量和效率,同时也可以增加灰度发布的合法性和安全性,为业务运转带来更多的价值。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/652a70c27d4982a6ebcc7071