详解如何自定义开发构建一个Helm Chart包

举报
jiangxl 发表于 2022/05/05 22:34:49 2022/05/05
【摘要】 详解如何自定义开发构建一个Helm Chart包 文章目录 详解如何自定义开发构建一个Helm Chart包1.Helm Chart包的目录结构2.Chart包构建的相关命令3.自定义开发构建一...

详解如何自定义开发构建一个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的变量值。

image-20210723140427061

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端口即可访问。

image-20210723140149700

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

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。