基于 Kubernetes 实现 CI/CD 配置
基于 Kubernetes 实现 CI/CD 配置
- 一、基本介绍
- 二、基于 Kubernetes 实现 CI/CD 配置
- 1.配置 GitLab
- 2.配置 Jenkins
- 3.实现 CI/CD 配置
- 4.验证
一、基本介绍
基于 Kubernetes 实现 CI/CD 配置,其实和往常那些 CI/CD 配置并没有太大区别。都是通过 提交代码,拉取代码,构建代码,发布代码来实现的。 只不过要是通过 K8s 来实现的话,则是需要将构建好的代码打包成镜像,通过镜像的方式来运行。
CI/CD 流程图:
开发将代码提交代码仓库后,我们便可以通过在 Jenkins 上配置脚本或是 Pipline 的方式来实现代码发布,其中发布有两种方式,一种是通过手动发布,另外一种可以通过 WebHook 插件来实现提交代码便自动发布(生产环境不建议自动发布)
- 脚本内容一般分为:克隆代码、编译代码、将编译好的代码打包成镜像、运行镜像几个步骤。
二、基于 Kubernetes 实现 CI/CD 配置
- 下面我们是通过容器的方式安装配置,物理安装可以看我前面的文章:传送门
1.配置 GitLab
1)安装 Docker-Compose
[root@k8s-master01 ~]# wget "https://github.com/docker/compose/releases/download/v2.3.2/docker-compose-$(uname -s)-$(uname -m)" -O /usr/local/bin/docker-compose
[root@k8s-master01 ~]# chmod +x /usr/local/bin/docker-compose
[root@k8s-master01 ~]# docker-compose --version
2)安装 GitLab
[root@k8s-master01 ~]# vim docker-compose.yml
version: '3'
services:web:image: 'gitlab/gitlab-ce:14.8.5-ce.0'restart: alwayshostname: 192.168.1.1environment:GITLAB_OMNIBUS_CONFIG: |external_url 'http://192.168.1.1'ports:- '1080:80'- '1443:443'- '1022:22'volumes:- '/app/gitlab/config:/etc/gitlab'- '/app/gitlab/logs:/var/log/gitlab'- '/app/gitlab/data:/var/opt/gitlab'
[root@k8s-master01 ~]# docker-compose up -d
- 因为博主的电脑配置不是很高,所以就不使用上面的方式安装 GitLab,而是直接使用 GitHub 上面的仓库。
2.配置 Jenkins
1)安装 NFS 存储,并配置共享目录
[root@k8s-master01 ~]# yum -y install nfs-utils rpcbind
[root@k8s-master01 ~]# echo "/app/jenkins *(rw,sync,no_root_squash)" > /etc/exports
[root@k8s-master01 ~]# mkdir /app/jenkins
[root@k8s-master01 ~]# systemctl start rpcbind nfs
2)创建 PV 和 PVC
[root@k8s-master01 ~]# vim jenkins-pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:name: jenkins-pv
spec:capacity:storage: 10GiaccessModes:- ReadWriteManynfs:server: 192.168.1.1path: /app/jenkins
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: jenkins-pvc
spec:resources:requests:storage: 10GiaccessModes:- ReadWriteMany
[root@k8s-master01 ~]# kubectl create -f jenkins-pv.yaml
2)创建 RBAC 授权
[root@k8s-master01 ~]# vim jenkins-sa.yaml
apiVersion: v1
kind: ServiceAccount
metadata:name: jenkins-sa
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRole
metadata:name: jenkins-cr
rules:- apiGroups: ["extensions","apps"]resources: ["deployments"]verbs: ["create","delete","get","list","watch","patch","update"]- apiGroups: [""]resources: ["services"]verbs: ["create","delete","get","list","watch","patch","update"]- apiGroups: [""]resources: ["pods"]verbs: ["create","delete","get","list","patch","update"]- apiGroups: [""]resources: ["pods/exec"]verbs: ["create","delete","get","list","patch","update"]- apiGroups: [""]resources: ["pods/log"]verbs: ["get","list","update"]- apiGroups: [""]resources: ["secrets"]verbs: ["get"]
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:name: jenkins-crb
roleRef:kind: ClusterRolename: jenkins-crapiGroup: rbac.authorization.k8s.io
subjects:
- kind: ServiceAccountname: jenkins-sanamespace: default
[root@k8s-master01 ~]# kubectl create -f jenkins-sa.yaml
3)创建 StatefulSet
[root@k8s-master01 ~]# vim jenkins-statefulset.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:name: jenkins
spec:serviceName: jenkinsreplicas: 1selector:matchLabels:app: jenkinstemplate:metadata:name: "jenkins"labels:app: jenkinsspec:serviceAccountName: jenkins-sacontainers:- name: jenkinsimage: jenkins/jenkins:ltsimagePullPolicy: IfNotPresentports:- containerPort: 8080- containerPort: 50000volumeMounts:- name: jenkinsmountPath: /var/jenkins_homevolumes:- name: jenkinspersistentVolumeClaim:claimName: jenkins-pvc
[root@k8s-master01 ~]# chown -R 1000 /app/jenkins
[root@k8s-master01 ~]# kubectl create -f jenkins-statefulset.yaml
4)创建 Service
[root@k8s-master01 ~]# vim jenkins-svc.yaml
apiVersion: v1
kind: Service
metadata:name: jenkins
spec:type: NodePortports:- name: httpport: 8080targetPort: 8080nodePort: 30080- name: agentport: 50000targetPort: 50000nodePort: 30090selector:app: jenkins
[root@k8s-master01 ~]# kubectl create -f jenkins-svc.yaml
5)配置 Jenkins
[root@k8s-master01 ~]# cat /app/jenkins/secrets/initialAdminPassword
a303d66e915e4ee5b26648a64fdff4be
http://192.168.1.1:30080/
我们这里安装推荐的插件即可,后面有需求可以再进行安装
3.实现 CI/CD 配置
1)在 Jenkins 宿主机上创建 SSH 密钥
[root@k8s-master01 ~]# ssh-keygen -t rsa # 三连回车
[root@k8s-master01 ~]# cat ~/.ssh/id_rsa.pub # 查看公钥
2)将公钥上传到 GitLab 上
3)将仓库克隆到本地
[root@k8s-master01 ~]# git clone git@github.com:ChenZhuang1217/test.git
4)编写 Go 代码
[root@k8s-master01 ~]# cd test
[root@k8s-master01 test]# vim main.go
package main
import ("fmt""net/http"
)
func HelloHandler(w http.ResponseWriter, r *http.Request) {fmt.Fprintf(w, "Hello World")
}
func main() {http.HandleFunc("/", HelloHandler)http.ListenAndServe(":8080", nil)
}
5)编写 Dockerfile
[root@k8s-master01 test]# vim Dockerfile
FROM golang:1.16 as builder
ENV GO111MODULE=on \GOPROXY=https://goproxy.cn,direct
WORKDIR /app
COPY . .
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags="-w -s" -o main main.goFROM busybox:1.28.4
WORKDIR /app
COPY --from=builder /app/ .
EXPOSE 8080
CMD ["./main"]
[root@k8s-master01 test]# docker build -t test-web-server:devops-$(date +%Y-%m-%d-%H-%M-%S) .
6)提交代码(Git 教程可以看博主前面写的文章:Git)
[root@k8s-master01 test]# git add . # 提交到暂存区
[root@k8s-master01 test]# git config --global user.email "Zhuang_zz1217@163.com" # 配置用户邮箱
[root@k8s-master01 test]# git commit -m "This is test CI/CD" # 提交到本地仓库
[root@k8s-master01 test]# git push # 推送到远程仓库
7)创建 Deployment 和 Service
[root@k8s-master01 ~]# vim test-web-server.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: test-web-server
spec:replicas: 1selector:matchLabels:app: test-web-servertemplate:metadata:labels:app: test-web-serverspec:containers:- name: test-web-serverimage: test-web-server:devops-2022-04-25-17-16-54imagePullPolicy: IfNotPresentports:- containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:name: test-web-server
spec:type: NodePortports:- name: test-web-serverport: 8080targetPort: 8080nodePort: 30188selector:app: test-web-server
[root@k8s-master01 ~]# kubectl create -f test-web-server.yaml
8)编写 Jenkins 发版脚本
[root@k8s-master01 ~]# vim test.sh
#!/bin/bash
# 固定时间格式
Second=$(date +%Y-%m-%d-%H-%M-%S)# 备份旧的镜像
Image=$(kubectl -s https://192.168.1.1:6443 describe pod | grep Image: | awk '{print $2}' | grep test)
echo $Image > /opt/test-image-$Second# 克隆代码
cd /root
if [ -d test ];
thenmv test /opt/test-devops-$Secondgit clone git@github.com:ChenZhuang1217/test.git
elsegit clone git@github.com:ChenZhuang1217/test.git
fi# 发布新的镜像
cd /root/test && docker build -t test-web-server:devops-$Second .# 上传到镜像仓库
if [ $? -eq 0 ];
thendocker tag test-web-server:devops-$Second harbor.tianya.com:5000/test-web-server:devops-$Seconddocker push harbor.tianya.com:5000/test-web-server:devops-$Second
elseexit 1 # 退出 (防止运行下面命令)
fi# 替换镜像
sed -i 's/image:.*/image: harbor.tianya.com:5000\/test-web-server:devops-'$Second'/g' /root/test-web-server.yaml# 重启应用
kubectl delete -f /root/test-web-server.yaml
kubectl create -f /root/test-web-server.yaml
[root@k8s-master01 ~]# chmod +x test.sh
上面这个脚本有两步需要注意:
- 上传到镜像仓库: 如果你们没有自己的镜像仓库,可以选择调整脚本或看博主前面写的文章来安装 Harbor 仓库。
- 替换镜像: 我们上面配置的脚本是针对单个模块的,多个模块可以根据
for
循环来实现。
4.验证
1)在 Jenkins 上安装 SSH 插件
- 安装 SSH 插件的原因是因为,我们这个 Jenkins 是容器安装的,而脚本是在宿主机写的,所以通过远程到宿主机来运行脚本。
2)配置远程主机的用户名和密码
3)创建 Jenkins 私钥凭证(类型选择:SSH Username with private key
)
4)配置 Jenkins 流水线
5)修改代码
6)在 Jenkins 上发布
基于 Kubernetes 实现 CI/CD 配置相关推荐
- Jenkins X:基于Kubernetes的CI/CD平台
背景 Jenkins自动化服务器一直都是DevOps工具链的重要组成部分,并且已发展成为开源持续集成和持续部署(CI&CD)软件的领导者.据不完全统计,截至2019年6月,已有将近26万的Je ...
- Kubernetes 的 CI/CD 管道概述
An Overview of CI/CD Pipelines With Kubernetes Take a look at CI/CD approaches in a Kubernetes ecosy ...
- gitlab ci 配置 java_GitLab CI/CD 配置
GitLab CI/CD 配置 概念 操作示例 创建测试项目 sample-web,然后打开项目的 Runners 配置 找到这个地方,后边要用 然后搭建 gitlab-runner,CI/CD 需要 ...
- kubernetes之CI/CD工具jenkins第二篇,helm的使用
1. kubernetes之CI/CD第二篇-jenkins结合helm部署应用: 1. 概述: 在前期的博文中我已经初步介绍过kubernetes环境下的CI/CD的使用.主要是jenkins ...
- gogs创建项目_容器云平台No.10~通过gogs+drone+kubernetes实现CI/CD
什么是CI/CD 持续集成(Continous Intergration,CI)是一种软件开发实践,即团队开发成员经常集成它们的工作,通常每个成员每天至少集成一次,也就意味着每天可能会发生多次集成.每 ...
- 容器云平台No.10~通过gogs+drone+kubernetes实现CI/CD
什么是CI/CD 持续集成(Continous Intergration,CI)是一种软件开发实践,即团队开发成员经常集成它们的工作,通常每个成员每天至少集成一次,也就意味着每天可能会发生多次集成.每 ...
- 为 Kubernetes 提供 CI/CD 服务 Jenkins X
Jenkins X 是一个高度集成化的 CI/CD 平台,基于 Jenkins 和 Kubernetes 实现,旨在解决微服务体系架构下的云原生应用的持续交付的问题,简化整个云原生应用的开发.运行和部 ...
- Kubernetes原生CI/CD构建框架Tekton详解
流水线(Pipeline)是把一个重复的过程分解为若干个子过程,使每个子过程与其他子过程并行进行的技术.本文主要介绍了诞生于云原生时代的流水线框架 Tekton. 什么是流水线? 在计算机中,流水线是 ...
- 基于Kubernetes的CI/CDPipeline流水线解决方案
Pipeline 介绍 要实现在 Jenkins 中的构建工作,可以有多种方式,我们这里采用比较常用的 Pipeline 这种方式.Pipeline,简单来说,就是一套运行在 Jenkins 上的工 ...
最新文章
- VS2010 SQL Server 2005 Database Project 使用笔记(二)
- java webpack_webpack将对象暴露为全局
- ITK:两幅图像之差的绝对值
- python之路----验证客户端合法性
- 相亲有风险,且行且珍惜!| 今日最佳
- linux安装 icc编译器,安装 Intel Compiler (ifort icc icpc)
- 计算机打不出汉字怎么办,电脑打不出字怎么办,教您电脑打不出字怎么解决
- 这67款APP被下架了
- 关于css中列表(ul ol)存在默认间距的问题
- java日期格式化 类_Java日期格式化(DateFormat类和SimpleDateFormat类)
- spline: 计算机曲线简史(转载)
- 中国实验室玻璃器皿行业市场供需与战略研究报告
- 关于word导出pdf时更新域出错的问题
- 人工智能行业知识 - AI应用场景
- Intel MKL FATAL ERROR: Cannot load libmkl_avx512.so or libmkl_def.so.
- 来用 TypeScript(技术周刊 2019-04-01)
- 3G上网卡在Liunx系统上实现上网的过程
- 示波器测量晶振、万用表测量晶振的方法
- 快速建站 python_Django简单快捷建站(适合做大作业)
- 网络基础CCNP|SDN与日志
热门文章
- slf4j的log.warn()的参数问题研究
- 读敖丙Kafka性能笔记
- 不确定性弥漫的零食市场,三只松鼠如何交出确定性答案?
- 值得深读的多年工作经验总结!
- 房产中介APP开发需要哪些功能|房产中介app开发多少钱?
- word中有时出现表或者图的注释与表或者图分页了
- Combo Cleaner for Mac(系统清理软件)
- ACM卡常优化模板(C++/Java)
- 高通公司宣布将骁龙处理器改名为骁龙移动平台
- 〖金融帝国实验室〗(Capitalism Lab)软件(Software)开局攻略(作者:似流年)