Kubernetes包管理解决方案helm

实验环境

安装好k8s集群

一、引入helm原因

当今的软件开发,随着云原生技术的普及,我们的工程应用进行微服务化和容器化的现象也变得越来越普遍。而Kubernetes几乎已经成了云原生服务编排绕不开的标准和技术。

假设我们需要在K8s中简单部署一个nginx,必要步骤如下:

1、创建或者编写deployment模板

kubectl create deployment nginx --image=nginx:1.20 --dry-run=client -o yaml > deployment.yaml

2、创建deployment资源

kubectl apply -f deployment.yaml

3、查看pod状态

kubectl get pod

4、创建service

kubectl expose deployment nginx --port=8099 --target-port=80 --type=NodePort --dry-run=client -o yaml > service.yaml

5、创建service资源

kubectl apply -f service.yaml

6、查看service端口

kubectl get svc

7、访问nginx服务

使用浏览器访问192.168.10.11:31994

实际生产中,微服务项目可能有十几个模块,若还需要进行安全访问和控制,那么需要创建诸如Role、ServiceAccount等资源。部署和版本升级时也往往需要修改或添加配置文件中的一些参数(例如:服务占用的CPU、内存、副本数、端口等),维护大量的yaml文件极为不便,所以,我们需要将这些YAML文件作为一个整体管理,并高效复用。

  1. 在Linux操作系统软件部署中,我们可以使用批量管理工具完成软件的批量管理等,例如yum、apt等;
  2. 在容器应用中Docker使用Dockerfile文件解决了容器镜像制作难题;
  3. 在kubernetes应用中,通过YAML格式文件解决容器编排部署难题,例如可以通过YAML格式的资源清单文件,非常方便部署不同控制器类型的应用;
  4. 但是如何维护大量的,系统性的YAML文件,需要我们拥有更好的工具,不能简单使用YAML资源清单托管服务器就可以解决的

那么在CNCF的体系中是否存在这样的强力“工具”,能够简化我们部署安装过程呢?答案是存在的,Helm就是这样一款工具。

二、helm是什么

官方:https://helm.sh/

作为CNCF的毕业项目。它的官方的定义是:Helm是一个为K8s进行包管理的工具。Helm将yaml作为一个整体管理并实现了这些yaml的高效复用,就像Linux中的yum或apt-get,它使我们能够在K8s中方便快捷的安装、管理、卸载K8s应用。

  1. Helm(舵柄; 舵轮)是一个Kubernetes的包管理工具,就像Linux下的包管理器,如yum/apt等。
  2. helm一个命令行客户端工具,主要用于Kubernetes应用chart的创建、打包、发布和管理。
  3. 通过helm可以很方便的将之前打包好的yaml文件部署到kubernetes上。
  4. 对于应用发布者而言,可以通过Helm打包应用,管理应用依赖关系,管理应用版本并发布应用到软件仓库。
  5. 对于使用者而言,使用Helm后不用需要了解Kubernetes的Yaml语法并编写应用部署文件,可以通过Helm下载并在kubernetes上安装需要的应用。
  6. 除此以外,Helm还提供了kubernetes上的软件部署,删除,升级,回滚应用的强大功能。
  7. Helm 社区已经维护了一个官方 Helm Hub,我们可以直接使用已经做好的 Helm Chart,部署和管理比较复杂的应用程序
  8. 早期的hub.helm.dev转移到了https://artifacthub.io/。

三、helm作用及核心概念

Helm基于go模板语言,用户只要提供规定的目录结构和模板文件。在真正部署时Helm模板引擎便可以将其渲染成真正的K8s资源配置文件,并按照正确的顺序将它们部署到节点上。

Helm 定义了一套 Chart 格式来描述一个应用。打个比方,一个安卓程序打包成 APK 格式,就可以安装到任意一台运行安卓系统的手机上,如果我们把 kubernetes 集群比做安卓系统,kubernetes 集群内应用比做安卓程序,那么 Chart 就可以比做 APK。这就意味着,kubernetes 集群应用只要打包成 Chart,就可以通过 Helm 部署到任意一个 kubernetes 集群中。

Helm中有三个重要概念,分别为Chart、Repository和Release。

  1. Chart代表Helm包。它包含在K8s集群内部运行应用程序,工具或服务所需的所有资源定义,为所有项目资源清单yaml文件的集合,采用TAR格式,可以类比成yum中的RPM。
  2. Repository就是用来存放和共享Chart的地方,可以类比成YUM仓库。
  3. Release是运行在K8s集群中的Chart的实例,一个Chart可以在同一个集群中安装多次。Chart就像流水线中初始化好的模板,Release就是这个“模板”所生产出来的各个产品。

Helm作为K8s的包管理软件,每次安装Charts 到K8s集群时,都会创建一个新的 release。你可以在Helm 的Repository中寻找需要的Chart。Helm对于部署过程的优化的点在于简化了原先完成配置文件编写后还需使用一串kubectl命令进行的操作、统一管理了部署时的可配置项以及方便了部署完成后的升级和维护。

四、helm部署(二进制包)

下载或上传helm-v3.13.2-linux-amd64.tar.gz包到/root目录

下载方法:wget https://get.helm.sh/helm-v3.13.2-linux-amd64.tar.gz

tar xf helm-v3.13.2-linux-amd64.tar.gz

mv linux-amd64/helm /usr/bin/

helm version

五、helm基础使用

1、查看仓库

helm repo list

2、添加新的仓库地址

微软仓库:

helm repo add stable http://mirror.azure.cn/kubernetes/charts/

bitnami仓库(需要连接VPN才能添加):

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

阿里云仓库:

helm repo add alistable https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts

开源社仓库:

helm repo add kaiyuanshe http://mirror.kaiyuanshe.cn/kubernetes/charts

3、查看已经添加的仓库

helm repo list

4、为了确保获取到最新的Chart包信息,需要更新仓库

helm repo update

再次查看

helm repo list

5、删除仓库

helm repo remove kaiyuanshe

helm repo list

6、查看charts

使用helm search repo 关键字可以查看相关charts

helm search repo nginx

helm search repo mysql

从 stable Helm 仓库中安装名为 mysql 的 Chart

helm install mysql stable/mysql

列出当前 Kubernetes 集群中已安装的所有 Helm Release

helm list

NAME:mysql  Release 的名称,这里是 mysql。

NAMESPACE:default  Release 安装的命名空间,这里是 default。

REVISION:1 Release 的版本号,这里是 1,表示这是第一次安装或更新。

UPDATED:2025-04-11 17:45:58.45362188 +0800 CST  Release 的更新时间,格式为 YYYY-MM-DD HH:MM:SS +时区。

STATUS:deployed  Release 的状态,这里是 deployed,表示成功部署。

CHART:mysql-1.6.9  使用的 Chart 名称和版本,这里是 mysql Chart 的 1.6.9 版本。

APP VERSION:5.7.30  应用程序的版本,这里是 MySQL 的 5.7.30 版本。

kubectl get all

此处会因为连接不到StorageClass,pod异常

卸载名为 mysql 的 Helm Release

helm uninstall mysql

执行结果:

删除与 mysql Release 相关的所有 Kubernetes 资源(如 Pod、Service、PersistentVolumeClaim 等)。

从 Helm 的 Release 历史记录中移除 mysql。

六、部署应用MySQL

环境说明:k8s集群中存在storageclass:nfs-client

1、部署storageclass

(1)配置NFS服务

所有节点都安装nfs-utils工具包

yum -y install nfs-utils

这里将192.168.10.14作为nfs服务器

192.168.10.14:

mkdir -p /data/nfs

vim /etc/exports

添加:

/data/nfs *(rw,sync,no_root_squash)

 systemctl start nfs-server

systemctl enable nfs-server

showmount -e

worker1:

showmount -e 192.168.10.14

worker2:

showmount -e 192.168.10.14

(2)下载或上传storageclass-nfs.yml文件并创建storageclass(master1)

wget https://raw.githubusercontent.com/kubernetes-sigs/nfs-subdir-external-provisioner/master/deploy/class.yaml

mv class.yaml storageclass-nfs.yml

vim storageclass-nfs.yml

创建资源

kubectl apply -f storageclass-nfs.yml

列出集群中所有的 StorageClass(存储类)

kubectl get sc

存储类名为:nfs-client

(3)下载或上传rbac.yaml文件配置清单文件,创建rbac(创建账号,并授权)(master1)

因为storage自动创建pv需要经过kube-apiserver,所以需要授权。

RBAC(Role-Based Access Control):基于角色的访问控制

wget https://raw.githubusercontent.com/kubernetes-sigs/nfs-subdir-external-provisioner/master/deploy/rbac.yaml

mv rbac.yaml storageclass-nfs-rbac.yaml

vim storageclass-nfs-rbac.yaml

创建资源

kubectl apply -f storageclass-nfs-rbac.yaml

(4)创建动态供给的deployment(master1)

需要一个deployment来专门实现pv与pvc的自动创建

vim deploy-nfs-client-provisioner.yml

添加:

apiVersion: apps/v1

kind: Deployment

metadata:

  name: nfs-client-provisioner

spec:

  replicas: 1

  strategy:

    type: Recreate

  selector:

    matchLabels:

      app: nfs-client-provisioner

  template:

    metadata:

      labels:

        app: nfs-client-provisioner

    spec:

      serviceAccount: nfs-client-provisioner

      containers:

        - name: nfs-client-provisioner

          image: registry.cn-beijing.aliyuncs.com/pylixm/nfs-subdir-external-provisioner:v4.0.0

          volumeMounts:

            - name: nfs-client-root

              mountPath: /persistentvolumes

          env:

            - name: PROVISIONER_NAME

              value: k8s-sigs.io/nfs-subdir-external-provisioner

            - name: NFS_SERVER

              value: 192.168.10.14

            - name: NFS_PATH

              value: /data/nfs

      volumes:

        - name: nfs-client-root

          nfs:

            server: 192.168.10.14

            path: /data/nfs

创建资源

kubectl apply -f deploy-nfs-client-provisioner.yml

kubectl get pod | grep nfs-client-provisioner

2、安装MySQL应用

在所有已添加的 Helm 仓库中搜索与 mysql 相关的 Chart

helm search repo mysql

用 Helm 从 stable 仓库安装 MySQL Chart

helm install stable/mysql --generate-name --set persistence.storageClass=nfs-client --set mysqlRootPassword=test123

参数解析:

helm install:这是 Helm 的命令,用于安装 Chart。

stable/mysql:这是 Chart 的名称。stable 是仓库名称,mysql 是 Chart 名称。

--generate-name:让 Helm 自动生成一个唯一的 Release 名称,而不是手动指定。

--set persistence.storageClass=nfs-client:设置持久化存储的 StorageClass 为 nfs-client。

--set mysqlRootPassword=test123:设置 MySQL 的 root 用户密码为 test123

列出当前 Kubernetes 集群中已安装的所有 Helm Release

helm list或helm ls

kubectl get pod

kubectl get pvc

kubectl get pv

一个 chart 包是可以多次安装到同一个集群中的,每次安装都会产生一个release, 每个release都可以独立管理和升级。

再用 Helm 从 stable 仓库安装 MySQL Chart

helm install stable/mysql --generate-name --set persistence.storageClass=nfs-client --set mysqlRootPassword=root

列出当前 Kubernetes 集群中已安装的所有 Helm Release

helm ls

kubectl get pod

进入第一次创建的MySQL Pod

kubectl exec -it mysql-1744374156-55976dffc-nkmkv – bash

mysql -uroot -ptest123

show databases;

在NFS服务器上查看/data/nfs目录下的内容

ls /data/nfs/

3、查看Chart资源

helm ls

获取所有带有标签 release=mysql-1744374156 的资源

kubectl get all -l release=mysql-1744374156

显示 stable/mysql Chart 的详细信息

helm show chart stable/mysql

显示 stable/mysql Chart 的所有相关信息,包括 Chart 的元数据、默认值、模板和依赖项等

helm show all stable/mysql

4、删除Release

如果需要删除这个 Release 也很简单,只需要使用 helm uninstall或helm delete 命令即可

helm ls

卸载名为 mysql-1744374156 的 Helm Release

helm uninstall mysql-1744374156

执行结果:

删除与 mysql-1744374156 Release 相关的所有 Kubernetes 资源(如 Pod、Service、PersistentVolumeClaim 等)。

从 Helm 的 Release 历史记录中移除 mysql-1744374156

在NFS服务器上查看/data/nfs目录下的内容

ls /data/nfs/

持久化目录也一并删除

helm ls

在删除的时候使用 --keep-history 参数,则会保留 release 的历史记录,该 release 的状态就是 UNINSTALLED。

卸载名为 mysql-1744374360 的 Helm Release,同时保留其历史记录

helm uninstall mysql-1744374360 --keep-history

--keep-history:保留 Release 的历史记录,而不是完全删除

helm ls

获取所有带有标签 release= mysql-1744374360的资源

kubectl get all -l release=mysql-1744374360

资源都被删除

列出所有 Helm Release,包括已卸载的 Release

helm ls -a

STATUS:uninstalled  Release 的状态,这里是 uninstalled,表示已被卸载。

查看 Release 的历史记录

helm history mysql-1744374360

将名为 mysql-1744374360 的 Helm Release 回滚到指定的版本(这里是版本 1)

helm rollback mysql-1744374360 1

helm ls

rollback回滚后,又回到deployed状态表示成功部署

获取所有带有标签 release= mysql-1744374360的资源

kubectl get all -l release=mysql-1744374360

七、更多安装方式

1、Chart 仓库(上面的方式)

2、本地Chart包离线安装(实例)

从 stable 仓库下载 mysql Chart 的压缩包到本地

helm pull stable/mysql

ls

使用 Helm 从本地的 mysql-1.6.9.tgz Chart 压缩包安装 MySQL

helm install mysql2 mysql-1.6.9.tgz --set persistence.storageClass=nfs-client --set mysqlRootPassword=root

helm ls

获取所有带有标签 release=mysql2的资源

kubectl get all -l release=mysql2

3、在线URL安装

使用浏览器访问:Index of /kubernetes/charts/  找到所需包

helm install mysql http://mirror.azure.cn/kubernetes/charts/mysql-1.6.9.tgz --set persistence.storageClass=nfs-client --set mysqlRootPassword=root

helm ls

获取所有带有标签 release=mysql的资源

kubectl get all -l release=mysql

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值