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: web
containerPort: 80
protocol: TCP
volumeMounts:
- name: code
mountPath: /data/code/tanglinux
- 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
编辑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: 80
protocol: TCP
targetPort: 80
selector:
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: 2Gi
accessModes:
- ReadWriteMany
persistentVolumeReclaimPolicy: Retain
nfs:
path: {{ .Values.nfsPath }} #这里会引入nfsPath变量的值
server: {{ .Values.nfsServer }} #这里会引入nfsServer变量的值
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: {{ .Values.appname }}-pvc #引入appname变量加上-pvc作为pvc资源的名称
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 2Gi
selector:
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)浏览器访问