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

目录

  • 系列总目录
  • 前提
    • 背景
    • 服务器
  • 整体架构
    • 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
# 找到标签对,添加以下内容

   alimaven
    aliyun maven
    http://maven.aliyun.com/nexus/content/groups/public/
    central
    
        true
        always
    
    
        true
        always
    

远程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文件


    4.0.0
    
        org.springframework.boot
        spring-boot-starter-parent
        2.7.0
         
    
    com.example
    demo
    0.0.1-SNAPSHOT
    demo
    Demo project for Spring Boot
    
        1.8
    
    
        
            org.springframework.boot
            spring-boot-starter
        

        
            org.springframework.boot
            spring-boot-starter-web
        

        
            org.springframework.boot
            spring-boot-starter-test
            test
        
    

    
        
            
                org.springframework.boot
                spring-boot-maven-plugin
            
        
    

  • 在根目录底下(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
  • Jenkins X 是基于 Kubernetes 的持续集成、持续部署平台, 在 Kubernetes 上最小化安装 KubeSphere, 持续集成方案 drone 的简介及部署这三篇文章都是基于K8s的持续集成和持续部署,各有利弊,本文体验了KubeSphere
  • 由于腾讯只有4G内存所以在体验kubesphere的时候把Jenkins关掉了,否则内存不足,KubeSphere也集成了Devops功能
  • 先下载配置
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

  • 参考centOS安装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

  • jenkins结合ansible,ansible管理更多的服务器,执行ssh命令
  • centos7安装ansible
  • ansible tower(可视化界面) 部署及白嫖-centos7.8适用
  • ansible图形化---tower

Walle

  • DevOps 基于Walle的小型持续集成实战(五)基于Walle发布Java应用
  • walle 2.0 alpha

项目K8s部署

  • 尚硅谷-谷粒商城项目里面代码,文档都可以下载到,学习部署K8s都可以学习到

参考文章

  • 有哪些部署 DevOps 技巧值得分享?
  • 关于ansible自动化运维超级详细
  • jenkins结合ansible
  • 37 | 快速构建持续交付系统(四):Ansible 解决自动部署问题
  • Jenkins Redhat Packages
  • jenkins从安装到一键构建成功(maven、git、jdk配置
  • centos安装maven
  • linux修改密码
  • 手把手教你用 Jenkins + K8S 打造流水线环境
  • 使用Jenkins通过SSH插件远程控制主机执行脚本
  • CentOS 7安装minikube
  • Jenkins X 是基于 Kubernetes 的持续集成、持续部署平台
  • 在 Kubernetes 上最小化安装 KubeSphere
  • 持续集成方案 drone 的简介及部署
  • centOS安装nginx服务
  • K8S 滚动升级与回滚
  • kubesphere安装
  • DevOps 基于Walle的小型持续集成实战(五)基于Walle发布Java应用
  • walle 2.0 alpha
  • 尚硅谷-谷粒商城
  • centos7安装ansible
  • ansible tower(可视化界面) 部署及白嫖-centos7.8适用
  • ansible图形化---tower

你可能感兴趣的:(业务实战场景(十五)Devops之Jenkins持续交付基于K8S)