Chart的命名模板
命名模板有时候也被称为部分或子模板。
相对于 deployment.yaml 这种主模板,命名模板只是定义部分通用内容,然后在各个主模板中调用。
templates目录下有个_helpers.tpl文件。公共的命名模板都放在这个文件里。
命名模板使用 define 来定义。
如,这里先简单定义一个只包含字符串的模板,用作资源名称。
cat > templates/_helpers.tpl <<EOF
{{/* 定义资源名称 */}}
{{ define "mytest.name" -}}
tanglinux
{{- end }}
EOF
使用template引用
cat > templates/test.yaml <<EOF
apiVersion: apps/v1
kind: Deployment
metadata:name: {{ template "mytest.name" }}labels:app: {{ .Values.myname }}
EOF
渲染
helm template testrelease .
include用法:
cat > templates/_helpers.tpl <<EOF
{{/* 定义资源名称 */}}
{{ define "mytest.name" -}}
tanglinux
{{- end }}{{/* 定义label */}}
{{- define "mytest.label" -}}
app: {{ .Release.Name }}
release: stable
env: qa
{{- end }}
EOF
在template的yaml文件里调用
cat > templates/test.yaml <<EOF
apiVersion: apps/v1
kind: Deployment
metadata:name: test-{{ template "mytest.name" . }}labels:{{- include "mytest.label" . | nindent 4 }}
EOF
渲染
helm template testrelease .
自定义Chart实战
1)创建chart包
helm create tanglinux
2)自定义templates模板文件
删除掉默认的模板文件
cd tanglinux
rm -rf templates/*
生成一个deployment模板
kubectl create deployment tanglinux --image=nginx:1.23.2 -o yaml --dry-run > templates/deployment.yaml
修改deployment.yaml
vi templates/deployment.yaml #改成如下内容
apiVersion: apps/v1
kind: Deployment
metadata:labels:app: {{ .Values.appname }} #将values.yaml中的appname对应的变量值渲染在这里name: tanglinux
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 }} #容器的名称也和资源的名称保持一致即可command: [ "/bin/sh","-c","/data/init.sh" ]ports:- name: webcontainerPort: 80protocol: TCPvolumeMounts:- name: codemountPath: /data/code/tanglinux- name: configmountPath: /data/nginx/conf/conf.d/volumes: - name: configconfigMap:name: {{ .Values.appname }}-cm #confimap的名字也可以使用程序名称的变量加上-cm- name : codepersistentVolumeClaim:claimName: {{ .Values.appname }}-pvc #pvc的名字也可以使用程序名称的变量加上-pvreadOnly: false
编辑svc模板
vi templates/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: 80protocol: TCPtargetPort: 80selector:app: {{ .Values.appname }} #标签选择器还是调用appname这个变量type: NodePort
编辑configmap模板
vi templates/configmap.yaml ##写入如下内容
apiVersion: v1
kind: ConfigMap
metadata:name: {{ .Values.appname }}-cm #引入appname变量加上-cm作为cm资源的名称
data:test.tanglinux.com.conf: |server {listen 80;server_name test.tanglinux.com;location / {root /data/code/tanglinux;index index.html;}}
编辑pv/pvc模板
vi templates/pv-pvc.yaml #内容如下
apiVersion: v1
kind: PersistentVolume
metadata:name: {{ .Values.appname }}-pv #引入appname变量加上-pv作为pv资源的名称labels:pv: {{ .Values.appname }}-pv #标签也可以使用和pv名称一样的名字
spec:capacity:storage: 2GiaccessModes:- ReadWriteManypersistentVolumeReclaimPolicy: Retainnfs:path: {{ .Values.nfsPath }} #这里会引入nfsPath变量的值server: {{ .Values.nfsServer }} #这里会引入nfsServer变量的值
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: {{ .Values.appname }}-pvc #引入appname变量加上-pvc作为pvc资源的名称
spec:accessModes:- ReadWriteManyresources:requests:storage: 2Giselector:matchLabels:pv: {{ .Values.appname }}-pv #指定pv的标签
定义values.yaml
vi values.yaml #内容如下
appname: tanglinux
replicas: 2
image: tanglinux/helm-custom-chart ##这是一个测试的镜像
imageTag: v0
nfsPath: /data/nfs/tanglinux ##这个目录需要提前创建好
nfsServer: 192.168.222.99
注意:假定NFS服务器已经搭建好了
3)安装chart
helm install tanglinux-release .
4)查看svc
kubectl get svc
5)到NFS服务器上创建一个测试页
echo "This is a test site." > /data/nfs/tanglinux/index.html
6)浏览器访问
http://192.168.222.131:32745