4、自定义一个自己的chart模板

开发自己的Chart:我们已Java应用为例
完成这个chart,以后创建各种应用只需换应用镜像即可

创建模板

helm create javademo

修改Chart.yaml,Values.yaml,添加常用的变量

[root@master javademo]# cat values.yaml
replicaCount: 1

image:
  repository: 192.168.25.135/library/tomcat
  tag: latest
  pullPolicy: IfNotPresent

imagePullSecrets: []
nameOverride: ""
fullnameOverride: ""

podSecurityContext: {}
  # fsGroup: 2000

securityContext: {}
  # capabilities:
  #   drop:
  #   - ALL
  # readOnlyRootFilesystem: true
  # runAsNonRoot: true
  # runAsUser: 1000

service:
  type: ClusterIP
  port: 80

ingress:
  enabled: true
  annotations: {}
    # kubernetes.io/ingress.class: nginx
    # kubernetes.io/tls-acme: "true"
  host: liaochao.com
  tls:
    secretName: liaochao.com

resources:
   limits:
     cpu: 100m
     memory: 128Mi
   requests:
     cpu: 100m
     memory: 128Mi

nodeSelector: {}

tolerations: []

affinity: {}

上面可以看到,values.yaml中定义了java的镜像、service的类型、ingress、资源限制等。

在templates目录下创建部署镜像所需要的yaml文件,并变量引用yaml里经常变动的字段

修改deployment.yaml

[root@master templates]# cat deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ include "name" . }}
  labels:
    {{- include "labels" . | nindent 4 }}
spec:
  replicas: {{ .Values.replicaCount }}
  selector:
    matchLabels:
      {{- include "selectorLabels" . | nindent 6 }}
  template:
    metadata:
      labels:
        {{- include "selectorLabels" . | nindent 8 }}
    spec:
    {{- with .Values.imagePullSecrets }}
      imagePullSecrets:
        {{- toYaml . | nindent 8 }}
    {{- end }}
      containers:
        - name: {{ .Chart.Name }}
          securityContext:
            {{- toYaml .Values.securityContext | nindent 12 }}
          image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
          imagePullPolicy: {{ .Values.image.pullPolicy }}
          ports:
            - name: http
              containerPort: 8080
              protocol: TCP
          livenessProbe:
            httpGet:
              path: /test/status.html
              port: 8080
          resources:
            {{- toYaml .Values.resources | nindent 12 }}
      {{- with .Values.nodeSelector }}
      nodeSelector:
        {{- toYaml . | nindent 8 }}
      {{- end }}
    {{- with .Values.affinity }}
      affinity:
        {{- toYaml . | nindent 8 }}
    {{- end }}
    {{- with .Values.tolerations }}
      tolerations:
        {{- toYaml . | nindent 8 }}
    {{- end }}

上述可以看到,标签引用来自公共模板_helpers.tpl,其他数据来自values.yaml,健康检测手动定义。

编辑service.yaml

[root@master templates]# cat service.yaml
apiVersion: v1
kind: Service
metadata:
  name: {{ include "name" . }}
  labels:
    {{- include "labels" . | nindent 4 }}
spec:
  type: {{ .Values.service.type }}
  ports:
    - port: {{ .Values.service.port }}
      targetPort: http
      protocol: TCP
      name: http
  selector:
    {{- include "selectorLabels" . | nindent 4 }}

上述可以看到,标签引用也来自公共模板_helpers.tpl,其他数据来自values.yaml

编辑ingress.yaml

[root@master templates]# cat ingress.yaml
{{- if .Values.ingress.enabled -}}
{{- if semverCompare ">=1.14-0" .Capabilities.KubeVersion.GitVersion -}}
apiVersion: networking.k8s.io/v1beta1
{{- else -}}
apiVersion: extensions/v1beta1
{{- end }}
kind: Ingress
metadata:
  name: {{ include "name" . }}
  labels:
    {{- include "labels" . | nindent 4 }}
  {{- with .Values.ingress.annotations }}
  annotations:
    {{- toYaml . | nindent 4 }}
  {{- end }}
spec:
{{- if .Values.ingress.tls }}
  tls:
    - hosts:
      - {{ .Values.ingress.host }}
      secretName: {{ .Values.ingress.tls.secretName }}
{{- end }}
  rules:
    - host: {{ .Values.ingress.host | quote }}
      http:
        paths:
          - path: /
            backend:
              serviceName: {{ include "name" . }}
              servicePort: {{ .Values.service.port }}
{{- end }}

上述可以看到,标签引用也来自公共模板_helpers.tpl,其他数据来自values.yaml

编辑公共模板:_helpers.tpl

[root@master templates]# cat _helpers.tpl
{{/*
资源名字
*/}}

{{- define "name" -}}
{{ .Chart.Name }}-{{ .Release.Name }}
{{- end -}}

{{/*
资源标签
*/}}

{{- define "labels" -}}
app: {{ template "name" . }}
chart: {{ .Chart.Name }}-{{ .Chart.Version }}
release: {{ .Release.Name }}
{{- end -}}

{{/*
Pod标签
*/}}
{{- define "selectorLabels" -}}
app: {{ template "name" . }}
release: {{ .Release.Name }}
{{- end -}}

编辑文档说明:

[root@master templates]# cat NOTES.txt
访问地址:
{{- if .Values.ingress.enabled }}
  http{{ if .Values.ingress.tls }}s{{ end }}://{{ .Values.ingress.host }}
{{- end }}
{{- if contains "NodePort" .Values.service.type }}
  export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ include "name" . }})
  export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath="{.items[0].status.addresses[0].address}")
  echo http://$NODE_IP:$NODE_PORT
{{- end }}

最终结构:

[root@master helm]# tree javademo/
javademo/
├── charts
├── Chart.yaml
├── templates
│   ├── deployment.yaml
│   ├── _helpers.tpl
│   ├── ingress.yaml
│   ├── NOTES.txt
│   └── service.yaml
└── values.yaml

2 directories, 7 files

试运行查看:

[root@master helm]# helm install web02 --dry-run javademo
NAME: web02
LAST DEPLOYED: Sun Feb 23 14:11:35 2020
NAMESPACE: default
STATUS: pending-install
REVISION: 1
TEST SUITE: None
HOOKS:
MANIFEST:
---
# Source: javademo/templates/service.yaml
apiVersion: v1
kind: Service
metadata:
  name: javademo-web02
  labels:
    app: javademo-web02
    chart: javademo-0.1.0
    release: web02
spec:
  type: ClusterIP
  ports:
    - port: 80
      targetPort: http
      protocol: TCP
      name: http
  selector:
    app: javademo-web02
    release: web02
---
# Source: javademo/templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: javademo-web02
  labels:
    app: javademo-web02
    chart: javademo-0.1.0
    release: web02
spec:
  replicas: 1
  selector:
    matchLabels:
      app: javademo-web02
      release: web02
  template:
    metadata:
      labels:
        app: javademo-web02
        release: web02
    spec:
      containers:
        - name: javademo
          securityContext:
            {}
          image: "192.168.25.135/library/tomcat:latest"
          imagePullPolicy: IfNotPresent
          ports:
            - name: http
              containerPort: 8080
              protocol: TCP
          livenessProbe:
            httpGet:
              path: /test/status.html
              port: 8080
          resources:
            limits:
              cpu: 100m
              memory: 128Mi
            requests:
              cpu: 100m
              memory: 128Mi
---
# Source: javademo/templates/ingress.yaml
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: javademo-web02
  labels:
    app: javademo-web02
    chart: javademo-0.1.0
    release: web02
spec:
  tls:
    - hosts:
      - liaochao.com
      secretName: liaochao.com
  rules:
    - host: "liaochao.com"
      http:
        paths:
          - path: /
            backend:
              serviceName: javademo-web02
              servicePort: 80

NOTES:
访问地址:
  https://liaochao.com

这里可以看到,我们打开了ingress 开关,打开了资源限制,打开了https,得到了我们想要的。

运行:

helm install web01 --dry-run javademo

查看状态:

[root@master helm]# kubectl get pod
NAME                                      READY   STATUS               RESTARTS   AGE
javademo-web01-7f9bb95f8d-hfqh4           1/1     Running              2          14h

查看ingress:

[root@master helm]# kubectl get ingress
NAME             HOSTS          ADDRESS   PORTS     AGE
javademo-web01   liaochao.com             80, 443   15h

我们在自己的电脑上面加上hosts

192.168.25.136 liaochao.com

然后查看浏览器:

在这里插入图片描述
此时流程已经走完,如果我们想换应用,到时候只需要修改应用,其他的全都不需要变

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值