基于 Kubernetes 的 CI/CD 流程介绍

在现代化的软件开发中,持续集成/持续交付(CI/CD)已成为标准流程。Kubernetes 是当今云原生应用程序的先锋,提供了一个高度可扩展且强大的云平台,具有出色的部署、管理和监控功能。在本文中,我们将介绍如何基于 Kubernetes 来构建自己的 CI/CD 流程。

CI/CD 流程

在 CI/CD 流程中,我们首先需要一个版本控制系统,例如 Git。我们可以将我们的代码存储在 Git 上,并使用 Git Hooks 自动运行测试以确保我们的代码没有问题。

当我们提交代码时,一个 CI/CD 工具将通过自动化流程编译和部署我们的代码。我们的目标是自动发现和减少潜在的问题,并将代码部署到生产环境中。

以下是一个基本的 CI/CD 流程:

  1. 程序员在本地机器上修改代码并提交到 git
  2. git 触发钩子,运行测试并在成功时生成一个新的构建
  3. 构建将传递到 CI/CD 工具,例如 Jenkins
  4. CI/CD 工具将构建部署到测试环境,运行更多的测试(例如集成和回归测试)。如果这些测试通过了,构建将自动部署到生产环境。

在本文中,我们将使用 Jenkins 来演示如何将 Kubernetes 用于 CI/CD 流程。

配置 Jenkins

首先,我们需要安装 Jenkins 并配置它来与 Kubernetes 集成。我们可以使用 Jenkins Kubernetes 插件,该插件使 Jenkins 能够从 Kubernetes 中动态分配代理。

安装后,为了能够在 Jenkins 中使用 Kubernetes,我们需要使用许多配置文件。我们可以使用 kubectl 工具来创建这些配置文件。以下是一些配置文件示例:

# k8s_jenkins_namespace.yaml
apiVersion: v1
kind: Namespace
metadata:
  name: jenkins
  labels:
    app: jenkins-ci

---
# k8s_jenkins_svc.yaml
apiVersion: v1
kind: Service
metadata:
  name: jenkins
  namespace: jenkins
  labels:
    app: jenkins-ci
spec:
  type: ClusterIP
  selector:
    app: jenkins-ci
  ports:
  - name: http
    port: 8080
    targetPort: 8080
  - name: jnlp
    port: 50000
    targetPort: 50000

---
# k8s_jenkins_deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: jenkins
  namespace: jenkins
  labels:
    app: jenkins-ci
spec:
  replicas: 1
  selector:
    matchLabels:
      app: jenkins-ci
  template:
    metadata:
      labels:
        app: jenkins-ci
    spec:
      containers:
      - name: jenkins
        image: jenkins/jenkins
        env:
        - name: JAVA_OPTS
          value: "-Xms2g -Xmx2g"
        ports:
        - name: http
          containerPort: 8080
        - name: jnlp
          containerPort: 50000

创建好配置文件之后,我们可以使用 kubectl 工具在 Kubernetes 集群中创建 Jenkins:

kubectl apply -f k8s_jenkins_namespace.yaml
kubectl apply -f k8s_jenkins_svc.yaml
kubectl apply -f k8s_jenkins_deployment.yaml

配置 Jenkinsfile

现在我们已经准备好了 Kubernetes 和 Jenkins 的基本环境,接下来,我们需要为我们的项目创建一个 Jenkinsfile

Jenkinsfile 是 Jenkins 中的一个脚本,它定义了将在 CI/CD 流程中运行的步骤。在本文中,我们将使用 Kubernetes 的构建和发布插件来部署我们的容器。以下是一个 Jenkinsfile 的示例:

pipeline {
  agent {
    kubernetes {
      label 'my-pod'
      cloud 'my-k8s'
      containerTemplate {
        name 'maven'
        image 'maven:3.6.0-jdk-11'
        ttyEnabled true
        command 'cat'
        resourceLimit {
          cpu '1'
          memory '1Gi'
        }
      }
    }
  }
  stages {
    stage('Build') {
      steps {
        container('maven') {
          sh 'mvn clean install'
        }
      }
    }
    stage('Deploy') {
      steps {
        container('maven') {
          sh './scripts/deploy.sh'
        }
      }
    }
  }
}

在上面的示例中,我们首先定义了一个 Kubernetes 代理,然后定义了一个阶段 (stages),该阶段的第一步是构建(Build),第二步是部署(Deploy)。在构建阶段中,我们使用 Maven 构建项目。在部署阶段中,我们使用 deploy.sh 脚本来部署 Docker 容器,该脚本的示例如下:

#!/usr/bin/env bash

set -o errexit
set -o nounset
set -o pipefail

# docker login and push
docker login -u <username> -p <password>
docker build -t <docker-image>:${BUILD_NUMBER} .
docker tag <docker-image>:${BUILD_NUMBER} <docker-image>:latest
docker push <docker-image>:${BUILD_NUMBER}
docker push <docker-image>:latest

# deploy the docker container using kubectl
kubectl set image deployment/<k8s-app-name> <k8s-container-name>=<docker-image>:${BUILD_NUMBER} --record
kubectl rollout status deployment/<k8s-app-name>

该脚本首先登录到 Docker,构建 Docker 镜像,并将它们推送到 Docker Hub。然后,它使用 kubectl set image 命令更新 Kubernetes Deployment,并等待其状态为成功。

总结

在本文中,我们了解了如何将 Kubernetes 用于 CI/CD 流程,并演示了如何使用 Jenkins 运行该流程。使用 Kubernetes 和 Jenkins,我们可以轻松地自动化构建、测试和部署我们的代码,并确保我们的应用程序始终处于最新状态。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65a629c0add4f0e0ffeda982


纠错反馈