由于以前使用的是jenkins生成yaml文件部署,如果yaml有变动需要每个项目去修改yaml文件,十分影响效率,用了helm后方便很多。研究了几天,把模板缝合起来,虽然看起来像缝合怪,但是在使用上确实很方便,满足本人使用需求。
首先贴出我的Chart模板文件
[[email protected] ]$cat Chart.yaml
apiVersion: v2
name: java
description: A Helm chart for Kubernetes
type: application
version: 0.1.0
appVersion: "1.16.0"
maintainers:
- name: yx
email: [email protected]
url: www.g6k.cn
values默认的配置值我都使用变量的方式
[[email protected] ]$cat values.yaml
replicaCount: []
image:
repository: []
pullPolicy: IfNotPresent
imagePullSecrets: {}
nameOverride: ""
fullnameOverride: ""
service:
#type: ClusterIP and NodePort
serverpath: []
type: []
port: []
nodePort: []
probeType:
ServerHttpGet: []
livenessProbe:
initialDelaySeconds: []
periodSeconds: []
failureThreshold: []
command: {}
resources: {}
nodeSelector: {}
tolerations: []
affinity: {}
[[email protected] ]$cat templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ .Release.Name }}
labels:
app: {{ .Release.Name }}
spec:
replicas: {{ .Values.replicaCount }}
selector:
matchLabels:
app: {{ .Release.Name }}
template:
metadata:
labels:
app: {{ .Release.Name }}
spec:
imagePullSecrets:
- name: {{ .Values.imagePullSecrets }}
containers:
- name: {{ .Release.Name }}
image: {{ .Values.image.repository }}
imagePullPolicy: {{ .Values.image.pullPolicy }}
command:
- sh
- '-ce'
- {{ .Values.command }}
ports:
- containerPort: {{ .Values.service.port }}
readinessProbe:
tcpSocket:
port: {{ .Values.service.port }}
initialDelaySeconds: {{ .Values.livenessProbe.initialDelaySeconds }}
periodSeconds: {{ .Values.readinessProbe.periodSeconds }}
livenessProbe:
{{- if eq .Values.probeType.ServerHttpGet "HttpGet" }}
httpGet:
path: {{ .Values.service.serverpath }}
port: {{ .Values.service.port }}
httpHeaders:
- name: X-Custom-Header
value: Awesome
{{- else }}
tcpSocket:
port: {{ .Values.service.port }}
{{- end }}
initialDelaySeconds: {{ .Values.livenessProbe.initialDelaySeconds }}
periodSeconds: {{ .Values.readinessProbe.periodSeconds }}
failureThreshold: {{ .Values.readinessProbe.failureThreshold }}
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 }}
service是配置了ClusterIP or NodePort,根据传值判断使用那种方式。
[[email protected] ]$cat templates/service.yaml
apiVersion: v1
kind: Service
metadata:
name: {{ .Release.Name }}
labels:
spec:
type: {{ .Values.service.type }}
ports:
- port: {{ .Values.service.port }}
{{- if and .Values.service.type (eq .Values.service.type "NodePort") }}
nodePort: {{ .Values.service.nodePort }}
{{- end }}
selector:
app: {{ .Release.Name }}
模板文件主要针对了存活检测的方式,以及nodepod方式的判断。可以根据自己传参使用那种方式。使用http检测还是port检测。
service也可以实现使用ClusterIP or NodePort方式
jenkinsfile部署这里你只需要根据你的需要数值传参即可(由于涉及到公司信息本人只贴出了部分,相信改起来不难)
stage('helm校验') {
steps{
sh """
echo "Charts 校验"
#helm lint harbor/java
echo "检查配置"
helm upgrade --install --dry-run --debug ${PROJECT_NAME} --namespace ${params.NAMESPACE} harbor/java \
--set replicaCount=${REPLICAS} \
--set image.repository=${IMAGE_ADDR}:v${BUILD_ID} \
--set imagePullSecrets='harbor' \
--set service.type=${Servicetype} \
--set service.port=${PORT} \
--set service.nodePort=${ServicenodePort} \
--set service.serverpath=${Servicepath} \
--set probeType.ServerHttpGet=${Servicegettype} \
--set livenessProbe.initialDelaySeconds=60 \
--set readinessProbe.periodSeconds=10 \
--set readinessProbe.failureThreshold=3 \
--set command="java ${JavaCommand} ${JavaxmCommand} -jar /opt/${JAR_NAME}"
"""
}
}
stage('helm部署') {
steps {
script {
sh """
helm upgrade --install ${PROJECT_NAME} --namespace ${params.NAMESPACE} harbor/java \
--set replicaCount=${REPLICAS} \
--set image.repository=${IMAGE_ADDR}:v${BUILD_ID} \
--set imagePullSecrets='harbor' \
--set service.type=${Servicetype} \
--set service.port=${PORT} \
--set service.nodePort=${ServicenodePort} \
--set service.serverpath=${Servicepath} \
--set probeType.ServerHttpGet=${Servicegettype} \
--set livenessProbe.initialDelaySeconds=60 \
--set readinessProbe.periodSeconds=10 \
--set readinessProbe.failureThreshold=3 \
--set command="java ${JavaCommand} ${JavaxmCommand} -jar /opt/${JAR_NAME}"
"""
}
}
}
其中我是把helm的模板文件上传到了harbor上的
把模板文件打包
helm package java
上传模板文件到harbor(注意插件要自己安装,不过好像三版本有push命名没有具体研究)
helm cm-push --username admin --password admin java-0.1.0.tgz http://harborip/chartrepo/lc_chart
查看源
[[email protected] ]$helm repo list
NAME URL
harbor http://harborip/chartrepo/lc_chart
查看包
[[email protected] ]$helm search repo
NAME CHART VERSION APP VERSION DESCRIPTION
harbor/java 0.1.0 1.16.0 A Helm chart for Kubernetes
harbor/mysql 0.3.5 Fast, reliable, scalable, and easy to use open-...
部署过程就是,先把helm模板编写好,然后上传到harbor,上传好在编写好您的jenkinsfile,根据模板进行传参。
到这也就实现了Jenkins结合helm及harbor部署java应用了。
Jenkins上我实现的效果如下