k8s搭建DevOps环境一

  • DevOps、CI、CD都是什么
  • Agile Development
  • CI-持续集成
  • CD
  • 持续交付
  • 持续部署
  • DevOps
  • CI、CD、DevOps关系
  • Jenkins 安装
  • Jenkins 自动化部署实现原理
  • k8s环境概述
  • 创建命名空间
  • 创建pvc
  • 创建deployment
  • 创建svc
  • 创建ingress
  • 安装
  • k8s插件安装
  • K8S中创建ServiceAccout
  • jenkins配置k8s
  • K8s云基础配置
  • jenkins地址配置
  • POD 标签配置
  • POD模板配置
  • 添加host path挂载
  • docker引擎挂载
  • k8s 客户端命令挂载
  • 工作卷
  • jenkins凭证管理
  • 凭证方式创建
  • 创建Gitee、阿里云凭证
  • 添加k8s config凭证
  • 建立一个测试的流水线


DevOps、CI、CD都是什么

devops Helm构建_持续交付

Agile Development

敏捷开发以用户的需求进化为核心,采用迭代、循序渐进的方法进行软件开发。在敏捷开发中,软件项目在构建初期被切分成多个子项目,各个子项目的成果都经过测试,具备可视、可集成和可运行使用的特征。换言之,就是把一个大项目分为多个相互联系,但也可独立运行的小项目,并分别完成,在此过程中软件一直处于可使用状态。

devops Helm构建_运维_02

敏捷开发就是每个版本都是可用的,在此版本基础上进行快速迭代

CI-持续集成

CI的英文名称是Continuous Integration,中文翻译为:持续集成。

devops Helm构建_持续交付_03


CI中,开发人员将会频繁地向主干提交代码,这些新提交的代码在最终合并到主干前,需要经过编译和自动化测试流进行验证。持续集成(CI)是在源代码变更后自动检测、拉取、构建和(在大多数情况下)进行单元测试的过程。持续集成的目标是快速确保开发人员新提交的变更是好的,并且适合在代码库中进一步使用。CI的流程执行和理论实践让我们可以确定新代码和原有代码能否正确地集成在一起。

CD

CD可对应多个英文名称,持续交付Continuous Delivery和持续部署Continuous Deployment ,一下分别介绍。
查了一些资料,关于持续交互和持续部署的概念比较混乱,以下的概念总结按大部分的资料总结而来。

持续交付

完成 CI 中构建及单元测试和集成测试的自动化流程后,持续交付可自动将已验证的代码发布到存储库。为了实现高效的持续交付流程,务必要确保 CI 已内置于开发管道。持续交付的目标是拥有一个可随时部署到生产环境的代码库。

devops Helm构建_java_04

在持续交付中,每个阶段(从代码更改的合并,到生产就绪型构建版本的交付)都涉及测试自动化和代码发布自动化。在流程结束时,运维团队可以快速、轻松地将应用部署到生产环境中或发布给最终使用的用户。

持续部署

对于一个成熟的CI/CD管道(Pipeline)来说,最后的阶段是持续部署。作为持续交付——自动将生产就绪型构建版本发布到代码存储库——的延伸,持续部署可以自动将应用发布到生产环境。

devops Helm构建_devops Helm构建_05

持续部署意味着所有的变更都会被自动部署到生产环境中。持续交付意味着所有的变更都可以被部署到生产环境中,但是出于业务考虑,可以选择不部署。如果要实施持续部署,必须先实施持续交付。
持续交付并不是指软件每一个改动都要尽快部署到产品环境中,它指的是任何的代码修改都可以在任何时候实施部署。
持续交付表示的是一种能力,而持续部署表示的则一种方式。持续部署是持续交付的最高阶段

DevOps

DevOps是Development和Operations的组合,是一种方法论,是一组过程、方法与系统的统称,用于促进应用开发、应用运维和质量保障(QA)部门之间的沟通、协作与整合。以期打破传统开发和运营之间的壁垒和鸿沟。

devops Helm构建_运维_06

CI、CD、DevOps关系

概念性的内容,每个人的理解都有所不同。就好比CGI 这个词,即可以理解成CGI这种协议,也可以理解成实现了CGI协议的软件工具,都没有问题,咬文嚼字过犹不及。留下一图:

devops Helm构建_devops Helm构建_07


通过图中可以看到:

敏捷开发Agile Development:

devops Helm构建_java_08


从计划到编码再到构建就是敏捷开发

CI:

devops Helm构建_devops_09


CD:

devops Helm构建_运维_10


DEVOPS:

devops Helm构建_devops_11


从计划–》编码–》构建–》测试–》发布–》部署–》运维集成的,贯穿了整个软件的生命周期

Jenkins 安装

Jenkins 自动化部署实现原理

devops Helm构建_java_12

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

安装

当安装完成以后如下:

devops Helm构建_持续交付_13


现在就可以通过域名jk.bml.com来访问了

devops Helm构建_运维_14


需要一个密码,这个密码在日志中是可以看到的,我们可以查看日志

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_30,g_se,x_16)

将这个秘钥复制到输入框中如下:

devops Helm构建_java_15


开始安装了,这个安装根据网络情况需要好一会儿才能安装完成安装完成以后创建用户

devops Helm构建_运维_16


然后进入主页

devops Helm构建_java_17

k8s插件安装

devops Helm构建_devops Helm构建_18


安装好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云基础配置

在节点管理配置云,如下:

devops Helm构建_devops_19


配置k8s如下:

devops Helm构建_devops Helm构建_20


我这里的jenkins就安装到k8s中,所有可以通过https://kubernetes.default就可以连接,如果这里测试连接不成功,那么要不地址错了,要不sa和角色有问题,连接测试如下:

jenkins地址配置

devops Helm构建_devops Helm构建_21


jenkins的通道是jenkins的master和slave连接使用的的50000端口

POD 标签配置

devops Helm构建_devops Helm构建_22


定义一个jenkins的pod模板,就是定义个pod label,值是slave

POD模板配置

devops Helm构建_java_23


这里取了一个maven的pod模板,但是这个pod模板将jdk、mavn 、git这些都做成了一个镜像放到了阿里云,所以这里的maven 的pod模板其实包含了jdk、maven这些了

devops Helm构建_持续交付_24


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引擎挂载

devops Helm构建_java_25


devops Helm构建_持续交付_26


这个挂载路径的目的是让容器里面可以使用docker的命令,也就是说在容器里面使用的宿主机的docker引擎,这样在容器里面就不需要再安装一个docker引擎了

k8s 客户端命令挂载

devops Helm构建_java_27


我们在安装k8s的时候都需要在需要执行客户端命令kubectl **的节点去放一个.kube的文件,代表可以执行客户端指令,因为jenkins在讲git代码拉取下来过后打成镜像过后,需要执行执行kubectl apply等指令,并且拉取镜像这些,所以这个挂载就是让jenkins这个容器里面可以执行kubeclt相关指令。

工作卷

devops Helm构建_java_28


这个工作卷是配置的一个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的模式,所以首先要创建这两种凭证方式

devops Helm构建_devops_29


进入凭证配置,创建两种方式

devops Helm构建_devops Helm构建_30

创建Gitee、阿里云凭证

devops Helm构建_java_31


进入过后选择jenkins,进入

devops Helm构建_java_32


点击添加凭证

devops Helm构建_java_33


输入用户名和密码,ID是自己根据自己的凭证类型自己取个名字,阿里云和gitee账号都是一样的

添加k8s config凭证

将能执行kubectl命令的节点上,进入/root/.kube目录,将该目录下的config文件下载到本地,然后将内容进行复制

进入jenkins凭证添加,选择kubeconfig类型,如下:

devops Helm构建_devops_34


将config内容复制进去

建立一个测试的流水线

devops Helm构建_运维_35


devops Helm构建_java_36


定义一个简单的流水线脚本

,建立好过后直接构建

devops Helm构建_devops_37


devops Helm构建_运维_38


当构镜像成功以后如下:

devops Helm构建_devops Helm构建_39


因为我这里设置了睡眠,所以还在一直运行

我们可以看下刚刚设置的云配置是否生效了,比如在jenkins中挂载了很多目录,比如可以执行docker命令和k8s的客户端命令,都是使用的宿主机的引擎

kubectl exec -it maven-k8s-psk7k -- /bin/bash

devops Helm构建_java_40


devops Helm构建_运维_41


可以看到都是可以的,当如果当这个流水线完成以后pod就会结束,比如现在已经构建完成了

devops Helm构建_运维_42


这个时候k8s就没有了

devops Helm构建_devops_43


因为构建的时候,它会创建一个pod进行构建,这个pod里面包含了maven,git,jdk这些,然后这个容器里面可以执行docker k8s相关命令去构建pod,完成以后就会删除这个pod,是一个job的pod资源,因为流水线完成了以后它就不应该存在了,需要删除,这个是符合一个自动构建的流水线操作的,这个也是在jenkins的云配置里面配置的,比如看之前的配置:

devops Helm构建_devops_44

它是一个job,job完成以后,k8s会自动删除这个job类型的pod,所以就没有了,因为一次构建完成了, 这个pod也没有存在的必要了,不然的话那么在k8s集群里面会存在很多pod,而这些job也灭有存在的意义;下一篇开始写jenkins通过pipeline来搭建的spring boot的项目,通过自动构建,自动打包,自动部署等一个完整的DevOps