K8S+Jenkins自动化构建微服务项目(后续)

博客 动态
0 315
羽尘
羽尘 2022-04-19 17:58:10
悬赏:0 积分 收藏

K8S+Jenkins自动化构建微服务项目(后续)

因为之前写过基于K8S部署jenkins master/slave平台,在这个的基础上构建微服务到K8S集群中

Jenkins-slave构建微服务项目到K8S集群

1、微服务项目上传到git仓库

  这个就不多说了

2、更改注册中心eureka的配置文件

进入到项目代码中,更改微服务中eureka-service的配置文件application.yaml(需要和开发对一下,具体还要加哪些参数)

server:  port: 8761spring:   application:     name: eureka-service  eureka:  instance:    prefer-ip-address: false  client:    region: default    service-url:      defaultZone: http://eureka-0.eureka.default:${server.port}/eureka/,http://eureka-1.eureka.default:${server.port}/eureka/    register-with-eureka: true    fetch-registry: true

其他应用程序往eureka注册,需要在各自的application.yaml里添加下面的eureka信息

eureka:  instance:    prefer-ip-address: false  client:    region: default    service-url:      defaultZone: http://eureka-0.eureka:8761/eureka/,http://eureka-1.eureka:8761/eureka/    register-with-eureka: true    fetch-registry: true

3、创建statefulset资源文件部署eureka,ingress做负载均衡

(将所以要创建的资源都合并到一个yaml文件,上传到git仓库 项目代码的eureka目录下)

#创建Service为headlessapiVersion: v1kind: Servicemetadata:  namespace: NS  labels:    app: eureka  name: eurekaspec:  clusterIP: None  selector:    app: eureka  ports:  - port: 8761    protocol: TCP    targetPort: 8761status:  loadBalancer: {}  ---#创建StatefulSetapiVersion: apps/v1kind: StatefulSetmetadata:  name: eureka  namespace: NSspec:  selector:    matchLabels:      app: eureka  serviceName: "eureka"  replicas: RSCOUNT  template:    metadata:      labels:        app: eureka    spec:      imagePullSecrets:      - name: SECRET_NAME      containers:      - name: eureka        image: IMAGE_NAME        ports:        - containerPort: 8761---#创建ingressapiVersion: networking.k8s.io/v1kind: Ingressmetadata:  name: eureka-ingress  annotations:    kubernetes.io/ingress.class: "nginx"spec:  rules:  - host: eureka.test.com    http:      paths:      - path: /        pathType: Prefix        backend:          service:            name: eureka            port:               number: 8761

4、在jenkins创建流水线任务

新建任务——eureka  流水线——然后进入项目配置,Jenkinsfile如下:

def registry = "10.48.14.50:8888"def project = "dev"def app_name = "eureka-service"def jar_path = "build/libs"def jar_name = "${app_name}-0.0.1-SNAPSHOT.jar"def jar_port = "8761"def image_name = "${registry}/${project}/${app_name}:${BUILD_NUMBER}"def git_address = "http://10.48.14.100:30080/001/xiangmu.git"// 认证def secret_name = "registrypullauth"def docker_registry_auth = "b07ed5ba-e191-4688-9ed2-623f4753781c"def git_auth = "a5ec87ae-87a1-418e-aa49-53c4aedcd261"def k8s_auth = "3cd3f414-a0e2-4bc0-8808-78c64e6ad7d2"def JAVA_OPTS = "-Xms128m -Xmx256m -Dfile.encoding=UTF8 -Duser.timezone=GMT+08 -Dspring.profiles.active=test"pipeline {  agent {    kubernetes {        label "jenkins-slave"        yaml """kind: Podmetadata:  name: jenkins-slavespec:  containers:  - name: jnlp    image: "${registry}/library/jenkins-slave-jdk:latest"    imagePullPolicy: Always    env:       - name: TZ        value: Asia/Shanghai    volumeMounts:      - name: docker-cmd        mountPath: /usr/bin/docker      - name: docker-sock        mountPath: /var/run/docker.sock      - name: gradle-cache        mountPath: /root/.gradle  volumes:    - name: docker-cmd      hostPath:        path: /usr/bin/docker    - name: docker-sock      hostPath:        path: /var/run/docker.sock    - name: gradle-cache      hostPath:         path: /tmp/gradle"""        }      }    parameters {        choice (choices: ['1', '2', '3', '5', '7'], description: '副本数', name: 'ReplicaCount')        choice (choices: ['dev','test','prod','default'], description: '命名空间', name: 'Namespace')    }    stages {        stage('拉取代码'){            steps {                checkout([$class: 'GitSCM',                 branches: [[name: "${params.Branch}"]],                 doGenerateSubmoduleConfigurations: false,                 extensions: [], submoduleCfg: [],                 userRemoteConfigs: [[credentialsId: "${git_auth}", url: "${git_address}"]]                ])            }        }        stage('代码编译'){           steps {             sh """                java -version                pwd               	cd ${app_name}               	pwd          gradle -v          gradle clean build -x test                """            }        }        stage('构建镜像'){           steps {                withCredentials([usernamePassword(credentialsId: "${docker_registry_auth}", passwordVariable: 'password', usernameVariable: 'username')]) {                sh """                  echo '                    FROM ${registry}/library/java:11                    MAINTAINER liang                    RUN apk add -U tzdata && \	                ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime                    ADD ${jar_path}/${jar_name} /                    EXPOSE ${jar_port}                    CMD java -jar $JAVA_OPTS  /${jar_name}                    '> ${app_name}/Dockerfile                  docker build -t ${image_name} ${app_name}                  docker login -u ${username} -p ${password} ${registry}                  docker push ${image_name}                """                }           }         }                stage('部署到K8S平台'){          steps {            configFileProvider([configFile(fileId: "${k8s_auth}", targetLocation: 'admin.kubeconfig')]) {              sh """                pwd                sed -i 's#IMAGE_NAME#${image_name}#' ${app_name}/deploy.yaml                sed -i 's#SECRET_NAME#${secret_name}#' ${app_name}/deploy.yaml                sed -i 's#RSCOUNT#${ReplicaCount}#' ${app_name}/deploy.yaml                sed -i 's#NS#${Namespace}#' ${app_name}/deploy.yaml                kubectl apply -f ${app_name}/deploy.yaml -n ${Namespace} --kubeconfig=admin.kubeconfig                sleep 10                kubectl get pod -n ${Namespace} --kubeconfig=admin.kubeconfig              """           }          }        }    }}

构建项目:可以选择启动的副本数、项目代码分支、k8s命名空间(dev、test、prod:代表开发、测试、生产环境)

      

查看构建日志:

   

        

浏览器访问eureka:  需要添加dns记录或者host文件(根据自己的实际情况添加)   http://eureka.test.com

5、构建其他应用程序部署到K8S

修改微服务网关gateway的配置文件application.yaml:

server:  port: 8130spring:   application:     name: gateway-serviceeureka:  instance:    prefer-ip-address: false  client:    region: default    service-url:      defaultZone: http://eureka-0.eureka:8761/eureka/,http://eureka-1.eureka:8761/eureka/    register-with-eureka: true    fetch-registry: true

创建deploy资源 部署gateway,ingress做负载均衡

apiVersion: v1kind: Servicemetadata:  namespace: NS  labels:    app: gateway  name: gatewayspec:  selector:    app: gateway  ports:  - port: 8130    protocol: TCP    targetPort: 8130status:  loadBalancer: {}---#创建DeploymentapiVersion: apps/v1kind: Deploymentmetadata:  name: gateway  namespace: NSspec:  selector:     matchLabels:      app: gateway  replicas: RSCOUNT  template:    metadata:      labels:        app: gateway    spec:      imagePullSecrets:      - name: SECRET_NAME      containers:      - name: gateway        image: IMAGE_NAME        ports:        - containerPort: 8130---#创建ingressapiVersion: networking.k8s.io/v1kind: Ingressmetadata:  name: gateway-ingress  annotations:    kubernetes.io/ingress.class: "nginx"spec:  rules:  - host: gateway.test.com    http:      paths:      - path: /        pathType: Prefix        backend:          service:            name: gateway            port:               number: 8130

jenkins中创建gateway项目,使用eureka的Jenkinsfile,只需要修改其中的变量就可以了,这里就不写了

......

应用程序构建完成后,查看是否注册到eureka:

    

     再查看eureka日志,说明成功了

    

大概就是这样,部署微服务的其他应用程序也是一样。

需要注意的是:项目中application.yaml的参数要问开发人员(有些程序需要连数据库)

 

posted @ 2022-04-19 17:46 等风来~~ 阅读(0) 评论(0) 编辑 收藏 举报
回帖
    羽尘

    羽尘 (王者 段位)

    2335 积分 (2)粉丝 (11)源码

     

    温馨提示

    亦奇源码

    最新会员