由于以前使用的是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: [email protected]
    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上我实现的效果如下
2022-07-29T09:05:42.png
2022-08-03T08:22:42.png

Last modification:August 3, 2022
如果觉得我的文章对你有用,请随意赞赏