ToB企服应用市场:ToB评测及商务社交产业平台

标题: DevOps概念及搭建全过程(Jenkins、Harbor、SonarQube、K8s) [打印本页]

作者: 王柳    时间: 2024-6-19 15:00
标题: DevOps概念及搭建全过程(Jenkins、Harbor、SonarQube、K8s)
DevOps入门及过程搭建

   在如今互联网的格局下,抢占市场变得尤为重要,因此灵敏开辟越来越被大家所推崇。于是,慢慢的有了DevOps这个概念,大抵意思是开辟-运维一体化。
  1 DevOps概念

1.1 基本概念


   可以看到上图是一个无穷大的一个符号,Dev对应开辟,Ops对应运维。
  
  1.2 流程

DevOps的开辟过程及常用工具:

整体的软件开辟流程包括:

   总的来说就是:
    2 搭建DevOps情况

   本项目全部采用docker安装,如果服务器上没有docker情况的,
参考:https://editor.csdn.net/md/?articleId=127816970安装即可。
  
  2.1 GitLab

   在项目的Code(编码)阶段,我们需要将差别版本的代码存储到一个仓库中,常见的版本控制工具就是SVN大概Git,这里我们采用Git作为版本控制工具,GitLab作为远程仓库。
  1. git的安装:参考官网,无脑下一步即可
  2. 官网地址:https://git-scm.com/
复制代码
GitLab安装:
  1. # 查看镜像
  2. docker search gitlab
  3. # 拉取镜像
  4. docker pull gitlab/gitlab-ce
复制代码
   文档中的external_url等参考自己服务器上的ip
  1. version: '3.1'
  2. services:
  3.   gitlab:
  4.     image: 'gitlab/gitlab-ce:latest'
  5.     container_name: gitlab
  6.     restart: always
  7.     environment:
  8.       GITLAB_OMNIBUS_CONFIG: |
  9.         external_url 'http://192.168.11.11:8929'
  10.         gitlab_rails['gitlab_shell_ssh_port'] = 2224
  11.     ports:
  12.       - '8929:8929'
  13.       - '2224:2224'
  14.     volumes:
  15.       - './config:/etc/gitlab'
  16.       - './logs:/var/log/gitlab'
  17.       - './data:/var/opt/gitlab'
复制代码
  1. # 启动容器
  2. docker-compose up -d
复制代码
访问:http://192.168.11.11:8929即可。
结果:

4. 检察初始的用户名和暗码
  1. docker exec -it gitlab cat /etc/gitlab/initial_root_password
复制代码

5. 登录并修改暗码
   以root身份登录gitlab,首次登录需要修改暗码
  


   然后我们就可以像GitHub、Gitee一样操作GitLab了
  2.2 Docker

   构建Java项目的工具一样平常有两种选择,一个是Maven,一个是Gradle。
  
  部署过程,会采用Docker举行部署,暂时只安装Docker即可,后续还需安装Kubenetes
2.2.1 Docker安装

①准备测试情况&生产情况
②下载Docker依赖组件
  1. yum -y install yum-utils device-mapper-persistent-data lvm2
复制代码
③设置下载Docker的镜像源为阿里云
  1. yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
复制代码
④安装docker服务
  1. yum -y install docker-ce
复制代码
⑤设置docker开机自启
  1. # 启动Docker服务
  2. systemctl start docker
  3. # 设置开机自动启动
  4. systemctl enable docker
复制代码
⑥测试安装成功
  1. docker version
复制代码
2.2.2 Docker-compose安装


  1. # 设置文件权限
  2. chmod a+x docker-compose-Linux-x86_64
  3. # 移动到/usr/bin目录下,并重命名为docker-compose
  4. mv docker-compose-Linux-x86_64 /usr/bin/docker-compose
复制代码
2.3 Jenkins

2.3.1 介绍

   在DevOps中持续集成和持续部署是很重要的一个环节,雷同的工具也有很多,此中Jenkins是一个开源的持续集成平台。
Jenkins涉及到将编写完毕的代码发布到测试情况和生产情况的任务,并且还涉及到了构建项目等任务。
  Jenkins需要大量的插件包管工作,安装成本较高,下面会基于Docker搭建Jenkins。
   
  

Jenkins主要工作:
   GitLab上的代码经过大量测试后,确定发型版本,再发布到生产情况
  

CI/CD概念:

2.3.2 Jenkins安装

  1. docker pull jenkins/jenkins
复制代码
  1. version: "3.1"
  2. services:
  3.   jenkins:
  4.     image: jenkins/jenkins
  5.     container_name: jenkins
  6.     ports:
  7.       - 8080:8080
  8.       - 50000:50000
  9.     volumes:
  10.       - ./data/:/var/jenkins_home/
复制代码
  1. chmod -R a+w data/
复制代码
   重新启动Jenkins容器后,由于Jenkins需要下载大量内容,但是由于默认下载地址下载速度较慢,需要重新设置下载地址为国内镜像站
  1. # 修改数据卷中的hudson.model.UpdateCenter.xml文件
  2. <?xml version='1.1' encoding='UTF-8'?>
  3. <sites>
  4.   <site>
  5.     <id>default</id>
  6.     <url>https://updates.jenkins.io/update-center.json</url>
  7.   </site>
  8. </sites>
  9. # 将下载地址替换为http://mirror.esuni.jp/jenkins/updates/update-center.json
  10. <?xml version='1.1' encoding='UTF-8'?>
  11. <sites>
  12.   <site>
  13.     <id>default</id>
  14.     <url>http://mirror.esuni.jp/jenkins/updates/update-center.json</url>
  15.   </site>
  16. </sites>
  17. # 清华大学的插件源也可以https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
复制代码
  1. docker exec -it jenkins cat /var/jenkins_home/secrets/initialAdminPassword
复制代码
输入管理员暗码 - 选择插件来安装 - 选择对应的插件举行安装
   保举安装:
①Git Parameter
②Publish Over SSH
  

然后等候插件安装成功进入首页。(可能会出现下载失败的插件,重新下载即可)
7. 创建管理员用户,设置Jenkins URL

2.3.3 Jenkins实现拉取-构建-发布

   准备好GitLab仓库中的项目,并且通过Jenkins设置实现当前项目的DevOps流程。(Idea创建之后推送到远程即可)
     代码拉取到Jenkins当地后,需要在Jenkins中对代码举行构建,这里需要Maven的情况,而Maven需要Java的情况,接下来需要在Jenkins中安装JDK和Maven,并且设置到Jenkins服务。
  
  1. <!-- 阿里云镜像地址 -->
  2. <mirror>  
  3.     <id>alimaven</id>  
  4.     <name>aliyun maven</name>  
  5.     <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
  6.     <mirrorOf>central</mirrorOf>         
  7. </mirror>
  8. <!-- JDK1.8编译插件 -->
  9. <profile>
  10.     <id>jdk-1.8</id>
  11.     <activation>
  12.         <activeByDefault>true</activeByDefault>
  13.         <jdk>1.8</jdk>
  14.     </activation>
  15.     <properties>
  16.         <maven.compiler.source>1.8</maven.compiler.source>
  17.         <maven.compiler.target>1.8</maven.compiler.target>
  18.         <maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
  19.     </properties>        
  20. </profile>
复制代码

   jar包构建好后,就可以根据情况发布到测试大概生产情况,此处需要用到之前下载好的插件Publish Over SSH
  


2.3.4 CI/CD操作


   为了让步伐代码可以自动推送到测试情况基于Docker服务运行,需要添加Docker设置和脚本文件让步伐可以在集成到主干的同时运行起来。
  ①持续集成
   步伐代码在经过多次集成操作到达终极可以交付,持续交付整体流程和持续集成雷同,不过需要选取指定的发行版本
  
2.4 Sonar Qube

2.4.1 Sonar Qube介绍与安装

   Sonar Qube是一个开源的代码分析平台,支持Java、Python、PHP、JavaScript、CSS等25种以上的语言,可以检测出重复代码、代码漏洞、代码规范和安全性漏洞的问题。
  
  

安装过程:
   Sonar Qube在7.9版本中已经放弃了对MySQL的支持,并且建议在贸易情况中采用PostgreSQL,那么安装Sonar Qube时需要依赖PostgreSQL。
  ①拉取PostgreSQL镜像
  1. docker pull postgres
  2. docker pull sonarqube:8.9.3-community
复制代码
②编写docker-compose.yml
   更易管理
  1. version: "3.1"
  2. services:
  3.   db:
  4.     image: postgres
  5.     container_name: db
  6.     ports:
  7.       - 5432:5432
  8.     networks:
  9.       - sonarnet
  10.     environment:
  11.       POSTGRES_USER: sonar
  12.       POSTGRES_PASSWORD: sonar
  13.   sonarqube:
  14.     image: sonarqube:8.9.3-community
  15.     container_name: sonarqube
  16.     depends_on:
  17.       - db
  18.     ports:
  19.       - "9000:9000"
  20.     networks:
  21.       - sonarnet
  22.     environment:
  23.       SONAR_JDBC_URL: jdbc:postgresql://db:5432/sonar
  24.       SONAR_JDBC_USERNAME: sonar
  25.       SONAR_JDBC_PASSWORD: sonar
  26. networks:
  27.   sonarnet:
  28.     driver: bridge
复制代码
③设置sysctl.conf文件信息,并启动容器

   设置vm.max_map_count=262144,至少是这个数
  1. # 执行命令举行革新sysctl -p# 启动容器
  2. docker-compose up -d
复制代码
  重新启动需要一定时间,可以检察容器日志,如果看到如下内容代表启动成功
  

④访问Sonar Qube首页

   登录成功之后,会要求我们修改默认暗码
  首页图片:


   安装成功后需要重启,若安装失败,重新点击install即可
  2.4.2 Sonar Qube基本使用

   Sonar Qube的使用方式很多,Maven可以整合,也可以采用sonar-scanner的方式,再检察Sonar Qube的检测结果
  ①Maven实当代码检测


   修改当地Maven的settings.xml文件,设置Sonar Qube信息
  1. <profile>
  2.     <id>sonar</id>
  3.     <activation>
  4.         <activeByDefault>true</activeByDefault>
  5.     </activation>
  6.     <properties>
  7.         <sonar.login>admin</sonar.login>
  8.         <sonar.password>123456789</sonar.password>
  9.         <sonar.host.url>http://192.168.11.11:9000</sonar.host.url>
  10.     </properties>
  11. </profile>
复制代码

②Sonar-scanner实当代码检测


   
  
   下载下来的Sonar-scanner是zip压缩包,因此需要在linux上安装unzip插件
  1. # 安装unzip解压插件
  2. yum -y install unzip
  3. # 解压压缩包
  4. unzip sonar-scanner-cli/sonar-scanner-cli-4.6.0.2311-linux.zip
复制代码
  设置sonarQube服务端地址,修改conf下的sonar-scanner.properties

  
  1. # 在项目所在目录执行以下命令
  2. ~/sonar-scanner/bin/sonar-scanner -Dsonar.sources=./ -Dsonar.projectname=demo -Dsonar.projectKey=java -Dsonar.java.binaries=target/
复制代码


③Jenkins集成Sonar Qube

   Jenkins集成Sonar Qube实当代码扫描需要下载整合插件
     在SonarQube中开启Sonar Qube的权限验证

在Sonar Qube中生成一个令牌,获取Sonar Qube的令牌

  
   Dashboard - 体系设置
  



   将Sonar-scanner添加到Jenkins数据卷中并全局设置

  
Jenkins界面:

SonarQube界面:

2.5 Harbor(镜像仓库)

2.5.1 Harbor介绍与安装


   前面我们在部署时,主要流程如下:
    但是这种方式在项目比力多的时候,每个服务器都需要将jar包制作成自定义镜像,然后再通过docker举行启动,重复操作较多,降低部署效率。
  Harbor:私有的Docker镜像仓库。我们可以让Jenkins统一将项目打包并制作成Docker镜像发布到Harbor仓库中。然后我们只需要关照目标服务,让目标服务统一去Harbor仓库上拉取镜像并在当地部署即可。

  1. # 通过xftp或其他方式将压缩包传送到linux上
  2. # 解压
  3. tar -zxvf harbor-offline-installer-v2.3.4.tgz -C /usr/local/
复制代码
   设置harbor地址,注释https,检察暗码
  1. # 备份原有配置
  2. cp harbor.yml.tmpl harbor.yml
复制代码

4. 启动Harbor并登录Harbor
  1. # 启动Harbor
  2. ./install.sh
复制代码

首页信息:

2.5.2 Harbor基础使用

   Harbor作为镜像仓库,主要的交互方式就是将镜像上传到Harbor,以及从Harbor上下载拉取指定版本的镜像。
  
  ①添加用户构建项目


   体系管理-用户管理-创建用户

  
②发布镜像到Harbor


   名称要求:harbor地址/项目名/镜像名:版本

  
  1. docker login -u 用户名 -p 密码 Harbor地址
复制代码

③从Harbor中拉取镜像

   跟传统方式一样,不过需要先设置/etc/docker/daemon.json文件
  1. {
  2.         "registry-mirrors": ["https://pee6w651.mirror.aliyuncs.com"],
  3.         "insecure-registries": ["192.168.11.11:80"]
  4. }
复制代码
拉取镜像:

拓展:Jenkins容器使用宿主机Docker并编写构建脚本

   
  ①设置Jenkins容器使用宿主机Docker
  1. sudo chown root:root /var/run/docker.sock
  2. sudo chmod o+rw /var/run/docker.sock
复制代码
  1. version: "3.1"
  2. services:
  3.   jenkins:
  4.     image: jenkins/jenkins
  5.     container_name: jenkins
  6.     ports:
  7.       - 8080:8080
  8.       - 50000:50000
  9.     volumes:
  10.       - ./data/:/var/jenkins_home/
  11.       - /usr/bin/docker:/usr/bin/docker      - /var/run/docker.sock:/var/run/docker.sock      - /etc/docker/daemon.json:/etc/docker/daemon.json
复制代码
②添加构建操作

③编写构建脚本
   
   deploy.sh:
  1. harbor_url=$1
  2. harbor_project_name=$2
  3. project_name=$3
  4. tag=$4
  5. port=$5
  6. imageName=$harbor_url/$harbor_project_name/$project_name:$tag
  7. containerId=`docker ps -a | grep ${project_name} | awk '{print $1}'`
  8. if [ "$containerId" != "" ] ; then
  9.     docker stop $containerId
  10.     docker rm $containerId
  11.     echo "Delete Container Success"
  12. fi
  13. imageId=`docker images | grep ${project_name} | awk '{print $3}'`
  14. if [ "$imageId" != "" ] ; then
  15.     docker rmi -f $imageId
  16.     echo "Delete Image Success"
  17. fi
  18. docker login -u DevOps -p P@ssw0rd $harbor_url
  19. docker pull $imageName
  20. docker run -d -p $port:$port --name $project_name $imageName
  21. echo "Start Container Success"
  22. echo $project_name
复制代码
  1. chmod a+x deploy.sh
复制代码

④设置构建后操作

2.6 Jenkins流水线(pipeline)、自动化脚本

2.6.1 Jenkins流水线任务介绍

   之前采用的都是Jenkins的自由风格,每个流程都要通过差别的方式设置,并且构建过程中整体流程时不可见的,无法确认每个流程花费的时间,同时不方便问题的定位。
  Jenkins的Pipeline可以让项目的发布整体流程可视化,明白执行的阶段,快速定位问题。让整个项目的生命周期可以通过一个Jenkinsfile文件管理,而且Jenkinsfile文件是可以放在项目中维护。
①构建Jenkins流水线任务

  1. // 所有脚本命令包含在pipeline{}中
  2. pipeline {  
  3.         // 指定任务在哪个节点执行(Jenkins支持分布式)
  4.     agent any
  5.    
  6.     // 配置全局环境,指定变量名=变量值信息
  7.     environment{
  8.             host = '192.168.11.11'
  9.     }
  10.     // 存放所有任务的合集
  11.     stages {
  12.             // 单个任务
  13.         stage('任务1') {
  14.                 // 实现任务的具体流程
  15.             steps {
  16.                 echo 'do something'
  17.             }
  18.         }
  19.                 // 单个任务
  20.         stage('任务2') {
  21.                 // 实现任务的具体流程
  22.             steps {
  23.                 echo 'do something'
  24.             }
  25.         }
  26.         // ……
  27.     }
  28. }
复制代码

   Jenkinsfile方式需要将脚本内容编写到项目中的Jenkinsfile文件中,每次构建会自动拉取并且获取项目中的Jenkinsfile文件来对项目举行构建
  
2.6.2 Jenkins流水线任务实现

   添加参数化构建,方便选择差别的项目版本
  

2. 拉取Git代码
   通过流水线语法生成Checkout代码的脚本
  

   将*/master更改为标签${tag}
  1. pipeline {
  2.     agent any
  3.     stages {
  4.         stage('拉取Git代码') {
  5.             steps {
  6.                 checkout([$class: 'GitSCM', branches: [[name: '${tag}']], extensions: [], userRemoteConfigs: [[url: 'http://49.233.115.171:8929/root/test.git']]])
  7.             }
  8.         }
  9.     }
  10. }
复制代码
   通过脚本执行mvn的构建命令
  1. pipeline {
  2.     agent any
  3.     stages {
  4.         stage('拉取Git代码') {
  5.             steps {
  6.                 checkout([$class: 'GitSCM', branches: [[name: '${tag}']], extensions: [], userRemoteConfigs: [[url: 'http://49.233.115.171:8929/root/test.git']]])
  7.             }
  8.         }
  9.         stage('构建代码') {
  10.             steps {
  11.                 sh '/var/jenkins_home/maven/bin/mvn clean package -DskipTests'
  12.             }
  13.         }
  14. }
复制代码
   通过脚本执行sonar-scanner命令即可
  1. pipeline {
  2.     agent any
  3.     stages {
  4.         stage('拉取Git代码') {
  5.             steps {
  6.                 checkout([$class: 'GitSCM', branches: [[name: '${tag}']], extensions: [], userRemoteConfigs: [[url: 'http://49.233.115.171:8929/root/test.git']]])
  7.             }
  8.         }
  9.         stage('构建代码') {
  10.             steps {
  11.                 sh '/var/jenkins_home/maven/bin/mvn clean package -DskipTests'
  12.             }
  13.         }
  14.         stage('检测代码质量') {
  15.             steps {
  16.                 sh '/var/jenkins_home/sonar-scanner/bin/sonar-scanner -Dsonar.sources=./ -Dsonar.projectname=${JOB_NAME} -Dsonar.projectKey=${JOB_NAME} -Dsonar.java.binaries=target/ -Dsonar.login=31388be45653876c1f51ec02f0d478e2d9d0e1fa'
  17.             }
  18.         }
  19.     }
  20. }
复制代码

  1. pipeline {
  2.     agent any
  3.     environment{
  4.         harborHost = '192.168.11.11:80'
  5.         harborRepo = 'repository'
  6.         harborUser = 'DevOps'
  7.         harborPasswd = 'P@ssw0rd'
  8.     }
  9.     // 存放所有任务的合集
  10.     stages {
  11.         stage('拉取Git代码') {
  12.             steps {
  13.                 checkout([$class: 'GitSCM', branches: [[name: '${tag}']], extensions: [], userRemoteConfigs: [[url: 'http://49.233.115.171:8929/root/test.git']]])
  14.             }
  15.         }
  16.         stage('构建代码') {
  17.             steps {
  18.                 sh '/var/jenkins_home/maven/bin/mvn clean package -DskipTests'
  19.             }
  20.         }
  21.         stage('检测代码质量') {
  22.             steps {
  23.                 sh '/var/jenkins_home/sonar-scanner/bin/sonar-scanner -Dsonar.sources=./ -Dsonar.projectname=${JOB_NAME} -Dsonar.projectKey=${JOB_NAME} -Dsonar.java.binaries=target/ -Dsonar.login=31388be45653876c1f51ec02f0d478e2d9d0e1fa'
  24.             }
  25.         }
  26.         stage('制作自定义镜像并发布Harbor') {
  27.             steps {
  28.                 sh '''cp ./target/*.jar ./docker/
  29.                 cd ./docker
  30.                 docker build -t ${JOB_NAME}:${tag} ./'''
  31.                 sh '''docker login -u ${harborUser} -p ${harborPasswd} ${harborHost}
  32.                 docker tag ${JOB_NAME}:${tag} ${harborHost}/${harborRepo}/${JOB_NAME}:${tag}
  33.                 docker push ${harborHost}/${harborRepo}/${JOB_NAME}:${tag}'''
  34.             }
  35.         }
  36.     }
  37. }
复制代码

  1. pipeline {
  2.     agent any
  3.     environment{
  4.         harborHost = '192.168.11.11:80'
  5.         harborRepo = 'repository'
  6.         harborUser = 'DevOps'
  7.         harborPasswd = 'P@ssw0rd'
  8.     }
  9.     // 存放所有任务的合集
  10.     stages {
  11.         stage('拉取Git代码') {
  12.             steps {
  13.                 checkout([$class: 'GitSCM', branches: [[name: '${tag}']], extensions: [], userRemoteConfigs: [[url: 'http://49.233.115.171:8929/root/test.git']]])
  14.             }
  15.         }
  16.         stage('构建代码') {
  17.             steps {
  18.                 sh '/var/jenkins_home/maven/bin/mvn clean package -DskipTests'
  19.             }
  20.         }docker
  21.         stage('检测代码质量') {
  22.             steps {
  23.                 sh '/var/jenkins_home/sonar-scanner/bin/sonar-scanner -Dsonar.sources=./ -Dsonar.projectname=${JOB_NAME} -Dsonar.projectKey=${JOB_NAME} -Dsonar.java.binaries=target/ -Dsonar.login=7d66af4b39cfe4f52ac0a915d4c9d5c513207098'
  24.             }
  25.         }
  26.         stage('制作自定义镜像并发布Harbor') {
  27.             steps {
  28.                 sh '''cp ./target/*.jar ./docker/
  29.                 cd ./docker
  30.                 docker build -t ${JOB_NAME}:${tag} ./'''
  31.                 sh '''docker login -u ${harborUser} -p ${harborPasswd} ${harborHost}
  32.                 docker tag ${JOB_NAME}:${tag} ${harborHost}/${harborRepo}/${JOB_NAME}:${tag}
  33.                 docker push ${harborHost}/${harborRepo}/${JOB_NAME}:${tag}'''
  34.             }
  35.         }
  36.         
  37.         stage('目标服务器拉取镜像并运行') {
  38.             steps {
  39.                 sshPublisher(publishers: [sshPublisherDesc(configName: 'testEnvironment', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: "/usr/bin/deploy.sh $harborHost $harborRepo $JOB_NAME $tag $port ", execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: '')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
  40.             }
  41.         }
  42.     }
  43. }
复制代码
  Ps:由于采用变量,记得使用双引号
  2.6.3 Jenkins流水线整合钉钉

   在步伐部署成功之后,可以通过钉钉的机器人及时向开辟人员发送部署的终极结果关照
  步骤:Jenkins安装插件 - 钉钉创建群组并构建机器人 - Jenkins设置体系添加钉钉关照 - 任务中追加钉钉流水线设置
   https://oapi.dingtalk.com/robot/send?access_token=kej4ehkj34gjhg34jh5bh5jb34hj53b4
  
  1. pipeline {
  2.     agent any
  3.     environment {
  4.         sonarLogin = '2bab7bf7d5af25e2c2ca2f178af2c3c55c64d5d8'
  5.         harborUser = 'admin'
  6.         harborPassword = 'Harbor12345'
  7.         harborHost = '192.168.11.12:8888'
  8.         harborRepo = 'repository'
  9.     }
  10.     stages {
  11.         stage('拉取Git代码'){
  12.             steps {
  13.                 checkout([$class: 'GitSCM', branches: [[name: '$tag']], extensions: [], userRemoteConfigs: [[url: 'http://49.233.115.171:8929/root/lsx.git']]])
  14.             }
  15.         }
  16.         stage('Maven构建代码'){
  17.             steps {
  18.                 sh '/var/jenkins_home/maven/bin/mvn clean package -DskipTests'
  19.             }
  20.         }
  21.         stage('SonarQube检测代码'){
  22.             steps {
  23.                 sh '/var/jenkins_home/sonar-scanner/bin/sonar-scanner -Dsonar.sources=./ -Dsonar.projectname=${JOB_NAME} -Dsonar.projectKey=${JOB_NAME} -Dsonar.java.binaries=target/ -Dsonar.login=${sonarLogin}'
  24.             }
  25.         }
  26.         stage('制作自定义镜像'){
  27.             steps {
  28.                 sh '''cd docker
  29.                 mv ../target/*.jar ./
  30.                 docker build -t ${JOB_NAME}:$tag .
  31.                 '''
  32.             }
  33.         }
  34.         stage('推送自定义镜像'){
  35.             steps {
  36.                 sh '''docker login -u ${harborUser} -p ${harborPassword} ${harborHost}
  37.                 docker tag ${JOB_NAME}:$tag ${harborHost}/${harborRepo}/${JOB_NAME}:$tag
  38.                 docker push ${harborHost}/${harborRepo}/${JOB_NAME}:$tag'''
  39.             }
  40.         }
  41.         stage('通知目标服务器'){
  42.             steps {
  43.                 sshPublisher(publishers: [sshPublisherDesc(configName: 'centos-docker', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: "/usr/bin/deploy.sh $harborHost $harborRepo $JOB_NAME $tag $port", execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: '')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
  44.             }  
  45.         }
  46.     }
  47.     post {
  48.         success {
  49.             dingtalk (
  50.                 robot: 'Jenkins-DingDing',
  51.                 type:'MARKDOWN',
  52.                 title: "success: ${JOB_NAME}",
  53.                 text: ["- 成功构建:${JOB_NAME}项目!\n- 版本:${tag}\n- 持续时间:${currentBuild.durationString}\n- 任务:#${JOB_NAME}"]
  54.             )
  55.         }
  56.         failure {
  57.             dingtalk (
  58.                 robot: 'Jenkins-DingDing',
  59.                 type:'MARKDOWN',
  60.                 title: "fail: ${JOB_NAME}",
  61.                 text: ["- 失败构建:${JOB_NAME}项目!\n- 版本:${tag}\n- 持续时间:${currentBuild.durationString}\n- 任务:#${JOB_NAME}"]
  62.             )
  63.         }
  64.     }
  65. }
复制代码
2.7 Kubernetes

2.7.1 介绍及安装

   Kubernetes又称为k8s,是一个开源的,用于管理云平台中多个主机上的容器。目的是让容器化部署更加简单、高效。
  ①k8s主要作用:

②k8s的架构

   k8s搭建至少需要两个节点,一个Master负责管理,一个Slave搭建在工作服务器上负责分配
  

   各个组件的基本功能
  
  ③k8s安装

   本文采用https://kuboard.cn/提供的方式安装K8s,安装单Master节点
  
  

准备好服务器之后开始安装:
1. 重新设置hostname,不允许为localhost

  1. # 修改 hostname,名字不允许使用下划线、小数点、大写字母,不能叫master
  2. hostnamectl set-hostname your-new-host-name
  3. # 查看修改结果
  4. hostnamectl status
  5. # 设置 hostname 解析
  6. echo "127.0.0.1   $(hostname)" >> /etc/hosts
复制代码
  要求2台服务器之间可以相互通讯
  2. 安装kuboard软件

  1. # 阿里云 docker hub 镜像
  2. export REGISTRY_MIRROR=https://registry.cn-hangzhou.aliyuncs.com
  3. curl -sSL https://kuboard.cn/install-script/v1.19.x/install_kubelet.sh | sh -s 1.19.5
复制代码
3. 初始化Master节点

   关于初始化时用到的情况变量
  
  1. # 只在 master 节点执行
  2. # 替换 x.x.x.x 为 master 节点实际 IP(请使用内网 IP)
  3. # export 命令只在当前 shell 会话中有效,开启新的 shell 窗口后,如果要继续安装过程,请重新执行此处的 export 命令
  4. export MASTER_IP=192.168.11.32
  5. # 替换 apiserver.demo 为 您想要的 dnsName
  6. export APISERVER_NAME=apiserver.demo
  7. # Kubernetes 容器组所在的网段,该网段安装完成后,由 kubernetes 创建,事先并不存在于您的物理网络中
  8. export POD_SUBNET=10.100.0.1/16
  9. echo "${MASTER_IP}    ${APISERVER_NAME}" >> /etc/hosts
  10. curl -sSL https://kuboard.cn/install-script/v1.19.x/init_master.sh | sh -s 1.19.5
复制代码

  1. # 只在 master 节点执行
  2. # 执行如下命令,等待 3-10 分钟,直到所有的容器组处于 Running 状态
  3. watch kubectl get pod -n kube-system -o wide
  4. # 查看 master 节点初始化结果
  5. kubectl get nodes
  6. -o wide
复制代码
Ps:如果出现NotReady的情况执行(最新版本的BUG,1.19一样平常没有)
  1. docker pull quay.io/coreos/flannel:v0.10.0-amd64
  2. mkdir -p /etc/cni/net.d/
  3. cat <<EOF> /etc/cni/net.d/10-flannel.conf
  4. {"name":"cbr0","type":"flannel","delegate": {"isDefaultGateway": true}}
  5. EOF
  6. mkdir /usr/share/oci-umount/oci-umount.d -p
  7. mkdir /run/flannel/
  8. cat <<EOF> /run/flannel/subnet.env
  9. FLANNEL_NETWORK=172.100.0.0/16
  10. FLANNEL_SUBNET=172.100.1.0/24
  11. FLANNEL_MTU=1450
  12. FLANNEL_IPMASQ=true
  13. EOF
  14. kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/v0.9.1/Documentation/kube-flannel.yml
复制代码

  1. export POD_SUBNET=10.100.0.0/16
  2. kubectl apply -f https://kuboard.cn/install-script/v1.22.x/calico-operator.yaml
  3. wget https://kuboard.cn/install-script/v1.22.x/calico-custom-resources.yaml
  4. sed -i "s#192.168.0.0/16#${POD_SUBNET}#" calico-custom-resources.yaml
  5. kubectl apply -f calico-custom-resources.yaml
复制代码
4. 初始化worker节点


  1. # 只在 master 节点执行
  2. kubeadm token create --print-join-command
复制代码


  1. # 只在 worker 节点执行
  2. # 替换 x.x.x.x 为 master 节点的内网 IP
  3. export MASTER_IP=192.168.11.32
  4. # 替换 apiserver.demo 为初始化 master 节点时所使用的 APISERVER_NAME
  5. export APISERVER_NAME=apiserver.demo
  6. echo "${MASTER_IP}    ${APISERVER_NAME}" >> /etc/hosts
  7. # 替换为 master 节点上 kubeadm token create 命令的输出
  8. kubeadm join apiserver.demo:6443 --token vwfilu.3nhndohc5gn1jv9k     --discovery-token-ca-cert-hash sha256:22ff15cabfe87ab48a7db39b3bbf986fee92ec92eb8efc7fe9b0abe2175ff0c2
复制代码
5. 查抄终极运行结果


  1. # 只在 master 节点执行
  2. kubectl get nodes
  3. -o wide
复制代码
Ps:如果出现NotReady的情况执行(最新版本的BUG,1.19一样平常没有)
  1. docker pull quay.io/coreos/flannel:v0.10.0-amd64
  2. mkdir -p /etc/cni/net.d/
  3. cat <<EOF> /etc/cni/net.d/10-flannel.conf
  4. {"name":"cbr0","type":"flannel","delegate": {"isDefaultGateway": true}}
  5. EOF
  6. mkdir /usr/share/oci-umount/oci-umount.d -p
  7. mkdir /run/flannel/
  8. cat <<EOF> /run/flannel/subnet.env
  9. FLANNEL_NETWORK=172.100.0.0/16
  10. FLANNEL_SUBNET=172.100.1.0/24
  11. FLANNEL_MTU=1450
  12. FLANNEL_IPMASQ=true
  13. EOF
  14. kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/v0.9.1/Documentation/kube-flannel.yml
复制代码

  1. kubectl get nodes
复制代码

6. 安装Kuboard管理k8s集群


  1. kubectl apply -f https://addons.kuboard.cn/kuboard/kuboard-v3.yaml
  2. # 您也可以使用下面的指令,唯一的区别是,该指令使用华为云的镜像仓库替代 docker hub 分发 Kuboard 所需要的镜像
  3. # kubectl apply -f https://addons.kuboard.cn/kuboard/kuboard-v3-swr.yaml
复制代码

  1. watch kubectl get pods -n kuboard
复制代码

   
  

2.7.2 k8s操作

   起首k8s在运行我们的资源时,关联到了哪些内容呢?
  
  ①namespace

   命名空间:对k8s中运行的资源举行隔离,但是网络是互通的。雷同于docker的容器,可以将多个资源设置到一个namespace中。而namespace可以对差别情况举行资源隔离,默认情况下k8s提供了default命名空间。
  命令方式:
  1. # 查看现有的全部命名空间
  2. kubectl get ns
  3. # 构建命名空间
  4. kubectl create ns 命名空间名称
  5. # 删除现有命名空间, 并且会删除空间下的全部资源
  6. kubectl delete ns 命名空间名称
复制代码
yaml文件方式(构建源时,设置命名空间)
  1. apiVersion: v1
  2. kind: Namespace
  3. metadata:
  4.   name: test
复制代码
②Pod

   k8s中运行的一组容器,Pod是k8s的最小单元。但是对于Docker而言,Pod中会运行多个Docker容器
  
  1. # 查看所有运行的pod
  2. kubectl get pods -A
  3. # 查看指定Namespace下的Pod
  4. kubectl get pod [-n 命名空间]  #(默认default)
  5. # 创建Pod
  6. kubectl run pod名称 --image=镜像名称
  7. # 查看Pod详细信息
  8. kubectl describe pod pod名称
  9. # 删除pod
  10. kubectl delete pod pod名称 [-n 命名空间]  #(默认default)
  11. # 查看pod输出的日志
  12. kubectl logs -f pod名称
  13. # 进去pod容器内部
  14. kubectl exec -it pod名称 -- bash
  15. # 查看kubernetes给Pod分配的ip信息,并且通过ip和容器的端口,可以直接访问
  16. kubectl get pod -owide
复制代码

  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4.   labels:
  5.     run: 运行的pod名称
  6.   name: pod名称
  7.   namespace: 命名空间
  8. spec:
  9.   containers:
  10.   - image: 镜像名称
  11.     name: 容器名称
  12. # 启动Pod:kubectl apply -f yaml文件名称
  13. # 删除Pod:kubectl delete -f yaml文件名称
复制代码

  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4.   labels:
  5.     run: 运行的pod名称
  6.   name: pod名称
  7.   namespace: 命名空间
  8. spec:
  9.   containers:
  10.   - image: 镜像名称
  11.     name: 容器名称
  12.   - image: 镜像名称
  13.     name: 容器名称
  14. …………   
复制代码
Kuboard结果:

③Deployment

   部署时,可以通过Deployment管理和编排Pod
  
  1. # 基于Deployment启动容器
  2. kubectl create deployment deployment名称 --image=镜像名称
  3. # 用deployment启动的容器会在被删除后自动再次创建,达到故障漂移的效果
  4. # 需要使用deploy的方式删除deploy
  5. # 查看现在的deployment
  6. kubectl get deployment
  7. # 删除deployment
  8. kubectl delete deployment deployment名称
  9. # 基于Deployment启动容器并设置Pod集群数
  10. kubectl create deployment deployment名称 --image=镜像名称 --replicas 集群个数
复制代码

  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4.   name: nginx-deployment
  5.   labels:
  6.     app: nginx
  7. spec:
  8.   replicas: 3
  9.   selector:
  10.     matchLabels:
  11.       app: nginx
  12.   template:
  13.     metadata:
  14.       labels:
  15.         app: nginx
  16.     spec:
  17.       containers:
  18.       - name: nginx
  19.        image: nginx
  20.        ports:
  21.        - containerPort: 80
复制代码
  正常使用kubectl运行yaml即可
  弹性伸缩功能:
  1. # 基于scale实现弹性伸缩
  2. kubectl scale deploy/Deployment名称 --replicas 集群个数
  3. # 或者修改yaml文件
  4. kubectl edit deploy Deployment名称
复制代码

灰度发布:
Deploy可以在部署新版本数据时,成功启动一个Pod,才会下线一个老版本Pod
  1. kubectl set image deployment/Deployment名称 容器名=镜像:版本
复制代码
④service

   可以将多个Pod整合为一个Service,让客户端通过这一个Service访问到这一组Pod,并且可以实现负载均衡
  
   ClusterIP是集群内部Pod之间的访问方式
  命令实现结果
  1. # 通过生成service映射一个Deployment下的所有pod中的某一个端口的容器
  2. kubectl expose deployment Deployment名称 --port=Service端口号 --target-port=Pod内容器端口
复制代码
之后通过kubectl get service检察Service提供的ip,即可访问

也可以通过Deployment名称.namespace名称.svc作为域名访问


   ClusterIP方式只能在Pod内部实现访问,但是一样平常需要对外暴露网关,以是需要NodePort的方式将Pod对外暴露访问
  命令实现方式:
  1. # 通过生成service映射一个Deployment下的所有pod中的某一个端口的容器
  2. kubectl expose deployment Deployment名称 --port=Service端口号 --target-port=Pod内容器端口
  3. --type=NodePort
复制代码

Service通过yaml方式实现:
  1. apiVersion: v1
  2. kind: Service
  3. metadata:
  4.   labels
  5.     app: nginx
  6.   name: nginx
  7.   spec:
  8.     selector:
  9.       app: nginx
  10.     ports:
  11.     - port: 8888
  12.      protocol: TCP
  13.      targetPort: 80
复制代码
通过apply启动就可以创建Service
   测试:通过Deployment部署,通过Service部署
  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4.   name: nginx-deployment
  5.   labels:
  6.     app: nginx-deployment
  7. spec:
  8.   replicas: 2
  9.   selector:
  10.     matchLabels:
  11.       app: nginx-deployment
  12.   template:
  13.     metadata:
  14.       labels:
  15.         app: nginx-deployment
  16.     spec:
  17.       containers:
  18.       - name: nginx-deployment
  19.         image: nginx
  20.         ports:
  21.         - containerPort: 80
  22. ---
  23. apiVersion: v1
  24. kind: Service
  25. metadata:
  26.   labels:
  27.     app: nginx-service
  28.   name: nginx-service
  29. spec:
  30.   selector:
  31.     app: nginx-deployment
  32.   ports:
  33.   - port: 8888
  34.     protocol: TCP
  35.     targetPort: 80
  36.   type: NodePort
复制代码
可以检察到暴露信息:

⑤Ingress(入口)

   k8s保举将Ingress作为所有Service的入口,提供统一的入口,制止多个服务之间需要记录大量的IP或域名(IP可能变革,域名太多记录不方便)
  
  


   因为副本数默以为1,但是k8s整体集群就2个节点,以是显示下面即为安装成功
  

   可以将Ingress接收到的请求转发到差别的Service中
  保举使用yaml文件方式
  1. apiVersion: networking.k8s.io/v1
  2. kind: Ingress
  3. metadata:
  4.   name: nginx-ingress
  5. spec:
  6.   ingressClassName: ingress
  7.   rules:
  8.   - host: nginx.mashibing.com
  9.     http:
  10.       paths:
  11.       - path: /
  12.         pathType: Prefix
  13.         backend:
  14.           service:
  15.             name: nginx-service
  16.             port:
  17.               number: 8888
复制代码

Kuboard安装的Ingress有admission的校验设置,需要先删除设置再启动
   找到指定的ingress的校验信息,删除即可
  

  1. # 查看校验webhook的配置
  2. kubectl get -A ValidatingWebhookConfiguration
  3. # 删除指定的校验
  4. kubectl delete ValidatingWebhookConfiguration ingress-nginx-admission-my-ingress-controller
复制代码
设置当地hosts文件:

下面就可以访问在Service中暴露的Nginx信息:

2.8 Jenkins集成K8s

2.8.1 准备部署的yaml文件

  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4.   namespace: test
  5.   name: pipeline
  6.   labels:
  7.     app: pipeline
  8. spec:
  9.   replicas: 2
  10.   selector:
  11.     matchLabels:
  12.       app: pipeline
  13.   template:
  14.     metadata:
  15.       labels:
  16.         app: pipeline   
  17.     spec:
  18.       containers:
  19.       - name: pipeline
  20.         image: 192.168.11.102:80/repo/pipeline:v4.0.0
  21.         imagePullPolicy: Always
  22.         ports:
  23.         - containerPort: 8080
  24. ---
  25. apiVersion: v1
  26. kind: Service
  27. metadata:
  28.   namespace: test
  29.   labels:
  30.     app: pipeline
  31.   name: pipeline  
  32. spec:
  33.   selector:
  34.     app: pipeline
  35.   ports:
  36.   - port: 8081
  37.     targetPort: 8080
  38.   type: NodePort
  39. ---
  40. apiVersion: networking.k8s.io/v1
  41. kind: Ingress
  42. metadata:
  43.   namespace: test
  44.   name: pipeline
  45. spec:
  46.   ingressClassName: ingress
  47.   rules:
  48.   - host: mashibing.pipeline.com
  49.     http:
  50.       paths:
  51.       - path: /
  52.         pathType: Prefix
  53.         backend:
  54.           service:
  55.             name: pipeline
  56.             port:
  57.               number: 8081
复制代码
2.8.2 Harbor私服设置

   在尝试用kubernetes的yml文件启动pipeline服务时,会出现Kubernetes无法拉取镜像的问题,这里需要在kubernetes所在的Linux中设置Harbor服务信息,并且包管Kubernetes可以拉取Harbor上的镜像
     将上图复制好的指定执行,测试结果如下:
  

2.8.3 测试使用结果

   执行kubectl命令,基于yml启动服务,并且基于部署后服务的提示信息以及Ingress的设置,直接访问
  

2.8.4 Jenkins远程调用


   将Jenkins中公钥信息复制到k8s-master的~/.ssh/authorized_keysz中,包管远程毗连无暗码
  

5. 设置执行kubectl的脚本到Jenkinsfile

检察结果:

   可以检察到yml文件是由变革的, 如许k8s就会重新加载
  

Ps:这种方式更适应与CD操作,将项目将基于某个版本部署到指定的目标服务器
2.9 基于GitLab的WebHooks

   实现一个自动化的CI(开辟人员push代码到Git仓库之后,Jenkins会自动构建项目,将最新的提交点代码构建并举行打包部署)。这里区别于上面的CD,CD需要基于某个版本举行部署,而这里每次都是将最新的提交点集成到主干上并测试。
  2.9.1 WebHooks关照

拓展:实现滚动更新
   因为pipeline没有改变时,每次不会重新加载,如许会导致Pod中的容器不会动态更新,这里需要使用kubectl的rollout restart命令滚动更新
  


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4