开发自己的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
然后查看浏览器:
此时流程已经走完,如果我们想换应用,到时候只需要修改应用,其他的全都不需要变