Kubernetes 上的 GitLab + ArgoCD 实践(三):使用 ArgoCD 打通 CD 流程

文章目录

  • [ArgoCD 安装](#ArgoCD 安装)
  • 登录ArgoCD控制台
  • CD过程
    • [方式一:透过web ui设置CD](#方式一:透过web ui设置CD)
    • [方法 二:使用清单文件设置CD](#方法 二:使用清单文件设置CD)
  • 同步与监控应用程序
    • [GitHub 更新并触发自动同步(Automatic Sync)](#GitHub 更新并触发自动同步(Automatic Sync))
    • 验证:
  • 总结

Kubernetes 上的 GitLab + ArgoCD 实践(一):实现基础 CI/CD 流程
Kubernetes 上的 GitLab + ArgoCD 实践(二):使用自建 GitLab Runner 完善 CI 流程

在上两篇文章:中,我们已经介绍了一个简单的CI过程,顾名思义,CI即Continious integration(持续集成),我们继承后的项目最终需要落地,部署到无论测试还是生产环境, 接下来,在本篇文章中,我们将落实最后的一公里,利用argoCD来实现CD(Continious delivery)的部分

在上一篇文章中,我们build了一个image,并定义了一个deployment.yaml放置于gitops-repo中,现在我们需要透过argocd部署到k8s环境中

ArgoCD 安装

我使用的是 Kubernetes 集群版本 v1.31.8,并且使用了 ingress-nginx,它的 ingress.class 名称是 "nginx"。

首先,先创建一个 argocd 命名空间。

bash 复制代码
kubectl create namespace argocd

编辑 argocd 清单,添加选项 --- insecure

bash 复制代码
nano install.yaml
containers:
      - args:
        - /usr/local/bin/argocd-server
        - --insecure #这里增加--insecure

在编辑 ArgoCD deployment时使用的 --insecure 选项,表示连接到 ArgoCD 服务器时将不会检查其证书得真实性(不安全模式)。使用这个选项会在与 ArgoCD 服务器通信时禁用 SSL 证书的验证。

在修改完 manifest 之后,再部署该 manifest。

bash 复制代码
kubectl apply -n argocd -f install.yaml

当 Pod 正常运行且没有问题后,为 ArgoCD 的服务部署 Ingress。下面是 ArgoCD 的 Ingress manifest。

bash 复制代码
apiVersion: v1
items:
- apiVersion: networking.k8s.io/v1
  kind: Ingress
  metadata:
    name: argocd-internal
    namespace: argocd
  spec:
    ingressClassName: nginx
    rules:
    - http:
        paths:
        - backend:
            service:
              name: argocd-server
              port:
                number: 80
          path: /
          pathType: Prefix 
  ""
部署ingress清单
```bash
kubectl apply -f ingress.yaml

登录ArgoCD控制台

检查 ArgoCD 的控制台(dashboard),以确保 Ingress 正常运行并且没有问题。

确认能正常打开ArgoCD控制台,接下来获取密码,以便登录到 ArgoCD 的控制台(Dashboard)。

bash 复制代码
kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d;echo -e "\n"

用户名方面,ArgoCD 默认使用 admin 用户。

至此,我们已经顺利登入ArgoCD控制台

CD过程

CD(持续部署)的核心作用,是自动将代码仓库中已合并的稳定版本,同步部署到目标环境(如 Kubernetes 集群)。整个过程无需人工干预,既能减少手动操作的失误,也能确保应用从开发、测试到生产上线的流程高效且一致。

我们能透过如下两种方式配置CD:

方式一:透过web ui设置CD

设置 Argocd 仓库:进入 "设置"(Settings)→"仓库"(Repositories)→"连接仓库"(connect repo),然后根据仓库信息进行相应调整。

创建 Git 仓库:首先,需要创建一个包含你的 Kubernetes 清单文件(manifests)的 Git 仓库。该仓库将作为 ArgoCD 部署应用时的数据源。

我们将使用前面文章中使用的gitops-rep仓库

  1. 在 ArgoCD 控制台中,点击 "New App",并填写以下信息:
  • Application Name: my-first-application
  • Project Name: default,
    注意这里的default它不是 Kubernetes 的 namespace也不是 GitLab 的 project,是 ArgoCD 自带的应用分组。新建的应用如果没特别要求权限或目标环境,放在 default 就能直接部署到任意允许的集群与命名空间。
  • Sync Policy: Manual或Automatic (根据你的需求)
  • SYNC OPTIONS:这里仅勾选AUTO CREATE NAMESPACE
    其他,结合ArgoCD文档说明并根据需要选取
  • SOURCE:
    Repository URL:填入gitlab仓库的url,我这里填入先前章节介绍的gitops-repo的git url
    Path: 填入deployment.yaml所在的目录,在我的示例中,位于gitops-repo底下的myapp中,故填写myapp,如果直接位于gitops-repo下,填写"."即可
  • DESTINATION:
    Cluster URL: 保留当前集群的默认值,https://kubernetes.defaults.svc
    namespace: 应用程序将被部署的目标命名空间,此示例中是my-first-application
  • Directory: 有4个选项,helm、kustomize、directory、plugin,根据需要选择,此示例中选择directory
    DIRECTORY RECURSE(目录递归):如果 myapp 目录下还有子目录且需要扫描其中的配置文件,可勾选此选项;若只有 deployment.yaml 一个文件在 myapp 根目录,不勾选也可以。
    其他如 TOP-LEVEL ARGUMENTS、EXTERNAL VARIABLES、INCLUDE、EXCLUDE 等,在当前场景下若没有特殊参数或文件包含 / 排除需求,保持默认即可。

    应用创建完成后,点击 "同步(Sync)" 即可将应用部署到你的 Kubernetes 集群。如果同步策略(Sync Policy)设置为 "自动(Automatic)",应用将会自动部署到 Kubernetes 集群中。
    其中,"Sync" 是 ArgoCD 中触发部署动作的关键操作,"Sync Policy" 是控制部署触发方式的策略配置,"Automatic" 模式下 ArgoCD 会自动监控 Git 仓库的变更并同步到集群,这些术语在技术场景中保留英文以便准确理解功能。
    sync后,点击查看同步状况

使用 kubectl get applications -A应该能输出刚刚部署的application:

bash 复制代码
 kubectl get applications -A
NAMESPACE   NAME                   SYNC STATUS   HEALTH STATUS
argocd      my-first-application   Synced        Healthy```

同时,也可以进入k8s集群查看部署状况
这里将看到部署了一个deployment(带一个pod)以及一个service
```bash
 kubectl get all -n my-first-application
NAME                                    READY   STATUS    RESTARTS   AGE
pod/nginx-deployment-6584b54554-nhd4q   1/1     Running   0          26s

NAME            TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
service/myapp   ClusterIP   10.97.31.129   <none>        80/TCP    31s

NAME                               READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/nginx-deployment   1/1     1            1           27s

NAME                                          DESIRED   CURRENT   READY   AGE
replicaset.apps/nginx-deployment-6584b54554   1         1         1       27s

方法 二:使用清单文件设置CD

你也可以通过在清单文件(manifest file)中定义 ArgoCD 应用,再使用 kubectl 应用该文件来创建 ArgoCD 应用。

在此示例中,我们将my-first-application的yaml文件稍加改造,用于示范使用manifest文件部署应用

  • 创建清单:最简单的方式,将上述步骤一中创建的my-first-application ,
bash 复制代码
kubectl get applications -n argocd -o yaml > my-second-application.yaml

改造清单:我们将对上面的输出内容进行改造,主要改造的地方如下:

  • 删除.status部分
  • 删除.metadata.creationTimestamp
  • 删除.metadata.generation
  • 删除.metadata.uid
  • 删除.metadata.resourceVersion
bash 复制代码
yq 'del(.status)' my-second-application.yaml -i -y
yq 'del(.metadata.creationTimestamp)' my-second-application.yaml -i -y
yq 'del(.metadata.generation)' my-second-application.yaml  -i -y
yq 'del(.metadata.uid)' my-second-application.yaml  -i -y
yq 'del(.metadata.resourceVersion)' my-second-application.yaml  -i -y
  • 修改.metadata.name的值为my-second-application
  • 修改.spec.destination.namespace的值为my-second-application
    改造后,最终输出如下:
bash 复制代码
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  finalizers:
    - resources-finalizer.argocd.argoproj.io
  name: my-second-application
  namespace: argocd
spec:
  destination:
    namespace: my-second-application
    server: https://kubernetes.default.svc
  project: default
  source:
    path: myapp
    repoURL: https://gitlab.com/laker.whu-group/gitops-repo.git
    targetRevision: HEAD
  syncPolicy:
    automated:
      enabled: true
      selfHeal: true
    syncOptions:
      - CreateNamespace=true

应用manifest文件

bash 复制代码
kubectl apply -f my-second-application.yaml

这条命令会在 argocd 命名空间中创建一个名为 my-second-application 的 ArgoCD 应用:

bash 复制代码
kubectl get application my-second-application -n argocd
NAME                    SYNC STATUS   HEALTH STATUS
my-second-application   Synced        Healthy

该应用将从指定的 Git 仓库同步你的 Kubernetes 清单文件。

bash 复制代码
kubectl get all -n my-second-application
NAME                                    READY   STATUS    RESTARTS   AGE
pod/nginx-deployment-6584b54554-b62bt   1/1     Running   0          22m

NAME            TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
service/myapp   ClusterIP   10.101.0.121   <none>        80/TCP    22m

NAME                               READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/nginx-deployment   1/1     1            1           22m

NAME                                          DESIRED   CURRENT   READY   AGE
replicaset.apps/nginx-deployment-6584b54554   1         1         1       22m

同步与监控应用程序

同步完成后,ArgoCD 会开始部署该应用程序。

你可以在仪表板(Dashboard)中监控部署进度。

如果出现任何问题,ArgoCD 会在界面上标示出来,你可以直接在 UI 中采取修正措施。

ArgoCD 还支持诸如 自动回滚、自我修复 等功能,

以确保你的 Kubernetes 集群始终与 Git 仓库中定义的目标状态保持一致。

GitHub 更新并触发自动同步(Automatic Sync)

ArgoCD 的一项强大功能是它能够 自动同步(Automatic Sync) 你的 Kubernetes 集群与 Git 仓库。

这意味着,只要你在 GitHub 中对 manifests 进行任何修改,这些变更都会 自动应用(apply) 到你的集群中。

接下来,我们通过一个示例来演示这个功能,这个示例仍然使用前面my-first-application与my-second-application所引用的gitops-repo中的deployment.yaml

  1. 首先,clone仓库
bash 复制代码
cd /root/demo-cicd-project
https://gitlab.com/laker.whu-group/gitops-repo.git
  1. 修改deployment.yaml
    修改gitops-repo/myapp/deployment,将.metadata.name的值从原来的nginx-deployment变更为nginx-deployment-2
  • 变更前:
bash 复制代码
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: registry.gitlab.com/laker.whu-group/app-repo:16a969d2
          ports:
            - containerPort: 80
  • 变更后:
bash 复制代码
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment-2
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: registry.gitlab.com/laker.whu-group/app-repo:16a969d2
          ports:
            - containerPort: 80
  1. 增加自动prune功能
    由于之前在 ArgoCD 中创建的应用未启用 Prune 特性,导致旧资源在更新或删除时无法被自动清理。为了解决这个问题,可以执行以下命令,为应用开启自动清理(Prune)功能:
bash 复制代码
kubectl patch app my-second-application -n argocd -p '{"spec":{"syncPolicy":{"automated":{"prune":true}}}}' --type merge
  1. 推送更新至 Git 仓库
    执行以下命令提交代码并推送到远程仓库,推送完成后将触发 ArgoCD 的同步检测(若启用自动同步):
bash 复制代码
git add .
git commit -m "update deployment name"
git push origin main

验证:

启用 ArgoCD 的自动同步策略后,只要你将此变更推送到 GitHub 仓库,ArgoCD 就会检测到该更新,并自动将其应用到你的 Kubernetes 集群中。

随后会执行以下操作:

  • 删除 nginx-deploy 这个 Deployment(部署)资源
  • 创建 nginx-deploy-1 这个 Deployment(部署)资源
    下图输出能显示my-second-application这个应用已经成功同步

    同时,我们能执行以下命令查看目标命名空间下的资源状态:
bash 复制代码
 kubectl get deployment -n my-second-application

输出如下,deployment的名字已经从原来的nginx-deployment变更为nginx-deployment-1

bash 复制代码
NAME                 READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment-1   1/1     1            1           112m

总结

在本文中,我们详细介绍了如何在 Kubernetes 集群上安装 ArgoCD,以及如何使用 ArgoCD 部署你的应用。ArgoCD 是一款功能强大的工具,它通过 GitOps 实践简化了 Kubernetes 资源的管理流程。完成当前配置后,你可以进一步探索 ArgoCD 的更多高级功能,例如自动回滚(automated rollbacks)、应用健康监控(application health monitoring)和多集群管理(multi-cluster management)。

相关推荐
starandsea21 小时前
gitlab解决传过大文件后删除导致pack过大问题
大数据·elasticsearch·gitlab
liming4951 天前
Ubuntu18.04部署k8s
云原生·容器·kubernetes
喜欢你,还有大家1 天前
集群——GitLab&&Jenkins部署
运维·gitlab·jenkins
YC运维1 天前
Kubernetes资源管理全解析
java·容器·kubernetes
Leinwin1 天前
微软发布Azure Kubernetes Service Automatic国际版
microsoft·kubernetes·azure
西部森林牧歌1 天前
Arbess零基础学习,使用Arbess+GitLab实现Vue.js项目构建并主机部署
vue.js·gitlab·arbess·tiklab devops
退役小学生呀1 天前
二十二、DevOps:基于Tekton的云原生平台落地(三)
linux·云原生·容器·kubernetes·k8s·devops·tekton
维尔切1 天前
搭建 k8s
云原生·容器·kubernetes
hwj运维之路1 天前
《Kubernetes面试题汇总系列》
云原生·容器·kubernetes