为什么需要Helm
常规K8s部署应用方式:将需要的资源编写YAML文件,然后apply部署;
由于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。
项目地址:https://github.com/helm/helm
下载Helm客户端:
wget https://get.helm.sh/helm-v3.6.0-linux-amd64.tar.gz
[root@k8s-master1 ~]# tar zxf helm-v3.6.0-linux-amd64.tar.gz [root@k8s-master1 ~]# cd linux-amd64/
[root@k8s-master1 linux-amd64]# ls
helm LICENSE README.md
[root@k8s-master1 linux-amd64]# mv helm /usr/bin/
helm --help
Helm命令
Helm基本使用
Helm管理应用生命周期:
• helm create 创建Chart示例
• helm install 部署
• helm upgrade 更新
• helm rollback 回滚
• helm uninstall 卸载
Helm基本使用:创建Chart示例
创建chart:
helm create mychart
• charts:目录里存放这个chart依赖的所有子chart。
• Chart.yaml:用于描述这个 Chart的基本信息,包括名字、描述信息以及版本等。
• values.yaml :用于存储 templates 目录中模板文件中用到变量的值。
• Templates: 目录里面存放所有yaml模板文件。
• NOTES.txt :用于介绍Chart帮助信息, helm install 部署后展示给用户。例如:如何使用这个 Chart、列出缺省的设置等。
• _helpers.tpl:放置模板的地方,可以在整个 chart 中重复使用。
打包chart:
helm package mychart
简单理解:
自定义chart
[root@k8s-master1 ~]# mkdir -p mychart/templates
[root@k8s-master1 mychart]# touch values.yaml
[root@k8s-master1 mychart]# vim Chart.ymal
apiVersion: v2
name: mychart
description: A Helm chart for Kubernetes
type: application
version: 0.1.0
appVersion: "1.16.0"
[root@k8s-master1 mychart]# cd templates/
[root@k8s-master1 templates]# ls
[root@k8s-master1 templates]# touch NOTES.txt _helpers.tpl
[root@k8s-master1 templates]# echo "这是一个测试chart" > NOTES.txt
[root@k8s-master1 templates]# kubectl create deployment web --image=nginx --dry-run=client -o yaml > deployment.yaml
[root@k8s-master1 templates]# kubectl apply -f deployment.yaml
[root@k8s-master1 templates]# kubectl expose deployment web --port=80 --target-port=80 --type=NodePort --dry-run=client -o yaml > service.yaml
Helm基本使用:部署
部署Chart:
helm install web /root/mychart #web为名字
查看Release:
helm list -n default
查看部署的Pod:
kubectl get pods,svc
动态引用变量
[root@k8s-master1 mychart]# cat values.yaml
image:
repository: nginx
tag: "1.15"
[root@k8s-master1 templates]# cat deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: web
name: {
{
.Release.Name }} #根据命令行输入的名字动态设置
spec:
replicas: 1
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web
spec:
containers:
- image: {
{
.Values.image.repository }}:{
{
.Values.image.tag }}
name: nginx
resources: {
}
[root@k8s-master1 templates]# cat server.yaml
apiVersion: v1
kind: Service
metadata:
labels:
app: web
name: {
{
.Release.Name }}
spec:
ports:
- port: 80
protocol: TCP
targetPort: 80
selector:
app: web
[root@k8s-master1 templates]# helm install web4 /root/mychart/ -n