Helm 包管理工具
Helm的打包格式叫做chart,所谓chart就是一系列文件,它描述了一组相关的k8s集群资源。
目录
2、What Problems did Helm solve?
一、Helm 简介
1、What is Helm?
1. Helm Charts 是 Kubernetes项目中的一个子项目,该子项目现在托管在github上(https://github.com/kubernetes/helm),目的是提供Kubernetes 的包管理平台。
Helm 能够帮你管理 Kubernetes 的应用集合
Helm Charts 能够帮你定义、安装、升级最复杂的Kubernetes 应用集合
官网: Helm
2. Helm Charts 很容易创建,做版本化,共享和发布
最新版本的Helm 由CNCF 进行维护,
目前在业界已经有大量的公司在使用Helm,其中包括谷歌,微软,Bitnami等大型企业
2、What Problems did Helm solve?
在K8s 中部署一个可以使用的应用,需要涉及到很多的 Kubernetes 资源共同协作。
比如安装一个WordPress,用到了一些K8s 的一些资源对象,
包括Deployment、Service、Secret、pv、pvc来提供持久化服务。
并且WordPress 数据时存储在mariadb里面的,需要mariadb 启动就绪后才能启动WordPress。这些k8s资源过于分散,不方便管理,通过kubectl来管理它们将会十分麻烦。
所以在k8s中可以使用 Helm 部署一个应用来解决以下几个问题:
1. 如何统一管理、配置和更新这些分散的k8s 的应用资源文件
2. 如何分发和复用一套应用模板
3. 将应用的一系列资源当做一个软件包管理
3、Why Teams Love Helm
1. 管理复杂的应用集合
Charts 能够描述最复杂的应用,提供可重复,幂等性的安装,以及提供统一的认证中心服务
2. 容易升级
为团队提供实时的镜像升级,以及自定义 webhook,解决镜像升级的痛点(可以用helm搭建私有镜像仓库)
3. 企业内部共享
Charts 能够很容易的进行版本化、共享,
在企业内部提供私有Helm 仓库服务,解决了从官方源拉镜像速度慢的痛点
4. 回滚
使用 Helm 可以方便的进行应用的回滚,回到之前的Release 版本
4、Helm 相关概念
1. chart
Helm的打包格式叫做chart,所谓 chart 就是一系列文件,它描述了一组相关的k8s集群资源
2. Release
是chart的部署实例,一个chart 在一个Kubernetes 集群上可以有多个 release
3. Tiller Server
是Helm 的服务端。Tiller 负责接收Helm的请求,与k8s的 apiserver 交互,根据chart 来生成一个release 并管理 release
4. Helm
是一个命令行工具,通过gRPC 协议与Tiller Server 进行交互,主要提供了增删改查 chart、release 和 repository 相关的功能
5. Repoistory
Helm chart 的仓库,Helm 客户端通过HTTP协议来访问存储库中chart 的索引文件和压缩包
5、Helm 架构
1. Helm 客户端Go 编写的,用gRPC协议套件与 Tiller 进行交互
2. Tiller 服务器Go编写的,提供了一个gRPC服务器与客户端连接,使用kubenet客户端与kubernetes 通信,目前该库使用REST + JSON
3. Tiller 服务器把信息存储在kubernetes 中内置的ConfigMaps上,不需要自己的数据库
二、使用Helm
1、Helm 基本操作
1. 安装helm
①. 默认官方提供的方式如果不科学上网无法安装
$ curl https://baltocdn.com/helm/signing.asc | gpg --dearmor | sudo tee /usr/share/keyrings/helm.gpg > /dev/null #下载签名并导入 $ sudo apt-get install apt-transport-https --yes #安装支持https $ echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/helm.gpg] https://baltocdn.com/helm/stable/debian/ all main" | sudo tee /etc/apt/sources.list.d/helm-stable-debian.list #导入仓库 $ sudo apt-get update #更新仓库 $ sudo apt-get install helm #安装helm
②. 使用wget方式去github下载安装(以其中一个版本为例)
可在如下网址寻找需要的版本:Releases · helm/helm (github.com)
$ sudo wget https://get.helm.sh/helm-v3.10.1-linux-amd64.tar.gz #下载安装包 $ tar -zxvf helm-v3.10.1-linux-amd64.tar.gz #解压 $ sudo mv linux-amd64/helm /usr/local/bin/ $ chmod +x /usr/local/bin/helm #为helm增加执行权限 $ helm version #查看版本 version.BuildInfo{Version:"v3.10.1", GitCommit:"9f88ccb6aee40b9a0535fcc7efea6055e1ef72c9", GitTreeState:"clean", GoVersion:"go1.18.7"} '默认helm没有补全功能,加入以下命令可完成补全' source <(helm completion bash)
参考资料: Helm | Installing Helm
2. 使用helm
$ helm version #查看版本 $ helm search hub wordpress #hub为公共库 $ helm repo add kaiyuan http://mirror.kaiyuanshe.cn/kubernetes/charts/ #添加仓库,开源社区为例 $ helm repo update #更新仓库列表 $ helm repo list #查看仓库 $ helm search repo mysql #搜索mysql相关 $ helm install kaiyuan/mysql --generate-name #安装musql,生成随机名 $ helm list #查看 $ helm uninstall mysql-1653395570 #默认包无法直接使用,先卸载
参考资料: Helm | Using Helm
三、Chart简介
1、描述
Helm的打包格式叫做chart,所谓chart就是一系列文件,它描述了一组相关的k8s集群资源
2、目录名就是 Chart 的名字
1. Chart.yaml 包含Chart的基本信息,包括版本、名称(必选)等
2. README.md 可选文件,使用文档
3. templates k8s资源的 yaml 模板文件,Helm会将values.yaml 中的参数值注入 到模板中生成标准的yaml文件
查阅README.md文件相关需求
## Prerequisites 19 20 - Kubernetes 1.10+ with Beta APIs enabled 21 - PV provisioner support in the underlying infrastructure '提示需求必须要有PV,所以之前pod为pending状态'
文件中介绍的变量可以用value(大量)方式 也可以用--set方式(少量)
参考资料: Helm | Using Helm
四、Chart模板的使用
1、Chart.yaml文件
提供Charts 相关的各种元数据,他是一个Charts 必备的核心文件
查看命令说明
$ helm inspect values kaiyuan/mysql | less
1. 准备NFS
$ sudo mkdir -m 777 /nfs_{a..b} $ sudo tee /etc/exports <<EOF /nfs_a *(rw,no_root_squash) /nfs_b *(rw,no_root_squash) EOF $ sudo apt -y install nfs-kernel-server $ sudo systemctl enable nfs-server --now $ showmount -e Export list for k8s-master: /nfs_b * /nfs_a *
2. 创建PV
$ kubectl apply -f- <<EOF apiVersion: v1 kind: PersistentVolume metadata: name: pva spec: capacity: storage: 8Gi accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Recycle nfs: path: /nfs_a server: 192.168.147.102 --- apiVersion: v1 kind: PersistentVolume metadata: name: pvb spec: capacity: storage: 8Gi accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Recycle nfs: path: /nfs_b server: 192.168.147.102 EOF
$ kubectl get persistentvolume -o wide NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE VOLUMEMODE pva 8Gi RWO Recycle Available 41s Filesystem pvb 8Gi RWO Recycle Available 41s Filesystem
参考资料:持久卷 | Kubernetes
2、Helm 部署mysql
1.安装mysql
$ helm install test kaiyuan/mysql
2. 查看
$ kubectl get pods | grep mysql test-mysql-f4b787c8f-sfrxp 1/1 Running 0 2m58s $ kubectl get pvc #再次查看PVC已经绑定 NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE test-mysql Bound pva 8Gi RWO 7m12s $ helm status test #查看test信息 NAME: test LAST DEPLOYED: Thu Oct 13 06:50:02 2022 NAMESPACE: default STATUS: deployed REVISION: 1 NOTES: MySQL can be accessed via port 3306 on the following DNS name from within your cluster: test-mysql.default.svc.cluster.local To get your root password run: MYSQL_ROOT_PASSWORD=$(kubectl get secret --namespace default test-mysql -o jsonpath="{.data.mysql-root-password}" | base64 --decode; echo) '可以查看密码' To connect to your database: 1. Run an Ubuntu pod that you can use as a client: kubectl run -i --tty ubuntu --image=ubuntu:16.04 --restart=Never -- bash -il #进入pod 2. Install the mysql client: $ apt-get update && apt-get install mysql-client -y #安装mysql 3. Connect using the mysql cli, then provide your password: $ mysql -h test-mysql -p #进入mysql To connect to your database directly from outside the K8s cluster: MYSQL_HOST=127.0.0.1 MYSQL_PORT=3306 # Execute the following command to route the connection: kubectl port-forward svc/test-mysql 3306 mysql -h ${MYSQL_HOST} -P${MYSQL_PORT} -u root -p${MYSQL_ROOT_PASSWORD}
$ kubectl get secret --namespace default test-mysql -o jsonpath="{.data.mysql-root-password}" | base64 --decode; echo yuOWs8lXGo $ kubectl run -i --tty ubuntu --image=ubuntu:16.04 --restart=Never -- bash -il If you don't see a command prompt, try pressing enter.' root@ubuntu:/# mysql -h test-mysql -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 952 Server version: 5.7.30 MySQL Community Server (GPL) Copyright (c) 2000, 2021, Oracle and/or its affiliates. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql>
更多推荐
所有评论(0)