为什么需要Helm

由于Kubernetes缺少对发布的应用版本管理和控制,使得部署的应 用维护和更新等面临诸多的挑战,主要面临以下问题:

  • 如何将这些服务作为一个整体管理?

  • 这些资源文件如何高效复用?

  • 不支持应用级别的版本管理

Helm介绍

Helm是一个Kubernetes的包管理工具,就像Linux下的包管理器,如yum/apt等,可以很方便的将之前 打包好的yaml文件部署到kubernetes上。

Helm有3个重要概念:

  • helm:一个命令行客户端工具,主要用于Kubernetes应用chart的创建、打包、发布和管理。

  • Chart:应用描述,一系列用于描述 k8s 资源相关文件的集合。

  • Release:基于Chart的部署实体,一个 chart 被 Helm 运行后将会生成对应的一个 release;将在 k8s中创建出真实运行的资源对象。

Helm目前有两个大版本:v2和v3

2019年11月Helm团队发布v3版本,相比v2版本最 大变化是将Tiller删除,并将大部分代码重构。

Helm客户端

使用helm很简单,你只需要下载一个二进制客户端包即可,会通过kubeconfig配置(通常 $HOME/.kube/config)来连接Kubernetes。

下载Helm客户端:

wget https://get.helm.sh/helm-v3.2.4-linux-amd64.tar.gz
tar zxvf helm-v3.2.4-linux-amd64.tar.gz
mv linux-amd64/helm /usr/bin/

Helm基本使用

Helm管理应用生命周期:

  • helm create 制作Chart

  • helm install 部署

  • helm upgrade 更新

  • helm rollback 回滚

  • helm uninstall 卸载

Helm基本使用:制作Chart

创建chart:

helm create mychart 

打包chart:

helm package mychart
  • Chart.yaml:用于描述这个 Chart的基本信息,包括名字、描述信息以及 版本等。

  • values.yaml :用于存储 templates 目录中模板文件中用到变量的值。

  • Templates: 目录里面存放所有yaml模板文件。

  • charts:目录里存放这个chart依赖的所有子chart。

  • NOTES.txt :用于介绍Chart帮助信息, helm install 部署后展示给用户。 例如:如何使用这个 Chart、列出缺省的设置等。

  • _helpers.tpl:放置模板的地方,可以在整个 chart 中重复使用。

Helm基本使用:部署

Helm核心是模板,即模板化K8s YAML文件。

部署多个应用时,将需要改动的字段进行模板 化,可动态传入。

cd mychart/templates/
#部署deployment
vim deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ .Release.Name }}-deployment
namespace: default
spec:
replicas: {{ .Values.replicas }} # Pod副本预期数量
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web # Pod副本的标签
spec:
containers:
- name: web1
image: {{ .Values.image }}:{{ .Values.imageTag }}

#部署service
vim service.yaml

apiVersion: v1
kind: Service
metadata:
labels:
app: web
name: {{ .Release.Name }}-service
spec:
type: NodePort # 服务类型
ports:
- port: 80 # Service端口
protocol: TCP # 协议
targetPort: 80 # 容器端口
nodePort: 30009 #nodeport暴露的端口
selector:
app: web # 指定关联Pod的标签


cd mychart/
#渲染变量
vim values.yaml
replicas: 3
image: "nginx"
imageTag: "1.17"

#部署Chart:
helm install web mychart/
#查看Release:
helm list -n default
#查看部署的Pod:
kubectl get pod
kubectl get svc

Helm基本使用:升级

为了实现Chart复用,可动态传参修改values.yaml中的 变量值,有两种方式:

  • –values,-f

  • –set

例如将升级应用版本和副本数:

helm upgrade --set imageTag=1.18,replicas=1 web mychart/
helm list
helm history web #查看历史版本
kubectl get pod -o wdie
curl -I 10.244.36.67 #访问验证是否升级到指定版本

Helm基本使用:回滚、卸载

回滚到上一个版本:

helm rollback web

查看历史版本:

helm history web

回滚到指定版本:

helm rollback web 1

卸载应用:

helm uninstall web

Helm基本使用:工作流程

helm install web mychart/ --dry-run   #尝试运行但不执行,调式
helm install web mychart/
helm get manifest web #显示web的清单

公共Chart仓库

国内Chart仓库,可直接使用它们制作好的包:

添加仓库方式:

helm repo add azure http://mirror.azure.cn/kubernetes/charts/
helm repo add aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
helm repo update #更新
helm repo list #列出当前的仓库
helm search repo mysql #搜索MySQL的chart包
helm install mysql aliyun/mysql #安装
helm pull aliyun/mysql --untar #从远程仓库中下载chart并解压到本地
helm package mychart/ #打包自己的chart