可信网站多少钱,太原关键词网站排名,奉贤专业网站建设,wordpress电商优秀Devops简介
k8s助力Devops在企业落地实践
传统方式部署项目为什么发布慢#xff0c;效率低#xff1f; 上线一个功能#xff0c;有多少时间被浪费了#xff1f; 如何解决发布慢#xff0c;效率低的问题呢#xff1f; 什么是Devops#xff1f; 敏捷开发
提高开发效率效率低 上线一个功能有多少时间被浪费了 如何解决发布慢效率低的问题呢 什么是Devops 敏捷开发
提高开发效率及时跟进用户需求缩短开发周期。
敏捷开发包括编写代码和构建代码两个阶段可以使用git或者svn来管理代码用maven对代码进行构建。
持续集成(CI)
持续集成强调开发人员提交了新代码之后立刻自动的进行构建、(单元)测试。根据测试结果可以确定新代码和原有代码能否正确地集成在一起。持续集成过程中很重视自动化测试验证结果对可能出现的一些问题进行预警以保障最终合并的代码没有问题。
常见的持续集成工具
Jenkins Jenkins是用Java语言编写的是目前使用最多和最受欢迎的持续集成工具使用Jenkins可以自动监测到git或者svn存储库代码的更新基于最新的代码进行构建把构建好的源码或者镜像发布到生产环境。Jenkins还有个非常好的功能它可以在多台机器上进行分布式地构建和负载测试 TeamCityTravis CIGo CDBambooGitLab CICodeship 它的好处主要有以下几点
较早的发现错误每次集成都通过自动化的构建(包括编译、发布、自动化测试)来验证哪个环节出现问题都可以较早的发现快速的发现错误每完成一部分代码的更新就会把代码集成到主干中这样就可以快速的发现错误比较容易的定位错误提升团队绩效持续集成中代码更新速度快能及时发现小问题并进行修改使团队能创造出更好的产品防止分支过多的偏离主干经常持续集成会使分支代码经常向主干更新当单元测试失败或者出现bug如果开发者需要在没有调试的情况下恢复仓库的代码到没有bug的状态只有很小部分的代码会丢失
持续集成的目的是提高代码质量让产品快速的更新迭代。它的核心措施是代码集成到主干之前必须通过自动化测试。只要有一个测试用例失败就不能集成。
Martin Fowler说过“持续集成并不能消除bug而是让它们非常容易发现和纠正。”
持续交付
持续交付在持续集成的基础上将集成后的代码部署到更贴近真实运行环境的“类生产环境”中。交付给质量团队或者用户以供评审。如果评审通过代码就进入生产阶段。
如果所有的代码完成之后一起交付会导致很多问题爆发出来解决起来很麻烦所以持续集成也就是每更新一次代码都向下交付一次这样可以及时发现问题及时解决防止问题大量堆积。
持续部署
持续部署是指当交付的代码通过评审之后自动部署到生产环境中。持续部署是持续交付的最高阶段。 k8s在Devops中的核心作用
docker和k8s的出现使devops变得更加普及更加容易实现。在传统运维中我们服务时需要针对不同的环境去安装不同的版本部署方式也杂、多。那么有了docker之后一次构建、到处运行只需要构建一次镜像那么只要有docker的主机就可以基于镜像把应用跑起来。
在至多微服务中每天可能需要去处理各种服务的崩溃而服务间的依赖调用关系也极其复杂这队解决问题带来了很大的复杂度。要很好的解决这个问题就需要用到容器编排工具。
kubernetes的出现主宰了容器编排的市场也进化了过去的运维方式将开发与运维联系的更加紧密。而且让devops这一角色变得更加清晰它是目前可用的很流行的容器解决方案之一。
自动化
敏捷开发----持续集成----持续交付----持续部署
多集群管理
可以根据客户需求对开发测试生产环境部署多套kubernetes集群每个环境使用独立的物理资源相互之间避免影响。
多环境一致性
kubernetes是基于docker的容器编排工具因为容器的镜像是不可变的所以镜像把OS、业务代码、运行环境、程序库、目录结构都包含在内镜像保存在我们的私有仓库只要用户从我们提供的私有仓库拉取镜像就能保证环境的一致性。
实时反馈和智能化报表
每次集成或交付都会第一时间将结果通过多途径的方式反馈给你也可以定制适合企业专用的报表平台。
前情提要
我的节点以及k8s版本 主从的ip
ipwentaomaster1192.168.184.10wentaonode1192.168.184.20 安装nfs存储
#安装nfs并设置开机自启动主从都需要安装
[rootwentaomaster1 ~]#yum install -y nfs-utils
[rootwentaomaster1 ~]#systemctl enable nfs --now
[rootwentaonode1 ~]#yum install -y nfs-utils
[rootwentaonode1 ~]#systemctl enable nfs --now#配置nfs存储目录仅在master节点配置
[rootwentaomaster1 ~]# vim /etc/exports
/data/v2 *(rw,no_root_squash)
#使nfs配置生效
[rootwentaomaster1 ~]# exportfs -arv创建数据存储挂载
创建项目所用的名称空间
[rootwentaomaster1 jenkins-k8s]# kubectl create namespace jenkins-k8s
namespace/jenkins-k8s created创建存储用的pv
[rootwentaomaster1 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[rootwentaomaster1 ~]# kubectl apply -f pv.yaml创建pvc
[rootwentaomaster1 jenkins-k8s]# cat pvc.yaml
kind: PersistentVolumeClaim
apiVersion: v1
metadata:name: jenkins-k8s-pvcnamespace: jenkins-k8s
spec:resources:requests:storage: 10GiaccessModes:- ReadWriteMany[rootwentaomaster1 ~]# kubectl apply -f pvc.yaml创建serviceaccount并RBAC授权
创建一个服务账号sa并对其授权
[rootwentaomaster1 ~]# kubectl create sa jenkins-k8s-sa -n jenkins-k8s
#对sa服务账号授予系统角色cluster-admin的权限【RBAC】
[rootwentaomaster1 ~]# kubectl create clusterrolebinding jenkins-k8s-sa-cluster -n jenkins-k8s --clusterrolecluster-admin --serviceaccountjenkins-k8s:jenkins-k8s-sa准备项目需要的镜像
在工作节点上从dockerhub上拉取jenkins镜像(我用的2.418)
#用于安装jenkins用
[rootwentaonode1 ~]# docker pull jenkins/jenkins:2.418 创建一个dockerfile构建镜像jenkins-slave-latest:v1
[rootwentaomaster1 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从
[rootwentaomaster1 slave]# docker build -tjenkins-slave-latest:v1 . 安装jenkins
给nfs的数据目录/data/v2做下权限
[rootwentaomaster1 ~]# chown -R 1000.1000 /data/v2
使用deployment控制器创建jenkins pod
[rootwentaomaster1 ~]# 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
[rootwentaomaster1 ~]# kubectl apply -f jenkins-deploy.yaml 给jenkins pod前端加上service对外部提供网络访问
[rootwentaomaster1 ~]# 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
[rootwentaomaster1 ~]# 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配置内容 名称kuberneteskubernetes地址https://192.168.184.10:6443 6443是kubernetes apiserver的端口 kubernetes命名空间jenkins-k8s Jenkins UI界面配置访问Dockerhub凭据
添加dockerhub凭据 jenkinsk8s自动化发布项目 准备好各个环境的命名空间
#创建开发、生产、测试的命名空间
[rootwentaomaster1 ~]# kubectl create ns devlopment
[rootwentaomaster1 ~]# kubectl create ns production
[rootwentaomaster1 ~]# kubectl create ns qatest 创建流水线自动化发布任务左侧栏点击新建任务 node(testtan) {stage(Clone) {echo 1.Clone Stagegit 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 Stagesh docker build -t twttwt/jenkins-demo:${build_tag} .}stage(Push) {echo 4.Push Docker Image StagewithCredentials([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 DEVsh sed -i s/BUILD_TAG/${build_tag}/ k8s-dev.yamlsh sed -i s/BRANCH_NAME/${env.BRANCH_NAME}/ k8s-dev.yaml
// sh bash running-devlopment.shsh kubectl apply -f k8s-dev.yaml --validatefalse} 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.yamlsh sed -i s/BRANCH_NAME/${env.BRANCH_NAME}/ k8s-qa.yaml
// sh bash running-qa.shsh kubectl apply -f k8s-qa.yaml --validatefalsesh sleep 6sh 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.yamlsh sed -i s/BRANCH_NAME/${env.BRANCH_NAME}/ k8s-prod.yaml
// sh bash running-production.shsh cat k8s-prod.yamlsh kubectl apply -f k8s-prod.yaml --record --validatefalse}}
} 点击保存后回到dashboard可以看到已经多出来了一条任务,点击构建 [rootwentaomaster1 ~]# kubectl get pod -n production
[rootwentaomaster1 ~]# kubectl get pod -n devlopment
[rootwentaomaster1 ~]# 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-rolloutsh ls -alsh 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.csvprintln 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
}
}
保存后回到首页