helm3
Helm客户端
安装
wget https://get.helm.sh/helm-v3.0.0-linux-amd64.tar.gz
tar zxvf helm-v3.0.0-linux-amd64.tar.gz
mv linux-amd64/helm /usr/bin/
配置仓库
- 微软仓库(http://mirror.azure.cn/kubernetes/charts/)这个仓库强烈推荐,基本上官网有的chart这里都有。
- 阿里云仓库(https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts )
- 官方仓库(https://hub.kubeapps.com/charts/incubator)官方chart仓库,国内有点不好使。
helm repo add stable 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 stable
- 删除存储库
helm repo remove aliyun
案例1
helm create mychart
cd mychart/
rm -rf /root/mychart/templates/*
- Chart.yaml (
helm create mychart 自动生成的文件
)
apiVersion: v2
name: nginx
description: A Helm chart for Kubernetes
type: application
version: 0.1.0
appVersion: 1.16.0
1. 生成模板deployment文件
kubectl create deployment mychart --image=nginx:1.16 -o yml -o yaml --dry-run > deployment.yaml
2. 修改deployment文件
- deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ .Values.name }}
spec:
replicas: {{ .Values.replicas }}
selector:
matchLabels:
app: mychart
template:
metadata:
labels:
app: mychart
spec:
containers:
- image: {{ .Values.image }}:{{ .Values.imageTag }}
name: nginx
resources: {}
- values.yaml
replicas: 3
name: hello
image: nginx
imageTag: 1.17
3. 安装
helm install hello /root/mychart/
4. 验证
kubectl get pods -owide
curl -I 192.168.236.233
5. 修改nginx版本并升级
- values.yaml
replicas: 3
name: hello
image: nginx
imageTag: 1.12
helm upgrade hello /root/mychart/
helm history hello
6. 回滚到上一个版本
helm rollback hello 1
kubectl get pods -owide
curl -I 192.168.236.240
7. 将nginx版本下降到1.8
helm upgrade --set imageTag=1.8 hello /root/mychart/
helm history hello
案例2
helm create nginx
cd nginx/
- 目录结构
├── charts
├── Chart.yaml # 可以被templates下面的文件引用
├── templates
│ ├── deployment.yaml
│ ├── _helpers.tpl
│ ├── ingress.yaml
│ ├── NOTES.txt
│ ├── serviceaccount.yaml
│ ├── service.yaml
│ └── tests
│ └── test-connection.yaml
└── values.yaml # 定义变量, 可以被templates下面的文件引用
手动deploy
rm -rf /root/nginx/templates/*
kubectl create deployment web --image=nginx --dry-run -o yaml>/root/nginx/templates/deployment.yaml
kubectl apply -f /root/nginx/templates/deployment.yaml
kubectl expose deployment web --port=80 --target-port=80 --dry-run -o yaml > service.yaml
- deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
creationTimestamp: null
labels:
app: web
name: web
spec:
replicas: 1
selector:
matchLabels:
app: web
strategy: {}
template:
metadata:
creationTimestamp: null
labels:
app: web
spec:
containers:
- image: nginx
name: nginx
resources: {}
status: {}
- service.yaml
apiVersion: v1
kind: Service
metadata:
creationTimestamp: null
labels:
app: web
name: web
spec:
ports:
- port: 80
protocol: TCP
targetPort: 80
selector:
app: web
status:
loadBalancer: {}
- 查看pod
kubectl get pods
- 查看service
kubectl get svc
helm 安装
kubectl delete -f /root/nginx/templates/
kubectl delete -f /root/nginx/
helm install web /root/nginx/
- 查看部署状态
helm ls
- 查看dashboard
helm定义变量安装
- helm全局变量
Release.Name | release 名称 |
---|---|
Release.Name | helm install时候 的 release 名字 |
Release.Namespace | release 命名空间 |
Release.Service | release 服务的名称 |
Release.Revision | release 修订版本号,从1开始累加 |
- deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
chart: {{ .Chart.Name }}
app: {{ .Release.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 }}
resources: {}
status: {}
- service.yaml
apiVersion: v1
kind: Service
metadata:
labels:
chart: {{ .Chart.Name }}
app: {{ .Release.Name }}
name: {{ .Release.Name }}
spec:
ports:
- port: {{ .Values.port }}
protocol: TCP
targetPort: {{ .Values.targetPort }}
selector:
app: {{ .Values.label }}
- values.yaml
replicas: 3
image: nginx
imageTag: 1.17
label: nginx_label
port: 80
targetPort: 80
- Chart.yaml
apiVersion: v2
name: nginx
description: A Helm chart for Kubernetes
type: application
version: 0.1.0
appVersion: 1.16.0
- 安装
helm install lyysb /root/nginx/
- 更新
helm upgrade lyysb --set replicas=1 /root/nginx/
--set 定义的变量的值的优先级最高
- 删除
helm delete lyysb
helm语法
条件判断(if)
条件判断中被对比的对象不支持数字, 单引号'', 必须使用双引号""
案例1
- deployment
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
chart: {{ .Chart.Name }}
app: {{ .Release.Name }}
name: {{ .Release.Name }}
spec:
replicas: {{ .Values.replicas }}
selector:
matchLabels:
app: {{ quote .Values.label }}
template:
metadata:
labels:
app: {{ .Values.label }}
{{- if eq .Values.test "lyysb" }}
develop: lyysb
{{- else }}
develop: lyysupersb
{{- end }}
spec:
containers:
- image: {{ .Values.image }}:{{ .Values.imageTag}}
name: {{ .Release.Name }}
resources: {}
status: {}
- values.yaml
replicas: 3
image: nginx
imageTag: 1.17
label: nginx_label
port: 80
targetPort: 80
test: 'lyysb'
案例2
- values.yaml
replicaCount: 3
image:
repository: nginx
tag: 1.17
pullPolicy: IfNotPresent
imagePullSecrets: []
nameOverride: ""
fullnameOverride: ""
serviceAccount:
create: true
name:
podSecurityContext: {}
securityContext: {}
service:
type: ClusterIP
port: 80
ingress:
enabled: true
annotations: {}
hosts:
- host: chart-example.local
paths: []
tls: []
resources: {}
nodeSelector: {}
tolerations: []
affinity: {}
- deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
chart: {{ .Chart.Name }}
app: {{ .Release.Name }}
name: {{ .Release.Name }}
spec:
replicas: {{ .Values.replicaCount }}
selector:
matchLabels:
app: {{ .Release.Name }}
chart: {{ .Chart.Name }}
template:
metadata:
labels:
app: {{ .Release.Name }}
chart: {{ .Chart.Name }}
spec:
containers:
- image: {{ .Values.image.repository }}:{{ .Values.image.tag }}
name: {{ .Release.Name }}
resources: {}
status: {}
-
Ingress.yaml
参考官网示例 https://v1-17.docs.kubernetes.io/docs/concepts/services-networking/ingress/
{{- if .Values.ingress.enabled }}
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: test-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- http:
paths:
- path: /testpath
backend:
serviceName: test
servicePort: 80
{{- end }}
条件判断(with)
- values.yaml
nodeSelector:
team: a
gpu: ok
-
deployment.yaml
{{- toYaml . | nindent 8 }}
可以写成 如下形式{{ .team}}
{{ .gpu }}
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
chart: {{ .Chart.Name }}
app: {{ .Release.Name }}
name: {{ .Release.Name }}
spec:
replicas: {{ .Values.replicaCount }}
selector:
matchLabels:
app: {{ .Release.Name }}
chart: {{ .Chart.Name }}
template:
metadata:
labels:
app: {{ .Release.Name }}
chart: {{ .Chart.Name }}
spec:
{{- with .Values.nodeSelector }}
nodeSelector:
{{- toYaml . | nindent 8 }}
{{- end }}
containers:
- image: {{ .Values.image.repository }}:{{ .Values.image.tag }}
name: {{ .Release.Name }}
resources: {}
status: {}
- 验证下
helm install web2 /root/helm/nginx/ --dry-run
循环(range)
- values.yaml
test:
- 'lzzsb'
- 'lyysb'
- 'lxxsb'
- configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}
data:
test:
{{- range .Values.test }}
{{ . }}
{{- end }}
- 验证
helm install web2 /root/helm/nginx/ --dry-run
变量
with 无法引用全局变量的解决办法
- values.yaml
nodeSelector:
team: a
gpu: ok
- deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
chart: {{ .Chart.Name }}
app: {{ .Release.Name }}
name: {{ .Release.Name }}
spec:
replicas: {{ .Values.replicaCount }}
selector:
matchLabels:
app: {{ .Release.Name }}
chart: {{ .Chart.Name }}
template:
metadata:
labels:
app: {{ .Release.Name }}
chart: {{ .Chart.Name }}
spec:
{{- with .Values.nodeSelector }}
nodeSelector:
name: {{ .Release.Name }}
{{- toYaml . | nindent 8 }}
{{- end }}
containers:
- image: {{ .Values.image.repository }}:{{ .Values.image.tag }}
name: {{ .Release.Name }}
resources: {}
status: {}
-
此时执行部署会出现报错
Error: template: nginx/templates/deployment.yaml:22:25: executing "nginx/templates/deployment.yaml" at <.Release.Name>: nil pointer evaluating interface {}.Name
-
解决方法
在全局变量前面加上
$
或者 在with 前面将全局变量的值赋值给一个变量, with内调用这个变量
spec:
{{- with .Values.nodeSelector }}
nodeSelector:
name: {{ $.Release.Name }}
{{- toYaml . | nindent 8 }}
{{- end }}
spec:
{{- $releasename := $.Release.Name -}}
{{- with .Values.nodeSelector }}
nodeSelector:
name: {{ $releasename }}
{{- toYaml . | nindent 8 }}
{{- end }}
range解压赋值
- values.yaml
env:
jvm.options:
-Xms128M
-Xmx128M
path: /usr/local/elasticsearch-6.6.0/data
log: /usr/local/elasticsearch-6.6.0/logs
network: 127.0.0.1
port: 9200
- deployment.yaml
spec:
{{- $releasename := $.Release.Name -}}
{{- with .Values.nodeSelector }}
nodeSelector:
name: {{ $releasename }}
{{- toYaml . | nindent 8 }}
{{- end }}
containers:
- image: {{ .Values.image.repository }}:{{ .Values.image.tag }}
name: {{ .Release.Name }}
env:
{{- range $k, $v := .Values.env }}
- name: {{ $k }}
value: {{ $v }}
{{- end }}
resources: {}
- 验证下
helm install web2 /root/helm/nginx/ --dry-run
命名模板
- helper.tpl
{{- define "name" -}}
{{ .Chart.Name }}-{{ .Release.Name }}
{{- end -}}
{{- define "labels" -}}
chart: {{ .Chart.Name }}-{{ .Chart.Version }}
app: {{ template "name" . }}
{{- end -}}
- deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
{{- include "labels" . | nindent 4 }}
name: {{ template "name" . }}
spec:
replicas: {{ .Values.replicaCount }}
selector:
matchLabels:
app: {{ .Release.Name }}
chart: {{ .Chart.Name }}
template:
metadata:
labels:
app: {{ .Release.Name }}
chart: {{ .Chart.Name }}
spec:
{{- with .Values.nodeSelector }}
nodeSelector:
{{- toYaml . |nindent 8 }}
{{- end }}
containers:
- image: {{ .Values.image.repository }}:{{ .Values.image.tag }}
name: {{ .Release.Name }}
resources: {}
status: {}
- 验证
helm install web /root/helm/nginx/ --dry-run
helm搭建私有仓库
参考: https://blog.51cto.com/14268033/2455006?source=dra
安装minio服务端
wget https://dl.min.io/server/minio/release/linux-amd64/minio
chmod +x minio
mkdir -p /chart
./minio server /chart
- 输入
http://172.16.240.100:9000/minio/login
,通过浏览器访问
- 在启动日志中获取access key和secret key
安装minio客户端
wget https://dl.min.io/client/mc/release/linux-amd64/mc
chmod +x mc
连接到服务端
命令在启动日志中有
./mc config host add myminio http://192.168.189.217:9000 minioadmin minioadmin
创建bucket
./mc mb myminio/minio-helm-repo
设置bucket和objects匿名访问
./mc policy set download myminio/minio-helm-repo
mkdir /root/helm/repo
helm repo index helm/repo/
./mc cp helm/repo/index.yaml myminio/minio-helm-repo
helm创建与仓库连接的index.yaml文件
mkdir /root/helm/repo
helm repo index helm/repo/
helm与minio仓库进行连接
1. 将index.yaml文件推送到backet中去
./mc cp helm/repo/index.yaml myminio/minio-helm-repo
2. helm连接私有仓库
helm repo add myrepo http://172.16.240.100:9000/minio-helm-repo
3. 更新repo仓库
helm repo update
4 .查看repo
helm repo list
5. 查看repo中的文件
./mc ls helm/repo/