Kubernetes 中的 CI/CD 集成
持续集成和持续部署(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。
检索 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 流水线。