在现代化的架构中,云原生应用的开发和部署成为了一种趋势。Kubernetes 作为云原生的代表,能够帮助前端开发人员实现对应用的自动化管理和部署。在实际部署过程中,我们需要实现线上流量的切换,以便进行版本回退或灰度发布。本文将介绍在 Kubernetes 上如何实现线上流量切换方案,以及如何实现合理的部署策略。
线上流量切换的实现方式
Kubernetes 实现了对于应用的自动化管理和部署,而在线上流量切换时,我们需要解决以下两个问题:
- 如何将流量从一个版本迁移到另一个版本;
- 如何避免线上服务中断。
部署策略
Kubernetes 提供了两种部署策略:滚动更新和蓝绿部署。
滚动更新
滚动更新是指将新版本的 Pod 逐步替换掉旧版本的 Pod,直到所有 Pod 均为新版本。在滚动更新过程中,如果出现了问题,我们可以灵活回滚到旧版本,因为旧版本的 Pod 仍然在运行。
示例代码:
// javascriptcn.com 代码示例 apiVersion: apps/v1 kind: Deployment metadata: name: app-deployment spec: replicas: 5 # 运行 5 个 Pod 的副本 selector: matchLabels: app: frontend template: metadata: labels: app: frontend spec: containers: - name: app image: myapp:v2 # 新版本的镜像
蓝绿部署
蓝绿部署是指在同一时间只有一个版本的 Pod 在运行。将新版本的 Pod 部署在一个新的服务中,在测试通过后再将流量切换到新服务中,实现零宕机无感知升级。
示例代码:
// javascriptcn.com 代码示例 apiVersion: v1 kind: Service metadata: name: myapp spec: selector: app: frontend ports: - name: http port: 5000 --- apiVersion: apps/v1 kind: Deployment metadata: name: myapp-v1 # 旧版本的 Deployment spec: replicas: 5 selector: matchLabels: app: frontend template: metadata: labels: app: frontend spec: containers: - name: app image: myapp:v1 --- apiVersion: apps/v1 kind: Deployment metadata: name: myapp-v2 # 新版本的 Deployment spec: replicas: 0 # 不运行 Pod,准备切换流量 selector: matchLabels: app: frontend template: metadata: labels: app: frontend spec: containers: - name: app image: myapp:v2
在部署应用时,我们可以考虑两种策略,即并行发布和渐进发布:
- 并行发布:将旧版本和新版本的服务一起运行,在确定新版本无问题后再将流量切换到新版本中。
- 渐进发布:先将一部分流量切换到新版本,再逐步将所有流量切换到新版本。
线上流量切换
在部署完成后,我们需要实现线上流量的切换,以完成应用的升级。Kubernetes 提供了多种实现方式,例如 Ingress、Service 和 HPA。
Ingress
Ingress 是在 Kubernetes 集群外部暴露 HTTP 和 HTTPS 路由的 API 对象。我们可以使用 Ingress 来将流量从旧版本的 Deployment 切换到新版本的 Deployment。
示例代码:
// javascriptcn.com 代码示例 apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: myapp-ingress spec: rules: - host: myapp.example.com http: paths: - path: / pathType: Prefix backend: service: name: myapp port: name: http --- apiVersion: v1 kind: Service metadata: name: myapp spec: selector: app: frontend ports: - name: http port: 5000 --- apiVersion: apps/v1 kind: Deployment metadata: name: myapp-v1 spec: replicas: 5 selector: matchLabels: app: frontend template: metadata: labels: app: frontend spec: containers: - name: app image: myapp:v1 --- apiVersion: apps/v1 kind: Deployment metadata: name: myapp-v2 spec: replicas: 0 selector: matchLabels: app: frontend template: metadata: labels: app: frontend spec: containers: - name: app image: myapp:v2
Service
Service 是 Kubernetes 中提供服务发现机制的 API 对象。我们可以使用 Service 来将流量从旧版本的 Deployment 切换到新版本的 Deployment,或者从一个服务切换到另一个服务。
示例代码:
// javascriptcn.com 代码示例 apiVersion: v1 kind: Service metadata: name: myapp spec: selector: app: frontend ports: - name: http port: 5000 type: NodePort # 暴露 NodePort 类型的端口 --- apiVersion: apps/v1 kind: Deployment metadata: name: myapp-v1 spec: replicas: 5 selector: matchLabels: app: frontend template: metadata: labels: app: frontend spec: containers: - name: app image: myapp:v1 --- apiVersion: apps/v1 kind: Deployment metadata: name: myapp-v2 spec: replicas: 0 selector: matchLabels: app: frontend template: metadata: labels: app: frontend spec: containers: - name: app image: myapp:v2
HPA
HPA(Horizontal Pod Autoscaler)是自动调整 Pod 副本数的机制。我们可以使用 HPA 来根据流量负载自动调整 Pod 副本数。
示例代码:
// javascriptcn.com 代码示例 apiVersion: autoscaling/v2beta2 kind: HorizontalPodAutoscaler metadata: name: myapp-hpa spec: scaleTargetRef: kind: Deployment name: myapp minReplicas: 1 maxReplicas: 10 metrics: - type: Resource resource: name: cpu target: type: Utilization averageUtilization: 50 --- apiVersion: v1 kind: Service metadata: name: myapp spec: selector: app: frontend ports: - name: http port: 5000 --- apiVersion: apps/v1 kind: Deployment metadata: name: myapp spec: replicas: 5 selector: matchLabels: app: frontend template: metadata: labels: app: frontend spec: containers: - name: app image: myapp:v1 resources: requests: cpu: 200m # 每个 Pod 请求 200 毫核 CPU limits: cpu: 500m # 每个 Pod 最多占用 500 毫核 CPU
实际应用
在实际应用中,我们应该选取合适的部署策略和实现方式,以便完成应用的升级和线上流量的切换。在实际部署时,我们需要注意以下几个问题:
- 在部署应用时,尽量使用容器构建工具,例如 Docker;
- 在进行流量切换时,需要先进行充分的测试;
- 需要根据实际需求,选择合适的部署策略和实现方式;
- 如果出现问题,需要及时回滚。
总结
Kubernetes 下线上流量切换方案是前端开发人员必备的技能之一。在实际应用中,我们需要选取合适的部署策略和实现方式,以便实现零宕机升级和流量切换。在实际部署时,需要充分测试,根据实际需求实现合理的部署策略,并在出现问题时及时回滚。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/6535cce87d4982a6ebd64ca3