# k8s+jenkins+gitlab实现devops **Repository Path**: mustnova/jenkins ## Basic Information - **Project Name**: k8s+jenkins+gitlab实现devops - **Description**: 云原生的学习笔记 CI 持续集成 CD 持续交付 devops 开发测试运维协同工作一体化持续交付持续集成的一种自动化软件交付思想的落地实践。 微服务 容器化 docker - **Primary Language**: Unknown - **License**: AFL-3.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 4 - **Created**: 2025-03-18 - **Last Updated**: 2025-03-18 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 基于K8s+jenkins+gitlab实现devops ## 云原生 什么是云原生? ![输入图片说明](image/image.png) 为私有云公有云混合云提供可弹性扩展的环境 云 - cloud 包括(IaaS,PaaS,SaaS) 原生 -- native 项目设计之初要考虑到云环境的适配性,要为云环境而生 native英文指的是土生土长的 原生的。 ![image-20240413083839632](image/image-20240413083839632.png) 云原生的核心技术:微服务+Devops+CD+容器化 微服务指的是将一个项目划分成很多微小的项目去开发部署上线最后将项目整合起来 Devops指的是持续开发持续集成的开发测试运维一体化协同工作的自动化软件交付模式的落地实践,借助jenkins等自动化集成工具等技术手段实现的解决的沟通问题 CD 持续交付 对于频繁发布的业务能够做多快速交付快速反馈从而降低发布风险 容器化 所有业务和环境都打包成一个镜像,相当于模板,后面如果想使用直接实例化镜像即可。容器有点启动速度快,无OS开销,资源利用率高,可以实现资源隔离(namespace)和资源限制(cgroup)。 ![image-20240413083858898](image/image-20240413083858898.png) ### 三种类型的云服务 ![image-20240413084836981](image/image-20240413084836981.png) **IaaS** *基础设施及服务* 及云服务商提供给你基础的设施机器硬盘cpu等云设备,其他包括os以及中间件都需要用户自己从零开始手撕。挖地基,搭框架 **PaaS** *平台及服务* 提供了对开发者较友好的平台,比如安装好了操作系统,mysql数据库,java环境等一些开发软件,类似于毛坯房 刷了墙漆,铺了地板装上了门 装了窗户 **SaaS** 软件及服务 啥都给你配好了 用户或者商户购买此产品后直接就可以使用进行业务 类似于精装修的成品房 拎包入住 ![image-20240413085255639](image/image-20240413085255639.png) ![image-20240413085322296](image/image-20240413085322296.png) 可以看到IaaS就提供给你了服务器,存储和网络然后PaaS在此基础上给你提供了中间件操作系统运行环境等 最后的SaaS在PaaS的基础上提供了可以直接使用的应用 最后我们再介绍一下私有云公有云混合云。 ![image-20240413085637865](image/image-20240413085637865.png) 看以上这张图即可 我的理解: 私有云:大型企业或者个人搭建的云计算平台供企业内部使用 安全性较高 公有云: 云服务提供商提供的公共的云计算平台,用户企业只要购买云服务提供商的云产品即可直接使用无需自己搭建,减少搭建维护的成本 混合云: 私有云+公有云 优点:灵活性强 可扩展性强 ![image-20240413085902990](image/image-20240413085902990.png) 在此基础上按照服务层次可以将云计算分为IaaS,PaaS,SaaS 至此我们关于云原生的介绍就到此结束 接下来我们围绕云原生的核心技术展开讲解! 参考文章: [什么是云原生?| Oracle 中国](https://www.oracle.com/cn/cloud/cloud-native/what-is-cloud-native/) [什么是云原生?这回终于有人讲明白了 - 知乎 (zhihu.com)](https://zhuanlan.zhihu.com/p/150190166) **我们需要用到的技术工具:** 持续继承工具: - jenkins - gitlabci - tekton ## devops CI CD介绍 Continuous Integration (*CI*) 持续继承 Continuous Delivery (*CD*) 持续交付 一个软件的交付流程 ![image-20240412144608813](image/image-20240412144608813.png) 一个软件从零开始到最终的部署上线交付大概经历了如上的几个阶段,基于这几个阶段,我们软件交付模式的模型经历了三个阶段: **阶段一:瀑布式流程** ![image-20240412144747560](image/image-20240412144747560.png) 瀑布式开发注重的是软件从设计到开发到测试到部署是有序的执行的,这种模式的缺陷软件开发周期较长,灵活性较差,所以我们后来引入了敏捷开发,这也是很多公司目前使用的软件交付模型 **阶段二:敏捷开发** 敏捷开发注重开发不注重运维,主要做的是讲项目任务分成一小段一小段的去开发 开发完后紧接着立即测试,然后最终将这些开发测试后的小任务拼接成大任务,最后交给运维工程师部署上线 ![image-20240412145009400](image/image-20240412145009400.png) **阶段三:devops** ![image-20240412145028614](image/image-20240412145028614.png) 一句话概括:devops是一种开发测试运维一体化协同工作的持续交付持续集成的自动化软件交付模式的落地实践。这种落地实践需要技术和工具来解决开发测试和运维之间的沟通成本,所以我们这节课就是这个jenkins流水线工具来做到将devops思想实践化。 devops的核心是**自动化**,靠什么实现自动化呢?其实就是我们的技术和工具 devops的工具链 ![image-20240412145256436](image/image-20240412145256436.png) 靠这些工具我们的devops才具有了可落地性 ## 环境准备 安装k8s集群,准备三台主机 | 主机名 | ip | 配置参数 | | ---------- | -------------- | ----------------------------------------------------------- | | k8s-master | 192.168.208.10 | 2h2g(apiserver,kube-scheduler,kube-controller manager,etcd) | | k8s-node1 | 192.168.208.10 | 2h4g(kubelet,kube-proxy) 这台机器安装jenkins | | k8s-node2 | 192.168.208.30 | 2h6g 资源尽量给多点 这台机器安装gitlab 因为gitlab比较吃内存 | - 在所有机器上关闭防火墙 ```bash systemctl stop firewalld systemctl disable firewalld ``` - 在所有机器上关闭selinux ```bash sed -i 's/enforcing/disabled/' /etc/selinux/config setenforce 0 ``` - 在所有机器上关闭swap交换分区 ```bash swapoff -a sed -ri 's/.*swap.*/#&/' /etc/fstab ``` - 修改主机名 ```bash hostnamectl set-hostname k8s-master/k8s-node1/k8s-node2 bash ``` - 添加ip与主机名的映射关系 ```bash cat < /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 192.168.208.10 k8s-master 192.168.208.20 k8s-node1 192.168.208.30 k8s-node2 EOF ``` - 将桥接的ipv4流量传递到iptables链 ```bash cat > /etc/sysctl.d/k8s.conf << EOF net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 EOF ``` - 为所有节点安装docker ```bash yum install wget.x86_64 -y wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo yum install docker-ce-20.10.11 -y ``` ### 集群部署 - 为所有节点修改仓库,安装kubeadm,kubelet,kubectl 解释一下这个kubeadm是k8s官方提供的一键部署安装k8s集群的工具,我们之后就用这个工具一键安装k8s集群,kubelet是用来创建销毁pod的,kubectl是客户端命令行工具 ```bash cat < /etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/ enabled=1 gpgcheck=1 repo_gpgcheck=1 gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg EOF yum install kubelet-1.22.2 kubeadm-1.22.2 kubectl-1.22.2 -y systemctl enable kubelet && systemctl start kubelet ``` - 修改docker配置 ```bash mkdir /etc/docker cat > /etc/docker/daemon.json < Manage Jenkins > System 配置gitlab地址 ![image-20240412180124114](image/image-20240412180124114.png) 使用gitlab api token的方式 然后我们来到gitlab申请api token ![image-20240412180242128](image/image-20240412180242128.png) ![image-20240412180253120](image/image-20240412180253120.png) 会给你一个access token 拿到他来到jenkins ![image-20240412180332654](image/image-20240412180332654.png) 填写添加 然后点击`Test connection`测试连接 出现Success即表示连接成功啦 点击新建item 选择自由类型的project ![image-20240412180543796](image/image-20240412180543796.png) ![image-20240412180725716](image/image-20240412180725716.png) 注意这边的分支是main 因为我们创建gitlab项目的时候分支就是main ![image-20240412180810381](image/image-20240412180810381.png) ![image-20240412181006590](image/image-20240412181006590.png) 选择构建触发器复制那段url来到我们的gitlab的webhook设置一下让gitlab一旦有提交的事件的时候就会触发这个触发器去实现报警功能 ![image-20240412181127324](image/image-20240412181127324.png) 点击高级生成secret token然后拿到它复制粘贴到我们的webhook里面来 ![image-20240412181217278](image/image-20240412181217278.png) ![image-20240412181241340](image/image-20240412181241340.png) 然后点击确认会发现没有权限所以提示我们要去先授个权 ![image-20240412181331176](image/image-20240412181331176.png) 来到我们的go-demo项目点击小扳手 ![image-20240412181425478](image/image-20240412181425478.png) ![image-20240412181442309](image/image-20240412181442309.png) 然后继续来到webhooks界面设置一下即可 ![image-20240412181551373](image/image-20240412181551373.png) 这个时候我们的webhook就添加成功了 ![image-20240412181618413](image/image-20240412181618413.png) 来到我们的流水线配置 `Build Steps`选择执行shell脚本 ```bash curl '你的机器人的webhook' \ -H 'Content-Type: application/json' \ -d '{"msgtype": "text", "text": { "content": "我就是我, 是不一样的烟火" } }' ``` 这个脚本是用来实现钉钉告警的 ![image-20240412181802217](image/image-20240412181802217.png) 来个钉钉 创一个群然后设置一个机器人复制机器人的webhook ![image-20240412182121566](image/image-20240412182121566.png) 流水线运行成功了 ![image-20240412182137506](image/image-20240412182137506.png) 点击进去可以看到控制台输出状态集等等 ```bash Started by GitLab push by Administrator Running as SYSTEM Building in workspace /var/jenkins_home/workspace/test The recommended git tool is: NONE using credential gitlab_user_pass > git rev-parse --resolve-git-dir /var/jenkins_home/workspace/test/.git # timeout=10 Fetching changes from the remote Git repository > git config remote.origin.url http://192.168.208.30/gitlab-instance-4d9b9ba9/go-demo.git # timeout=10 Fetching upstream changes from http://192.168.208.30/gitlab-instance-4d9b9ba9/go-demo.git > git --version # timeout=10 > git --version # 'git version 2.39.2' using GIT_ASKPASS to set credentials > git fetch --tags --force --progress -- http://192.168.208.30/gitlab-instance-4d9b9ba9/go-demo.git +refs/heads/*:refs/remotes/origin/* # timeout=10 skipping resolution of commit remotes/origin/main, since it originates from another repository > git rev-parse refs/remotes/origin/main^{commit} # timeout=10 Checking out Revision f1ea7e724eaee926fdc8d01e9aeeb096b8557148 (refs/remotes/origin/main) > git config core.sparsecheckout # timeout=10 > git checkout -f f1ea7e724eaee926fdc8d01e9aeeb096b8557148 # timeout=10 Commit message: "first commit" First time build. Skipping changelog. [test] $ /bin/sh -xe /tmp/jenkins8302867855664172248.sh + curl https://oapi.dingtalk.com/robot/send?access_token=ee4ee74d092b21126f0ad3e9d567a5797cbedfbca47f9c2d03b02509ae4e9ed8 -H Content-Type: application/json -d {"msgtype": "text", "text": { "content": "hahahha我就是我, aaa是不一样的烟火" } } % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 100 155 100 27 100 128 87 412 --:--:-- --:--:-- --:--:-- 501 {"errcode":0,"errmsg":"ok"}Finished: SUCCESS ``` ![image-20240412182216411](image/image-20240412182216411.png) 钉钉这边也实现了告警至此我们初步实现了jenkins的一些功能了 manage jenkins --- nodes ![image-20240412182302177](image/image-20240412182302177.png) 目前我们就一个节点 这个节点意思就是你的jenkins部署在哪个节点它就会把这个代码下载到哪个节点的哪个文件里面 具体下载到哪个文件可以到可以查看一下控制台输出 ![image-20240412182426369](C:\Users\万里\AppData\Roaming\Typora\typora-user-images\image-20240412182426369.png) 这段意思就是他下载到了我们的`k8s-node1`底下`/var/jenkins_home/workspace/test/`下我们可以来到我们的k8s-node1底下查看验证一下 ![image-20240412182525274](image/image-20240412182525274.png) 确实有我们之前的项目 但是现在有一个问题就是触发流水线工作只有一台机器来进行会出现OSPF问题当并发大的时候吞吐量大的时候一台机器可能顶不住 所以我们可以添加更多的工作node来完成流水线 ![image-20240412182657643]/(image/image-20240412182657643.png) ![image-20240412182731076](image/image-20240412182731076.png) 启动方式通过Java Web启动代理的方式 ![image-20240412182751933](image/image-20240412182751933.png) 根据他的提示来到k8s-node2节点上来 先安装java编译器 ```bash wget https://download.oracle.com/java/17/latest/jdk-17_linux-x64_bin.rpm yum -y install ./jdk-17_linux-x64_bin.rpm curl -sO http://192.168.208.10:30080/jnlpJars/agent.jar nohup java -jar agent.jar -url http://192.168.208.10:30080/ -secret 61fb76f87cd8a4a41c00b0c235a538b3bb78ffed25321959b234fedc18276eb4 -name "k8s-node2" -workDir "/opt/jenkins-home" & ```