jenkins结合helm及harbor部署java应用

406次阅读
没有评论

共计 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 上我实现的效果如下
jenkins 结合 helm 及 harbor 部署 java 应用
jenkins 结合 helm 及 harbor 部署 java 应用

正文完
 0
yx
版权声明:本站原创文章,由 yx 于2022-07-29发表,共计4420字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)
验证码