Version: v1.1

多集群应用交付

本章节会介绍如何使用 KubeVela 完成应用的多集群应用交付。

简介

如今,越来越多的企业及开发者出于不同的原因,开始在多集群环境中进行应用交付:

  • 由于 Kubernetes 集群存在着部署规模的局限性(单一集群最多容纳 5k 节点),需要应用多集群技术来部署、管理海量的应用。
  • 考虑到稳定性及高可用性,同一个应用可以部署在多个集群中,以实现容灾、异地多活等需求。
  • 应用可能需要部署在不同的区域来满足不同政府对于数据安全性的政策需求。

下文将会介绍如何在 KubeVela 中使用多集群技术帮助你快速将应用部署在多集群环境中。

准备工作

在使用多集群应用部署之前,你需要将子集群通过 KubeConfig 加入到 KubeVela 的管控中来。Vela CLI 可以帮你实现这一点。

  1. vela cluster join <your kubeconfig path>

该命令会自动使用 KubeConfig 中的 context.cluster 字段作为集群名称,你也可以使用 --name 参数来指定,如

  1. vela cluster join stage-cluster.kubeconfig --name cluster-staging
  2. vela cluster join prod-cluster.kubeconfig --name cluster-prod

在子集群加入 KubeVela 中后,你同样可以使用 CLI 命令来查看当前正在被 KubeVela 管控的所有集群。

  1. $ vela cluster list
  2. CLUSTER TYPE ENDPOINT
  3. cluster-prod tls https://47.88.4.97:6443
  4. cluster-staging tls https://47.88.7.230:6443

如果你不需要某个子集群了,还可以将子集群从 KubeVela 管控中移除。

  1. $ vela cluster detach cluster-prod

当然,如果现在有应用正跑在该集群中,这条命令会被 KubeVela 拒绝。

部署多集群应用

KubeVela 将一个 Kubernetes 集群看作是一个环境,对于一个应用,你可以将其部署在多个环境中。

下面的这个例子将会把应用先部署在预发环境中,待确认应用正常运行后,再将其部署在生产环境中。

对于不同的环境,KubeVela 支持进行差异化部署。比如在本文的例子中,预发环境只使用 webservice 组件而不是用 worker 组件,同时 webservice 也只部署了一份。而在生产环境中,两个组件都会使用,而且 webservice 还会部署三副本。

  1. apiVersion: core.oam.dev/v1beta1
  2. kind: Application
  3. metadata:
  4. name: example-app
  5. namespace: default
  6. spec:
  7. components:
  8. - name: hello-world-server
  9. type: webservice
  10. properties:
  11. image: crccheck/hello-world
  12. port: 8000
  13. traits:
  14. - type: scaler
  15. properties:
  16. replicas: 1
  17. - name: data-worker
  18. type: worker
  19. properties:
  20. image: busybox
  21. cmd:
  22. - sleep
  23. - '1000000'
  24. policies:
  25. - name: example-multi-env-policy
  26. type: env-binding
  27. properties:
  28. envs:
  29. - name: staging
  30. placement: # 选择要部署的集群
  31. clusterSelector:
  32. name: cluster-staging
  33. selector: # 选择要使用的组件
  34. components:
  35. - hello-world-server
  36. - name: prod
  37. placement:
  38. clusterSelector:
  39. name: cluster-prod
  40. patch: # 对组件进行差异化配置
  41. components:
  42. - name: hello-world-server
  43. type: webservice
  44. traits:
  45. - type: scaler
  46. properties:
  47. replicas: 3
  48. - name: health-policy-demo
  49. type: health
  50. properties:
  51. probeInterval: 5
  52. probeTimeout: 10
  53. workflow:
  54. steps:
  55. # 部署到预发环境中
  56. - name: deploy-staging
  57. type: deploy2env
  58. properties:
  59. policy: example-multi-env-policy
  60. env: staging
  61. # 手动确认
  62. - name: manual-approval
  63. type: suspend
  64. # 部署到生产环境中
  65. - name: deploy-prod
  66. type: deploy2env
  67. properties:
  68. policy: example-multi-env-policy
  69. env: prod

在应用创建后,它会通过 KubeVela 工作流完成部署。

你可以参考多环境部署健康检查的用户手册来查看更多参数细节。

首先,它会将应用部署到预发环境中,你可以运行下面的命令来查看应用的状态。

  1. > kubectl get application example-app
  2. NAME COMPONENT TYPE PHASE HEALTHY STATUS AGE
  3. example-app hello-world-server webservice workflowSuspending true Ready:1/1 10s

可以看到,当前的部署工作流在 manual-approval 步骤中暂停。

  1. ...
  2. status:
  3. workflow:
  4. appRevision: example-app-v1:44a6447e3653bcc2
  5. contextBackend:
  6. apiVersion: v1
  7. kind: ConfigMap
  8. name: workflow-example-app-context
  9. uid: 56ddcde6-8a83-4ac3-bf94-d19f8f55eb3d
  10. mode: StepByStep
  11. steps:
  12. - id: wek2b31nai
  13. name: deploy-staging
  14. phase: succeeded
  15. type: deploy2env
  16. - id: 7j5eb764mk
  17. name: manual-approval
  18. phase: succeeded
  19. type: suspend
  20. suspend: true
  21. terminated: false
  22. waitCount: 0

你也可以检查 status.service 字段来查看应用的健康状态。

  1. ...
  2. status:
  3. services:
  4. - env: staging
  5. healthy: true
  6. message: 'Ready:1/1 '
  7. name: hello-world-server
  8. scopes:
  9. - apiVersion: core.oam.dev/v1alpha2
  10. kind: HealthScope
  11. name: health-policy-demo
  12. namespace: test
  13. uid: 6e6230a3-93f3-4dba-ba09-dd863b6c4a88
  14. traits:
  15. - healthy: true
  16. type: scaler
  17. workloadDefinition:
  18. apiVersion: apps/v1
  19. kind: Deployment

通过工作流的 resume 指令,你可以在确认当前部署正常后,继续将应用部署至生产环境中。

  1. > vela workflow resume example-app
  2. Successfully resume workflow: example-app

再次确认应用的状态:

  1. > kubectl get application example-app
  2. NAME COMPONENT TYPE PHASE HEALTHY STATUS AGE
  3. example-app hello-world-server webservice running true Ready:1/1 62s
  1. status:
  2. services:
  3. - env: staging
  4. healthy: true
  5. message: 'Ready:1/1 '
  6. name: hello-world-server
  7. scopes:
  8. - apiVersion: core.oam.dev/v1alpha2
  9. kind: HealthScope
  10. name: health-policy-demo
  11. namespace: default
  12. uid: 9174ac61-d262-444b-bb6c-e5f0caee706a
  13. traits:
  14. - healthy: true
  15. type: scaler
  16. workloadDefinition:
  17. apiVersion: apps/v1
  18. kind: Deployment
  19. - env: prod
  20. healthy: true
  21. message: 'Ready:3/3 '
  22. name: hello-world-server
  23. scopes:
  24. - apiVersion: core.oam.dev/v1alpha2
  25. kind: HealthScope
  26. name: health-policy-demo
  27. namespace: default
  28. uid: 9174ac61-d262-444b-bb6c-e5f0caee706a
  29. traits:
  30. - healthy: true
  31. type: scaler
  32. workloadDefinition:
  33. apiVersion: apps/v1
  34. kind: Deployment
  35. - env: prod
  36. healthy: true
  37. message: 'Ready:1/1 '
  38. name: data-worker
  39. scopes:
  40. - apiVersion: core.oam.dev/v1alpha2
  41. kind: HealthScope
  42. name: health-policy-demo
  43. namespace: default
  44. uid: 9174ac61-d262-444b-bb6c-e5f0caee706a
  45. workloadDefinition:
  46. apiVersion: apps/v1
  47. kind: Deployment

现在,工作流中的所有步骤都已完成。

  1. ...
  2. status:
  3. workflow:
  4. appRevision: example-app-v1:44a6447e3653bcc2
  5. contextBackend:
  6. apiVersion: v1
  7. kind: ConfigMap
  8. name: workflow-example-app-context
  9. uid: e1e7bd2d-8743-4239-9de7-55a0dd76e5d3
  10. mode: StepByStep
  11. steps:
  12. - id: q8yx7pr8wb
  13. name: deploy-staging
  14. phase: succeeded
  15. type: deploy2env
  16. - id: 6oxrtvki9o
  17. name: manual-approval
  18. phase: succeeded
  19. type: suspend
  20. - id: uk287p8c31
  21. name: deploy-prod
  22. phase: succeeded
  23. type: deploy2env
  24. suspend: false
  25. terminated: false
  26. waitCount: 0

更多使用案例

KubeVela 可以提供更多的应用多集群部署策略,如将单一应用的不同组件部署在不同环境中,或在管控集群及子集群中混合部署。

对于工作流与多集群部署的使用,你可以通过下图简单了解其整体流程。

alt

更多的多集群环境下应用部署的使用案例将在不久后加入文档中。