草庐IT

【云原生 • Kubernetes】一文掌握 k8s 包管理工具 Helm

敬 之 2023-04-18 原文


本文导读


一、为什么要引入 Helm

1. Helm 的应用场景

在以往的应用部署过程当中,我们需要先编写一个 yaml 文件,然后该文件中包含 deployment、Service、Ingress 等等。

如果说需要部署的是单一、少数服务的应用,那么完全可以使用 yaml 文件的方式,这样会很简单。但是在实际的项目当中,微服务的数量基本不可能是一个,可能是几十个,如果说再用 yaml 文件的部署方式,那就意味着需要编写几十个 yaml 文件,这就会导致 数量多维护难 等诸多问题。

2. 使用 Helm 可以解决哪些问题

针对上述问题,Helm 的引入使用则可以将所有的 yaml 文件进行一个整体的管理,而且它能够实现 yaml 文件的高效复用。

高效复用:yaml 文件的格式和结果基本相同,一般只是属性值有所变化。使用 helm 后,针对格式和结构基本相同的 yaml 文件就不需要一遍一遍的进行重复编写了,直接复用即可。

除此之外,Helm 还可以进行应用级别的版本管理,包括版本更新、回退等等。

二、Helm 概述

Helm 是 Kubernetes 的一个 包管理工具,类似于 Linux 下的包管理工具如 yum、apt 等。可以方便的将之前打包好的 yaml 文件部署到 Kunernetes 上。

在 Helm 中有三个主要概念:

概念含义
helm一个命令行工具,主要用于 k8s 应用 Chart 的创建、打包、发布和管理。
Chart应用描述,它是一系列用于描述 k8s 资源相关文件的集合(可以理解为 yaml 的集合)。
Release基于 Chart 的部署实体,一个 Chart 被 Helm 运行后将会生成一个对应的 release,然后将在 k8s 中创建出真正运行的资源对象,它是一个应用级别的版本管理。

在 2019 年 11 月 13日,Helm 团队发布了稳定版本 Helm v3,这也是当前主流版本。该版本与往期版本相比较有主要以下变化:

  • 删除了 Tiller;
  • 支持 release 在不同命名空间中重用;
  • 支持直接将 Chart 推送到 docker 仓库中。

如下为各版本 Helm 架构简易示意图。

v3 之前版本架构

v3 版本架构

三、Helm 安装与配置(v3)

1. 安装 Helm v3

第一步:前往 Helm 官网下载压缩文件;



也可以直接使用以下网址进行下载,我这里使用的是 3.0.0 版本:

操作系统Helm二进制文件下载地址(v3.0.0)
macOShttps://get.helm.sh/helm-v3.0.0-darwin-amd64.tar.gz
linux/amd64https://get.helm.sh/helm-v3.0.0-linux-amd64.tar.gz

第二步:将压缩文件上传至我们的 Linux 系统;

第三步:解压 helm 压缩文件;

#解压文件
tar -zxvf helm-v3.0.0-linux-amd64.tar.gz

解压后会有一个 linux-arm64 目录,这其中就包含了我们需要的 helm 文件;

第四步:将解压之后的 helm 目录复制或者移动到 /usr/local/bin 目录下;

#移动文件
mv helm /usr/local/bin

完成此四步的操作之后就可以直接在 Linux 系统中使用 helm 命令进行相关操作了,如果使用 helm 命令不报错,则说明 helm 安装成功。

2. 配置 Helm 仓库

添加仓库语法如下;

#语法
helm repo add 仓库名称 仓库地址

#eg:
#添加微软仓库
helm repo add stable http://mirror.azure.cn/kubernetes/charts
#添加阿里云仓库
helm repo add aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts

仓库成功添加之后可以使用 helm repo list 命令查看已有仓库;

四、使用 Helm 快速部署应用

在这里我们以部署可视化工具 weave 为例。

第一步:使用命令搜索应用 weave;

helm search repo weave

第二步:根据搜索到的内容选择安装;

#安装	
helm install ui stable/weave-scope

这里选择的是微软源的 weave-scope 进行安装,如果在安装过程中报错那就换一个源;

安装成功就可以使用命令 helm list 查看了;


接下来使用 kubectl get podskubectl get svc 就可以看到我们安装的 weave 相关内容和对外暴露端口;


第三步:可以看到此时并未对外暴露端口,所以我们需要修改 service 中的 yaml 文件,将 type 值改为 NodePort,使用命令 kubectl edit svc ui-weave-scope


修改过后再次查看 svc,此时已有端口暴露;

五、自定义 Chart 部署应用

我们在这里以部署自定义应用 myweb1 为例。

第一步:创建一个chart;

helm create mychart

创建成功会自动生成一个 mychart 目录(其实也就是一个模板);


在生成的目录中有以下几部分:

文件含义
charts一个普通的空文件,一般也不会写入内容
Chart.yaml当前 chart 属性的配置信息
templates自己定义的 yaml 文件存于此
values.yaml定义 yaml 文件的全局配置

第二步:进入 templates 目录,创建 deployment. yaml 文件;

[root@master mychart]# cd templates/
[root@master templates]# kubectl create deployment myweb1 --image=nginx --dry-run -o yaml > deployment.yaml
W0906 10:18:15.827722  113157 helpers.go:535] --dry-run is deprecated and can be replaced with --dry-run=client.
[root@master templates]# ls
deployment.yaml  ingress.yaml  serviceaccount.yaml  tests
_helpers.tpl     NOTES.txt     service.yaml

查看 deployment.yaml 文件;

第四步:设置对外暴露端口,创建 service.yaml 文件;

[root@master templates]# kubectl expose deployment myweb1 --port=80 --target-port=80  --type=NodePort --dry-run -o yaml > service.yaml
W0906 10:37:13.004600  126020 helpers.go:535] --dry-run is deprecated and can be replaced with --dry-run=client.
[root@master templates]# ls
deployment.yaml  ingress.yaml  serviceaccount.yaml  tests
_helpers.tpl     NOTES.txt     service.yaml

如果这里无法导出,我们就先创建一次镜像:kubectl create deployment myweb1 --image=nginx

导出 service 后再删除此镜像:kubectl delete deployment myweb1

查看 service.yaml 文件;


此时在 templates 目录中已有创建的两个 yaml 文件;


第五步:回到 mychart 父级目录,开始安装;

[root@master linux-amd64]# helm install myweb1 mychart/

安装成功后查看应用内容,应用节点与对外端口均创建成功;

myweb1 应用部署完成,此时就完成了 chart 的自定义及部署应用操作。

第六步:应用升级,每次修改 yaml 文件内容之后,我们均需对应用进行升级操作,使用如下命令。

#格式
helm upgrade 自定义应用名称 目录
#eg:
helm upgrade myweb1 mychart/

六、Helm 实现 yaml 文件高效复用

高效复用:如果若干 yaml 文件的格式和结果基本相同,只是属性值有所变化时。在使用 Helm 后,针对格式和结构基本相同的 yaml 文件就不需要一遍一遍的进行重复编写了,直接复用即可。其主要实现原理就是通过动态传递参数、动态渲染模板、动态传入参数生成 yaml 文件内容。

创建 chart 之后,目录下有一个 values.yaml 文件,基于此进行操作;


第一步:在 values.yaml 文件中定义全局变量和值;

第二步:在具体的 yaml 文件中获取定义的变量值。

原理就是以表达式的形式获取全局变量,格式为:{{ .Values.变量名称}}

此处以修改 deployment.yaml 文件为例:


修改后如下:

apiVersion: apps/v1
kind: Deployment
metadata:
  creationTimestamp: null
  labels:
    app: myweb1
  name: {{ .Release.Name}}-deploy
spec:
  replicas: 1
  selector:
    matchLabels:
      app: {{ .Values.label}}
  strategy: {}
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: {{ .Values.label}}
    spec:
      containers:
      - image: {{ .Values.image}}
        name: nginx
        resources: {}
status: {}

七、Helm 的常用操作命令汇总

#查看仓库
helm repo list

#更新仓库
helm repo update

#删除仓库
helm repo remove 仓库名称

#搜索应用
helm search repo 名称

#安装应用
helm install 自定义应用名称 搜索出的结果名

#查看安装后的应用
helm list
helm status 应用名称	

#创建chart
helm create chart名称

有关【云原生 • Kubernetes】一文掌握 k8s 包管理工具 Helm的更多相关文章

  1. 世界前沿3D开发引擎HOOPS全面讲解——集3D数据读取、3D图形渲染、3D数据发布于一体的全新3D应用开发工具 - 2

    无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD

  2. 基于C#实现简易绘图工具【100010177】 - 2

    C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.

  3. postman接口测试工具-基础使用教程 - 2

    1.postman介绍Postman一款非常流行的API调试工具。其实,开发人员用的更多。因为测试人员做接口测试会有更多选择,例如Jmeter、soapUI等。不过,对于开发过程中去调试接口,Postman确实足够的简单方便,而且功能强大。2.下载安装官网地址:https://www.postman.com/下载完成后双击安装吧,安装过程极其简单,无需任何操作3.使用教程这里以百度为例,工具使用简单,填写URL地址即可发送请求,在下方查看响应结果和响应状态码常用方法都有支持请求方法:getpostputdeleteGet、Post、Put与Delete的作用get:请求方法一般是用于数据查询,

  4. ruby-on-rails - 有没有一种工具可以在编码时自动保存对文件的增量更改? - 2

    我最喜欢的Google文档功能之一是它会在我工作时不断自动保存我的文档版本。这意味着即使我在进行关键更改之前忘记在某个点进行保存,也很有可能会自动创建一个保存点。至少,我可以将文档恢复到错误更改之前的状态,并从该点继续工作。对于在MacOS(或UNIX)上运行的Ruby编码器,是否有具有等效功能的工具?例如,一个工具会每隔几分钟自动将Gitcheckin我的本地存储库以获取我正在处理的文件。也许我有点偏执,但这点小保险可以让我在日常工作中安心。 最佳答案 虚拟机有些人可能讨厌我对此的回应,但我在编码时经常使用VIM,它具有自动保存功

  5. ruby - 使用 Ruby 开发工具包将文件上传到 Amazon S3 - 2

    我正在尝试上传文件。一个简单的hello.txt。我正在关注文档,但无法将其上传到我的存储桶。#STARTAWSCLIENTs3=Aws::S3::Resource.newbucket=s3.bucket(BUCKET_NAME)begins3.buckets[BUCKET_NAME].objects[KEY].write(:file=>FILE_NAME)puts"Uploadingfile#{FILE_NAME}tobucket#{BUCKET_NAME}."bucket.objects.eachdo|obj|puts"#{obj.key}=>#{obj.etag}"endresc

  6. ruby - 在 StockChart (highchart) 中以编程方式显示柱形图的工具提示 - 2

    我有一个Highstock图表(带有标记和阴影的线条),并且想以编程方式显示一个highstock工具提示,例如,当我选择某个表上的一行(包含图表数据)我想显示相应的highstock工具提示。这可能吗? 最佳答案 股票图表thissolution不起作用:在thisexample你必须更换这个:chart.tooltip.refresh(chart.series[0].data[i]);为此:chart.tooltip.refresh([chart.series[0].points[i]]);解决方案可用here.

  7. ABB-IRB-1200运动学分析MATLAB RVC工具分析+Simulink-Adams联合仿真 - 2

    一、机器人介绍        此处是基于MATLABRVC工具箱,对ABB-IRB-1200型号的微型机械臂进行正逆向运动学分析,并利Simulink工具实现对机械臂进行具有动力学参数的末端轨迹规划仿真,最后根据机械模型设计Simulink-Adams联合仿真。 图1.ABBIRB 1200尺寸参数示意图ABBIRB 1200提供的两种型号广泛适用于各作业,且两者间零部件通用,两种型号的工作范围分别为700 mm 和 900 mm,大有效负载分别为 7 kg 和5 kg。 IRB 1200 能够在狭小空间内能发挥其工作范围与性能优势,具有全新的设计、小型化的体积、高效的性能、易于集成、便捷的接

  8. 【云原生】SpringCloud-Spring Boot Starter使用测试 - 2

    目录SpringBootStarter是什么?以前传统的做法使用SpringBootStarter之后starter的理念:starter的实现: 创建SpringBootStarter步骤在idea新建一个starter项目、直接执行下一步即可生成项目。 在xml中加入如下配置文件:创建proterties类来保存配置信息创建业务类:创建AutoConfiguration测试如下:SpringBootStarter是什么? SpringBootStarter是在SpringBoot组件中被提出来的一种概念、简化了很多烦琐的配置、通过引入各种SpringBootStarter包可以快速搭建出一

  9. Ruby & Syslog & 自定义工具 - 2

    我是syslog的新手。我们决定使用系统日志来跟踪Rails应用程序中的一些特殊事件。问题是我不想使用默认的/var/log/system.log文件,而是使用自定义文件,例如/var/log/myapp_events.log.我看到我必须像这样在/etc/syslog.conf中定义我自己的设施:myapp_events.*/var/log/myapp_events.log重新启动syslogd后,我发现我可以直接在bash控制台中使用它:syslog-s-kFacilitymyapp_eventsMessage"thisismymessage"该消息按预期出现在/var/log/m

  10. ruby - 使用 Gatling 作为集成测试工具 - 2

    目前我有一小套针对我的网络服务器运行的集成测试,它发出请求并断言一些关于响应应该是什么的假设。这些是用Ruby编写的,生成http请求。我一直在看Gatling作为压力测试工具,但我想知道它是否也可以用于集成测试。这样,所有端点请求都可以在压力测试和集成测试中重复使用。我可能在这里失去了一些东西,因为没有RSpec的BDD,但不必两次创建相同的测试。有没有人有这样使用gatling的经验? 最佳答案 您可以使用AssertionAPI并设置验收标准。但是,Gatling不是浏览器,不会运行/测试您的Javascript,因此这种方法

随机推荐