什么是Helm

Kubernetes 包管理器
Helm 是查找、分享和使用软件构件 Kubernetes 的最优方式。

Helm 管理名为 chart 的 Kubernetes 包的工具。Helm 可以做以下的事情:

  • 从头开始创建新的 chart
  • 将 chart 打包成归档(tgz)文件
  • 与存储 chart 的仓库进行交互
  • 在现有的 Kubernetes 集群中安装和卸载 chart
  • 管理与 Helm 一起安装的 chart 的发布周期


对于Helm,有三个重要的概念:

  1. chart 创建Kubernetes应用程序所必需的一组信息。
  2. config 包含了可以合并到打包的chart中的配置信息,用于创建一个可发布的对象。
  3. release 是一个与特定配置相结合的chart的运行实例。

helm架构

重要概念

  • chart

chart 创建 Kubernetes 应用程序所必需的一组信息

  • config

config 包含了可以合并到打包的 chart 中的配置信息,用于创建一个可发布的对象。

  • release

release 是一个与特定配置相结合的 chart 的运行实例。

组件

Helm 客户端

**Helm 客户端 是终端用户的命令行客户端。负责以下内容:

  • 本地 chart 开发
  • 管理仓库
  • 管理发布
  • 与 Helm 库建立接口
    • 发送安装的 chart
    • 发送升级或卸载现有发布的请求
Helm 库

**Helm 库 提供执行所有 Helm 操作的逻辑。与 Kubernetes API 服务交互并提供以下功能:

  • 结合 chart 和配置来构建版本
  • 将 chart 安装到 Kubernetes 中,并提供后续发布对象
  • 与 Kubernetes 交互升级和卸载 chart

独立的 Helm 库封装了 Helm 逻辑以便不同的客户端可以使用它。

安装heml

helm类似于一个包管理工具,主要是为了解决k8s资源编排文件过多难以维护的问题。

使用halm快速部署应用

  1. 搜索应用:helm search repo nginx
  2. 安装应用:helm install nginx_name nginx
  3. 查看已安装应用:helm list
  4. 查看应用状态:helm status nginx
#下载二进制文件
[root@k8s-master helm]# wget https://get.helm.sh/helm-v3.2.3-linux-amd64.tar.gz
--2024-01-04 17:06:53--  https://get.helm.sh/helm-v3.2.3-linux-amd64.tar.gz
正在解析主机 get.helm.sh (get.helm.sh)... 152.199.39.108, 2606:2800:247:1cb7:261b:1f9c:2074:3c
正在连接 get.helm.sh (get.helm.sh)|152.199.39.108|:443... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度:12924654 (12M) [application/x-tar]
正在保存至: “helm-v3.2.3-linux-amd64.tar.gz”

100%[====================================================================================================================>] 12,924,654  3.87MB/s 用时 3.2s   

2024-01-04 17:06:59 (3.87 MB/s) - 已保存 “helm-v3.2.3-linux-amd64.tar.gz” [12924654/12924654])

[root@k8s-master helm]# ls
helm-v3.2.3-linux-amd64.tar.gz
#解压
[root@k8s-master helm]# tar -zxvf helm-v3.2.3-linux-amd64.tar.gz
linux-amd64/
linux-amd64/README.md
linux-amd64/LICENSE
linux-amd64/helm
[root@k8s-master helm]# ls
helm-v3.2.3-linux-amd64.tar.gz  linux-amd64
[root@k8s-master helm]# cd linux-amd64/
[root@k8s-master linux-amd64]# ls
helm  LICENSE  README.md
[root@k8s-master linux-amd64]# cp helm /usr/local/bin/
[root@k8s-master linux-amd64]# cd ~
[root@k8s-master ~]# pwd
/root
# 输入版本号 安装成功
[root@k8s-master ~]# helm version
version.BuildInfo{Version:"v3.2.3", GitCommit:"8f832046e258e2cb800894579b1b3b50c2d83492", GitTreeState:"clean", GoVersion:"go1.13.12"}

添加 helm 仓库

可以从helm仓库下载东西

# 安装 ingress-nginx
[root@k8s-master ~]# helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
"ingress-nginx" has been added to your repositories
#查看仓库列表
[root@k8s-master ~]# helm repo list
NAME         	URL                                       
ingress-nginx	https://kubernetes.github.io/ingress-nginx
# 搜索 ingress-nginx 这是配置好的软件的安装包
[root@k8s-master ~]# helm search repo ingress-nginx
NAME                       	CHART VERSION	APP VERSION	DESCRIPTION                                       
ingress-nginx/ingress-nginx	4.9.0        	1.9.5      	Ingress controller for Kubernetes using NGINX a...

Helm 的常用命令

命令描述
helm search使用关键词搜索 chart
helm pull拉取远程仓库中的 chart 到本地
helm create在本地创建新的 chart。
helm dependency管理 chart 的依赖。
helm install安装 chart。
helm list列出所有的 release。
helm lint检查 chart 配置是否有误。
helm package打包本地 chart。
helm repo列出、增加、更新、删除 chart 仓库。
helm rollback回滚 release 到历史版本。
helm uninstall卸载 release。
helm upgrade升级 release。

chart 详解

目录结构

mychart
├── Chart.yaml
├── charts # 该目录保存其他依赖的 chart(子 chart)
├── templates # chart 配置模板,用于渲染最终的 Kubernetes YAML 文件
│   ├── NOTES.txt # 用户运行 helm install 时候的提示信息
│   ├── _helpers.tpl # 用于创建模板时的帮助类
│   ├── deployment.yaml # Kubernetes deployment 配置
│   ├── ingress.yaml # Kubernetes ingress 配置
│   ├── service.yaml # Kubernetes service 配置
│   ├── serviceaccount.yaml # Kubernetes serviceaccount 配置
│   └── tests
│       └── test-connection.yaml
└── values.yaml # 定义 chart 模板中的自定义配置的默认值,可以在执行 helm install 或 helm update 的时候覆盖

Redis chart 实践

创建StorageClass制备器,配置NFS动态制备

1、k8s 中提供了一套自动创建 PV 的机制,就是基于 StorageClass 进行的,通过 StorageClass 可以实现仅仅配置 PVC,然后交由 StorageClass 根据 PVC 的需求动态创建 PV。

2、每个 StorageClass 都有一个制备器(Provisioner),用来决定使用哪个卷插件制备 PV。

# 在master节点上安装nfs服务,(每个node节点上都安装下nfs,这样的目的是为了node节点可以驱动nfs设备)
[root@k8s-master01 ~]# yum install nfs-utils -y

# 准备共享目录
 [root@k8s-master01 ~]# mkdir /nfs_data/rw/ 
 [root@k8s-master01 ~]# mkdir /nfs_data/ro/

# 暴露服务
[root@k8s-master01 ~]# vim /etc/exports
/nfs_data/rw 192.168.18.0/24(rw,sync,no_subtree_check,no_root_squash)
/nfs_data/ro 192.168.18.0/24(ro,sync,no_subtree_check,no_root_squash)

# 启动nfs服务
[root@k8s-master01 ~]# systemctl restart nfs

修改 helm 源
# 查看默认仓库
helm repo list

# 添加仓库
helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo add aliyun https://apphub.aliyuncs.com/stable
helm repo add azure http://mirror.azure.cn/kubernetes/charts

搜索 redis chart
# 搜索 redis chart
helm search repo redis

# 查看安装说明
helm show readme bitnami/redis

修改配置
# 先将 chart 拉到本地
helm pull bitnami/redis

[root@k8s-master k8s]# ls
Affinity  helm  ingress  jobs  pic  pod-toleration.yaml  redis-18.7.1.tgz  tolera

# 解压后,修改 values.yaml 中的参数
[root@k8s-master k8s]# tar -xvf redis-18.7.1.tgz

#解压好了创建了一个redis的文件夹
[root@k8s-master k8s]# ls
Affinity  helm  ingress  jobs  pic  pod-toleration.yaml  redis  redis-18.7.1.tgz  tolera

[root@k8s-master k8s]# cd redis
[root@k8s-master redis]# ls
Chart.lock  charts  Chart.yaml  img  README.md  templates  values.schema.json  values.yaml

#修改yaml文件
[root@k8s-master redis]# vi values.yaml


# 修改 storageClass 为 nfs-storage
# 设置 redis 密码 password
# 修改集群架构 architecture,默认是主从(replication,3个节点),可以修改为 standalone 单机模式
# 修改实例存储大小 persistence.size 为需要的大小  1GB
# 修改 service.nodePorts.redis 向外暴露端口,范围 <30000-32767> 可以不修改

# 安装操作
# 创建命名空间
kubectl create namespace redis

# 安装
cd ../
helm install redis ./redis -n redis
helm install redis ./redis -n dev


安装

# 安装操作
# 创建命名空间
kubectl create namespace redis

# 安装
cd ../
helm install redis ./redis -n redis

image.png

查看安装情况
# 查看 helm 安装列表
helm list

# 查看 redis 命名空间下所有对象信息
[root@k8s-master k8s]# kubectl get all -n redis
NAME                   READY   STATUS    RESTARTS   AGE
pod/redis-master-0     0/1     Pending   0          4m39s
pod/redis-replicas-0   0/1     Pending   0          4m39s

NAME                     TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE
service/redis-headless   ClusterIP   None             <none>        6379/TCP   4m39s
service/redis-master     ClusterIP   10.111.20.39     <none>        6379/TCP   4m39s
service/redis-replicas   ClusterIP   10.110.145.172   <none>        6379/TCP   4m39s

NAME                              READY   AGE
statefulset.apps/redis-master     0/1     4m39s
statefulset.apps/redis-replicas   0/3     4m39s

[root@k8s-master k8s]# kubectl get pvc -n redis
NAME                          STATUS    VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS          AGE
redis-data-redis-master-0     Pending                                      managed-nfs-storage   5m59s
redis-data-redis-replicas-0   Pending                                      managed-nfs-storage   5m59s

升级和回滚
#升级版本
[root@k8s-master01 redis]# helm upgrade redis ./ -n redis


# 查看历史
helm history redis
# 回退到上一版本
helm rollback redis
# 回退到指定版本
helm rollback redis 3

卸载redis
[root@k8s-master01 redis]# helm delete redis -n redis
kubectl delete pvc redis-data-redis-master-0 -n redis
kubectl delete pvc redis-data-redis-replicas-0 -n redis
Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐