简介: 在本文中,我们将介绍如何通过 KubeVela解决多集群环境下 Helm Chart 的部署问题。如果你手里没有多集群也不要紧,我们将介绍一种仅依赖于 Docker 或者 Linux 系统的轻量级部署方式,可以让你轻松的体验多集群功能。当然,KubeVela 也完全具备单集群的 Helm Chart 交付能力。

Helm Charts[1] 如今已是一种非常流行的软件打包方式,在其应用市场中你可以找到接近一万款适用于云原生环境的软件。然后在如今的混合云多集群环境中,业务越来越依赖部署到不同的集群、不同的环境、同时指定不同的配置。再这样的环境下,单纯依赖 Helm 工具可能无法做到灵活的部署和交付。

在本文中,我们将介绍如何通过 KubeVela[2] 解决多集群环境下 Helm Chart 的部署问题。如果你手里没有多集群也不要紧,我们将介绍一种仅依赖于 Docker 或者 Linux 系统的轻量级部署方式,可以让你轻松的体验多集群功能。当然,KubeVela 也完全具备单集群的 Helm Chart 交付[3]能力。

前提条件

  • 安装 Docker v20.10.5+ (runc >= v1.0.0-rc93) 或者你的操作系统是 Linux。
  • VelaD[4],一个轻量级的部署 KubeVela 和 Kubernetes 的工具。

准备集群

本节是做 KubeVela 以及多集群环境的准备,我们将基于 Docker 或者 Linux 环境从头开始。如果你已经具备了 KubeVela 的环境并且完成了集群管理[5] ,则可以跳过本节。

安装 KubeVela 控制平面

  1. velad install

将新创建的集群导入到环境变量

  1. export KUBECONFIG=$(velad kubeconfig --name default --host)

到这里,恭喜你!我们已经完成了 KubeVela 控制平面的安装。你可以通过下面这个方式加入你的 Kubernetes 集群:

  1. vela cluster join <path-to-kubeconfig-of-cluster> --name foo

如果你没有现成的 Kubernetes 集群,VelaD 也可以很方便的为你创建一个:

用 velad 创建一个名为 foo 的集群,并加入到控制平面

  1. velad install --name foo --cluster-only
  2. vela cluster join $(velad kubeconfig --name foo --internal) --name foo

作为一个充分可扩展的控制平面,KubeVela 的大多数能力都是作为插件提供的。接下来的几步我们介绍安装 Helm 多集群部署的必要插件。

启用 velaux 插件,获得 UI 控制台

  1. vela addon enable velaux

启用 fluxcd 插件获得 helm chart 交付能力

  1. vela addon enable fluxcd

如果你在加入新集群之前已启用过 fluxcd 插件,则应该通过以下方式来为新加入的集群启用(部署)插件:

  1. vela addon enable fluxcd --clusters foo

至此,我们完成了所有的准备工作,可以查看加入的集群了:

  1. $ vela cluster ls
  2. CLUSTER ALIAS TYPE ENDPOINT ACCEPTED LABELS
  3. local Internal - true
  4. foo X509Certificate https://172.20.0.6:6443 true

local 是 KubeVela 控制平面的集群,foo 则是我们刚刚添加的集群。

多集群部署

 

我们可以使用 topology 策略来指定 Helm Chart 交付的环境,指令如下:

  1. cat <<EOF | vela up -f -
  2. apiVersion: core.oam.dev/v1beta1
  3. kind: Application
  4. metadata:
  5. name: helm-hello
  6. spec:
  7. components:
  8. - name: hello
  9. type: helm
  10. properties:
  11. repoType: "helm"
  12. url: "https://jhidalgo3.github.io/helm-charts/"
  13. chart: "hello-kubernetes-chart"
  14. version: "3.0.0"
  15. policies:
  16. - name: foo-cluster-only
  17. type: topology
  18. properties:
  19. clusters: ["foo"]
  20. EOF

clusters 字段的 topology 策略是一个切片(slice),此处可以指定多个集群的名称。你还可以使用标签选择器或指定命名空间,详情见参考文档[6] 。

部署后,你可以通过以下方式检查已部署的应用程序:

  1. vela status helm-hello

部署成功的预期输出应该如下:

  1. About:
  2.  
  3. Name: helm-hello
  4. Namespace: default
  5. Created at: 2022-06-09 19:14:57 +0800 CST
  6. Status: running
  7.  
  8. Workflow:
  9.  
  10. mode: DAG
  11. finished: true
  12. Suspend: false
  13. Terminated: false
  14. Steps
  15. - id:vtahj5zrz4
  16. name:deploy-foo-cluster-only
  17. type:deploy
  18. phase:succeeded
  19. message:
  20.  
  21. Services:
  22.  
  23. - Name: hello
  24. Cluster: foo Namespace: default
  25. Type: helm
  26. Healthy Fetch repository successfully, Create helm release successfully
  27. No trait applied

你可以通过以下方式检查已部署的资源:

  1. $ vela status helm-hello --tree
  2. CLUSTER NAMESPACE RESOURCE STATUS
  3. foo ─── default ─┬─ HelmRelease/hello updated
  4. └─ HelmRepository/hello updated

你也可以通过 VelaUX 检查已部署的资源。

使用 UI 控制台查看部署状态

通过使用 velaux UI 控制台,则可以很方便的查看多集群信息,并获得统一的体验。你可以参考文档[7]了解 VelaUX 的访问和使用细节。

通过 UI 界面,我们可以:

  • 检查来自不同集群的实例状态和事件:

  • 检查来自不同集群的实例日志:

  • 检查资源拓扑关系和状态:

使用 Override 配置进行部署

在某些情况下,我们会为不同集群的 Helm Chart 设置不同的 Value ,这样我们可以使用 Override 策略[8]。

下面是一个复杂的示例,我们将把一个 Helm Chart 部署到两个集群中,并为每个集群指定不同的 Value 。让我们部署它:

  1. cat <<EOF | vela up -f -
  2. apiVersion: core.oam.dev/v1beta1
  3. kind: Application
  4. metadata:
  5. name: helm-hello
  6. spec:
  7. components:
  8. - name: hello
  9. type: helm
  10. properties:
  11. repoType: "helm"
  12. url: "https://jhidalgo3.github.io/helm-charts/"
  13. chart: "hello-kubernetes-chart"
  14. version: "3.0.0"
  15. policies:
  16. - name: topology-local
  17. type: topology
  18. properties:
  19. clusters: ["local"]
  20. - name: topology-foo
  21. type: topology
  22. properties:
  23. clusters: ["foo"]
  24. - name: override-local
  25. type: override
  26. properties:
  27. components:
  28. - name: hello
  29. properties:
  30. values:
  31. configs:
  32. MESSAGE: Welcome to Control Plane Cluster!
  33. - name: override-foo
  34. type: override
  35. properties:
  36. components:
  37. - name: hello
  38. properties:
  39. values:
  40. configs:
  41. MESSAGE: Welcome to Your New Foo Cluster!
  42. workflow:
  43. steps:
  44. - name: deploy2local
  45. type: deploy
  46. properties:
  47. policies: ["topology-local", "override-local"]
  48. - name: manual-approval
  49. type: suspend
  50. - name: deploy2foo
  51. type: deploy
  52. properties:
  53. policies: ["topology-foo", "override-foo"]
  54. EOF

注意:如果你觉得策略和工作流程有点复杂,你可以将它们作为一个外部对象并仅引用该对象,用法和容器交付[9]是一样的。

部署过程分为三个步骤:

(1)部署到本地集群;

(2)等待人工审批;

(3)部署到 foo 集群。

你会发现它在第一步之后就被暂停了,就像下面这样:

  1. $ vela status helm-hello
  2. About:
  3.  
  4. Name: helm-hello
  5. Namespace: default
  6. Created at: 2022-06-09 19:38:13 +0800 CST
  7. Status: workflowSuspending
  8.  
  9. Workflow:
  10.  
  11. mode: StepByStep
  12. finished: false
  13. Suspend: true
  14. Terminated: false
  15. Steps
  16. - id:ww4cydlvee
  17. name:deploy2local
  18. type:deploy
  19. phase:succeeded
  20. message:
  21. - id:xj6hu97e1e
  22. name:manual-approval
  23. type:suspend
  24. phase:succeeded
  25. message:
  26.  
  27. Services:
  28.  
  29. - Name: hello
  30. Cluster: local Namespace: default
  31. Type: helm
  32. Healthy Fetch repository successfully, Create helm release successfully
  33. No trait applied

你可以查看并使用 Value 为 “Welcome to Control Plane Cluster!” 的部署在控制平面的 Helm Chart 。

  1. vela port-forward helm-hello

浏览器会自动提示如下页面:

发现部署成功,让我们继续。

  1. vela workflow resume helm-hello

然后它会部署到 foo 集群,你可以查看这些资源的详细信息。

  1. $ vela status helm-hello --tree --detail
  2. CLUSTER NAMESPACE RESOURCE STATUS APPLY_TIME DETAIL
  3. foo ─── default ─┬─ HelmRelease/hello updated 2022-06-09 19:38:13 Ready: True Status: Release reconciliation succeeded Age: 64s
  4. └─ HelmRepository/hello updated 2022-06-09 19:38:13 URL: https://jhidalgo3.github.io/helm-charts/ Age: 64s Ready: True
  5. Status: stored artifact for revision 'ab876069f02d779cb4b63587af1266464818ba3790c0ccd50337e3cdead44803'
  6. local ─── default ─┬─ HelmRelease/hello updated 2022-06-09 19:38:13 Ready: True Status: Release reconciliation succeeded Age: 7m34s
  7. └─ HelmRepository/hello updated 2022-06-09 19:38:13 URL: https://jhidalgo3.github.io/helm-charts/ Age: 7m34s Ready: True

Status: stored 再次使用端口转发:

  1. vela port-forward helm-hello

然后它会弹出一些选项:

  1. ? You have 2 deployed resources in your app. Please choose one: [Use arrows to move, type to filter]
  2. > Cluster: foo | Namespace: default | Kind: HelmRelease | Name: hello
  3. Cluster: local | Namespace: default | Kind: HelmRelease | Name: hello

选择带有 foo 集群的选项,然后你会看到结果已经被新消息覆盖。

  1. $ curl http://127.0.0.1:8080/
  2. ...snip...
  3. <div id="message">
  4. Welcome to Your New Foo Cluster!
  5. </div>
  6. ...snip...

为不同环境指定不同的 Value 文件

你可以为不同环境选择 Helm Chart 中现有的不同 Value 文件。比如:

请确保你的本地集群有两个命名空间 “test” 和 “prod”,它们代表我们示例中的两个环境。

我们以 Chart hello-kubernetes-chart 为例。这个 Chart 有两个 Value 文件。你可以拉取此 Chart 并查看其中包含的所有文件:

  1. $ tree ./hello-kubernetes-chart
  2. ./hello-kubernetes-chart
  3. ├── Chart.yaml
  4. ├── templates
  5. ├── NOTES.txt
  6. ├── _helpers.tpl
  7. ├── config-map.yaml
  8. ├── deployment.yaml
  9. ├── hpa.yaml
  10. ├── ingress.yaml
  11. ├── service.yaml
  12. ├── serviceaccount.yaml
  13. └── tests
  14. └── test-connection.yaml
  15. ├── values-production.yaml
  16. └── values.yaml

我们可以看到此 Chart 中有 values.yaml values-production.yaml 这两个 Value 文件。

  1. cat <<EOF | vela up -f -
  2. apiVersion: core.oam.dev/v1beta1
  3. kind: Application
  4. metadata:
  5. name: hello-kubernetes
  6. spec:
  7. components:
  8. - name: hello-kubernetes
  9. type: helm
  10. properties:
  11. repoType: "helm"
  12. url: "https://wangyikewxgm.github.io/my-charts/"
  13. chart: "hello-kubernetes-chart"
  14. version: "0.1.0"
  15.  
  16. policies:
  17. - name: topology-test
  18. type: topology
  19. properties:
  20. clusters: ["local"]
  21. namespace: "test"
  22. - name: topology-prod
  23. type: topology
  24. properties:
  25. clusters: ["local"]
  26. namespace: "prod"
  27. - name: override-prod
  28. type: override
  29. properties:
  30. components:
  31. - name: hello-kubernetes
  32. properties:
  33. valuesFiles:
  34. - "values-production.yaml"
  35. workflow:
  36. steps:
  37. - name: deploy2test
  38. type: deploy
  39. properties:
  40. policies: ["topology-test"]
  41. - name: deploy2prod
  42. type: deploy
  43. properties:
  44. policies: ["topology-prod", "override-prod"]
  45. EOF

访问 Application 的 endpoint :

  1. vela port-forward hello-kubernetes

如果你选择 Cluster: local | Namespace: test | Kind: HelmRelease | Name: hello-kubernetes 你会看到:

选择 Cluster: local | Namespace: prod | Kind: HelmRelease | Name: hello-kubernetes 则会看到:

清理

如果你使用 velad 进行此演示,则可以通过以下方式便捷地进行清理:

  • 清理 foo 集群
  1. velad uninstall -n foo
  • 清理默认集群
  1. velad uninstall

不仅如此

KubeVela 提供的能力远不止如此,通过安装其他插件,你还可以获得包括金丝雀发布[10] 在内的更多能力,为你的 Helm Chart 交付保驾护航。

快使用 KubeVela 交付 Helm Chart ,让现代化的应用交付和管理更简单、轻松、可靠!

 

相关链接

 

[1] Helm Charts:

https://artifacthub.io/packages/search?kind=0

 

[2] KubeVela:

https://kubevela.io/

 

[3] 单集群的 Helm Charts 交付

https://kubevela.net/zh/docs/tutorials/helm

 

[4] velad:

https://github.com/kubevela/velad

 

[5] 集群管理:

https://kubevela.net/zh/docs/platform-engineers/system-operation/managing-clusters

 

[6] 参考文档:

https://kubevela.net/zh/docs/end-user/policies/references#topology

 

[7] 文档

https://kubevela.io/docs/install#2-install-velaux

 

[8] Override 策略

https://kubevela.io/docs/end-user/policies/references#override

 

[9] 容器交付

https://kubevela.io/docs/case-studies/multi-cluster#use-policies-and-workflow-outside-the-application

 

[10] 金丝雀发布:

https://kubevela.io/docs/tutorials/helm-rollout

 


您可以通过如下材料了解更多关于 KubeVela 以及 OAM 项目的细节:

  • 项目代码库:github.com/oam-dev/kubevela 欢迎 Star/Watch/Fork!
  • 项目官方主页与文档:kubevela.io ,从 1.1 版本开始,已提供中文、英文文档,更多语言文档欢迎开发者进行翻译。
  • 项目钉钉群:23310022;Slack:CNCF #kubevela Channel
  • 加入微信群:请先添加以下 maintainer 微信号,表明进入 KubeVela 用户群:

此处:查看 KubeVela 项目官网!

本文为阿里云原创内容,未经允许不得转载。
 

Helm Chart 多环境、多集群交付实践,透视资源拓扑和差异的更多相关文章

  1. CentOS7环境RabbitMQ集群配置管理(转载)

    CentOS7环境RabbitMQ集群配置管理(转载)   CentOS7系统内核版本:3.10.0-514.26.2.el7.x86_64 一.对应主机host地址(三台主机host文件要保持一致) ...

  2. 大数据集群环境 zookeeper集群环境安装

    大数据集群环境 zookeeper集群环境准备 zookeeper集群安装脚本,如果安装需要保持zookeeper保持相同目录,并且有可执行权限,需要准备如下 编写脚本: vi zkInstall.s ...

  3. (Linux环境Kafka集群安装配置及常用命令

    Linux环境Kafka集群安装配置及常用命令 Kafka 消息队列内部实现原理 Kafka架构 一.下载Kafka安装包 二.Kafka安装包的解压 三.设置环境变量 四.配置kafka文件 4.1 ...

  4. 美团点评Kubernetes集群管理实践

    背景 作为国内领先的生活服务平台,美团点评很多业务都具有非常显著.规律的”高峰“和”低谷“特征.尤其遇到节假日或促销活动,流量还会在短时间内出现爆发式的增长.这对集群中心的资源弹性和可用性有非常高的要 ...

  5. 基于winserver的Apollo配置中心分布式&集群部署实践(正确部署姿势)

    基于winserver的Apollo配置中心分布式&集群部署实践(正确部署姿势)   前言 前几天对Apollo配置中心的demo进行一个部署试用,现公司已决定使用,这两天进行分布式部署的时候 ...

  6. 转】Neo4j集群安装实践

    原博文出自于: http://blog.fens.me/category/%E6%95%B0%E6%8D%AE%E5%BA%93/page/2/ 感谢! Posted: Oct 29, 2013 Ta ...

  7. Nginx+Keepalived高可用集群应用实践

    Nginx+Keepalived高可用集群应用实践 1.Keepalived高可用软件 1.1 Keepalived服务的三个重要功能 1.1.1管理LVS负载均衡软件 早期的LVS软件,需要通过命令 ...

  8. PB级数据实时查询,滴滴Elasticsearch多集群架构实践

    PB级数据实时查询,滴滴Elasticsearch多集群架构实践  mp.weixin.qq.com 点击上方"IT牧场",选择"设为星标"技术干货每日送达 点 ...

  9. 三艾云 Kubernetes 集群最佳实践

    三艾云 Kubernetes 集群最佳实践 三艾云 Kubernetes 集群最佳实践 容器是 Cloud Native 的基石,它们之间的关系不言而喻.了解容器对于学习 Cloud Native 也 ...

  10. MongoDB 4.0 开发环境搭建集群

    环境准备 Liunx 服务器一台 以下示例为单机版安装集群, 没有分片 MongoDB 安装 1.下载 MongoDB tgz 安装包: 可以从下载中心下载: https://www.mongodb. ...

随机推荐

  1. Kettle实战视频教程

    kettle实战视频教程 欢迎关注笔者的公众号: java大师, 每日推送java.kettle运维等领域干货文章,关注即免费无套路附送 100G 海量学习.面试资源哟!!个人网站: http://w ...

  2. Java浮点数内存存储

    转自: [解惑]剖析float型的内存存储和精度丢失问题 1.小数的二进制表示问题 首先我们要搞清楚下面两个问题: (1)  十进制整数如何转化为二进制数 算法很简单.举个例子,11表示成二进制数: ...

  3. Leetcode 招商银行-03. 点燃木棒

    用广度优先,暴力搜索.代码如下 import java.util.*; class Solution { public static void main(String[] args) { Soluti ...

  4. NJUPT自控第一次积分赛的小总结(二)基于simpleFOC的无刷电机控制

    新人一枚,写的比较水,欢迎大佬指正! 先说一下我用的物料与开发环境吧: 无刷电机:makerbase的2804电机(带AS5600磁编码器) 电机驱动板:simpleFOCmini(学校推荐的) 电池 ...

  5. 一周内容分享(第 10 期):别让自己"墙"了自己

    这里记录过去一周,我看到的值得分享的东西. 一方面是整理记录一下自己一周的学习,另一方面也是期待自己有更多的输出,有更多的价值. 周刊开源(Github:wmyskxz/weekly),欢迎提交 is ...

  6. Oracle 视图创建自增ID

    select ROW_NUMBER() over (order by sysdate()) as id

  7. UE4_C++实现TimeLine

    主要实现蓝图节点中时间轴的功能. 目前UE提供了两种实现方式,一个是使用FTimeLine其是一个时间轴的结构体:另一种方式是使用UTimeLineComponent,其是一个时间轴组件类.两者内部定 ...

  8. #第一类斯特林数,NTT#CF960G Bandit Blues

    题目 给你三个正整数 \(n\),\(a\),\(b\),定义 \(A\) 为一个排列中是前缀最大值的数的个数, 定义 \(B\) 为一个排列中是后缀最大值的数的个数,求长度为 \(n\) 的排列中满 ...

  9. #zkw线段树,扫描线,dp,离散#NOIP2020.9.26模拟speike

    分析 由于可以走边界,那么最短路径一定按横坐标递增并且经过矩形的顶点, 考虑扫描线,找到当前线段(矩形右边界可以忽略)两个端点离的最近而又可达的线段, dp一下并用线段树维护就可以了 代码 #incl ...

  10. MySQL 主从 AUTO_INCREMENT 不一致问题分析

    作者:vivo 互联网数据库团队 - Wei Haodong 本文介绍了 MySQL5.7 中常见的replace into 操作造成的主从auto_increment不一致现象,一旦触发了主从切换, ...