jenkins+kubernetes+git+dockerhub构建devops云平台

Devops简介

k8s助力Devops在企业落地实践

传统方式部署项目为什么发布慢,效率低?

在这里插入图片描述

上线一个功能,有多少时间被浪费了?

在这里插入图片描述

如何解决发布慢,效率低的问题呢?

在这里插入图片描述

在这里插入图片描述

什么是Devops?

在这里插入图片描述

在这里插入图片描述

敏捷开发

提高开发效率,及时跟进用户需求,缩短开发周期。

敏捷开发包括编写代码和构建代码两个阶段,可以使用git或者svn来管理代码,用maven对代码进行构建。

持续集成(CI)

持续集成强调开发人员提交了新代码之后,立刻自动的进行构建、(单元)测试。根据测试结果,可以确定新代码和原有代码能否正确地集成在一起。持续集成过程中很重视自动化测试验证结果,对可能出现的一些问题进行预警,以保障最终合并的代码没有问题。

常见的持续集成工具:

  • Jenkins
    • Jenkins是用Java语言编写的,是目前使用最多和最受欢迎的持续集成工具,使用Jenkins,可以自动监测到git或者svn存储库代码的更新,基于最新的代码进行构建,把构建好的源码或者镜像发布到生产环境。Jenkins还有个非常好的功能:它可以在多台机器上进行分布式地构建和负载测试
  • TeamCity
  • Travis CI
  • Go CD
  • Bamboo
  • GitLab CI
  • Codeship

在这里插入图片描述

它的好处主要有以下几点:

  • 较早的发现错误:每次集成都通过自动化的构建(包括编译、发布、自动化测试)来验证,哪个环节出现问题都可以较早的发现
  • 快速的发现错误:每完成一部分代码的更新,就会把代码集成到主干中,这样就可以快速的发现错误,比较容易的定位错误
  • 提升团队绩效:持续集成中代码更新速度快,能及时发现小问题并进行修改,使团队能创造出更好的产品
  • 防止分支过多的偏离主干:经常持续集成,会使分支代码经常向主干更新,当单元测试失败或者出现bug,如果开发者需要在没有调试的情况下恢复仓库的代码到没有bug的状态,只有很小部分的代码会丢失

持续集成的目的是提高代码质量,让产品快速的更新迭代。它的核心措施是,代码集成到主干之前,必须通过自动化测试。只要有一个测试用例失败,就不能集成。

Martin Fowler说过:“持续集成并不能消除bug,而是让它们非常容易发现和纠正。”

持续交付

持续交付在持续集成的基础上,将集成后的代码部署到更贴近真实运行环境的“类生产环境”中。交付给质量团队或者用户,以供评审。如果评审通过,代码就进入生产阶段。

如果所有的代码完成之后一起交付,会导致很多问题爆发出来,解决起来很麻烦,所以持续集成,也就是每更新一次代码,都向下交付一次,这样可以及时发现问题,及时解决,防止问题大量堆积。

持续部署

持续部署是指当交付的代码通过评审之后,自动部署到生产环境中。持续部署是持续交付的最高阶段。

在这里插入图片描述

k8s在Devops中的核心作用

docker和k8s的出现使devops变得更加普及,更加容易实现。在传统运维中我们服务时需要针对不同的环境去安装不同的版本,部署方式也杂、多。那么有了docker之后,一次构建、到处运行,只需要构建一次镜像,那么只要有docker的主机,就可以基于镜像把应用跑起来。

在至多微服务中,每天可能需要去处理各种服务的崩溃,而服务间的依赖调用关系也极其复杂,这队解决问题带来了很大的复杂度。要很好的解决这个问题,就需要用到容器编排工具。

kubernetes的出现主宰了容器编排的市场,也进化了过去的运维方式,将开发与运维联系的更加紧密。而且让devops这一角色变得更加清晰,它是目前可用的很流行的容器解决方案之一。

自动化

敏捷开发---->持续集成---->持续交付---->持续部署

多集群管理

可以根据客户需求对开发,测试,生产环境部署多套kubernetes集群,每个环境使用独立的物理资源,相互之间避免影响。

多环境一致性

kubernetes是基于docker的容器编排工具,因为容器的镜像是不可变的,所以镜像把OS、业务代码、运行环境、程序库、目录结构都包含在内,镜像保存在我们的私有仓库,只要用户从我们提供的私有仓库拉取镜像,就能保证环境的一致性。

实时反馈和智能化报表

每次集成或交付,都会第一时间将结果通过多途径的方式反馈给你,也可以定制适合企业专用的报表平台。

前情提要:

  • 我的节点以及k8s版本

在这里插入图片描述

  • 主从的ip:
ip
wentaomaster1192.168.184.10
wentaonode1192.168.184.20

在这里插入图片描述

在这里插入图片描述

安装nfs存储

#安装nfs并设置开机自启动,主从都需要安装
[root@wentaomaster1 ~]#yum install -y nfs-utils
[root@wentaomaster1 ~]#systemctl enable nfs --now
[root@wentaonode1 ~]#yum install -y nfs-utils
[root@wentaonode1 ~]#systemctl enable nfs --now

在这里插入图片描述

#配置nfs存储目录,仅在master节点配置
[root@wentaomaster1 ~]# vim /etc/exports
/data/v2 *(rw,no_root_squash)
#使nfs配置生效
[root@wentaomaster1 ~]# exportfs -arv

在这里插入图片描述

创建数据存储挂载

  • 创建项目所用的名称空间
[root@wentaomaster1 jenkins-k8s]# kubectl create namespace jenkins-k8s
namespace/jenkins-k8s created
  • 创建存储用的pv
[root@wentaomaster1 jenkins-k8s]# cat pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:name: jenkins-k8s-pv
spec:capacity:storage: 10GiaccessModes:- ReadWriteManynfs:server: 192.168.184.10path: /data/v2
[root@wentaomaster1 ~]# kubectl apply -f pv.yaml

在这里插入图片描述

  • 创建pvc
[root@wentaomaster1 jenkins-k8s]# cat pvc.yaml
kind: PersistentVolumeClaim
apiVersion: v1
metadata:name: jenkins-k8s-pvcnamespace: jenkins-k8s
spec:resources:requests:storage: 10GiaccessModes:- ReadWriteMany
[root@wentaomaster1 ~]# kubectl apply -f pvc.yaml

在这里插入图片描述

创建serviceaccount并RBAC授权

  • 创建一个服务账号sa并对其授权
[root@wentaomaster1 ~]# kubectl create sa jenkins-k8s-sa -n jenkins-k8s
#对sa服务账号授予系统角色cluster-admin的权限【RBAC】
[root@wentaomaster1 ~]# kubectl create clusterrolebinding jenkins-k8s-sa-cluster -n jenkins-k8s --clusterrole=cluster-admin --serviceaccount=jenkins-k8s:jenkins-k8s-sa

在这里插入图片描述

准备项目需要的镜像

  • 工作节点上,从dockerhub上拉取jenkins镜像(我用的2.418)
#用于安装jenkins用
[root@wentaonode1 ~]# docker pull jenkins/jenkins:2.418

在这里插入图片描述

  • 创建一个dockerfile构建镜像jenkins-slave-latest:v1
[root@wentaomaster1 slave]# cat dockerfile
FROM jenkins/jnlp-slave:4.13.3-1-jdk11
USER root
# 安装Docker
RUN apt-get update && apt-get install -y \docker.io
# 将当前用户加入docker用户组
RUN usermod -aG docker jenkins
RUN curl -LO https://dl.k8s.io/release/stable.txt
RUN curl -LO https://dl.k8s.io/release/$(cat stable.txt)/bin/linux/amd64/kubectl
RUN chmod +x kubectl
RUN mv kubectl /usr/local/bin/
ENV DOCKER_HOST unix:///var/run/docker.sock
#k8s中装好jenkins后,是有主从的,构建jenkins时候会在集群里再创建一个jenkins从,我用jenkins-slave-latest这个镜像来构建jenkins从
[root@wentaomaster1 slave]# docker build -t=jenkins-slave-latest:v1 .

在这里插入图片描述

安装jenkins

  • 给nfs的数据目录/data/v2做下权限
[root@wentaomaster1 ~]# chown -R 1000.1000 /data/v2

使用deployment控制器创建jenkins pod

[root@wentaomaster1 ~]# cat  jenkins-deploy.yaml
kind: Deployment
apiVersion: apps/v1
metadata:name: jenkinsnamespace: jenkins-k8s
spec:replicas: 1selector:matchLabels:app: jenkinstemplate:metadata:labels:app: jenkinsspec:serviceAccount: jenkins-k8s-sacontainers:- name: jenkinsimage:  docker.io/jenkins/jenkins:2.418imagePullPolicy: IfNotPresentports:- containerPort: 8080name: webprotocol: TCP- containerPort: 50000name: agentprotocol: TCPresources:limits:cpu: 2000mmemory: 2Girequests:cpu: 500mmemory: 512MilivenessProbe:httpGet:path: /loginport: 8080initialDelaySeconds: 60timeoutSeconds: 5failureThreshold: 12readinessProbe:httpGet:path: /loginport: 8080initialDelaySeconds: 60timeoutSeconds: 5failureThreshold: 12volumeMounts:- name: jenkins-volumesubPath: jenkins-homemountPath: /var/jenkins_homevolumes:- name: jenkins-volumepersistentVolumeClaim:claimName: jenkins-k8s-pvc
[root@wentaomaster1 ~]# kubectl apply -f jenkins-deploy.yaml

在这里插入图片描述

给jenkins pod前端加上service,对外部提供网络访问

[root@wentaomaster1 ~]# cat jenkins-service.yaml
apiVersion: v1
kind: Service
metadata:name: jenkins-servicenamespace: jenkins-k8slabels:app: jenkins
spec:selector:app: jenkinstype: NodePortports:- name: webport: 8080targetPort: webnodePort: 30002- name: agentport: 50000targetPort: agent
[root@wentaomaster1 ~]# kubectl apply -f jenkins-service.yaml
#通过kubectl get svc -n 看到对外提供的端口是30002

在这里插入图片描述

登录jenkins web页面

  • 浏览器网址栏输入192.168.184.10:30002

在这里插入图片描述

  • 可以看到提示为:初始密码在跑jenkins的pod里面的/var/jenkins_home/secrets/initialAdminPassword文件中

在这里插入图片描述

  • 将密码复制后,点击继续

在这里插入图片描述

  • 选择“安装推荐的插件”

在这里插入图片描述

  • 安装完成之后,创建管理员用户

在这里插入图片描述

  • 实例配置不改,用默认url

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

  • 更新kubernetes插件

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

  • 点击安装后,下滑到最下面,勾选安装后重启

在这里插入图片描述

  • 安装完成后,再安装jenkins自动化部署的ui界面Blue Ocean

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

  • 输入之前设置的用户、密码,选择保持登录状态

在这里插入图片描述

在这里插入图片描述

jenkins对接kubernetes自动生成jenkins从节点

  • 新增一个云kubernetes

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

  • 填写云kubernetes配置内容
    • 名称:kubernetes
    • kubernetes地址:https://192.168.184.10:6443
      • 6443是kubernetes apiserver的端口
    • kubernetes命名空间:jenkins-k8s

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

Jenkins UI界面配置访问Dockerhub凭据

  • 添加dockerhub凭据

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

jenkins+k8s自动化发布项目

在这里插入图片描述

  • 准备好各个环境的命名空间
#创建开发、生产、测试的命名空间
[root@wentaomaster1 ~]# kubectl create ns devlopment
[root@wentaomaster1 ~]# kubectl create ns production
[root@wentaomaster1 ~]# kubectl create ns qatest

在这里插入图片描述

  • 创建流水线自动化发布任务,左侧栏点击新建任务

在这里插入图片描述

在这里插入图片描述

node('testtan') {stage('Clone') {echo "1.Clone Stage"git url: "https://github.com/twttwttwt/jenkins-sample/"script {build_tag = sh(returnStdout: true, script: 'git rev-parse --short HEAD').trim()}}stage('Test') {echo "2.Test Stage"}stage('Build') {echo "3.Build Docker Image Stage"sh "docker build -t twttwt/jenkins-demo:${build_tag} ."}stage('Push') {echo "4.Push Docker Image Stage"withCredentials([usernamePassword(credentialsId: 'dockerhub', passwordVariable: 'dockerHubPassword', usernameVariable: 'dockerHubUser')]) {sh "docker login -u ${dockerHubUser} -p ${dockerHubPassword}"sh "docker push twttwt/jenkins-demo:${build_tag}"}}stage('Deploy to dev') {echo "5. Deploy DEV"sh "sed -i 's/<BUILD_TAG>/${build_tag}/' k8s-dev.yaml"sh "sed -i 's/<BRANCH_NAME>/${env.BRANCH_NAME}/' k8s-dev.yaml"
//        sh "bash running-devlopment.sh"sh "kubectl apply -f k8s-dev.yaml  --validate=false"}	stage('Promote to qa') {	def userInput = input(id: 'userInput',message: 'Promote to qa?',parameters: [[$class: 'ChoiceParameterDefinition',choices: "YES\nNO",name: 'Env']])echo "This is a deploy step to ${userInput}"if (userInput == "YES") {sh "sed -i 's/<BUILD_TAG>/${build_tag}/' k8s-qa.yaml"sh "sed -i 's/<BRANCH_NAME>/${env.BRANCH_NAME}/' k8s-qa.yaml"
//            sh "bash running-qa.sh"sh "kubectl apply -f k8s-qa.yaml --validate=false"sh "sleep 6"sh "kubectl get pods -n qatest"} else {//exit}}stage('Promote to pro') {	def userInput = input(id: 'userInput',message: 'Promote to pro?',parameters: [[$class: 'ChoiceParameterDefinition',choices: "YES\nNO",name: 'Env']])echo "This is a deploy step to ${userInput}"if (userInput == "YES") {sh "sed -i 's/<BUILD_TAG>/${build_tag}/' k8s-prod.yaml"sh "sed -i 's/<BRANCH_NAME>/${env.BRANCH_NAME}/' k8s-prod.yaml"
//            sh "bash running-production.sh"sh "cat k8s-prod.yaml"sh "kubectl apply -f k8s-prod.yaml --record --validate=false"}}
}

在这里插入图片描述

  • 点击保存后回到dashboard,可以看到已经多出来了一条任务,点击构建

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

[root@wentaomaster1 ~]# kubectl get pod -n production
[root@wentaomaster1 ~]# kubectl get pod -n devlopment
[root@wentaomaster1 ~]# kubectl get pod -n qatest

在这里插入图片描述

#通过上面可以看到jenkins对接k8s,可以把应用发布到k8s集群的开发、测试、生产环境了。

  • 访问github中index配置的web页面

在这里插入图片描述

devops自动化版本更新

  • 修改上图web页面的index文件

在这里插入图片描述

  • 此时访问web页面,暂时没有改动

在这里插入图片描述

  • 回到dashboard,重新执行一次pipeline文件

在这里插入图片描述

在这里插入图片描述

  • 可以看到,已成功更新

在这里插入图片描述

Devops自动化版本回滚

  • 新建任务

在这里插入图片描述

在这里插入图片描述

node('testtan') {stage('git clone') {git url: "https://github.com/twttwttwt/jenkins-rollout"sh "ls -al"sh "pwd"
}stage('select env') {def envInput = input(id: 'envInput',message: 'Choose a deploy environment',parameters: [[$class: 'ChoiceParameterDefinition',choices: "devlopment\nqatest\nproduction",name: 'Env']]
)
echo "This is a deploy step to ${envInput}"
sh "sed -i 's/<namespace>/${envInput}/' getVersion.sh"
sh "sed -i 's/<namespace>/${envInput}/' rollout.sh"
sh "bash getVersion.sh"
// env.WORKSPACE = pwd()
// def version = readFile "${env.WORKSPACE}/version.csv"
// println version
}stage('select version') {env.WORKSPACE = pwd()def version = readFile "${env.WORKSPACE}/version.csv"println versiondef userInput = input(id: 'userInput',message: '选择回滚版本',parameters: [[$class: 'ChoiceParameterDefinition',choices: "$version\n",name: 'Version']]
)sh "sed -i 's/<version>/${userInput}/' rollout.sh"
}stage('rollout deploy') {sh "bash rollout.sh"
}
}
  • 保存后回到首页

在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/496024.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【通讯录案例-tabbarController结构 Objective-C语言】

一、接下来,我们来说一下,tabbarController的View结构 1.实际上,这个tabbarController的结构呢,跟这个导航控制器的结构,差不多, 它里边儿呢,首先,有一个tabbarController的View, tabbarController,实际上,里边儿,有一个View,是专门儿来放子控制器View的, nav…

计算机网络——IPV4数字报

1. IPv4数据报的结构 本结构遵循的是RFC 791规范&#xff0c;介绍了一个IPv4数据包头部的不同字段。 1.1 IPv4头部 a. 版本&#xff08;Version&#xff09;&#xff1a;指明了IP协议的版本&#xff0c;IPv4表示为4。 b. 头部长度&#xff08;IHL, Internet Header Length&…

【六袆-Golang】Golang:安装与配置Delve进行Go语言Debug调试

安装与配置Delve进行Go语言Debug调试 一、Delve简介二、win-安装Delve三、使用Delve调试Go程序[命令行的方式]四、使用Golang调试程序 Golang开发工具系列&#xff1a;安装与配置Delve进行Go语言Debug调试 摘要&#xff1a; 开发环境中安装和配置Delve&#xff0c;一个强大的G…

算法打卡day5|哈希表篇01|Leetcode 242.有效的字母异位词 、19.删除链表的倒数第N个节点、202. 快乐数、1. 两数之和

哈希表基础知识 哈希表 哈希表关键码就是数组的索引下标&#xff0c;然后通过下标直接访问数组中的元素&#xff1b;数组就是哈希表的一种 一般哈希表都是用来快速判断一个元素是否出现集合里。例如要查询一个名字是否在班级里&#xff1a; 要枚举的话时间复杂度是O(n)&…

Leetcoder Day25| 回溯part05:子集+排列

491.递增子序列 给定一个整型数组, 你的任务是找到所有该数组的递增子序列&#xff0c;递增子序列的长度至少是2。 示例: 输入:[4, 7, 6, 7]输出: [[4, 6], [4, 7], [4, 6, 7], [6, 7], [7,7], [4,7,7]] 说明: 给定数组的长度不会超过15。数组中的整数范围是 [-100,100]。给定数…

【Python】Code2flow学习笔记

1 Code2flow介绍 Code2flow是一个代码可视化工具库&#xff0c;旨在帮助开发人员更好地理解和分析代码&#xff1a; 可以将Python代码转换为流程图&#xff0c;以直观的方式展示代码的执行流程和逻辑结构。具有简单易用、高度可定制化和美观的特点&#xff0c;适用于各种代码…

AI学习(5):PyTorch-核心模块(Autograd):自动求导

1.介绍 在深度学习中&#xff0c;自动求导是一项核心技术&#xff0c;它使得我们能够方便地计算梯度并优化模型参数。PyTorch 提供了一个强大的自动求导模块(Autograd)&#xff0c;它可以自动计算张量的导数得出梯度信息&#xff0c;同时也支持高阶导数计算。 1.1 概念词 在学…

Bicycles(变形dijkstra,动态规划思想)

Codeforces Round 918 (Div. 4) G. Bicycles G. Bicycles 题意&#xff1a; 斯拉夫的所有朋友都打算骑自行车从他们住的地方去参加一个聚会。除了斯拉维奇&#xff0c;他们都有一辆自行车。他们可以经过 n n n 个城市。他们都住在城市 1 1 1 &#xff0c;想去参加位于城市…

nginx实现http反向代理

一、代理概述 1、代理概念 1.1 正向代理&#xff08;Forward Proxy&#xff09; 概念&#xff1a;正向代理是位于客户端和目标服务器之间的代理服务器&#xff0c;代表客户端向目标服务器发送请求。客户端将请求发送给代理服务器&#xff0c;然后代理服务器将请求转发给目标服…

ChatGPT 正测试Android屏幕小组件;联想ThinkBook 推出透明笔记本电脑

▶ ChatGPT 测试屏幕小组件 近日 ChatGPT 正在测试 Android 平台上的屏幕小组件&#xff0c;类似于手机中的悬浮窗&#xff0c;按住 Android 手机主屏幕上的空白位置就可以调出 ChatGPT 的部件菜单。 菜单中提供了许多选项&#xff0c;包括文本、语音和视频查询的快捷方式&…

【OpenCV C++】Mat img.total() 和img.cols * img.rows 意思一样吗?二者完全相等吗?

文章目录 1 结论及区别2 Mat img的属性 介绍1 结论及区别 在大多数情况下,img.total() 和 img.cols * img.rows 是相等的,但并不总是完全相等的。下面是它们的含义和一些区别: 1.img.total() 表示图像中像素的总数,即图像的总像素数量。2.img.cols * img.rows 也表示图像中…

springboot003图书个性化推荐系统的设计与实现(源码+调试+LW)

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。今天给大家介绍一篇基于SpringBoot的图书个…