Kubernetes CI/CD 怎么集成?

文章导读
Previous Quiz Next 持续集成和持续部署(CI/CD)在高效交付应用方面发挥着重要作用。Kubernetes 通过提供可扩展且自动化的平台来部署应用,在现代 DevOps 工作流程中扮演着关键角色。通过将 Kubernetes 与 CI/CD 管道集成,我
📋 目录
  1. A Kubernetes 中的 CI/CD 理解
  2. B 结论
A A

Kubernetes 中的 CI/CD 集成



Previous
Quiz
Next

持续集成和持续部署(CI/CD)在高效交付应用方面发挥着重要作用。Kubernetes 通过提供可扩展且自动化的平台来部署应用,在现代 DevOps 工作流程中扮演着关键角色。通过将 Kubernetes 与 CI/CD 管道集成,我们可以实现更快的部署、自动回滚以及最小停机时间的无缝更新。

在本章中,我们将探讨如何将 Kubernetes 与 CI/CD 集成,涵盖基础概念、工具和最佳实践,这些将帮助我们简化部署流程。

Kubernetes 中的 CI/CD 理解

CI/CD 代表 Continuous Integration 和 Continuous Deployment,这是一套旨在自动化应用程序开发、测试和部署的实践。

  • Continuous Integration (CI) − 开发者频繁地将代码变更推送到共享仓库。这些变更会自动构建、测试和验证,以确保不会引入错误。
  • Continuous Deployment (CD) − 一旦变更通过 CI,它会自动部署到生产或 staging 环境,减少手动干预并提高发布速度。

借助 Kubernetes,我们可以自动化应用程序的部署、扩展和管理,使其成为 CI/CD 的完美搭档。

为什么在 CI/CD 中使用 Kubernetes?

将 CI/CD 与 Kubernetes 集成提供了多项优势 −

  • Scalability − Kubernetes 通过动态扩展确保应用程序能够处理流量波动。
  • Rolling Updates and Rollbacks − 以零停机时间部署应用程序的新版本,并在出现问题时轻松回滚到先前版本。
  • Declarative Configuration − Kubernetes 使用 YAML manifests 将基础设施定义为代码,确保跨环境的一致性。
  • Automation − Kubernetes operators 和 controllers 有助于自动化部署、监控和自愈等任务。

Kubernetes 的 CI/CD 工具

要在 Kubernetes 中实现 CI/CD,我们将使用以下工具 −

  • GitHub − 开发者推送变更的代码仓库。
  • GitHub Actions − 用于构建、测试和部署应用程序的 CI/CD 自动化工具。
  • Containerd − 在部署到 Kubernetes 之前用于 containerize 应用程序。
  • ArgoCD − 基于 GitOps 的 continuous deployment 工具。

这些工具中的每一个都在自动化我们的 Kubernetes 部署管道中发挥关键作用。

步骤 1:设置 GitHub 仓库

我们将从创建一个 GitHub 仓库开始,用于存储应用程序代码和 CI/CD 配置。

访问 GitHub 并登录您的账户。点击右上角的 + 图标,选择 New repository。我们将仓库命名为 kubernetes-cicd 并初始化它。

仓库创建完成后,使用以下命令将其克隆到本地 −

$ git clone https://github.com/your-username/kubernetes-cicd.git
$ cd kubernetes-cicd

步骤 2:设置 GitHub Actions CI/CD 管道

导航到克隆的仓库文件夹并创建所需的目录 −

$ mkdir -p .github/workflows

创建 CI/CD 工作流文件

使用文本编辑器创建以下工作流文件 −

$ nano .github/workflows/ci-cd.yml

然后,添加以下 YAML 内容并保存文件 −

name: CI/CD Pipeline
on:
   push:
   branches:
      - main
jobs:
   build:
      runs-on: ubuntu-latest
   steps:
      - name: Checkout Code
         uses: actions/checkout@v3
      - name: Set up Docker
         uses: docker/setup-buildx-action@v2
      - name: Build Docker Image
         run: |
            docker build -t myapp:latest .
      - name: Push to Docker Hub
         run: |
            echo "${{ secrets.DOCKER_PASSWORD }}" | docker login -u "${{ secrets.DOCKER_USERNAME }}" --password-stdin
            docker tag myapp:latest myrepo/myapp:latest
            docker push myrepo/myapp:latest

步骤 3:提交和推送变更

设置仓库并添加必要文件后,我们需要将它们提交并推送到 GitHub。

暂存所有变更

$ git add -A

此命令将仓库中的所有变更暂存,包括新文件、修改文件和删除文件。

提交变更

$ git commit -m "Added GitHub Actions CI/CD workflow and removed README.md"

输出

[main cddfa2c] Added GitHub Actions CI/CD workflow and removed README.md
 1 file changed, 1 deletion(-)
 delete mode 100644 README.md

提交消息确认已在本地仓库中创建了一个新提交,记录了 CI/CD 工作流的添加和 README.md 的删除。

将变更推送到 GitHub

$ git push origin main

输出

Username for 'https://github.com': asigoondara
Password for 'https://asigoondara@github.com': 
Enumerating objects: 9, done.
Counting objects: 100% (9/9), done.
Delta compression using up to 4 threads
Compressing objects: 100% (5/5), done.
Writing objects: 100% (9/9), 967 bytes | 967.00 KiB/s, done.
Total 9 (delta 1), reused 0 (delta 0), pack-reused 0
remote: Resolving deltas: 100% (1/1), done.
To https://github.com/asigoondara/kubernetes-cicd.git
 * [new branch]      main -> main

解释

GitHub 会提示输入凭据以验证推送。

仓库现在包含最新的变更,包括 CI/CD 工作流。

消息 new branch main -> main 确认我们的分支已成功更新到远程仓库。

步骤 4:使用 ArgoCD 部署到 Kubernetes

现在我们的代码已在 GitHub 中,我们将使用 ArgoCD(基于 GitOps 的部署工具)来部署应用程序。

安装 ArgoCD

$ kubectl create namespace argocd
$ kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml

输出

customresourcedefinition.apiextensions.k8s.io/applications.argoproj.io created
customresourcedefinition.apiextensions.k8s.io/applicationsets.argoproj.io created
customresourcedefinition.apiextensions.k8s.io/appprojects.argoproj.io created
serviceaccount/argocd-application-controller created
serviceaccount/argocd-applicationset-controller created
serviceaccount/argocd-dex-server created
serviceaccount/argocd-notifications-controller created
serviceaccount/argocd-redis created
serviceaccount/argocd-repo-server created

访问 ArgoCD UI

$ kubectl port-forward svc/argocd-server -n argocd 8080:443

输出

Forwarding from 127.0.0.1:8080 -> 8080
Forwarding from [::1]:8080 -> 8080

此输出确认端口转发已成功建立,我们可以通过 https://localhost:8080 访问 ArgoCD UI。

Argo User Interface

检索 ArgoCD 管理员密码

$ kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d

输出

fUBg7s8lv30EtBjq

此命令从 Kubernetes secrets 中提取并解码 ArgoCD 管理员密码,使我们能够登录。

通过 CLI 登录 ArgoCD

$ sudo argocd login localhost:8080 --insecure

输出

Username: admin
Password: 
'admin:login' logged in successfully
Context 'localhost:8080' updated

解释

我们使用先前检索的凭据登录到 ArgoCD CLI。

--insecure 标志用于绕过 localhost 连接的证书验证。

消息 Context 'localhost:8080' updated 确认登录成功。

应用 ArgoCD 应用程序 YAML 文件

在应用 ArgoCD 应用程序 YAML 文件之前,我们需要在本地机器上创建并保存它为 .yaml 文件。为此,我们将创建一个名为 myapp.yaml 的文件,然后使用 kubectl 应用它。

创建并打开 YAML 文件

使用文本编辑器如 nano 创建文件 −

$ nano myapp.yaml

然后,将以下内容粘贴到文件中 −

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
   name: myapp
   namespace: argocd
spec:
   project: default
   destination:
      namespace: default
      server: https://kubernetes.default.svc
   source:
      repoURL: https://github.com/myrepo/myapp.git
      targetRevision: main
      path: k8s
   syncPolicy:
      automated:
         prune: true
         selfHeal: true

文件保存后,使用以下命令应用它 −

$ kubectl apply -f myapp.yaml --validate=false

此命令指示 Kubernetes 根据指定的配置在 ArgoCD 中创建应用程序。

输出

application.argoproj.io/myapp created

最后,我们使用以下命令同步应用程序 −

$ argocd app sync myapp

输出

TIMESTAMP  NAME    STATUS      MESSAGE                         
---------- ------- ----------- -----------------------------------
15:30:45   myapp   Synced      Successfully synced (all tasks run)
15:30:45   myapp   Healthy     Application is healthy

此输出确认我们的应用程序已成功同步,并且当前状态与仓库中定义的期望状态匹配。

结论

将 Kubernetes 与 CI/CD 集成可以简化部署流程,提高可靠性,并减少手动干预。通过利用 GitHub Actions、Containerd 和 ArgoCD 等工具,我们可以高效地自动化构建、测试和部署应用程序。

采用正确的实践,我们可以确保应用程序始终保持最新状态、高可用且随时准备扩展。现在,您可以将这些知识应用到自己的 Kubernetes 环境中,开始实施 CI/CD 流水线。