基于 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

上面这个脚本有两步需要注意:

  1. 上传到镜像仓库: 如果你们没有自己的镜像仓库,可以选择调整脚本或看博主前面写的文章来安装 Harbor 仓库。
  2. 替换镜像: 我们上面配置的脚本是针对单个模块的,多个模块可以根据 for 循环来实现。

4.验证

1)在 Jenkins 上安装 SSH 插件

  • 安装 SSH 插件的原因是因为,我们这个 Jenkins 是容器安装的,而脚本是在宿主机写的,所以通过远程到宿主机来运行脚本。

2)配置远程主机的用户名和密码

3)创建 Jenkins 私钥凭证(类型选择:SSH Username with private key

4)配置 Jenkins 流水线



5)修改代码

6)在 Jenkins 上发布

基于 Kubernetes 实现 CI/CD 配置相关推荐

  1. Jenkins X:基于Kubernetes的CI/CD平台

    背景 Jenkins自动化服务器一直都是DevOps工具链的重要组成部分,并且已发展成为开源持续集成和持续部署(CI&CD)软件的领导者.据不完全统计,截至2019年6月,已有将近26万的Je ...

  2. Kubernetes 的 CI/CD 管道概述

    An Overview of CI/CD Pipelines With Kubernetes Take a look at CI/CD approaches in a Kubernetes ecosy ...

  3. gitlab ci 配置 java_GitLab CI/CD 配置

    GitLab CI/CD 配置 概念 操作示例 创建测试项目 sample-web,然后打开项目的 Runners 配置 找到这个地方,后边要用 然后搭建 gitlab-runner,CI/CD 需要 ...

  4. kubernetes之CI/CD工具jenkins第二篇,helm的使用

    1. kubernetes之CI/CD第二篇-jenkins结合helm部署应用: 1. 概述:    在前期的博文中我已经初步介绍过kubernetes环境下的CI/CD的使用.主要是jenkins ...

  5. gogs创建项目_容器云平台No.10~通过gogs+drone+kubernetes实现CI/CD

    什么是CI/CD 持续集成(Continous Intergration,CI)是一种软件开发实践,即团队开发成员经常集成它们的工作,通常每个成员每天至少集成一次,也就意味着每天可能会发生多次集成.每 ...

  6. 容器云平台No.10~通过gogs+drone+kubernetes实现CI/CD

    什么是CI/CD 持续集成(Continous Intergration,CI)是一种软件开发实践,即团队开发成员经常集成它们的工作,通常每个成员每天至少集成一次,也就意味着每天可能会发生多次集成.每 ...

  7. 为 Kubernetes 提供 CI/CD 服务 Jenkins X

    Jenkins X 是一个高度集成化的 CI/CD 平台,基于 Jenkins 和 Kubernetes 实现,旨在解决微服务体系架构下的云原生应用的持续交付的问题,简化整个云原生应用的开发.运行和部 ...

  8. Kubernetes原生CI/CD构建框架Tekton详解

    流水线(Pipeline)是把一个重复的过程分解为若干个子过程,使每个子过程与其他子过程并行进行的技术.本文主要介绍了诞生于云原生时代的流水线框架 Tekton. 什么是流水线? 在计算机中,流水线是 ...

  9. 基于Kubernetes的CI/CDPipeline流水线解决方案

    Pipeline 介绍  要实现在 Jenkins 中的构建工作,可以有多种方式,我们这里采用比较常用的 Pipeline 这种方式.Pipeline,简单来说,就是一套运行在 Jenkins 上的工 ...

最新文章

  1. VS2010 SQL Server 2005 Database Project 使用笔记(二)
  2. java webpack_webpack将对象暴露为全局
  3. ITK:两幅图像之差的绝对值
  4. python之路----验证客户端合法性
  5. 相亲有风险,且行且珍惜!| 今日最佳
  6. linux安装 icc编译器,安装 Intel Compiler (ifort icc icpc)
  7. 计算机打不出汉字怎么办,电脑打不出字怎么办,教您电脑打不出字怎么解决
  8. 这67款APP被下架了
  9. 关于css中列表(ul ol)存在默认间距的问题
  10. java日期格式化 类_Java日期格式化(DateFormat类和SimpleDateFormat类)
  11. spline: 计算机曲线简史(转载)
  12. 中国实验室玻璃器皿行业市场供需与战略研究报告
  13. 关于word导出pdf时更新域出错的问题
  14. 人工智能行业知识 - AI应用场景
  15. Intel MKL FATAL ERROR: Cannot load libmkl_avx512.so or libmkl_def.so.
  16. 来用 TypeScript(技术周刊 2019-04-01)
  17. 3G上网卡在Liunx系统上实现上网的过程
  18. 示波器测量晶振、万用表测量晶振的方法
  19. 快速建站 python_Django简单快捷建站(适合做大作业)
  20. 网络基础CCNP|SDN与日志

热门文章

  1. slf4j的log.warn()的参数问题研究
  2. 读敖丙Kafka性能笔记
  3. 不确定性弥漫的零食市场,三只松鼠如何交出确定性答案?
  4. 值得深读的多年工作经验总结!
  5. 房产中介APP开发需要哪些功能|房产中介app开发多少钱?
  6. word中有时出现表或者图的注释与表或者图分页了
  7. Combo Cleaner for Mac(系统清理软件)
  8. ACM卡常优化模板(C++/Java)
  9. 高通公司宣布将骁龙处理器改名为骁龙移动平台
  10. 〖金融帝国实验室〗(Capitalism Lab)软件(Software)开局攻略(作者:似流年)