13.k8s包管理工具helm的基本使用
孙富阳, 江湖人称没人称。多年互联网运维工作经验,曾负责过孙布斯大规模集群架构自动化运维管理工作。擅长Web集群架构与自动化运维,曾负责国内某大型博客网站运维工作。
1.Helm概述
1.为什么需要Helm
由于Kubernetes缺少对发布的应用版本管理和控制,使得部署的应用维护和更新等面临诸多的太挑战。主要面临以下问题:
(1)如何将这些服务作为一个整体管理?
(2)这些资源文件如何高效复用?
(3)不支持应用级别的版本管理?
2.Helm介绍
Helm是Kubernetes的包管理工具,就像Linux下的包管理器,如centos系统的yum,Ubuntu系统的apt等,可以方便将之前打包好的yaml文件部署到Kubernetes上。
helm有以下几个重要概念:
helm:
一个命令行客户端工具,主要用于kubernetes应用chart的创建,打包,发布和管理。
chart:
应用描述,一系列用于描述K8S资源相关文件的集合。
Release:
基于Chart的部署实体,一个chart被Helm运行后将会生成对应的一个release;将在K8S中创建出真实运行的资源对象。
3.Helm版本介绍
Helm目前有两个版本,即V2和V3。
2019年11月Helm团队发布V3版本,相比v2版本最大变化是将Tiller删除,并大部分代码重构。
helm v3相比helm v2还做了很多优化,比如不同命名空间资源同名的情况在v3版本是允许的,我们在生产环境中使用建议搭建使用v3版本,不仅仅是因为它版本功能较强,而且相对来说也更加稳定了。
官方地址:
https://helm.sh/docs/intro/install/
github地址:
https://github.com/helm/helm/releases
4.Helm的工作流程概述
helm有以下几个核心功能:
(1)将变量从"value.yaml"文件中获取,并渲染到chart模板文件中;
(2)chart模板文件对应的是一系列yaml文件,会基于这些yaml清单来部署应用到kuberntes集群;
(3)helm也有其对应的Chart仓库,这些公共仓库是一些其他开发或者运维人员编写好的chart,如果他们写的chart在我们工作中能用到就是最好的了;
2.Helm客户端部署
1.下载helm二进制软件包
使用heml很简单,你只需要下载一个二进制客户端包即可,会通过kubeconfig配置(通常位置在"$HOME/.kube/config")来连接kubernetes集群。
如下图所示,我们下载最新的helm软件包,下载地址为:"https://github.com/helm/helm/releases"

2.解压helm二进制软件包并配置环境变量
[root@k8s-master helm]# mkdir -pv /helm
[root@k8s-master helm]# tar zxf helm-v3.7.1-linux-amd64.tar.gz -C /helm
[root@k8s-master helm]# ln -sv /helm/linux-amd64/helm /usr/bin/
[root@k8s-master helm]# helm version
3.helm可用命令概述
completion:
生成命令补全的功能。使用"source <(helm completion bash)"
create:
创建一个chart并指定名称。
dependency:
管理chart依赖关系。
env:
查看当前客户端的helm环境变量信息。
get:
下载指定版本的扩展信息。
help:
查看帮助信息。
history:
获取发布历史记录。
install:
安装chart。
lint:
检查chart中可能出现的问题。
list:
列出releases信息。
package:
将chart目录打包到chart存档文件中。
plugin:
安装、列出或卸载Helm插件。
pull:
从存储库下载chart并将其解包到本地目录。
repo:
添加、列出、删除、更新和索引chart存储库。
rollback:
将版本回滚到以前的版本。
search:
在chart中搜索关键字。
show:
显示chart详细信息。
status:
显示已有的"RELEASE_NAME"状态。
template:
本地渲染模板。
test:
运行版本测试。
uninstall:
卸载版本。
upgrade:
升级版本。
verify:
验证给定路径上的chart是否已签名且有效
version:
查看客户端版本
4.配置helm命令自动补全
helm completion bash > .helmrc && echo "source .helmrc" >> .bashrc
source .bashrc
3.Helm工具创建chart
1.Chart的组织结构
chart是一个组织在文件目录中的集合。目录名称就是chart名称(没有版本信息)。
因而描述WordPress的chart可以存储在"wordpress/"目录中。以官方的"wordpress"为例,其包含以下文件内容:
Chart.yaml
一个包含chart的信息。
LICENSE
包含chart许可证的纯文本文件。
README.md
一个可读的自述文件,通常是给用户看的,以便于用户更加了解该Chart的使用。
values.yaml
定义此chart的默认配置值。
values.schema.json
用于在values.yaml文件上施加结构的JSON模式
charts/
包含此Chart的任何图表(chart)的目录。
crds/
自定义资源定义
templates/
模板目录,与values.yaml中的值组合使用,将用来生成Kubernetes清单文件。
templates/NOTES.txt
包含简短用法说明的纯文本文件。
参考链接:
https://helm.sh/docs/topics/charts/#the-chart-file-structure
https://helm.sh/zh/docs/topics/charts/#chart-%E6%96%87%E4%BB%B6%E7%BB%93%E6%9E%84
2.使用helm管理chart的生命周期
(1)创建一个名为"linux"的Chart(默认部署的是nginx 1.16)
[root@k8s-master helm]# mkdir chart
[root@k8s-master helm]# cd chart/
[root@k8s-master chart]# helm create linux
(2)创建kubernetes命名空间
[root@k8s-master chart]# kubectl create namespace helm
(3)部署自定义的Chart
[root@k8s-master chart]# helm install my-web01 ./linux -n helm
(4)查看releases信息和Pod信息
[root@k8s-master chart]# helm list -n helm
[root@k8s-master chart]# kubectl get pods -n helm -o wide
(5)卸载自定义的Chart
[root@k8s-master chart]# helm uninstall my-web01 -n helm
温馨提示:
一旦我们卸载了一个Chart,这意味着其创建的K8S资源也将被随之删除,因此生产环境中谨慎操作!
3.使用helm部署wordpress应用-未使用变量文件
###创建一个名为" linux"的Chart
[root@k8s-master helm]# mkdir chart
[root@k8s-master helm]# cd chart/
[root@k8s-master chart]# helm create linux
###删除模板文件
[root@k8s-master chart]# rm -rf
###自定义部署chart后的提示信息
[root@k8s-master linux]# > values.yaml
[root@k8s-master linux]# echo "Welcome to my Wordpress" > templates/NOTES.txt
[root@k8s-master linux]# cat Chart.yaml
apiVersion: v2
name: linux
description: A Helm chart for Kubernetes
type: application
version: 0.1.0
appVersion: "1.0"
#将模板文件放到templates目录下
[root@k8s-master linux]# cd templates/
[root@k8s-master templates]# cat > deployment-mysql.yaml <<EOF
> apiVersion: extensions/v1beta1
> kind: Deployment
> metadata:
> name: mysql
> namespace: kube-system
> spec:
> replicas: 1
> template:
> metadata:
> labels:
> app: mysql
> spec:
> containers:
> - name: mysql
> image: mysql:5.7
> ports:
> - containerPort: 3306
> env:
> - name: MYSQL_ROOT_PASSWORD
> value: somewordpress
> - name: MYSQL_DATABASE
> value: wordpress
> - name: MYSQL_USER
> value: wordpress
> - name: MYSQL_PASSWORD
> value: wordpress
> EOF
[root@k8s-master templates]# cat > svc-mysql.yaml <<EOF
> apiVersion: v1
> kind: Service #简称svc
> metadata:
> name: musql-svc
> namespace: kube-system
> spec:
> type: ClusterIP
> ports:
> - port: 3306
> targetPort: 3306 #pod port
> selector:
> app: mysql
> EOF
[root@k8s-master templates]# cat > deployment-wordpress.yaml <<EOF
> apiVersion: extensions/v1beta1
> kind: Deployment
> metadata:
> name: wordpress
> spec:
> replicas: 1
> template:
> metadata:
> labels:
> app: wordpress
> spec:
> containers:
> - name: wordpress
> image: wordpress:latest
> ports:
> - containerPort: 80
> env:
> - name: WORDPRESS_DB_HOST
> value: musql-svc.kube-system.svc.cluster.local
> - name: WORDPRESS_DB_USER
> value: wordpress
> - name: WORDPRESS_DB_PASSWORD
> value: wordpress
> EOF
[root@k8s-master templates]# cat > svc-wordpress.yaml <<EOF
> apiVersion: v1
> kind: Service #简称svc
> metadata:
> name: wordpress-svc
> spec:
> type: NodePort
> ports:
> - port: 80
> nodePort: 31001
> targetPort: 80 #pod port
> selector:
> app: wordpress
> EOF
###安装咱们自定义的chart
[root@k8s-master templates]# cd ../../
[root@k8s-master chart]# helm install wordpress linux/ -n helm
###查看安装是否成功
4.使用helm部署nginx应用-使用变量文件
###创建一个名为"nginx"的Chart
[root@k8s-master chart]# helm create nginx
###自定义"values.yaml"文件
[root@k8s-master nginx]# cat values.yaml
school: ["北京","上海","深圳"]
replicas: 3
image: "nginx"
imageTag: "1.13"
###删除无用的文件
[root@k8s-master nginx]# rm -rf templates/*
[root@k8s-master nginx]# cat NOTES.txt
北京欢迎您......[ 博客地址: https://www.buyao007.icu/ ]
我去过的城市: {{ .Values.school }}, image: [{{ .Values.image }}:{{ .Values.imageTag }}]
###创建资源的配置文件并引用"values.yaml"文件中的变量
[root@k8s-master nginx]# cd templates/
[root@k8s-master templates]# cat > myweb-deployment.yaml << EOF
> apiVersion: apps/v1
> kind: Deployment
> metadata:
> # 注意哈,此处的".Release.Name"我们并没有在"../values.yaml"文件中定义,该变量表示的是我们在部署chart时指定Release的名称
> name: {{ .Release.Name }}-deployment
> namespace: helm
> spec:
> # 此处我引用的是"../values.yaml"文件中的"replicas"变量
> replicas: {{ .Values.replicas }}
> selector:
> matchLabels:
> app: mynginx
> template:
> metadata:
> labels:
> app: mynginx
> spec:
> containers:
> - name: web
> # 此处我引用的是"../values.yaml"文件中的变量
> image: {{ .Values.image }}:{{ .Values.imageTag }}
> EOF
[root@k8s-master templates]# cat > myweb-service.yaml << EOF
> apiVersion: v1
> kind: Service
> metadata:
> name: {{ .Release.Name }}-service
> namespace: helm
> spec:
> ports:
> - port: 80
> protocol: TCP
> targetPort: 80
> selector:
> app: mynginx
> type: NodePort
> EOF
###部署服务
[root@k8s-master templates]# cd ../../
[root@k8s-master chart]# helm install web-nginx nginx/ -n helm
5.使用"--dry-run"选项并未真正部署!它会列出要执行的yaml文件内容!
[root@k8s-master chart]# helm install nginx nginx/ -n helm --dry-run
4.Helm工具升级与回滚Chart的Release
1.基于helm升级Chart的Release概述
为了实现Chart复用,可动态传参修改"values.yaml"文件中的变量值,有以下两种方式:
--values,-f:
基于yaml配置文件方式升级Release。
例如:"helm upgrade -f values.yaml myweb02 nginx"
--set:
基于命令行方式升级Release。例如:"helm upgrade --set imageTag=1.18 myweb02 oldboyedu-nginx"
如下图所示,对比了基于yaml配置文件和基于命令行方式升级Release的差别。

2.使用helm基于yaml配置文件方式升级Nginx应用
[root@k8s-master nginx]# cat values.yaml
school: ["北京","上海","深圳"]
replicas: 3
image: "nginx"
imageTag: "1.14"###修改版本为1.14
[root@k8s-master nginx]# helm upgrade -n helm web-nginx ../nginx/

3.使用helm基于命令行方式升级Nginx应用
[root@k8s-master nginx]# helm upgrade --set imageTag=1.15 -n helm web-nginx ../nginx
4.Helm工具回滚Chart的Release
###查看某个Chart的历史发布版本信息
[root@k8s-master nginx]# helm history -n helm web-nginx

###回滚到上一个版本
[root@k8s-master nginx]# helm rollback -n helm web-nginx

###回滚到指定的版本
[root@k8s-master nginx]# helm rollback -n helm web-nginx 1

5.Helm工具公共Chart仓库管理
1.主流的Chart仓库概述
国内Chart仓库,可以直接使用他们制作好的包:
官方仓库:
https://hub.kubeapps.com/charts/incubator
微软仓库:
http://mirror.azure.cn/kubernetes/charts/
阿里云仓库:
https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
添加仓库的方式:
helm repo list
查看现有的仓库信息,默认情况下是没有任何仓库地址的
helm repo add azure http://mirror.azure.cn/kubernetes/charts/
此处我们将微软云的仓库添加到咱们的helm客户端仓库
helm repo update
我们也可以更新仓库信息
2.手动添加微软云和阿里云Chart仓库
(1)未添加存储库之前,先查看仓库信息
helm repo list
(2)添加微软云的Chart仓库repositories
helm repo add azure http://mirror.azure.cn/kubernetes/charts/
(3)添加阿里云的Chart仓库 repositories
helm repo add aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
(4)再次查看仓库信息
helm repo list
(5)更新仓库信息
helm repo update
温馨提示:
当我们成功添加了存储库后记得更新一下
6.Helm工具私有Chart仓库管理
1.使用docker部署Chartmuseum私有Chart仓库
(1)创建数据持久化目录
mkdir -pv /data/chartmuseum
(2)启动chartmuseum容器
docker container run -d \
-p 8080:8080 \
-e DEBUG=1 \
-e STORAGE=local \
-e STORAGE_LOCAL_ROOTDIR=/charts \
-v /data/chartmuseum:/charts \
--restart always \
chartmuseum/chartmuseum:latest
(3)使用curl工具访问下接口,没有报错就行,当前仓库内容还是空的
curl http://10.0.0.11:8080/api/charts
推荐阅读:
https://github.com/helm/chartmuseum
2.准备helm及离线chart,推送到私有库
[root@k8s-master chartmuseum]# helm pull aliyun/redis
[root@k8s-master chartmuseum]# helm pull aliyun/mysql
[root@k8s-master chartmuseum]# curl http://10.0.0.11:8080/api/charts###发现已经有数据了
3.添加私有的仓库并上传自己的chart
[root@k8s-master chartmuseum]# helm repo add sfy-helm http://10.0.0.11:8080/
(1)将自定义的Chart进行打包
[root@k8s-master nginx]# helm package ../nginx/
(2)修改权限,否则执行下一条命令时会报错""
[root@k8s-master nginx]# chmod -R 777 /data
(3)使用 helm cm-push 插件上传自定义Chart
[root@k8s-master nginx]# yum -y install git
[root@k8s-master nginx]# helm plugin install https://gitee.com/jasonyin2020/helm-push.git
[root@k8s-master nginx]# helm cm-push nginx-0.1.0.tgz sfy-helm

未经允许不得转载:孙某某的运维之路 » 13.k8s包管理工具helm的基本使用
评论已关闭