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)浏览器访问

http://192.168.222.131:32745

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐