k8s搭建DevOps环境一
DevOps、CI、CD都是什么
Agile Development
敏捷开发以用户的需求进化为核心,采用迭代、循序渐进的方法进行软件开发。在敏捷开发中,软件项目在构建初期被切分成多个子项目,各个子项目的成果都经过测试,具备可视、可集成和可运行使用的特征。换言之,就是把一个大项目分为多个相互联系,但也可独立运行的小项目,并分别完成,在此过程中软件一直处于可使用状态。
敏捷开发就是每个版本都是可用的,在此版本基础上进行快速迭代
CI-持续集成
CI的英文名称是Continuous Integration,中文翻译为:持续集成。
CI中,开发人员将会频繁地向主干提交代码,这些新提交的代码在最终合并到主干前,需要经过编译和自动化测试流进行验证。持续集成(CI)是在源代码变更后自动检测、拉取、构建和(在大多数情况下)进行单元测试的过程。持续集成的目标是快速确保开发人员新提交的变更是好的,并且适合在代码库中进一步使用。CI的流程执行和理论实践让我们可以确定新代码和原有代码能否正确地集成在一起。
CD
CD可对应多个英文名称,持续交付Continuous Delivery和持续部署Continuous Deployment ,一下分别介绍。
查了一些资料,关于持续交互和持续部署的概念比较混乱,以下的概念总结按大部分的资料总结而来。
持续交付
完成 CI 中构建及单元测试和集成测试的自动化流程后,持续交付可自动将已验证的代码发布到存储库。为了实现高效的持续交付流程,务必要确保 CI 已内置于开发管道。持续交付的目标是拥有一个可随时部署到生产环境的代码库。在持续交付中,每个阶段(从代码更改的合并,到生产就绪型构建版本的交付)都涉及测试自动化和代码发布自动化。在流程结束时,运维团队可以快速、轻松地将应用部署到生产环境中或发布给最终使用的用户。
持续部署
对于一个成熟的CI/CD管道(Pipeline)来说,最后的阶段是持续部署。作为持续交付——自动将生产就绪型构建版本发布到代码存储库——的延伸,持续部署可以自动将应用发布到生产环境。
持续部署意味着所有的变更都会被自动部署到生产环境中。持续交付意味着所有的变更都可以被部署到生产环境中,但是出于业务考虑,可以选择不部署。如果要实施持续部署,必须先实施持续交付。
持续交付并不是指软件每一个改动都要尽快部署到产品环境中,它指的是任何的代码修改都可以在任何时候实施部署。
持续交付表示的是一种能力,而持续部署表示的则一种方式。持续部署是持续交付的最高阶段
DevOps
DevOps是Development和Operations的组合,是一种方法论,是一组过程、方法与系统的统称,用于促进应用开发、应用运维和质量保障(QA)部门之间的沟通、协作与整合。以期打破传统开发和运营之间的壁垒和鸿沟。
CI、CD、DevOps关系
概念性的内容,每个人的理解都有所不同。就好比CGI 这个词,即可以理解成CGI这种协议,也可以理解成实现了CGI协议的软件工具,都没有问题,咬文嚼字过犹不及。留下一图:
通过图中可以看到:
敏捷开发Agile Development:
从计划到编码再到构建就是敏捷开发
CI:
CD:
DEVOPS:
从计划–》编码–》构建–》测试–》发布–》部署–》运维集成的,贯穿了整个软件的生命周期
Jenkins 安装
Jenkins 自动化部署实现原理
k8s环境概述
192.168.56.120 k8s-master
192.168.56.121 k8s-node1
192.168.56.122 k8s-node2
创建命名空间
kubectl create ns jenkins-k8s
kubectl config set-context --current --namespace=jenkins-k8s
创建pvc
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: jenkins-pvc
namespace: jenkins-k8s
spec:
resources:
requests:
storage: 10Gi
accessModes:
- ReadWriteMany
storageClassName: nfs
pvc采用的是nfs存储
创建deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: jenkins
namespace: jenkins-k8s
spec:
replicas: 1
selector:
matchLabels:
app: jenkins
template:
metadata:
labels:
app: jenkins
spec:
containers:
- name: jenkins
image: registry.cn-hangzhou.aliyuncs.com/liuyik8s/jenkins:2.303.3-jdk11
imagePullPolicy: IfNotPresent
ports:
- containerPort: 8080
name: web
protocol: TCP
- containerPort: 50000
name: agent
protocol: TCP
resources:
limits:
cpu: 1000m
memory: 1Gi
requests:
cpu: 500m
memory: 500Mi
livenessProbe:
httpGet:
port: 8080
path: /login
initialDelaySeconds: 60
timeoutSeconds: 5
failureThreshold: 12
readinessProbe:
httpGet:
port: 8080
path: /login
initialDelaySeconds: 60
volumeMounts:
- mountPath: /var/jenkins_home
name: jenkins-volume
subPath: jenkins-home
nodeSelector:
jenkins: "yes"
volumes:
- name: jenkins-volume
persistentVolumeClaim:
claimName: jenkins-pvc
在执行这个deployment之前,先选一个节点创建一个label,否则不成功,因为上面的yaml文件是加了节点选择的
kubectl label node jenkins=yes
创建svc
apiVersion: v1
kind: Service
metadata:
name: jenkins-service
namespace: jenkins-k8s
labels:
app: jenkins
spec:
selector:
app: jenkins
type: ClusterIP
ports:
- port: 8080
name: web
targetPort: web
- name: agent
port: 50000
targetPort: agent
创建ingress
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: jk
namespace: jenkins-k8s
spec:
ingressClassName: nginx
rules:
- host: jk.bml.com
http:
paths:
- pathType: Prefix
path: "/"
backend:
service:
name: jenkins-service
port:
number: 8080
安装
当安装完成以后如下:
现在就可以通过域名jk.bml.com来访问了
需要一个密码,这个密码在日志中是可以看到的,我们可以查看日志
kubectl logs jenkins-7fb78859d5-7dbs7
![在这里插入图片描述](https://img-blog.csdnimg.cn/7e78531792db4ce3b88553bc2e21c8d5.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBATGlmZSAgam91cm5leQ==,size_20,color_FFFFFF,t_70,g_se,x_16)
将这个秘钥复制到输入框中如下:
开始安装了,这个安装根据网络情况需要好一会儿才能安装完成
安装完成以后创建用户
然后进入主页
k8s插件安装
安装好k8s的插件后重启
K8S中创建ServiceAccout
创建ServiceAccout,用于jenkins连接k8s
#创建一个 sa 账号
kubectl create sa jenkins-k8s-sa -n jenkins-k8s
#授权, kubectl create clusterrolebinding 名称、名称空间、绑定 clusterrole=clusteradmin
kubectl create clusterrolebinding jenkins-k8s-sa-cluster -n jenkins-k8s --clusterrole=cluster-admin --serviceaccount=jenkins-k8s:jenkins-k8s-sa
kubectl create clusterrolebinding jenkins-k8s-sa-cluster1 -n jenkins-k8s --clusterrole=cluster-admin --serviceaccount=jenkins-k8s:default
要创建sa和角色否则jenkins连接不上k8s
jenkins配置k8s
K8s云基础配置
在节点管理配置云,如下:
配置k8s如下:
我这里的jenkins就安装到k8s中,所有可以通过https://kubernetes.default就可以连接,如果这里测试连接不成功,那么要不地址错了,要不sa和角色有问题,连接测试如下:
jenkins地址配置
jenkins的通道是jenkins的master和slave连接使用的的50000端口
POD 标签配置
定义一个jenkins的pod模板,就是定义个pod label,值是slave
POD模板配置
这里取了一个maven的pod模板,但是这个pod模板将jdk、mavn 、git这些都做成了一个镜像放到了阿里云,所以这里的maven 的pod模板其实包含了jdk、maven这些了
jenkins-slave是需要一个jenkins的slave的,我这里做的镜像,镜像内容如下,有兴趣的可以自己制作:
FROM centos
LABEL maintainer liuyi
RUN yum install -y maven curl git libtool-ltdl-devel && \
yum clean all && \
rm -rf /var/cache/yum/* && \
mkdir -p /usr/share/jenkins
COPY k8s.repo /etc/yum.repos.d/kubernetes.repo
RUN yum install -y kubectl-1.21.5 -y
ADD openjdk-12.0.2_linux-x64_bin.tar.gz /usr/local
COPY slave.jar /usr/share/jenkins/slave.jar
COPY jenkins-slave /usr/bin/jenkins-slave
COPY settings.xml /etc/maven/settings.xml
ENV JAVA_HOME /usr/local/jdk-12.0.2
ENV JAVA_VERSION=12.0.2
RUN chmod +x /usr/bin/jenkins-slave
ENTRYPOINT ["jenkins-slave"]
添加host path挂载
docker引擎挂载
这个挂载路径的目的是让容器里面可以使用docker的命令,也就是说在容器里面使用的宿主机的docker引擎,这样在容器里面就不需要再安装一个docker引擎了
k8s 客户端命令挂载
我们在安装k8s的时候都需要在需要执行客户端命令kubectl **的节点去放一个.kube的文件,代表可以执行客户端指令,因为jenkins在讲git代码拉取下来过后打成镜像过后,需要执行执行kubectl apply等指令,并且拉取镜像这些,所以这个挂载就是让jenkins这个容器里面可以执行kubeclt相关指令。
工作卷
这个工作卷是配置的一个pvc的命令,这个工作卷用做什么呢,就是说在jenkins拉取代码过后,代码里面有很多maven依赖,这些依赖主要去远程mavne仓库下载依赖包,这个工作卷就是用来存储这些依赖包的, 否则每次构建都需要远程从mavn仓库拉取依赖包,这样是非常耗时的操作,这个工作卷我这里采用的是nfs来存储,内容如下:
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: agent-workspace
spec:
resources:
requests:
storage: 5Gi
accessModes:
- ReadWriteMany
storageClassName: nfs
在k8s中执行过后就可以了
可以看到已经是可以了
到这里k8s的云配置就完成了
jenkins凭证管理
凭证方式创建
这里涉及到的凭证有两种,一种是用户名密码的凭证,一种是k8s config的模式,所以首先要创建这两种凭证方式
进入凭证配置,创建两种方式
创建Gitee、阿里云凭证
进入过后选择jenkins,进入
点击添加凭证
输入用户名和密码,ID是自己根据自己的凭证类型自己取个名字,阿里云和gitee账号都是一样的
添加k8s config凭证
将能执行kubectl命令的节点上,进入/root/.kube目录,将该目录下的config文件下载到本地,然后将内容进行复制
进入jenkins凭证添加,选择kubeconfig类型,如下:
将config内容复制进去
建立一个测试的流水线
定义一个简单的流水线脚本
,建立好过后直接构建
当构镜像成功以后如下:
因为我这里设置了睡眠,所以还在一直运行
我们可以看下刚刚设置的云配置是否生效了,比如在jenkins中挂载了很多目录,比如可以执行docker命令和k8s的客户端命令,都是使用的宿主机的引擎
kubectl exec -it maven-k8s-psk7k -- /bin/bash
可以看到都是可以的,当如果当这个流水线完成以后pod就会结束,比如现在已经构建完成了
这个时候k8s就没有了
因为构建的时候,它会创建一个pod进行构建,这个pod里面包含了maven,git,jdk这些,然后这个容器里面可以执行docker k8s相关命令去构建pod,完成以后就会删除这个pod,是一个job的pod资源,因为流水线完成了以后它就不应该存在了,需要删除,这个是符合一个自动构建的流水线操作的,这个也是在jenkins的云配置里面配置的,比如看之前的配置:
它是一个job,job完成以后,k8s会自动删除这个job类型的pod,所以就没有了,因为一次构建完成了, 这个pod也没有存在的必要了,不然的话那么在k8s集群里面会存在很多pod,而这些job也灭有存在的意义;下一篇开始写jenkins通过pipeline来搭建的spring boot的项目,通过自动构建,自动打包,自动部署等一个完整的DevOps