DevOps系列文章-Kubernetes实现CI与CD配置

这篇具有很好参考价值的文章主要介绍了DevOps系列文章-Kubernetes实现CI与CD配置。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Kubernetes实现CI与CD配置

一、基本介绍

基于 Kubernetes 实现 CI/CD 配置,其实和往常那些 CI/CD 配置并没有太大区别。都是通过 提交代码,拉取代码,构建代码,发布代码来实现的。 只不过要是通过 K8s 来实现的话,则是需要将构建好的代码打包成镜像,通过镜像的方式来运行。

CI/CD 流程图:

DevOps系列文章-Kubernetes实现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: always
    hostname: 192.168.59.130
    environment:
      GITLAB_OMNIBUS_CONFIG: |
        external_url 'http://192.168.59.130'
    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

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: 10Gi
  accessModes:
    - ReadWriteMany
  nfs:
    server: 192.168.59.130
    path: /app/jenkins
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: jenkins-pvc
spec:
  resources:
    requests:
      storage: 10Gi
  accessModes:
    - ReadWriteMany   
[root@k8s-master01 ~]# kubectl create -f jenkins-pv.yaml

3)创建 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: ClusterRole
  name: jenkins-cr
  apiGroup: rbac.authorization.k8s.io
subjects:
- kind: ServiceAccount
  name: jenkins-sa
  namespace: default
[root@k8s-master01 ~]# kubectl create -f jenkins-sa.yaml

4)创建 StatefulSet

[root@k8s-master01 ~]# vim jenkins-statefulset.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: jenkins
spec:
  serviceName: jenkins
  replicas: 1
  selector:
    matchLabels:
      app: jenkins
  template:
    metadata:
      name: "jenkins"
      labels:
        app: jenkins
    spec:
      serviceAccountName: jenkins-sa
      containers:
      - name: jenkins
        image: jenkins/jenkins:lts
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 8080
        - containerPort: 50000
        volumeMounts:
        - name: jenkins
          mountPath: /var/jenkins_home
      volumes:
      - name: jenkins
        persistentVolumeClaim:
          claimName: jenkins-pvc          
[root@k8s-master01 ~]# chown -R 1000 /app/jenkins
[root@k8s-master01 ~]# kubectl create -f jenkins-statefulset.yaml

5)创建 Service

[root@k8s-master01 ~]# vim jenkins-svc.yaml
apiVersion: v1
kind: Service
metadata:
  name: jenkins
spec:
  type: NodePort
  ports:
  - name: http
    port: 8080
    targetPort: 8080
    nodePort: 30080
  - name: agent
    port: 50000
    targetPort: 50000
    nodePort: 30090
  selector:
    app: jenkins
[root@k8s-master01 ~]# kubectl create -f jenkins-svc.yaml

6)配置 Jenkins

[root@k8s-master01 ~]# cat /app/jenkins/secrets/initialAdminPassword 
a303d66e915e4ee5b26648a64fdff4be

http://192.168.59.131:30080/

DevOps系列文章-Kubernetes实现CI与CD配置

我们这里安装推荐的插件即可,后面有需求可以再进行安装

DevOps系列文章-Kubernetes实现CI与CD配置

3.实现 CI/CD 配置

1)在 Jenkins 宿主机上创建 SSH 密钥

[root@k8s-master01 ~]# ssh-keygen -t rsa							
[root@k8s-master01 ~]# cat ~/.ssh/id_rsa.pub							

将生成的公钥 私钥 移动到 nfs的jenkins的挂载目录下
DevOps系列文章-Kubernetes实现CI与CD配置
或者 直接进入jenkins容器内生成ssh密钥

最终都是保存在/app/jenkins/.ssh文件夹 下面

2)将公钥上传到 Gitee上

DevOps系列文章-Kubernetes实现CI与CD配置

3)将仓库克隆到本地

[root@k8s-master01 ~]#   git clone git@gitee.com:JavaBigDataStudy/go-devops.git

4)编写 Go 代码

[root@k8s-master01 ~]# cd go-devops
[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 go-devops]# 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.go
FROM busybox:1.28.4
WORKDIR /app
COPY --from=builder /app/ .
EXPOSE 8080
CMD ["./main"]
[root@k8s-master01 go-devops]# docker build -t test-web-server:devops-$(date +%Y-%m-%d-%H-%M-%S) .

6)提交代码

[root@k8s-master01 go-devops]# git add .														# 提交到暂存区
[root@k8s-master01 go-devops]# git config --global user.email "dukng-jker@163.com"		# 配置用户邮箱
[root@k8s-master01 go-devops]# git commit -m "This is test CI/CD"							# 提交到本地仓库
[root@k8s-master01 go-devops]# 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: 1
  selector:
    matchLabels:
      app: test-web-server
  template:
    metadata:
      labels:
        app: test-web-server
    spec:
      containers:
      - name: test-web-server
        image: test-web-server:devops-2023-05-20-15-18-13
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
  name: test-web-server
spec:
  type: NodePort
  ports:
  - name: test-web-server
    port: 8080
    targetPort: 8080
    nodePort: 30188
  selector:
    app: test-web-server
[root@k8s-master01 ~]# kubectl create -f test-web-server.yaml

DevOps系列文章-Kubernetes实现CI与CD配置

8)编写 Jenkins 发版脚本

[root@k8s-master01 ~]# vim jenkins-test.sh
#!/bin/bash
# 固定时间格式
Second=$(date +%Y-%m-%d-%H-%M-%S)
# 备份旧的镜像
Image=$(kubectl -s https://192.168.59.131:6443 describe pod | grep Image: | awk '{print $2}' | grep test)
echo $Image > /opt/test-image-$Second
# 克隆代码
cd /home/shell
if [ -d go-devops ];
then
  mv go-devops  /opt/test-devops-$Second
  git clone git@gitee.com:JavaBigDataStudy/go-devops.git
else
  git clone git@gitee.com:JavaBigDataStudy/go-devops.git
fi
# 发布新的镜像
cd /home/shell/go-devops && docker build -t test-web-server:devops-$Second .
# 上传到镜像仓库
if [ $? -eq 0 ];
then
  docker tag test-web-server:devops-$Second 192.168.59.130:5000/test-web-server:devops-$Second
  docker push 192.168.59.130:5000/test-web-server:devops-$Second
else
  exit 1			# 退出 (防止运行下面命令)
fi
# 替换镜像
sed -i 's/image:.*/image: 192.168.59.130:5000\/test-web-server:devops-'$Second'/g' /home/shell/test-web-server.yaml
# 重启应用
kubectl delete -f /home/shell/test-web-server.yaml
kubectl create -f /home/shell/test-web-server.yaml

[root@k8s-master01 ~]# chmod +x  jenkins-test.sh

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

上传到镜像仓库: 如果你们没有自己的镜像仓库,可以选择调整脚本, 提前安装registry镜像仓库

替换镜像: 我们上面配置的脚本是针对单个模块的,多个模块可以根据 for 循环来实现。

4.验证

1)在 Jenkins 上安装 SSH 插件

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

DevOps系列文章-Kubernetes实现CI与CD配置

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

DevOps系列文章-Kubernetes实现CI与CD配置

DevOps系列文章-Kubernetes实现CI与CD配置

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

DevOps系列文章-Kubernetes实现CI与CD配置

4)配置 Jenkins 流水线
DevOps系列文章-Kubernetes实现CI与CD配置

DevOps系列文章-Kubernetes实现CI与CD配置

DevOps系列文章-Kubernetes实现CI与CD配置

5)修改代码

DevOps系列文章-Kubernetes实现CI与CD配置

6)在 Jenkins 上发布

DevOps系列文章-Kubernetes实现CI与CD配置
DevOps系列文章-Kubernetes实现CI与CD配置
DevOps系列文章-Kubernetes实现CI与CD配置
访问应用服务
DevOps系列文章-Kubernetes实现CI与CD配置

总结:

通过上面的操作,实现了从git提交代码到发布K8S应用服务的整个CICD流程文章来源地址https://www.toymoban.com/news/detail-453135.html

到了这里,关于DevOps系列文章-Kubernetes实现CI与CD配置的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 《DevOps企业级CI/CD实战》:一站式掌握DevOps核心方法论,实现高效自动化部署

    DevOps是一组实践,由人、工具和文化理念组成。DevOps的核心是实现软件开发团队和IT运维团队之间的流程自动化。自2018年起,笔者参与了大型企业中多个项目的DevOps项目实施和改进,从中积累了丰富的实践经验。于是将实践思考与开发经验整理成一本书分享给同路人共同学习

    2024年04月14日
    浏览(50)
  • DevOps 教程 (4) - CI/CD 整合

    在本第四章的\\\"DevOps 教程\\\"系列中,我们将介绍CI/CD整合的概念和实践。我们会介绍DevOps所带来的好处,包括团队协作、开发效率和产品交付速度的显著提升。 我们还将讨论在DevOps中的不同角色,并理解每个角色在持续集成和持续交付中的关键作用。通过了解这些角色,我们将

    2024年02月20日
    浏览(34)
  • DevOps与CI/CD的最佳实践

    在当今的软件开发领域,DevOps(开发与运维的结合)和CI/CD(持续集成/持续交付)已经成为了不可或缺的一部分。它们不仅提高了软件开发的效率,还帮助团队更快地交付高质量的软件。本文将深入探讨DevOps文化和CI/CD的关键概念,以及它们如何改善软件开发流程。 DevOps是一

    2024年02月08日
    浏览(31)
  • 前端自动化部署,Devops,CI/CD

    提到 Jenkins,想到的第一个概念就是 CI/CD 在这之前应该再了解一个概念。 DevOps  Development  和  Operations  的组合,是一种方法论,并不特指某种技术或者工具。DevOps 是一种重视  Dev  开发人员和  Ops  运维人员之间沟通、协作的流程。通过自动化的软件交付,使软件的构建

    2024年02月10日
    浏览(44)
  • 【前端自动化部署】,Devops,CI/CD

    提到 Jenkins ,想到的第一个概念就是 CI/CD 在这之前应该再了解一个概念。 DevOps Development 和 Operations 的组合,是一种方法论,并不特指某种技术或者工具。 DevOps 是一种重视 Dev 开发人员和 Ops 运维人员之间沟通、协作的流程。通过自动化的软件交付,使软件的构建,测试,发

    2024年02月10日
    浏览(32)
  • 实践:devops之云主机模式持续部署(ci-cd)

    https://www.yuque.com/xyy-onlyone/aevhhf?# 《玩转Typora》 2条Jenkins pipeline CI pipeline CD pipeline 标准规范 项目规范与总体设计 公司里面要使用流水线要做持续集成CI/CD的项目越来越多,这对流水线的设计和开发有不同的要求。我们经常听到用户的反馈: 各种 不同语言的技术栈, 如何使流

    2024年02月12日
    浏览(30)
  • DevOps:自动化部署和持续集成/持续交付(CI/CD)

    在现代软件开发领域,DevOps(Development和Operations的组合)已经成为一个不可或缺的概念。它代表了一种将软件开发和运维(Operations)紧密结合的方法,旨在提高软件交付速度、质量和可靠性。本文将深入探讨DevOps中的关键概念,特别是自动化部署和持续集成/持续交付(CI/C

    2024年02月07日
    浏览(47)
  • 前端要了解的k8s、CI/CD、Devops概念

    简单的理解,k8s就是 docker容器集群的管理工具 。他将容器进行更多自动化的操作,自动创建、自动重启、自动扩容等,这个过程称为 容器编排 。 k8s 抽象了硬件资源 ,将N台物理机或云主机抽象成一个资源池,容器的调度交给K8S(例如CPU 不够用就调度到一台足够使用的机器

    2024年02月03日
    浏览(36)
  • devops-5:从0开始构建一条完成的CI CD流水线

    前文中已经讲述了静态、动态增加agent节点,以动态的k8s cloud为例,下面就以Maven构建Java程序为例,开始构建出一条完整的CI CD流水线。 实现功能目标: 1.分别可以根据分支和tag从源码仓库clone代码 2.拿到源码后开始编译 3.构建image,并push到镜像仓库 4.部署到对应k8s集群 5.部署

    2023年04月20日
    浏览(42)
  • 使用Kubernetes进行CI/CD的最佳实践

    CI/CD是指持续集成 (Continuous Integration) 和持续交付/部署 (Continuous Delivery/Deployment) 的缩写,是一种软件开发方法论。通过自动化的构建、测试、部署等过程CI/CD能够帮助开发者快速地将代码交付到生产环境中。 Kubernetes是一种容器编排工具,它非常适合用来部署和运行分布式应用

    2024年02月08日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包