共计 4420 个字符,预计需要花费 12 分钟才能阅读完成。
由于以前使用的是 jenkins 生成 yaml 文件部署,如果 yaml 有变动需要每个项目去修改 yaml 文件,十分影响效率,用了 helm 后方便很多。研究了几天,把模板缝合起来,虽然看起来像缝合怪,但是在使用上确实很方便,满足本人使用需求。
首先贴出我的 Chart 模板文件
[root@az-k8s-nginx-001]$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: yx@g6k.cn
url: www.g6k.cn
values 默认的配置值我都使用变量的方式
[root@az-k8s-nginx-001]$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: {}
[root@az-k8s-nginx-001]$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,根据传值判断使用那种方式。
[root@az-k8s-nginx-001]$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
查看源
[root@az-k8s-nginx-001]$helm repo list
NAME URL
harbor http://harborip/chartrepo/lc_chart
查看包
[root@az-k8s-nginx-001]$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 上我实现的效果如下
正文完