2025,每天10分钟,跟我学K8S(三十八)- Helm (一)什么是Helm

        之前章节学习了K8S中各种各样的资源对象,现在提出一个问题,让你来创建一个可以对外提供访问的MYSQL服务,你会怎么做?我想了下大概有5个步骤如下:

  • 创建一个mysql-secret.yaml 用于定义mysql的账号密码
  • 创建一个mysql-volume.yaml 创建pv/pvc用于存储mysql持久化的数据
  • 创建一个mysql-deployment.yaml 用于创建mysql的pod服务
  • 创建一个mysql-service.yaml 用于提供对外服务
  • 使用kubectl apply -f 命令依次去应用上述yaml文件

        看起来都头大,为什么用了K8S,比在物理机上安装要麻烦这么多?而且这还只是一个mysql应用,当环境中有100个应用,那该怎么办?难道每个应用都要按照上述流程走一次?能不能使用一个 apt install mysql-server 就安装好一个服务呢?答案当然是有,Helm就相当于kubernetes环境下的apt包管理工具。

什么是HELM

        Helm 是 Kubernetes 生态中的核心包管理工具,旨在简化应用的打包、部署和生命周期管理。

一、Helm 的核心概念

  1. Chart

    • 定义:Helm 的“软件包”,包含应用部署所需的所有 Kubernetes 资源模板(如 Deployment、Service)及默认配置(values.yaml)。
    • 目录结构
      • Chart.yaml:元数据文件(名称、版本、依赖等)。
      • templates/:存放 Kubernetes 资源模板(支持 Go 模板语法)。
      • values.yaml:默认配置参数,支持动态注入。
  2. Release

    • 实例化:每次通过 Helm 安装 Chart 会生成唯一的 Release,记录版本状态和配置差异。
    • 版本追踪:支持查看历史版本及回滚(如 helm rollback <release> <version>)。
  3. Repository

    • 仓库类型:公共仓库(如 stablebitnami)和私有仓库(如 Harbor),用于存储和分发 Chart。
    • 仓库管理:通过 helm repo add/update 添加或同步仓库索引。

二、Helm 的核心功能与优势

  1. 简化复杂应用部署

    • 模板化配置:通过变量替换(如 {{ .Values.image.tag }})实现多环境配置复用。
    • 依赖管理:支持定义子 Chart(charts/ 目录)及版本约束。
  2. 生命周期管理

    • 安装/升级:使用 helm install/upgrade 部署或更新应用,自动处理资源顺序。
    • 回滚机制:基于版本快照快速恢复至历史状态(依赖 helm history 和 helm rollback)。
  3. 动态资源生成

    • 钩子(Hooks)​:在部署生命周期中插入自定义操作(如预检查、数据库迁移)。
    • 条件渲染:根据参数动态生成资源(如 if .Values.ingress.enabled 控制 Ingress 创建)。

三、Helm 的安装与使用

1.​安装 Helm

Helm现在主要使用v3版:

  • Helm官方网址:https://helm.sh/zh/
  • Helm国内镜像:http://mirror.rancher.cn/ 或 http://mirror.cnrancher.com/

本章采用最新版3.17.2(202503最新版)

  • 下载Helm
# 创建临时目录并下载
root@k8s-master:~# mkdir -vp helm
mkdir: created directory 'helm'
root@k8s-master:~# cd helm/
root@k8s-master:~/helm# wget https://rancher-mirror.rancher.cn/helm/v3.17.2/helm-v3.17.2-linux-amd64.tar.gz

# 解压并将二进制文件移至/usr/local/bin
root@k8s-master:~/helm# tar zxvf helm-v3.17.2-linux-amd64.tar.gz 
linux-amd64/
linux-amd64/LICENSE
linux-amd64/helm
linux-amd64/README.md


root@k8s-master:~/helm# cd linux-amd64/
root@k8s-master:~/helm/linux-amd64# ls
helm  LICENSE  README.md
root@k8s-master:~/helm/linux-amd64# mv helm /usr/local/bin/

# 版本验证
root@k8s-master:~/helm/linux-amd64# helm version
version.BuildInfo{Version:"v3.17.2", GitCommit:"cc0bbbd6d6276b83880042c1ecb34087e84d41eb", GitTreeState:"clean", GoVersion:"go1.23.7"}

  • 更换国内仓库

由于helm默认仓库是使用国外镜像,所以会导致很多时候速度慢甚至无法下载,将镜像仓库修改为阿里云仓库

# 查看仓库源 为空
helm repo list
# 新增仓库源,可以添加多个地址,
helm repo add azure  http://mirror.azure.cn/kubernetes/charts/
helm repo add aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts

# 配置国内Chart仓库
    
    阿里云仓库(https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts) #已经很久不更新
    微软仓库(http://mirror.azure.cn/kubernetes/charts/) #推荐
    官方仓库(https://hub.kubeapps.com/charts/incubator)官方chart仓库,国内有点不好使。


# 搜索redis镜像
# helm search repo redis
NAME                           	CHART VERSION	APP VERSION	DESCRIPTION                                       
aliyun/redis                   	1.1.15       	4.0.8      	Open source, advanced key-value store. It is of...
aliyun/redis-ha                	2.0.1        	           	Highly available Redis cluster with multiple se...
azure/prometheus-redis-exporter	3.5.1        	1.3.4      	DEPRECATED Prometheus exporter for Redis metrics  
azure/redis                    	10.5.7       	5.0.7      	DEPRECATED Open source, advanced key-value stor...
azure/redis-ha                 	4.4.6        	5.0.6      	DEPRECATED - Highly available Kubernetes implem...
aliyun/sensu                   	0.2.0        	           	Sensu monitoring framework backed by the Redis ...
azure/sensu                    	0.2.5        	0.28       	DEPRECATED Sensu monitoring framework backed by...


    2.使用Helm

    创建一个新的helm Chart

    # 创建一个myapp的自定义应用
    root@k8s-master:~/helm# helm create myapp
    Creating myapp
    
    # 进入目录
    root@k8s-master:~/helm# cd myapp/
    
    # 查看目录结构
    root@k8s-master:~/helm/myapp# tree
    .
    ├── charts
    ├── Chart.yaml
    ├── templates
    │   ├── deployment.yaml
    │   ├── _helpers.tpl
    │   ├── hpa.yaml
    │   ├── ingress.yaml
    │   ├── NOTES.txt
    │   ├── serviceaccount.yaml
    │   ├── service.yaml
    │   └── tests
    │       └── test-connection.yaml
    └── values.yaml
    
    3 directories, 10 files
    

    这里从目录结构可以看出来,可以总共分为3大部分:

    • Chart.yaml、
    • values.yaml
    • templates目录下的其他yaml文件

    这些文件有什么作用,会在后面的章节详细讲解,现在首先编辑values.yaml,发现默认是一个nginx的镜像,由于默认dockerhub仓库国内无法访问,将nginx镜像修改为镜像仓库。为了后面访问方便,将Service 的类型也改成 NodePort。

    修改镜像地址:



    修改service类型为NodePort:

    3.创建首个helm应用

            在myapp目录的上一层,使用命令 helm install myapp myapp 安装,这里第一个myapp 为创建后的deployments的名字,第二个myapp为刚create的目录名。

            在install后,提示我们可以运行后续命令,可以获取对应的服务暴露IP和端口,也就是可以通过  $NODE_IP:$NODE_PORT 来访问myapp这个服务。

    root@k8s-master:~/helm# ls
    helm-v3.17.2-linux-amd64.tar.gz  linux-amd64  myapp
    root@k8s-master:~/helm# helm install myapp myapp
    NAME: myapp
    LAST DEPLOYED: Thu Apr  3 14:28:31 2025
    NAMESPACE: default
    STATUS: deployed
    REVISION: 1
    NOTES:
    1. Get the application URL by running these commands:
      export NODE_PORT=$(kubectl get --namespace default -o jsonpath="{.spec.ports[0].nodePort}" services myapp)
      export NODE_IP=$(kubectl get nodes --namespace default -o jsonpath="{.items[0].status.addresses[0].address}")
      echo http://$NODE_IP:$NODE_PORT
    

    查看helm 下的应用,查看deployment,查看pod

    root@k8s-master:~/helm# helm list
    NAME 	NAMESPACE	REVISION	UPDATED                               	STATUS  	CHART      	APP VERSION
    myapp	default  	1       	2025-04-03 14:33:46.58464117 +0800 CST	deployed	myapp-0.1.0	1.16.0     
    root@k8s-master:~/helm# kubectl get deployments,pod
    NAME                    READY   UP-TO-DATE   AVAILABLE   AGE
    deployment.apps/myapp   1/1     1            1           21s
    
    NAME                        READY   STATUS    RESTARTS   AGE
    pod/myapp-6c5df5768-nvvcg   1/1     Running   0          21s
    

    查看nginx服务是否对外正常

    # 获取端口
    root@k8s-master:~/helm# echo $(kubectl get --namespace default -o jsonpath="{.spec.ports[0].nodePort}" services myapp)
    32117
    
    # 获取IP
    root@k8s-master:~/helm# echo $(kubectl get nodes --namespace default -o jsonpath="{.items[0].status.addresses[0].address}")
    172.21.176.3
    
    # 通过curl 访问测试
    root@k8s-master:~/helm# curl 172.21.176.3:32117
    <!DOCTYPE html>
    <html>
    <head>
    <title>Welcome to nginx!</title>
    ......
    

    4.载这个helm 应用

    使用命令 helm uninstall myapp 即可卸载,这里只需要有应用名即可。不需要带目录名,卸载后发现pod也消失了。

    root@k8s-master:~/helm# helm uninstall myapp
    release "myapp" uninstalled
    root@k8s-master:~/helm#  helm list
    NAME	NAMESPACE	REVISION	UPDATED	STATUS	CHART	APP VERSION
    root@k8s-master:~/helm# kubectl get deployments,pod
    No resources found in default namespace.
    

    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

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

    抵扣说明:

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

    余额充值