Helm 管理工具解析

简介: 什么是 Helm ?简单来说,Helm 是 Kubernetes 的一种包管理器。Helm 相当于 yum 或 apt 的 K8s。Helm 部署图表,我们可以将其视为打包的应用程序。它是所有版本化、预配置的应用程序资源的集合,可以作为一个单元进行部署。然后,我们可以使用不同的配置集部署图表的另一个版本。

   什么是 Helm ?简单来说,Helm 是 Kubernetes 的一种包管理器。Helm 相当于 yum 或 apt 的 K8s。Helm 部署图表,我们可以将其视为打包的应用程序。它是所有版本化、预配置的应用程序资源的集合,可以作为一个单元进行部署。然后,我们可以使用不同的配置集部署图表的另一个版本。

    其实,基于容器云生态体系,从本质上来讲,Helm 思想的引入,主要体现在:“关注分离”,在 DevOps 理念中,使得运维与开发职责进一步拆分。于业务角度,使得开发人员能够全身心投入到业务实现上;于资源角度,使得运维人员能够基于业务实现进行资源配置文件的模版建立以及编排操作。

    Helm 使用Go Template 来模板化资源文件。在 Go 提供的内置函数基础上,还添加了许多其他功能。Helm 可以安装本地或者远程的 Chart,当 Chart 安装到 Kubernetes 中后就会创建一个 Release,每次更新该 Chart 的配置并执行 Helm upgrade, Release 的版本数就会加 1。同一个 Chart 可以部署多次。其架构参考示意图如下所示:

    Helm 在三个关键方面提供帮助:

    1、提高生产力

    2、降低微服务部署的复杂性

    3、使能云原生应用适配

    在 Helm 工具中有三个关键概念:Chart,Repo 及 Release ,具体如下所示:

    1、Chart: 一系列 K8s 资源集合的命名,它包含一系列 K8s 资源配置文件的模板与参数,可供灵活配置

    2、Repo: 即 Chart 的仓库,其中有很多个 Chart 可供选择

    3、Release: 当一个 Chart 部署后生成一个 Release

    以下为一个简单的示例,工程名称为 “demo-service” ,相关命令行操作具体如下所示:


[administrator@JavaLangOutOfMemory ingress ]% helm create demo-service
Creating demo-service


[administrator@JavaLangOutOfMemory ingress ]% tree demo-service/
demo-service/
├── Chart.yaml        # 包含 Chart 基本信息(例如版本和名称)的 YAML 文件。
├── charts            # 一个目录,包含该 Chart 所依赖的任意 Chart。
├── templates         # 模板的目录,若提供相应值便可以生成有效的 Kubernetes 配置文件。
│   ├── NOTES.txt     # (可选)包含使用说明的纯文本文件。
│   ├── _helpers.tpl
│   ├── deployment.yaml
│   ├── hpa.yaml
│   ├── ingress.yaml
│   ├── service.yaml
│   ├── serviceaccount.yaml
│   └── tests
│       └── test-connection.yaml
└── values.yaml        # 该 Chart 的默认配置值。
3 directories, 10 files

    在实际的业务场景中,我们需要结合应用服务逻辑处理情况必须为 Chart 自定义 chart.yaml 文件。下面为一个示例文件,每个字段都尽可能进行描述,具体如下所示:


apiVersion: (必需)Chart API 版本。
name: (必需)Chart 名称。
version: (必需)版本,遵循 SemVer 2 标准。
kubeVersion: (可选)兼容的 Kubernetes 版本,遵循 SemVer 2 标准。
description: (可选)对应用的一句话说明。
type: (可选)Chart 的类型。
keywords:
  - (可选)关于应用的关键字列表。
home: (可选)应用的 URL。
sources:
  - (可选)应用源代码的 URL 列表。
dependencies: (可选)Chart 必要条件的列表。
  - name: Chart 的名称,例如 nginx。
    version: Chart 的版本,例如 "1.2.3"。
    repository: 仓库 URL ("https://example.com/charts") 或别名 ("@repo-name")。
    condition: (可选)解析为布尔值的 YAML 路径,用于启用/禁用 Chart (例如 subchart1.enabled)。
    tags: (可选)
      - 用于将 Chart 分组,一同启用/禁用。
    import-values: (可选)
      - ImportValues 保存源值到待导入父键的映射。每一项可以是字符串或者一对子/父子列表项。
    alias: (可选)Chart 要使用的别名。当您要多次添加同一个 Chart 时,它会很有用。
maintainers: (可选)
  - name: (必需)维护者姓名。
    email: (可选)维护者电子邮件。
    url: (可选)维护者 URL。
icon: (可选)要用作图标的 SVG 或 PNG 图片的 URL。
appVersion: (可选)应用版本。不需要是 SemVer。
deprecated: (可选,布尔值)该 Chart 是否已被弃用。
annotations:
  example: (可选)按名称输入的注解列表。

   Helm Chart 模板采用 Go 模板语言编写并存储在 Chart 的 templates 文件夹。有两种方式可以为模板提供值:

    1、在 Chart 中创建一个包含可供引用的默认值的 values.yaml 文件。

    2、创建一个包含必要值的 YAML 文件,通过在命令行使用 helm install 命令来使用该文件。

    针对 Helm 组件工具,其基本的工作流结构如下所示:

    在 Helm V3 之前的版本中,主要基于 “Tiller” 进行,Tiller Server 是一个部署在Kubernetes 集群内部的 Server,其与 Helm Client、Kubernetes API server 进行交互。         Tiller server 主要负责如下:

    1、监听来自 Helm Client 的请求

    2、通过 Chart 及其配置构建一次发布

    3、安装 Chart 到 Kubernetes 集群,并跟踪随后的发布

    4、通过与 Kubernetes 交互升级或卸载 Chart

    基于上述所述,简单的说,Client 管理 Charts,而 Server 管理发布 Release,其工作流如下示意图所示:

    在 Helm V2 时, 早期的Kubernetes 没有基于角色的访问控制(RBAC)的概念,因此,Helm 不得不自己控制谁、以及在哪里能够安装应用。直到 Kubernetes 1.6 中开启了 RBAC 。此时,Helm 也不必与 Kubernetes 做重复的事情,因此 Helm V3 彻底移除了 Tiller 。

    Tiller 作为维护 Helm 应用信息和状态的核心组件。Helm V3 直接从 Kubernetes API Server 就可以获取到相同的信息,并且在客户端呈现 Charts 。对于 Kubernetes 来说,这种方式更加简单且原生。

    在移除 Tiller 之后,Helm 的安全模型也变得非常简单(使用 RBAC 来控制生产环境 Tiller 的权限非常不易于管理)。Helm V3 基于 kube-config 鉴权。集群管理员针对应用,可以设置任何所需级别的权限控制,而其他功能则保持不变。

    除此之外,Helm V2 使用 ConfigMaps 存储应用的信息。在 Helm V3 中,改为 Secrets (secret 类型为 helm.sh/release )作为默认存储器。这带来了一些优势,并极大简化了 Helm 的功能。Helm V2 必须要经过一系列操作才能获取(和应用)配置。这些配置加密、打包存储在某一个 keys 或 ConfigMap 中。Helm V3 直接将配置存储在 Secret ,无需执行复杂操作,只需要提取、解码、使用即可。另一个优点是,应用名称不必集群唯一。包含应用信息的 Secrets 存储在应用安装的 Namespace 中。因此,基于不同的 Namespace ,应用可以具有相同的名字。两者的区别可通过如下图进行简要阐明:

    基于上述描述,我们可以看出,在 V3 中,移除了 V2 中固有的 “Tiller” 组件,其他部分则保持不变。

    接下来,我们以 Traefik v2.x 为例,简要介绍一下基于 Helm 进行安装部署的相关过程,具体如下所示:

    1、环境验证


[administrator@JavaLangOutOfMemory ingress ]% kubectl version
Client Version: version.Info{Major:"1", Minor:"21", GitVersion:"v1.21.2", GitCommit:"092fbfbf53427de67cac1e9fa54aaa09a28371d7", GitTreeState:"clean", BuildDate:"2021-06-16T12:52:14Z", GoVersion:"go1.16.5", Compiler:"gc", Platform:"darwin/amd64"}
Server Version: version.Info{Major:"1", Minor:"20", GitVersion:"v1.20.7", GitCommit:"132a687512d7fb058d0f5890f07d4121b3f0a2e2", GitTreeState:"clean", BuildDate:"2021-05-12T12:32:49Z", GoVersion:"go1.15.12", Compiler:"gc", Platform:"linux/amd64"}
[administrator@JavaLangOutOfMemory ingress ]% helm version    
version.BuildInfo{Version:"v3.6.1", GitCommit:"61d8e8c4a6f95540c15c6a65f36a6dd0a45e7a2f", GitTreeState:"dirty", GoVersion:"go1.16.5"}

    2、添加 Helm 仓库


[administrator@JavaLangOutOfMemory ingress ]% helm repo add traefik https://helm.traefik.io/traefik

    3、 更新仓库


[administrator@JavaLangOutOfMemory ingress ]% helm repo update

    4 Traefik 组件部署,指定特定的 NameSpace 命名空间


[administrator@JavaLangOutOfMemory ingress ]% kubectl create ns traefik-v2
namespace/traefik-v2 created
[administrator@JavaLangOutOfMemory ingress ]% helm install --namespace=traefik-v2 \
    traefik traefik/traefik

    针对部署后的组件服务,若需要进行配置参数的更新操作,则可借助如下命令行进行,具体为:helm show values traefik/traefik > traefik_values.yml 命令将 values 导出,然后更新后使用 helm upgrade -f traefik_values.yml traefik traefik/traefik 进行生效。

     5、 服务实例验证


[administrator@JavaLangOutOfMemory ingress ]% kubectl get pod -n default -o wide
NAME                      READY   STATUS    RESTARTS   AGE   IP           NODE       NOMINATED NODE   READINESS GATES
traefik-cfbc67f8c-58t9g   1/1     Running   0          22h   172.17.0.4   minikube   <none>           <none>
[administrator@JavaLangOutOfMemory ingress ]% curl -i http://localhost:9000/dashboard/
HTTP/1.1 200 OK
Accept-Ranges: bytes
Content-Length: 2708
Content-Type: text/html; charset=utf-8
Last-Modified: Tue, 28 Jul 2020 15:46:00 GMT
Date: Thu, 24 Jun 2021 06:44:39 GMT
<!DOCTYPE html><html><head><title>Traefik</title><meta charset=utf-8><meta name=description content="Traefik UI"><meta name=format-detection content="telephone=no"><meta name=msapplication-tap-highlight content=no><meta name=viewport content="user-scalable=no,initial-scale=1,maximum-scale=1,minimum-scale=1,width=device-width"><link rel=icon type=image/png href=statics/app-logo-128x128.png><link rel=icon type=image/png sizes=16x16 href=statics/icons/favicon-16x16.png><link rel=icon type=image/png sizes=32x32 href=statics/icons/favicon-32x32.png><link rel=icon type=image/png sizes=96x96 href=statics/icons/favicon-96x96.png><link rel=icon type=image/ico href=statics/icons/favicon.ico><link href=css/284ee262.162ea886.css rel=prefetch><link href=css/2b31cb68.b69a4f0a.css rel=prefetch><link href=css/2fc4e300.15d951f1.css rel=prefetch><link href=css/3e3ce03c.9b22e80f.css rel=prefetch><link href=css/46fd955e.9b22e80f.css rel=prefetch><link href=css/491024e9.9b22e80f.css rel=prefetch><link href=css/52875482.9b22e80f.css rel=prefetch><link href=css/6d73c73c.9b22e80f.css rel=prefetch><link href=css/70aa9655.0e433876.css rel=prefetch><link href=css/77d911b4.9b22e80f.css rel=prefetch><link href=css/ad8e29f4.b5aeb305.css rel=prefetch><link href=css/b34404c8.9b22e80f.css rel=prefetch><link href=css/c8abb44a.ad36de1b.css rel=prefetch><link href=css/d2880142.dd7c0af2.css rel=prefetch><link href=css/dba10db0.350172b4.css rel=prefetch><link href=js/284ee262.91e29d10.js rel=prefetch><link href=js/2b31cb68.af1fdfbd.js rel=prefetch><link href=js/2d21e8fd.c00ac0e6.js rel=prefetch><link href=js/2fc4e300.35f36a4b.js rel=prefetch><link href=js/3e3ce03c.293f4729.js rel=prefetch><link href=js/46fd955e.5ae3567e.js rel=prefetch><link href=js/491024e9.fca48131.js rel=prefetch><link href=js/52875482.65e645a6.js rel=prefetch><link href=js/6d73c73c.935c393f.js rel=prefetch><link href=js/70aa9655.2470591c.js rel=prefetch><link href=js/77d911b4.40543ff4.js rel=prefetch><link href=js/ad8e29f4.e68646e2.js rel=prefetch><link href=js/b34404c8.7a4b9be8.js rel=prefetch><link href=js/c8abb44a.11069c8c.js rel=prefetch><link href=js/d2880142.1586712d.js rel=prefetch><link href=js/dba10db0.4b33a696.js rel=prefetch><link href=css/app.03db6149.css rel=preload as=style><link href=js/app.4b9719d8.js rel=preload as=script><link href=js/runtime.be240131.js rel=preload as=script><link href=js/vendor.569cebaa.js rel=preload as=script><link href=css/app.03db6149.css rel=stylesheet></head><body><div id=q-app></div><script type=text/javascript src=js/app.4b9719d8.js></script><script type=text/javascript src=js/runtime.be240131.js></script><script type=text/javascript src=js/vendor.569cebaa.js></script></body></html>%

    6、 Dashboard 查看

    默认的 Dashboard 端口是 9000,可通过 Service 或 Ingress 进行暴露出来。我们可通过 Uri:http://localhost:9000/dashboard/ 进行访问,具体如下所示:

    至此,Traefik 组件服务部署成功,后续可依据实际的业务情况进行接口参数配置以及相关操作。Helm 工具相关解析本文到此为止,更多内容可关注公众号进行查看。


相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。 &nbsp; &nbsp; 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
6月前
|
机器学习/深度学习 人工智能 JSON
Resume Matcher:增加面试机会!开源AI简历优化工具,一键解析简历和职位描述并优化
Resume Matcher 是一款开源AI简历优化工具,通过解析简历和职位描述,提取关键词并计算文本相似性,帮助求职者优化简历内容,提升通过自动化筛选系统(ATS)的概率,增加面试机会。
541 18
Resume Matcher:增加面试机会!开源AI简历优化工具,一键解析简历和职位描述并优化
|
5月前
|
存储 人工智能 API
离线VS强制登录?Apipost与Apifox的API工具理念差异深度解析
在代码开发中,工具是助手还是枷锁?本文通过对比Apipost和Apifox在断网环境下的表现,探讨API工具的选择对开发自由度的影响。Apifox强制登录限制了离线使用,而Apipost支持游客模式与本地存储,尊重开发者数据主权。文章从登录策略、离线能力、协作模式等方面深入分析,揭示工具背后的设计理念与行业趋势,帮助开发者明智选择,掌握数据控制权并提升工作效率。
|
9月前
|
人工智能 自然语言处理 Java
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
FastExcel 是一款基于 Java 的高性能 Excel 处理工具,专注于优化大规模数据处理,提供简洁易用的 API 和流式操作能力,支持从 EasyExcel 无缝迁移。
1804 65
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
|
6月前
|
数据可视化 测试技术 API
前后端分离开发:如何高效调试API?有工具 vs 无工具全解析
在前后端分离开发中,API调试至关重要。本文探讨有无调试工具时如何高效调试API,重点分析Postman、Swagger等工具优势及无工具代码调试方法。通过实际场景如用户登录接口,对比两者特性。同时介绍Apipost-Hepler(IDEA插件),将可视化与代码调试结合,提供全局请求头配置、历史记录保存等功能,优化团队协作与开发效率,助力API调试进入全新阶段。
|
7月前
|
数据采集 存储 调度
BeautifulSoup VS Scrapy:如何选择适合的HTML解析工具?
在Python网页抓取领域,BeautifulSoup和Scrapy是两款备受推崇的工具。BeautifulSoup易于上手、灵活性高,适合初学者和简单任务;Scrapy则是一个高效的爬虫框架,内置请求调度、数据存储等功能,适合大规模数据抓取和复杂逻辑处理。两者结合使用可以发挥各自优势,例如用Scrapy进行请求调度,用BeautifulSoup解析HTML。示例代码展示了如何在Scrapy中设置代理IP、User-Agent和Cookies,并使用BeautifulSoup解析响应内容。选择工具应根据项目需求,简单任务选BeautifulSoup,复杂任务选Scrapy。
129 1
BeautifulSoup VS Scrapy:如何选择适合的HTML解析工具?
|
6月前
|
JSON 监控 物联网
WebSocket 调试全攻略:核心解析、工具选择与对比!
WebSocket 是一种全双工、实时交互的网络通信协议,适用于即时通信、实时数据流、多人协作、IoT 等场景。调试 WebSocket 时,工具应具备握手管理、实时消息收发、自定义 Header、消息大小告警、分组管理、多连接支持和断线重现等功能。主流调试工具如 Postman、ApiPost 和 ApiFox 各有优劣:Postman 界面友好适合基础调试;ApiPost 支持高级功能如消息分组和自动重连;ApiFox 则强化了多连接支持。选择工具时需根据具体需求和团队熟悉度决定。
|
6月前
|
数据可视化 测试技术 API
前后端分离开发:如何高效调试API?有工具 vs 无工具全解析
在前后端分离的开发模式中,API 调试的效率直接影响项目的质量和交付速度。通过本文的对比分析,我们可以看到无工具调试模式虽具备灵活性和代码复用能力,但在操作便利性和团队协作上稍显不足。而传统的外部调试工具带来了可视化、高效协作与扩展性,却可能存在工具切换带来的开发链路断层问题。Apipost-Hepler 融合了两者的优势,让开发者无需离开熟悉的 IDEA 环境,就能享受可视化调试工具的强大功能。
143 5
|
6月前
|
JSON 监控 物联网
#WebSocket 调试全攻略:Postman、Apipost和Apifox核心解析、工具选择与对比!
WebSocket 是一种现代化的全双工通信协议,允许客户端和服务端通过持久连接实时双向传输数据。它适用于即时通讯、实时通知、金融行情、在线协作、物联网等场景。调试 WebSocket 时,工具应具备握手管理、实时消息收发、自定义 Header、消息大小监控、分组管理、多连接支持等功能。
575 1
|
9月前
|
人工智能 搜索推荐 API
Cobalt:开源的流媒体下载工具,支持解析和下载全平台的视频、音频和图片,支持多种视频质量和格式,自动提取视频字幕
cobalt 是一款开源的流媒体下载工具,支持全平台视频、音频和图片下载,提供纯净、简洁无广告的体验
1245 9
Cobalt:开源的流媒体下载工具,支持解析和下载全平台的视频、音频和图片,支持多种视频质量和格式,自动提取视频字幕
|
8月前
|
网络协议 Unix Linux
深入解析:Linux网络配置工具ifconfig与ip命令的全面对比
虽然 `ifconfig`作为一个经典的网络配置工具,简单易用,但其功能已经不能满足现代网络配置的需求。相比之下,`ip`命令不仅功能全面,而且提供了一致且简洁的语法,适用于各种网络配置场景。因此,在实际使用中,推荐逐步过渡到 `ip`命令,以更好地适应现代网络管理需求。
285 11

推荐镜像

更多
  • DNS