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


     


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

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

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

      这个就不多说了

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

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    server:
      port: 8761
    spring:
      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信息

    1
    2
    3
    4
    5
    6
    7
    8
    9
    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目录下)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    #创建Service为headless
    apiVersion: v1
    kind: Service
    metadata:
      namespace: NS
      labels:
        app: eureka
      name: eureka
    spec:
      clusterIP: None
      selector:
        app: eureka
      ports:
      - port: 8761
        protocol: TCP
        targetPort: 8761
    status:
      loadBalancer: {}
       
    ---
    #创建StatefulSet
    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: eureka
      namespace: NS
    spec:
      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
     
    ---
    #创建ingress
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      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如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    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: Pod
    metadata:
      name: jenkins-slave
    spec:
      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:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    server:
      port: 8130
    spring:
      application:
        name: gateway-service
     
    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

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    apiVersion: v1
    kind: Service
    metadata:
      namespace: NS
      labels:
        app: gateway
      name: gateway
    spec:
      selector:
        app: gateway
      ports:
      - port: 8130
        protocol: TCP
        targetPort: 8130
    status:
      loadBalancer: {}
    ---
    #创建Deployment
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: gateway
      namespace: NS
    spec:
      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
    ---
    #创建ingress
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      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的参数要问开发人员(有些程序需要连数据库)

     

     

    原文链接:https://www.cnblogs.com/cfzy/p/16160965.html
  • 相关阅读:
    NodeJs实战-待办列表(2)-待办列表增删
    《深度学习进阶:自然语言处理》读书笔记:第8章 Attention
    Inno Setup打包的exe程序加上【unins.exe】卸载程序
    实现自定义Spring Boot Starter
    项目管理——评审中的误区
    必须知道的 17 个Go开发库
    zabbix监控网络连接状态
    运维自动导出业务容器Java堆栈错误日志脚本
    gcc编程4步编译、调试c程序实操详解(Linux系统编程)
    信号继电器驱动芯片(led驱动芯片)
  • 原文地址:https://www.cnblogs.com/cfzy/p/16160965.html