详解如何自定义开发构建一个Helm Chart包
详解如何自定义开发构建一个Helm Chart包
1.Helm Chart包的目录结构
可以使用helm create chart_name
的方式创建一个chart。
[root@k8s-master1 ~/helm/chart]# helm create mychart
Creating mychart
[root@k8s-master1 ~/helm/chart]# tree mychart/
mychart/
├── charts
├── Chart.yaml
├── templates
│ ├── deployment.yaml
│ ├── _helpers.tpl
│ ├── ingress.yaml
│ ├── NOTES.txt
│ ├── serviceaccount.yaml
│ ├── service.yaml
│ └── tests
│ └── test-connection.yaml
└── values.yaml
3 directories, 9 files
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
chart目录结构解释
Chart.yaml:用于描述这个chart的基本信息,包括名字、描述信息、版本信息等。
values.yaml:用于存储templates目录中模板文件中用到的变量信息,也就是说template中的模板文件引用的是values.yaml中的变量。
templates:用于存放部署使用的yaml文件模板,这里面的yaml都是通过各种判断、流程控制、引用变量去调用values中设置的变量信息,最后完成部署。
- deployment.yaml:deployment资源yaml文件。
- ingress.yaml:ingress资源文件。
- NOTES.txt:用于接收chart的帮助信息,helm install部署完成后展示给用户,也可以时候helm status列出信息。
- _helpers.tpl:防止模板助手的地方,可以在整个chart中重复使用。
自定义一个chart包的流程
- 创建一个chart包。
- 将部署服务用到的yaml文件全部放到templates目录中,然后将yaml中可能每次都需要变动的地方修改为变量。
- 将每次都需要变动的地方写到values.yaml中,让模板文件去引用,即可完成部署。
2.Chart包构建的相关命令
创建chart:helm create chart_name
将chart打包:helm package chart_path
查看chart中yaml模板文件渲染信息:helm get manifest release_name
3.自定义开发构建一个Helm Chart包
手动创建一个chart包部署一个web项目。
具体实现步骤:
1.创建一个chart包结构目录。
2.删除template下的所有文件。
3.将之前通过yaml部署的web程序的yaml文件放到template目录中,然后将yaml中经常需要修改的参数用变量替代。
4.编写values.yaml存放变量信息。
5.部署chart。
3.1.创建一个Chart包
我们可以先手动创建一个chart,然后将其部署,观察默认创建的chart有什么配置信息。
1.创建chart
[root@k8s-master1 ~/helm/chart]# helm create know-system
Creating mychart
2.运行chart
[root@k8s-master1 ~/helm/chart]# helm install test know-system/
NAME: test
LAST DEPLOYED: Fri Jul 23 10:49:08 2021ll
NAMESPACE: default
STATUS: deployed
REVISION: 1
NOTES:
1. Get the application URL by running these commands:
export POD_NAME=$(kubectl get pods --namespace default -l "app.kubernetes.io/name=mychart,app.kubernetes.io/instance=test" -o jsonpath="{.items[0].metadata.name}")
echo "Visit http://127.0.0.1:8080 to use your application"
kubectl --namespace default port-forward $POD_NAME 8080:80
3.查看创建的chart中values.yaml文件内容了解部署的是什么服务
[root@k8s-master1 ~/helm/chart]# cat know-system/values.yaml
·······
replicaCount: 1
image:
repository: nginx
pullPolicy: IfNotPresent
········
#可以看到原来创建的chart没有进行过任何配置,默认是一个nginx容器
4.验证容器服务是否可用
[root@k8s-master1 ~/helm/chart]# kubectl get pod -o wide
test-mychart-5fb497c548-s6h5z 1/1 Running 0 6m26s 100.111.156.102 k8s-node1 <none> <none>
[root@k8s-master1 ~/helm/chart]# curl -I 100.111.156.102
HTTP/1.1 200 OK
Server: nginx/1.16.0
Date: Fri, 23 Jul 2021 02:55:57 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 23 Apr 2019 10:18:21 GMT
Connection: keep-alive
ETag: "5cbee66d-264"
Accept-Ranges: bytes
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
3.2.自定义templates模板文件
templates下的模板文件中需要变动的信息都需要通过变量的方式调用。
调用values.yaml中变量的书写格式:{{ .Values.变量名 }}。
将templates目录下的yaml默认模板文件清空
[root@k8s-master1 ~/helm/chart]# cd know-system/
[root@k8s-master1 ~/helm/chart/know-system]# rm -rf templates/*
- 1
- 2
3.2.1.生成deployment资源模板文件
首先进入templates目录。
1.通过kubectl create命令生成一个deployment资源的yaml文件
[root@k8s-master1 ~/helm/chart/know-system/templates]# kubectl create deployment know-system --image=nginx:1.16 -o yaml --dry-run > deployment.yaml
2.修改deployment.yaml文件将需要动态变动的信息替换成变量
[root@k8s-master1 ~/helm/chart/know-system/templates]# vim deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: {{ .Values.appname }} #将values.yaml中的appname对应的变量值渲染在这里
name: know-system
spec:
replicas: {{ .Values.replicas }} #将values.yaml中的replicas对应的变量值渲染在这里
selector:
matchLabels:
app: {{ .Values.appname }} #标签可以和资源名称一样,因此也可以直接调用appname变量
template:
metadata:
labels:
app: {{ .Values.appname }} #标签可以和资源名称一样,因此也可以直接调用appname变量
spec:
containers:
- image: {{ .Values.image }}:{{ .Values.imageTag }} #将values.yaml中的image、imageTag对应的变量值渲染在这里,表示镜像的版本号
name: {{ .Values.appname }} #容器的名称也和资源的名称保持一致即可
ports:
- name: web
containerPort: 80
protocol: TCP
volumeMounts:
- name: code
mountPath: /data/code/
- name: config
mountPath: /data/nginx/conf/conf.d/
volumes:
- name: config
configMap:
name: {{ .Values.appname }}-cm #confimap的名字也可以使用程序名称的变量加上-cm
- name : code
persistentVolumeClaim:
claimName: {{ .Values.appname }}-pvc #pvc的名字也可以使用程序名称的变量加上-pv
readOnly: false
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
3.2.2.生成service资源模板文件
首先进入templates目录。
[root@k8s-master1 ~/helm/chart/know-system/templates]# cat service.yaml
apiVersion: v1
kind: Service
metadata:
labels:
app: {{ .Values.appname }} #service要管理deployment的pod资源,因此这里的标签要和pod资源的标签对应上,直接调用appname这个变量
name: {{ .Values.appname }}-svc #service资源的名称,也可以直接调用appname这个变量,后面加一个-svc
spec:
ports:
- port: 80
protocol: TCP
targetPort: 80
selector:
app: {{ .Values.appname }} #标签选择器还是调用appname这个变量
type: NodePort
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
3.2.4.生成configmap资源模板文件
生成一个cm资源,用于配置nginx找到know-system项目。
[root@k8s-master1 ~/helm/chart/know-system/templates]# vim configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Values.appname }}-cm #引入appname变量加上-cm作为cm资源的名称
data:
know.jiangxl.com.conf: |
server {
listen 80;
server_name know.jiangxl.com;
location / {
root /data/code/know_system;
index index.html;
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
3.2.5.生成pv和pvc的资源模板文件
pvc存储web程序的代码
[root@k8s-master1 ~/helm/chart/know-system/templates]# vim pv-pvc.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: {{ .Values.appname }}-pv #引入appname变量加上-pv作为pv资源的名称
labels:
pv: {{ .Values.appname }}-pv #标签也可以使用和pv名称一样的名字
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteMany
persistentVolumeReclaimPolicy: Retain
nfs:
path: {{ .Values.nfsPath }}
server: {{ .Values.nfsServer }}
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: {{ .Values.appname }}-pvc #引入appname变量加上-pvc作为pvc资源的名称
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 1Gi
selector:
matchLabels:
pv: {{ .Values.appname }}-pv #指定pv的标签
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
3.3.自定义values变量文件
刚刚在资源模板文件中调用了很多变量,这一部将变量对应的值卸载values.yaml中。
#在chart根目录去写values.yaml
[root@k8s-master1 ~/helm/chart/know-system]# pwd
/root/helm/chart/know-system
[root@k8s-master1 ~/helm/chart/know-system]# vim values.yaml
appname: know-system
replicas: 3
image: harbor.jiangxl.com/project/know-system
imageTag: master-v47
nfsPath: /data2/k8s/know
nfsServer: 192.168.16.105
#整个目录结构
[root@k8s-master1 ~/helm/chart]# tree know-system/
know-system/
├── charts
├── Chart.yaml
├── templates
│ ├── configmap.yaml
│ ├── deployment.yaml
│ ├── pv-pvc.yaml
│ └── service.yaml
└── values.yaml
2 directories, 6 files
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
3.4.部署自定义构建的Chart包
[root@k8s-master1 ~/helm/chart]# helm install know-system know-system/
NAME: know-system
LAST DEPLOYED: Fri Jul 23 13:42:08 2021
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
- 1
- 2
- 3
- 4
- 5
- 6
- 7
3.5.查看变量渲染后的YAML模板文件
[root@k8s-master1 ~/helm/chart]# helm get manifest know-system
- 1
可以清楚的看到完整的yaml文件,在模板文件中的变量以及替换成了values的变量值。
3.6.查看Chart包部署的状态
1.查看helm的状态
[root@k8s-master1 ~/helm/chart]# helm list
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
know-system default 1 2021-07-23 13:57:15.052171621 +0800 CST deployed know-system-0.1.0 1.16.0
2.查看pod的资源状态
[root@k8s-master1 ~/helm/chart]# kubectl get pod | grep know
know-system-74c7c789d-2kpdr 1/1 Running 0 52s
know-system-74c7c789d-87nwk 1/1 Running 0 52s
know-system-74c7c789d-qgchh 1/1 Running 0 52s
3.查看svc的资源状态
[root@k8s-master1 ~/helm/chart]# kubectl get cm
NAME DATA AGE
know-system-cm 1 91s
4.查看cm资源的状态
[root@k8s-master1 ~/helm/chart]# kubectl get svc | grep know
know-system-svc NodePort 10.98.64.51 <none> 80:50597/TCP 97s
5.查看pv、pvc的状态
[root@k8s-master1 ~/helm/chart]# kubectl get pv,pvc | grep know-system
persistentvolume/know-system-pv 5Gi RWX Retain Bound default/know-system-pvc 2m53s
persistentvolumeclaim/know-system-pvc Bound know-system-pv 5Gi RWX 3m14s
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
3.7.访问由Chart包部署的web程序
使用k8s任意节点ip加svc暴露的50597端口即可访问。
4.将Chart包打包
[root@k8s-master1 ~/helm/chart]# helm package know-system/
Successfully packaged chart and saved it to: /root/helm/chart/know-system-0.1.0.tgz
[root@k8s-master1 ~/helm/chart]# ll
总用量 4
drwxr-xr-x 4 root root 93 7月 23 13:38 know-system
-rw-r--r-- 1 root root 1276 7月 26 11:24 know-system-0.1.0.tgz
#至于为什么生成的包是0.1.0,是因为0.1.0是在Chart.yaml中定义的
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
文章来源: jiangxl.blog.csdn.net,作者:Jiangxl~,版权归原作者所有,如需转载,请联系作者。
原文链接:jiangxl.blog.csdn.net/article/details/124582160
- 点赞
- 收藏
- 关注作者
评论(0)