一. helm介绍
- helm是作为k8s的包管理器,类似于centos的yum或者python的pip
- 可以实现k8s的多环境管理,dev,uat,prod的多环境的yaml管理
- helm本质上是一个Go的template模板, 我们可以自定义一些元数据,扩展的库以及一些类似于编程形式的工作流,例如: 条件语句,管道等的,这会使得模板更加丰富
二. 安装
wget https://get.helm.sh/helm-v3.2.4-linux-amd64.tar.gz
tar -zxf helm-v3.2.4-linux-amd64.tar.gz
cp linux-amd64/helm /usr/local/bin/
# 查看版本
helm version
version.BuildInfo{Version:"v3.2.4", GitCommit:"0ad800ef43d3b826f31a5ad8dfbb4fe05d143688", GitTreeState:"clean", GoVersion:"go1.13.12"}
# 添加helm仓库
helm repo add stable http://mirror.azure.cn/kubernetes/charts/
# 查看
helm repo ls
NAME URL
stable http://mirror.azure.cn/kubernetes/charts/
# 同步更新
helm repo update
三. 多环境管理
1. 模板文件
- 初始模板文件树,
Chart.yaml
可以理解为变量文件,且都可以被templates
目录下的文件所引用 templates
下的deployment
,ingress
,service
,hpa
,serviceaccount
都是部署一个应用所需要的yaml- 其中
_helpers
是放一下上面的deployment
,service
等都有可能用到的模板 NOTES
是部署应用后给用户的一个提示values
就是定义变量的
# 创建一个名字为nginx的chart模板
helm create nginx
cd nginx
[root@k8s-master ~/nginx]# tree .
.
├── charts
├── Chart.yaml
├── templates
│ ├── deployment.yaml
│ ├── _helpers.tpl
│ ├── hpa.yaml
│ ├── ingress.yaml
│ ├── NOTES.txt
│ ├── serviceaccount.yaml
│ ├── service.yaml
│ └── tests
│ └── test-connection.yaml
└── values.yaml
egrep -v "#|^$" Chart.yaml
apiVersion: v2
name: nginx
description: A Helm chart for Kubernetes
type: application
version: 0.1.0
appVersion: 1.16.0
2. 删除默认模板
rm -rf templates/*
cd templates
# 将这个配置清单写入到deployment.yaml,也可以kubectl create deployment web --image=nginx --dry-run=client -o yaml >deployment.yaml,然后删除不常用的字段得到如下
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: web
name: web
spec:
replicas: 1
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web
spec:
containers:
- image: nginx
name: nginx
# 将这个配置清单写入service.yaml中,或者先创建上面的deployment,然后kubectl expose deployment web --port=80 --target-port=80 --dry-run=client -o yaml >service.yaml,然后删除不常用的字段
apiVersion: v1
kind: Service
metadata:
labels:
app: web
name: web
spec:
ports:
- port: 80
protocol: TCP
targetPort: 80
selector:
app: web
3. helm运行
# 上面定义的配置清单直接用helm运行
helm install web /root/nginx/
# 查看状态
helm ls
# 删除掉,
helm uninstall web
release "web" uninstalled
4. 内置对象
- 上面用helm部署和之前的apply部署效果一样,但是在多环境中该怎么去应用呢
Release.Name
是将release的名称插入到模板中
Release.Name | release名称 |
---|
Release.Name | release名字 |
Release.Namespace | release名称空间 |
Release.Service | release服务的名称 |
Release.Revision | release修订版本号,从1开始累加 |
5. 自定义yaml变量
- 标签增加了一个
name: {{ .Chart.Name }}
,也可以不增加这个标签
{{ .Release.Name }}
也是一个内置的,他引用的是Chart.yaml
中的内容
{{ .Values.label }}
引用的是values.yaml
中的内容{{ .Values.inage }}:{{ .Values.imageTag }}
同样也是引用的是values.yaml
中的内容
# 这里只渲染了deployment,其他的资源配置清单和这个一样渲染
vim deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: {{ .Release.Name }}
name: {{ .Chart.Name }}
name: {{ .Release.Name }}
spec:
replicas: {{ .Values.replicas }}
selector:
matchLabels:
app: {{ .Values.label }}
template:
metadata:
labels:
app: {{ .Values.label }}
spec:
containers:
- image: {{ .Values.image }}:{{ .Values.imageTag }}
name: {{ .Release.Name }}
# 之前的默认的内容可以都删除了,和上面配置清单要一一对应,如下
vim values.yaml
replicas: 3
image: nginx
imageTag: 1.17
label: nginx
# 同时Chart.yaml文件中也要有相应的字段
6. 部署安装
# 先预览一下yaml
# 输出的是yaml内容,没有报错基本就没问题,其中Release.Name就是webee了
helm install web--dry-run /root/nginx/
NAME: web
LAST DEPLOYED: Sun Nov 14 13:52:53 2021
NAMESPACE: default
STATUS: pending-install
REVISION: 1
TEST SUITE: None
HOOKS:
MANIFEST:
---
# Source: nginx/templates/service.yaml
apiVersion: v1
kind: Service
metadata:
labels:
app: web
name: web
spec:
ports:
- port: 80
protocol: TCP
targetPort: 80
selector:
app: web
---
# Source: nginx/templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: web
name: nginx
name: web
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- image: nginx:1.17
name: web
# 然后安装
helm install webee