美文网首页
业务实战场景(十五)Devops之Jenkins持续交付基于K8

业务实战场景(十五)Devops之Jenkins持续交付基于K8

作者: 后来丶_a24d | 来源:发表于2022-07-09 16:55 被阅读0次

    目录

    • 系列总目录
    • 前提
      • 背景
      • 服务器
    • 整体架构
      • Jenkins之CI
      • Jenkins之CD
      • K8s部署并且对外暴露
    • 实战前置
      • Centos7安装Jenkins
      • Git安装
      • Maven安装
    • 远程SSH安装
      • K8S安装
        • shell脚本
        • KubeSphere
      • Nginx
    • 实战Jenkins
      • 配置git源码
      • 构建第一步,mvn编译
      • 构建第二步,上传到dockerhub
      • 构建第三步远程执行上面的shell脚本
      • 执行所有pipeline
    • 进阶
      • Jenkins结合Ansible
      • Walle
      • 项目K8s部署
    • 参考文章

    系列总目录


    前提

    背景

    • 本文的例子是将SpringBoot项目持续集成,并持续交付到K8S部署,例子的主要目的是学习Jenkins持续集成,不作为生产使用

    服务器

    • 采用的是腾讯云Centos7,2C4G,Jenkins是部署在腾讯云物理机上,而非Docker上面,之前本地MAC部署Jenkins在执行流水线Docker命令踩了坑,处理起来比较麻烦于是直接在Centos物理机上部署

    整体架构

    整体架构.png

    Jenkins之CI

    • 从GIT上拉取代码
    • 使用mvn命令打包
    • docker推送到DockerHub私有远程仓库
    • 中间可以加一些比如单元测试检验,SonarQube静态检查等

    Jenkins之CD

    • 远程到K8S master节点执行编写好的远程脚本,因为这里只是为了体验Devops功能,并不做生产使用,所以简单处理,而不是链接K8s的apiserver处理

    K8s部署并且对外暴露

    • K8s删除旧的service和deployment,然后执行部署命令Kubectl apply -f配置,SpringBoot服务就可以部署起来了,这里只是demo, 所以没考虑不停机更新,灰度,回滚等

    实战前置

    Centos7安装Jenkins

    • 参考官网的指令安装Jenkins的Jenkins Redhat Packages, 这里是把JDK也安装了,安装完可以java -version看看
    sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo
    sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key
    yum install fontconfig java-11-openjdk
    yum install jenkins
    
    • 安装之后开启Jenkins之旅
    sudo systemctl enable jenkins
    sudo systemctl start jenkins
    
    • 如果启动不了看看jenkins状态是不是在安装中
    sudo systemctl status jenkins
    
    • 本文是采用腾讯云的轻量应用服务器,为了方便本地MAC访问,增加了轻量服务器网关端口开放,本地MAC就可以用腾讯云公网Ip + 8080端口访问Jenkins了
    • 输入安装之后配置的密码,然后选择安装推荐插件,等待完成


      Jenkins.png

    Git安装

    yum -y install git
    git --version
    

    Maven安装

    • 下载maven
    wget https://dlcdn.apache.org/maven/maven-3/3.8.6/binaries/apache-maven-3.8.6-bin.tar.gz 
    
    • 解压
    tar -zxvf apache-maven-3.8.6-bin.tar.gz
    mv apache-maven-3.8.6 /usr/local/maven/
    
    • 配置环境变量
    export MAVEN_HOME=/usr/local/maven
    export PATH=$PATH:$MAVEN_HOME/bin
    
    • 刷新并查看
    source /etc/profile
    mvn -v
    
    • 替换
    vim /usr/local/maven/conf/settings.xml
    # 找到<mirrors></mirrors>标签对,添加以下内容
    <mirror>
       <id>alimaven</id>
        <name>aliyun maven</name>
        <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
        <mirrorOf>central</mirrorOf>
        <releases>
            <enabled>true</enabled>
            <updatePolicy>always</updatePolicy>
        </releases>
        <snapshots>
            <enabled>true</enabled>
            <updatePolicy>always</updatePolicy>
        </snapshots>
    </mirror>
    

    远程SSH安装

    • 正常情况下是连接k8s的apiserver手把手教你用 Jenkins + K8S 打造流水线环境,但是本文是dev体验devops功能,所以简单ssh连接到K8s的master宿主机,然后执行写的的K8s部署脚本
    • Jenkins安装远程SSH插件,选择插件管理


      插件安装1.png
    • 在可选插件选择SSH第一个


      插件安装2.png
    • 等待安装完成,然后重启Jenkins, 可以手动ip:8080/restart重启
    • 然后配置k8s的master节点对应的宿主机


      配置SSH.png
    • 需要配置hostname也就是腾讯云的公网ip, 凭证就需要添加,点2下面的添加选择Jenkins全局,输入腾讯云用户账号密码,不要root账号注意,忘记密码可以直接用root账号改密码,修改密码 linux修改密码,root账号输入password xxx可修改
      配置SSH_2.jpg
      配置SSH_3.png
    • 然后测试连接OK的话保存

    K8S安装

    • 本文使用minikube安装K8s集群,目的是为了体验功能,参考了 CentOS 7安装minikube,安装步骤安装下来即可
    • minikube start我这边直接底下命令启动
    minikube start --image-mirror-country='cn'
    
    K8s部署服务并对外暴露
    • 新建一个springboot-demo项目,demo的话只需要springboot里面加个简单的controller,并没maven管理
    • pom文件
    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.7.0</version>
            <relativePath/> <!-- lookup parent from repository -->
        </parent>
        <groupId>com.example</groupId>
        <artifactId>demo</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <name>demo</name>
        <description>Demo project for Spring Boot</description>
        <properties>
            <java.version>1.8</java.version>
        </properties>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
        </dependencies>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
    </project>
    
    • 在根目录底下(src同级)新建dockerfile
    FROM java:8
    COPY target/demo-0.0.1-SNAPSHOT.jar app.jar
    ENTRYPOINT ["java","-jar","/app.jar"]
    
    • dockerhub里面注册账号
    • deployment.yaml文件, 这里面Service将会以nodePort的形式对外暴露,端口为31999,springboot项目服务端口是8888,k8s对外暴露了一个端口为31999的springboot-demo服务
    apiVersion: v1
    kind: Service
    metadata:
      name: springboot-demo
      namespace: default
      labels:
        app: springboot-demo
    spec:
      type: NodePort
      ports:
        - port: 8888
          nodePort: 31999
      selector:
        app: springboot-demo
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: springboot-demo
      labels:
        app: springboot-demo
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: springboot-demo
      template:
        metadata:
          labels:
            app: springboot-demo
        spec:
          containers:
            - name: springboot-demo
              image: XXX(你dockerhub的项目前缀)/springboot-demo:latest
              imagePullPolicy: Always
              ports:
                - containerPort: 8888
    
    • 本地Mac或者Windows将项目推送到DockerHub,需要先docker login你的远程dockerhub项目
    • 腾讯云服务器执行以下命令
    kubectl apply -f deployment.yaml
    
    • 查看service, 能看到springboot-demo说明启动成功,刚开始K8s拉取远程Dockerhub的springboot-demo项目比较慢,耐心等待
    kubectl get service
    
    service.png
    • 查看deployment,这里都是默认命令空间所有不用加-n
    kubectl get deployment
    
    deployment.png
    • 如果启动有问题也可以查看日志先kubectl get pods


      pods.png
    • 然后查看pod的日志 kubectl logs springboot-demo-67bfb65c5d-nqhpl -f


      pod的日志.png
    • 本地访问测试, 查看K8s集群信息, kubectl cluster-info,看到对应的Ip地址,然后curl一下看下springboot-demo能不能访问到


      访问.png
    • 想要本地Mac外网访问,需要开启腾讯云防火墙端口规则,并且安装Nginx对外暴露,Nginx下面讲到


      开启腾讯云防火墙端口规则.png
    ssh脚本
    • 在/shell目录底下touch一个test.sh,先删除部署的service和deployment, 然后重新部署,更高级的版本回退等在这里不体验了, 有兴趣可以体验下这里K8S 滚动升级与回滚
    #!/bin/bash
    echo deploy start
    cd /home/xxx
    pwd
    kubectl delete service springboot-demo
    kubectl delete deployment springboot-demo
    kubectl apply -f deployment.yaml
    # kubectl get pods -A
    echo deploy end
    
    KubeSphere
    wget https://github.com/kubesphere/ks-installer/releases/download/v3.3.0/kubesphere-installer.yaml
    wget https://github.com/kubesphere/ks-installer/releases/download/v3.3.0/cluster-configuration.yaml
    
    • 如果要体验devops功能,请先编译下cluster-configuration.yaml,里面有个devops开关,默认false,给他开启来,因为我腾讯只有4g内存,所以先关了jenkins等其他功能才能开kubespere,当然小于4g内存的就用不了kubesphere的devops等功能了
    • 开始部署
    kubectl apply -f kubesphere-installer.yaml
       
    kubectl apply -f cluster-configuration.yaml
    
    
    • 过程比较慢可以查看日志
    kubectl logs -n kubesphere-system $(kubectl get pod -n kubesphere-system -l 'app in (ks-install, ks-installer)' -o jsonpath='{.items[0].metadata.name}') -f
    
    
    • 成功之后可以看到kubeshere的界面,比原生好看很多


      集群部署界面
    • devops功能开启后可以体验,这个网上可以找资料体验下
    • 本地想要访问远程的腾讯云部署的kubesphere,依然需要开启腾讯云防火墙端口,并且nginx开放端口

    Nginx

    sudo yum install -y epel-release
    sudo yum -y update
    sudo yum install -y nginx
    
    • 腾讯云防火墙打开对应的端口,测试环境我这边全开了
    • 启动重启nginx, 还有开机启动
    systemctl start nginx
    systemctl restart nginx
    systemctl enable nginx
    
    • nginx配置, 192.168.49.2是我本地docker的ip, 通过kubectl cluster-info可以看到
    # For more information on configuration, see:
    #   * Official English Documentation: http://nginx.org/en/docs/
    #   * Official Russian Documentation: http://nginx.org/ru/docs/
    
    user nginx;
    worker_processes auto;
    error_log /var/log/nginx/error.log;
    pid /run/nginx.pid;
    
    # Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
    include /usr/share/nginx/modules/*.conf;
    
    events {
        worker_connections 1024;
    }
    
    http {
        log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                          '$status $body_bytes_sent "$http_referer" '
                          '"$http_user_agent" "$http_x_forwarded_for"';
    
        access_log  /var/log/nginx/access.log  main;
    
        sendfile            on;
        tcp_nopush          on;
        tcp_nodelay         on;
        keepalive_timeout   65;
        types_hash_max_size 2048;
    
        include             /etc/nginx/mime.types;
        default_type        application/octet-stream;
    
        # Load modular configuration files from the /etc/nginx/conf.d directory.
        # See http://nginx.org/en/docs/ngx_core_module.html#include
        # for more information.
        include /etc/nginx/conf.d/*.conf;
    
        server {
            listen       80 default_server;
            listen       [::]:80 default_server;
            server_name  _;
            root         /usr/share/nginx/html;
    
            # Load configuration files for the default server block.
            include /etc/nginx/default.d/*.conf;
    
            location / {
            }
    
            location /k8s-test {
                proxy_pass http://192.168.49.2:31999/test;
            }
    
            error_page 404 /404.html;
                location = /40x.html {
            }
    
            error_page 500 502 503 504 /50x.html;
                location = /50x.html {
            }
        }
    
        server {
            listen    8888;
    
            location / {
                  proxy_pass http://192.168.49.2:30880;
            }
        }
    
        server {
            listen    8889;
    
            location / {
                  proxy_pass http://192.168.49.2:32183;
    
            }
        }
    
    }
    
    • 本地mac访问


      本地mac访问

    实战Jenkins

    • 安装上面前置配置,配置好了之后,新建一个任务叫springboot-demo,然后就是配置流水线执行, 新建任务选择自由风格

    配置git源码

    • 1选择gitee地址 2填上面配置好的凭证,然后底下分支选择master


      配置git源码.png

    构建第一步,mvn编译

    • 构建第一步,构建时选择调用顶层 Maven 目标,clean package -Dmaven.test.skip=true


      构建第一步,mvn编译.png

    构建第二步,上传到dockerhub

    • 里面XXX需要改成你对应的dockerhub的项目,账户密码,构建时选择执行 shell , 项目名称可以自己本地编译下就知道了


      项目名称
    docker build -f Dockerfile --build-arg jar_name=target/demo-0.0.1-SNAPSHOT.jar -t springboot-demo:latest . 
    docker tag  springboot-demo:latest  XXX/springboot-demo:latest
    docker login --username=XXX -p XXX
    docker push XXX/springboot-demo:latest
    
    构建第二步,上传到dockerhub

    构建第三步远程执行上面的shell脚本

    • XXX改成自己的远程服务器配置的用户名,test.sh脚本上面讲到是放到shell目录底下,构建时选择Execute shell script on remote host using ssh
    hostname
    cd /home/XXX/shell
    pwd
    sh test.sh
    
    构建第三步远程执行上面的shell脚本

    执行所有pipeline

    • 注意Jenkins第一次跑时,要拉很多依赖跑的会比较慢, 耐心等待即可

    • 点新建的任务


      点新建的任务
    • 立即构建


      立即构建
    • 查看结果,截图那个16可以点进去看看


      查看结果,截图那个16可以点进去看看
    • 看下控制台输出


      看下控制台输出
    • 先按照流程从git拉下来,然后编译


      查看
      git拉取
      mvn打包
    • 熟悉的编译


      image.png
    • 然后执行推送dockhub,然后执行远程SSH,然后成功


      image.png

    进阶

    Jenkins结合Ansible

    Walle

    项目K8s部署


    参考文章

    相关文章

      网友评论

          本文标题:业务实战场景(十五)Devops之Jenkins持续交付基于K8

          本文链接:https://www.haomeiwen.com/subject/vufjbrtx.html