• 基于kubernetes平台微服务的部署


    目录

    Jenkins+Kubernetes+Docker完成微服务持续集成

                    创建NFS共享目录

     配置harbor

    微服务的部署

                    Jenkins认证k8s凭证

    部署其他微服务

                    手动上传父工程依赖到NFS的Maven共享仓库目录中


    Jenkins+Kubernetes+Docker完成微服务持续集成

                    创建NFS共享目录

    让所有Jenkins-Slave构建指向NFS的Maven的共享仓库目录

    1. [root@harbor /opt/nfs]# mkdir maven
    2. [root@harbor /opt/nfs]# chmod 777 maven/
    3. [root@harbor /opt/nfs]# vim /etc/exports
    4. /opt/nfs/jenkins 192.168.37.0/24(rw,sync,no_root_squash)
    5. /opt/nfs/maven 192.168.37.0/24(rw,sync,no_root_squash)
    6. #刷新
    7. [root@harbor /opt/nfs]# exportfs -rv
    8. exporting 192.168.37.0/24:/opt/nfs/maven
    9. exporting 192.168.37.0/24:/opt/nfs/jenkins

    查看k8s集群

    1. [root@node01 ~]# showmount -e 192.168.37.106
    2. Export list for 192.168.37.106:
    3. /opt/nfs/maven   192.168.37.0/24
    4. /opt/nfs/jenkins 192.168.37.0/24

    Docker命令执行权限问题

    [root@master01 /var/run]# chmod 777 docker.sock

    新建一个流水线项目

     

                    编写构建Pipeline

     

     

     配置harbor

            配置harbor凭证

     

     

    流水线脚本

    1. def git_url = "http://192.168.37.103:85/devops_group/tensquare_back.git"
    2. def git_auth = "72a48f14-72c7-444f-a471-2d482e85d808"
    3. //构建版本的名称
    4. def tag = "latest"
    5. //Harbor私服地址
    6. def harbor_url = "192.168.37.106:85"
    7. //Harbor的项目名称
    8. def harbor_project_name = "tensquare"
    9. //Harbor的凭证
    10. def harbor_auth = "ea2f47a0-3f01-4149-a095-987675db7162"
    11. podTemplate(label: 'jenkins-slave', cloud: 'kubernetes', containers: [
    12.        containerTemplate(
    13.            name: 'jnlp',
    14.            image: "192.168.37.106:85/library/jenkins-slave-maven:latest"
    15.       ),
    16.        containerTemplate(
    17.            name: 'docker',
    18.            image: "docker:stable",
    19.            ttyEnabled: true,
    20.            command: 'cat'
    21.       ),
    22.   ],
    23.    volumes: [
    24.        hostPathVolume(mountPath: '/var/run/docker.sock', hostPath: '/var/run/docker.sock'),
    25.        nfsVolume(mountPath: '/usr/local/apache-maven/repo', serverAddress: '192.168.37.106' , serverPath: '/opt/nfs/maven'),
    26.   ],
    27. )
    28. {
    29. node("jenkins-slave") {
    30.    // 第一步
    31.    stage('pull code'){
    32.        checkout([$class: 'GitSCM', branches: [[name: '*/master']], extensions: [],
    33. userRemoteConfigs: [[credentialsId: "${git_auth}", url: "${git_url}"]]])
    34.   }
    35.    // 第二步
    36.    stage('make public sub project'){
    37.        //编译并安装公共工程
    38.        sh "mvn -f tensquare_common clean install"
    39.   }
    40.    // 第三步
    41.    stage('make image'){
    42.        //把选择的项目信息转为数组
    43.        def selectedProjects = "${project_name}".split(',')
    44.        for(int i=0;i<selectedProjects.size();i++){
    45.            //取出每个项目的名称和端口
    46.            def currentProject = selectedProjects[i];
    47.            //项目名称
    48.            def currentProjectName = currentProject.split('@')[0]
    49.            //项目启动端口
    50.            def currentProjectPort = currentProject.split('@')[1]
    51.            //定义镜像名称
    52.            def imageName = "${currentProjectName}:${tag}"
    53.            //编译,构建本地镜像
    54.            sh "mvn -f ${currentProjectName} clean package dockerfile:build"
    55.            container('docker') {
    56.                //给镜像打标签
    57.                sh "docker tag ${imageName} ${harbor_url}/${harbor_project_name}/${imageName}"
    58.                //登录Harbor,并上传镜像
    59.                withCredentials([usernamePassword(credentialsId: "${harbor_auth}", passwordVariable: 'password', usernameVariable: 'username')])
    60.               {
    61.                    //登录
    62.                    sh "docker login -u ${username} -p ${password} ${harbor_url}"
    63.                    //上传镜像
    64.                    sh "docker push ${harbor_url}/${harbor_project_name}/${imageName}"
    65.               }
    66.            //删除本地镜像
    67.            sh "docker rmi -f ${imageName}"
    68.            sh "docker rmi -f ${harbor_url}/${harbor_project_name}/${imageName}"
    69.           }
    70.       }
    71.   }
    72. }
    73. }

     

    Eureka服务构建成功!!!

     

    此时harbor仓库已经推送上去了

     

    微服务的部署

    安装 Kubernetes Continuous Deploy插件

                    Jenkins认证k8s凭证

     

    添加k8s凭证

     

    点击确定,获取id号

    K8S 创建访问Harbor私服拉取镜像所需要密钥权限凭证,设置免交互

    [root@master01 ~/.kube]# kubectl create secret docker-registry registry-auth-secret --docker-username=jack --docker-password=Abc12345 --docker-email=jack@123.com --docker-server=192.168.37.106:85

     

     在tensquare_eureka_server微服务项目根目录下创建 deploy.yml配置文件

     

    1. ---
    2. apiVersion: v1
    3. kind: Service
    4. metadata:
    5. name: eureka
    6. labels:
    7.   app: eureka
    8. spec:
    9. type: NodePort
    10. ports:
    11.   - port: 10086
    12.     name: eureka
    13.     targetPort: 10086
    14. selector:
    15.   app: eureka
    16. ---
    17. apiVersion: apps/v1
    18. kind: StatefulSet
    19. metadata:
    20. name: eureka
    21. spec:
    22. serviceName: "eureka"
    23. replicas: 2
    24. selector:
    25.   matchLabels:
    26.     app: eureka
    27. template:
    28.   metadata:
    29.     labels:
    30.       app: eureka
    31.   spec:
    32.     imagePullSecrets:
    33.       - name: $SECRET_NAME    #通过变量引用K8S访问Harbor私服拉取镜像所需要的secret资源名称
    34.     containers:
    35.       - name: eureka
    36.         image: $IMAGE_NAME
    37.         ports:
    38.           - containerPort: 10086
    39.         env:
    40.           - name: MY_POD_NAME    #MY_POD_NAME环境变量会从每个被创建的Pod的metadata.name字段获取变量值,如eureka-0、eureka-1
    41.             valueFrom:
    42.               fieldRef:
    43.                 fieldPath: metadata.name
    44.           - name: EUREKA_SERVER    #此环境变量会被项目代码中的application.yml文件引用
    45.             value: "http://eureka-0.eureka:10086/eureka/,http://eureka-1.eureka:10086/eureka/"
    46.           - name: EUREKA_INSTANCE_HOSTNAME    #此环境变量会项目代码中的application.yml文件引用
    47.             value: ${MY_POD_NAME}.eureka
    48. podManagementPolicy: "Parallel"

    修改tensquare_eureka_server微服务项目的 application.yml 文件

    1. tensquare_eureka_server\src\main\resources \application.yml
    2. ---
    3. server:
    4. port: ${PORT:10086}
    5. spring:
    6. application:
    7.   name: eureka
    8. eureka:
    9. server:
    10.    #续期时间,即扫描失效服务的间隔时间(缺省为60*1000ms)
    11.   eviction-interval-timer-in-ms: 5000
    12.   enable-self-preservation: false
    13.   use-read-only-response-cache: false
    14. client:
    15.    #eureka client间隔多久去拉取服务注册信息 默认30s
    16.   registry-fetch-interval-seconds: 5
    17.   serviceUrl:
    18.     defaultZone: ${EUREKA_SERVER:http://127.0.0.1:${server.port}/eureka/}    #引用deploy.yml配置中的环境变量EUREKA_SERVER
    19. instance:
    20.    #心跳间隔时间,即发送一次心跳之后,多久在发起下一次(缺省为30s)
    21.   lease-renewal-interval-in-seconds: 5
    22.    #在收到一次心跳之后,等待下一次心跳的空档时间,大于心跳间隔即可,即服务续约到期时间(缺省为90s)
    23.   lease-expiration-duration-in-seconds: 10
    24.   instance-id: ${EUREKA_INSTANCE_HOSTNAME:${spring.application.name}}:${server.port}@${random.long(1000000,9999999)}
    25.   hostname: ${EUREKA_INSTANCE_HOSTNAME:${spring.application.name}}

    上传代码

    编写pipeline脚本

    1. def git_url = "http://192.168.37.103:85/devops_group/tensquare_back.git"
    2. def git_auth = "72a48f14-72c7-444f-a471-2d482e85d808"
    3. //构建版本的名称
    4. def tag = "latest"
    5. //Harbor私服地址
    6. def harbor_url = "192.168.37.106:85"
    7. //Harbor的项目名称
    8. def harbor_project_name = "tensquare"
    9. //Harbor的凭证
    10. def harbor_auth = "ea2f47a0-3f01-4149-a095-987675db7162"
    11. //获取当前选择项目名称
    12. def selectedProjectNames="${project_name}".split(",")
    13. def secret_name = "registry-auth-secret"
    14. def k8s_auth = "2e95a29c-79f1-41dd-be38-3f9691b25807"
    15. podTemplate(label: 'jenkins-slave', cloud: 'kubernetes', containers: [
    16.        containerTemplate(
    17.            name: 'jnlp',
    18.            image: "192.168.37.106:85/library/jenkins-slave-maven:latest"
    19.       ),
    20.        containerTemplate(
    21.            name: 'docker',
    22.            image: "docker:stable",
    23.            ttyEnabled: true,
    24.            command: 'cat'
    25.       ),
    26.   ],
    27.    volumes: [
    28.        hostPathVolume(mountPath: '/var/run/docker.sock', hostPath: '/var/run/docker.sock'),
    29.        nfsVolume(mountPath: '/usr/local/apache-maven/repo', serverAddress: '192.168.37.106' , serverPath: '/opt/nfs/maven'),
    30.   ],
    31. )
    32. {
    33. node("jenkins-slave") {
    34.    // 第一步
    35.    stage('pull code'){
    36.        checkout([$class: 'GitSCM', branches: [[name: '*/master']], extensions: [],
    37. userRemoteConfigs: [[credentialsId: "${git_auth}", url: "${git_url}"]]])
    38.   }
    39.    // 第二步
    40.    stage('make public sub project'){
    41.        //编译并安装公共工程
    42.        sh "mvn -f tensquare_common clean install"
    43.   }
    44.    // 第三步
    45.    stage('make image'){
    46.        //把选择的项目信息转为数组
    47.        def selectedProjects = "${project_name}".split(',')
    48.        for(int i=0;i<selectedProjects.size();i++){
    49.            //取出每个项目的名称和端口
    50.            def currentProject = selectedProjects[i];
    51.            //项目名称
    52.            def currentProjectName = currentProject.split('@')[0]
    53.            //项目启动端口
    54.            def currentProjectPort = currentProject.split('@')[1]
    55.            //定义镜像名称
    56.            def imageName = "${currentProjectName}:${tag}"
    57.            //编译,构建本地镜像
    58.            sh "mvn -f ${currentProjectName} clean package dockerfile:build"
    59.            container('docker') {
    60.                //给镜像打标签
    61.                sh "docker tag ${imageName} ${harbor_url}/${harbor_project_name}/${imageName}"
    62.                //登录Harbor,并上传镜像
    63.                withCredentials([usernamePassword(credentialsId: "${harbor_auth}", passwordVariable: 'password', usernameVariable: 'username')])
    64.               {
    65.                    //登录
    66.                    sh "docker login -u ${username} -p ${password} ${harbor_url}"
    67.                    //上传镜像
    68.                    sh "docker push ${harbor_url}/${harbor_project_name}/${imageName}"
    69.               }
    70.            //删除本地镜像
    71.            sh "docker rmi -f ${imageName}"
    72.            sh "docker rmi -f ${harbor_url}/${harbor_project_name}/${imageName}"
    73.           }
    74.       }
    75.   }
    76. stage('部署应用到K8S') {
    77. for(int i=0; i<selectedProjectNames.length; i++) {
    78. def projectInfo=selectedProjectNames[i]
    79.               //当前的项目名称
    80.               def currentProjectName="${projectInfo}".split("@")[0]
    81.               //当前的项目端口
    82.               def currentProjectPort="${projectInfo}".split("@")[1]
    83. def imageName = "${currentProjectName}:${tag}"
    84. def harbor_imageName = "${harbor_url}/${harbor_project_name}/${imageName}"
    85. sh """
    86. sed -i 's#\$IMAGE_NAME#${harbor_imageName}#' ${currentProjectName}/deploy.yml
    87. sed -i 's#\$SECRET_NAME#${secret_name}#' ${currentProjectName}/deploy.yml
    88. """
    89. kubernetesDeploy configs: "${currentProjectName}/deploy.yml", kubeconfigId: "${k8s_auth}"
    90. }
    91. }
    92. }
    93. }

    构建

    查看pod,svc资源

     

    浏览器访问

     

    部署其他微服务

    更改配置文件中的eureka集群地址

    1. tensquare_zuul\src\main\resources\application.yml
    2. # Eureka注册配置信息
    3. eureka:
    4. client:
    5.   service-url:  
    6.     defaultZone: http://eureka-0.eureka:10086/eureka/,http://eureka-1.eureka:10086/eureka/ #Eureka访问地址
    7. instance:
    8.   prefer-ip-address: true

    创建配置文件deploy.yml

    1. ---
    2. apiVersion: v1
    3. kind: Service
    4. metadata:
    5. name: zuul
    6. labels:
    7.   app: zuul
    8. spec:
    9. type: NodePort
    10. ports:
    11.   - port: 10020
    12.     name: zuul
    13.     targetPort: 10020
    14. selector:
    15.   app: zuul
    16. ---
    17. apiVersion: apps/v1
    18. kind: StatefulSet
    19. metadata:
    20. name: zuul
    21. spec:
    22. serviceName: "zuul"
    23. replicas: 2
    24. selector:
    25.   matchLabels:
    26.     app: zuul
    27. template:
    28.   metadata:
    29.     labels:
    30.       app: zuul
    31.   spec:
    32.     imagePullSecrets:
    33.       - name: $SECRET_NAME    #通过变量引用K8S访问Harbor私服拉取镜像所需要的secret资源名称
    34.     containers:
    35.       - name: zuul
    36.         image: $IMAGE_NAME
    37.         ports:
    38.           - containerPort: 10020
    39. podManagementPolicy: "Parallel"

                    手动上传父工程依赖到NFS的Maven共享仓库目录中

     

    开始构建

      

    其他项目名字和端口进行修改即可

  • 相关阅读:
    手写call(),apply(),bind()方法
    Flume(5个demo轻松入门)
    新库上线 | CnOpenData电力、热力、燃气及水生产和供应业工商注册企业基本信息数据
    idea安装MyBatisX插件
    GZ038 物联网应用开发赛题第4套
    【ARXIV2207】LightViT: Towards Light-Weight Convolution-Free Vision Transformers
    【idea】查看类或方法中的实现
    L76.linux命令每日一练 -- 第11章 Linux系统管理命令 -- free和iftop
    Makefile 精要(用得最多的规则-附示例)
    Fisher辨别分析
  • 原文地址:https://blog.csdn.net/weixin_48404074/article/details/125530609