总结:helm

25 篇文章 7 订阅

一、介绍

Helm是k8s的包管理工具,类似Linux系统常用的 apt、yum等包管理工具,基于go 语言开发。使用helm可以简化k8s应用部署

参考:Helm入门实战 - 知乎

二、基本概念

Helm的基本概念

  • Chart:一个 Helm 包,其中包含了运行一个应用所需要的镜像、依赖和资源定义等,还可能包含 Kubernetes 集群中的服务定义,类似 Homebrew 中的 formula、APT 的 dpkg 或者 Yum 的 rpm 文件。
  • Release:在 Kubernetes 集群上运行的 Chart 的一个实例。在同一个集群上,一个 Chart 可以安装很多次。每次安装都会创建一个新的 release。例如一个 MySQL Chart,如果想在服务器上运行两个数据库,就可以把这个 Chart 安装两次。每次安装都会生成自己的 Release,会有自己的 Release 名称。
  • Repository:用于发布和存储 Chart 的存储库。

三、架构

Chart Install 过程:

  1. Helm从指定的目录或者tgz文件中解析出Chart结构信息
  2. Helm将指定的Chart结构和Values信息通过gRPC传递给Tiller
  3. Tiller根据Chart和Values生成一个Release
  4. Tiller将Release发送给Kubernetes运行。


Chart Update过程:

  1. Helm从指定的目录或者tgz文件中解析出Chart结构信息
  2. Helm将要更新的Release的名称和Chart结构,Values信息传递给Tiller
  3. Tiller生成Release并更新指定名称的Release的History
  4. Tiller将Release发送给Kubernetes运行

四、安装helm

helm主要包括helm客户端和Tiller服务端两部分,Tiller部署在k8s集群中。

ps: 如果使用阿里云容器服务kubernetes版,默认已经安装了helm的服务端(Tiller),只要安装helm客户端即可。

可以根据自己的环境从github地址下载对应的安装包:

下载地址:Releases · helm/helm · GitHub

下载后解压到自己喜欢的目录,然后配置下对应的PATH环境变量。

默认情况helm操作k8s集群,需要借助kubectl命令的集群配置,可以参考这里配置kubectl命令-(k8s应用配置详解),当然也可以直接给helm命令指定--kubeconfig 参数指定k8s集群证书路径。

#这是通过--kubeconfig参数指定k8s证书的方式操作k8s集群
#下面命令是部署一个名字叫app-demo的应用,helm包在./chart目录中
/alidata/server/helm-v2.13.1/helm --kubeconfig ./config/k8s.conf install app-demo ./chart

安装服务端:

使用helm init 命令,可以一键安装。

ps: 关于chart仓库(Repository),通过helm命令:helm serve 就可以启动仓库服务,但是通常很多时候我们每个项目自己的chart包都跟着源码一起提交到git仓库,所以这里的chart仓库不是必须的。

五、helm常用命令

helm version:查看helm版本

helm repo add:添加chart仓库

  • helm repo add bitnami https://charts.bitnami.com/bitnami

helm repo list:列出已添加的仓库

helm repo update bitnami:从chart仓库中更新本地可用chart的信息

helm repo update:更新参考资源

helm list:列出当前安装的charts

  • 如:helm list -n iks-ns-hubble-mimir

helm install:上传chart到Kubernetes

  • 如:helm -n iks-ns-hubble-mimir install mimir4 ./ -f ./small-s3.yaml

helm search repo grafana:搜索chart

helm fetch grafana/mimir-distributed:下载charts到本地

 下载下来是tgz文件,需要进行解压:

  • gunzip mimir-distributed-4.3.0.tgz
  • tar -xvf mimir-distributed-4.3.0.tar

 进入目录:

这里面的values.yaml就可以自定义修改了,然后重新安装的时候指定使用本地的chart而不是repo中的。

本地chart目录:/data/weiwei/helm-ww/helm-mimir/mimir-distributed/mimir-distributed

helm create命令: 创建一个Helm Chart初始安装包工程

假设我们的Chart名称叫做myChart,我们可以使用命令:

$ Helm create myChart

创建一个初始模板工程,那么在名为myChart的目录下包含了以下目录和文件:

其中关键的目录和文件作用如下:

★ templates/ 目录包含了模板文件。Helm会通过模板渲染引擎渲染所有该目录下的文件来生成Chart,之后将收集到的模板渲染结果发送给K8s。

★ values.yaml 文件对于模板也非常重要。这个文件包含了对于一个Chart的默认值 。这些值可以在用户执行Helm install 或 Helm upgrade时指定新的值来进行覆盖。

★ Chart.yaml 文件包含对于该Chart元数据描述。这些描述信息可以在模板中被引用。

★ _helper.tpl 包含了一些可以在Chart中进行复用的模板定义。

Helm template myChart/ --output-dir ./result命令:预安装校验

  • 该命令会在myChart同级目录创建一个result目录,该目录内会存在模板渲染之后的配置文件,我们可以通过检查这些文件内容结合命令行的提示信息判断错误发生位置。

--set使用:

values.yaml 中包含了默认的安装参数,但是诸如数据库的ip、username、password,若我们不想去修改安装包,如何在安装的时候进行覆盖呢?我们只要在 install 时使用 set 选项,设置想要覆盖的参数值即可。

$ Helm install myChart-test myChart--set config.mysql.server=100.71.32.11

六、基本用法

这里以制作一个简单的网站应用chart包为例子介绍helm的基本用法。

ps: 这里跳过docker镜像制作过程,镜像制作可以参考:Docker基础教程

5.1.创建chart包

例子:通过helm create命令创建一个新的chart包

helm create myapp:在当前目录创建一个myapp chart包

创建完成后,得到的目录结构如下:

myapp                                   - chart 包目录名
├── charts                              - 依赖的子包目录,里面可以包含多个依赖的chart包
├── Chart.yaml                          - chart定义,可以定义chart的名字,版本号信息。
├── templates                           - k8s配置模版目录, 我们编写的k8s配置都在这个目录, 除了NOTES.txt和下划线开头命名的文件,其他文件可以随意命名。
│   ├── deployment.yaml
│   ├── _helpers.tpl                    - 下划线开头的文件,helm视为公共库定义文件,主要用于定义通用的子模版、函数等,helm不会将这些公共库文件的渲染结果提交给k8s处理。
│   ├── ingress.yaml
│   ├── NOTES.txt                       - chart包的帮助信息文件,执行helm install命令安装成功后会输出这个文件的内容。
│   └── service.yaml
└── values.yaml                         - chart包的参数配置文件,模版可以引用这里参数。

可以对比下mimir-distributed目录下的文件:

我们要在k8s中部署一个网站应用,需要编写deployment、service、ingress三个配置文件,刚才通过helm create命令已经创建好了。

5.2.编写k8s应用部署配置文件

为了演示chart包模版的用法,我们先把deployment、service、ingress三个配置文件的内容清空,重新编写k8s部署文件。

deployment.yaml 配置文件定义如下

apiVersion: apps/v1beta2
kind: Deployment
metadata:
  name: myapp           #deployment应用名
  labels:
    app: myapp          #deployment应用标签定义
spec:
  replicas: 1           #pod副本数
  selector:
    matchLabels:
      app: myapp          #pod选择器标签
  template:
    metadata:
      labels:
        app: myapp          #pod标签定义
    spec:
      containers:
        - name: myapp           #容器名
          image: xxxxxx:1.7.9    #镜像地址
          ports:
            - name: http
              containerPort: 80
              protocol: TCP

service.yaml定义如下:

apiVersion: v1
kind: Service
metadata:
  name: myapp-svc #服务名
spec:
  selector: #pod选择器定义
    app: myapp
  ports:
  - protocol: TCP 
    port: 80
    targetPort: 80

ingress.yaml定义如下:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: myapp-ingress #ingress应用名
spec:
  rules:
    - host: www.xxxxx.com  #域名
      http:
        paths: 
          - path: /  
            backend: 
              serviceName: myapp-svc #服务名
              servicePort: 80

5.3.提取k8s应用部署配置文件中的参数,作为chart包参数。

上面已经完成k8s应用部署配置文件的编写。

为什么要提取上面配置文件中的参数,作为chart包的参数?

思考下面的问题:

我们制作好一个chart包之后,如实现chart包更具有通用性,我们如何换域名?换镜像地址?改一下应用部署的名字?  部署多套环境(例如:dev环境、test环境分别以不同的应用名字部署一套)

5.2定义的k8s配置文件还不能称之为模版,都是固定的配置。(这里所说的模版就类似大家平时做前端开发的时候用的模版技术是一个概念)

我们通过提取配置中的参数注入模版变量,模版表达式将配置文件转化为模版文件,helm在运行的时候根据参数动态的将模版文件渲染成最终的配置文件。

下面将deployment、service、ingress三个配置文件转换成模版文件。

ps:  {{  }} 两个花括号包裹的内容为模版表达式,具体含义,后面会说明,这里不用理会。

deployment.yaml 配置模版如下

apiVersion: apps/v1beta2
kind: Deployment
metadata:
  name: {{ .Release.Name }}  #deployment应用名
  labels:
    app: {{ .Release.Name }}          #deployment应用标签定义
spec:
  replicas: {{ .Values.replicas}}           #pod副本数
  selector:
    matchLabels:
      app: {{ .Release.Name }}          #pod选择器标签
  template:
    metadata:
      labels:
        app: {{ .Release.Name }}          #pod标签定义
    spec:
      containers:
        - name: {{ .Release.Name }}           #容器名
          image: {{ .Values.image }}:{{ .Values.imageTag }}    #镜像地址
          ports:
            - name: http
              containerPort: 80
              protocol: TCP

service.yaml定义如下:

apiVersion: v1
kind: Service
metadata:
  name: {{ .Release.Name }}-svc #服务名
spec:
  selector: #pod选择器定义
    app: {{ .Release.Name }}
  ports:
  - protocol: TCP 
    port: 80
    targetPort: 80

ingress.yaml定义如下:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: {{ .Release.Name }}-ingress #ingress应用名
spec:
  rules:
    - host: {{ .Values.host }}  #域名
      http:
        paths: 
          - path: /  
            backend: 
              serviceName: {{ .Release.Name }}-svc #服务名
              servicePort: 80

values.yaml chart包参数定义:

#域名
host: www.XXX.com
 
#镜像参数
image: XXXXXXXXXXXXXXXXXX
imageTag: 1.7.9
 
#pod 副本数
replicas:1

5.4.通过helm命令安装/更新应用

安装应用:

#命令格式: helm install  chart包目录

$ helm install ./myapp

通过命令注入参数

#命令格式: helm install  --set key=value   chart包目录

#–set 参数可以指定多个参数,他的值会覆盖values.yaml定义的值,对象类型数据可以用 . (点)分割属性名,例子:  --set apiAppResources.requests.cpu=1
$ helm install --set replicas=2 --set host=www.xxxx.com ./myapp

更新应用:

命令格式: helm upgrade release名字  chart包目录

$ helm upgrade myapp ./myapp

也可以指定–set参数

$ helm upgrade --set replicas=2 --set host=www.xxxx.com myapp ./myapp

默认情况下,如果release名字不存在,upgrade会失败,可以加上-i 参数当release不存在的时候则安装,存在则更新,将install和uprade命令合并。

$ helm upgrade  -i --set replicas=2 --set host=www.xxxx.com myapp ./myapp

七、helm支持只升级某个组件吗?

问:在./这个chart路径下有个templates目录,templates目录里包含了很多组件目录,如querier,alertmanager,ingester等,如果我改了chart路径下values.xml中的alertmanager部分配置,且值想升级alertmanager组件,如果操作或者有什么命令?

答:在你描述的情况下,这个 Helm chart 包含多个组件,它们在 templates 目录中以子目录的形式组织。由于 Helm charts 是将所有组件作为整体进行部署和升级处理,因此你无法直接单独升级某个组件。当你执行 helm upgrade 时,它会升级整个chart(包括alertmanager和其他组件)。

但是,如果只有alertmanager的配置发生了变化,升级过程中其他组件不会受到影响(它们将保持当前状态),只有alertmanager将应用新的配置。

所以,你可以继续使用之前提到的命令来升级chart:

helm -n iks-ns-hubble-mimir upgrade hubble-mimir ./ -f ./small-s3.yaml

在这个例子中,假设你已经修改了values.xml(应该是 values.yaml)中的 alertmanager 配置部分。执行上面的命令,Helm将应用这些新的配置并重新部署alertmanager组件,同时确保其余组件保持当前状态。只要其他组件的配置在执行 helm upgrade 时没有改变,它们不会受到影响。

请确保在执行命令之前将改动过的 values.yaml 文件保存。

注意: 如果你的目的是将 alertmanager 修改为一个独立的可升级组件,你需要将其单独成一个 Helm chart。这样,你可以针对这个单独的 chart 来进行安装和升级操作。但这需要对现有的 chart 结构进行一些调整。

实践:修改了alertmanager的配置后用通用的升级命令,发现只有alertmanager被升级了,其它组件并没有重启。

总结:看现象是,一些全局配置会进行所有组件升级,其它单独组件的配置块的修改则只会升级这一个组件。


来源:

【云原生】Helm 常用命令(chart 安装、升级、回滚、卸载等操作)_helm下载chart到本地_大数据老司机的博客-CSDN博客

https://www.cnblogs.com/lyc94620/p/10945430.html

helm介绍及使用_helm开发工具_王小栋857的博客-CSDN博客

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值