【 云原生 | kubernetes 】- Argo CD 持续交付

简介: ArgoCD 是一个 GitOps 代理,它将 Git 存储库中描述的应用程序的状态与 Kubernetes 集群中的部署同步。

Argo CD 是用于 Kubernetes 的声明式 GitOps 持续交付工具。

什么是 GitOps?

文章开始我们先了解一下GitOps

GitOps 允许由 Git 控制整个代码交付过程,包括基础设施和应用程序定义为代码以及自动更新和回滚。简单来说就是在Git存储库中存储和管理部署的应用。

ArgoCD 是一个 GitOps 代理,它将 Git 存储库中描述的应用程序的状态与 Kubernetes 集群中的部署同步。

在这里插入图片描述

在上图示例中,我们讲学习如何使用Tekton Pipeline、Argo CD、Helm来构建GitOps工作流。使用以下组件:

  • Tekton Pipeline
  • 使用Helm Chart的Kubernetes模板
  • 使用Argo CD进行持续部署

先决条件

Argo CD是用在Kubernetes上的工具。所以在这之前,我们需要启动一个Kubernetes集群。

在这里插入图片描述

安装Argo CD

我们可通过helm来进行安装,也可通过官方提供的yaml文件来进行安装,两种方式都在下面贴出

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

这将创建一个新的命名空间 ,argocdArgo CD 服务和应用程序资源将在其中存在。

​ 这里需要注意一个地方,安装清单中ClusterRoleBinding绑定argocd命名空间得资源。如果将argocd 安装到别的命名空间下需注意修改。如遇到kubernetes cluster访问不成功,权限问题,那就是这的情况。

访问服务器UI

1>端口转发

Kubectl 端口转发也可用于连接到 API 服务器而不暴露服务。

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

然后可以使用 https://localhost:8080 访问 API 服务器

2>路由转发

按照ingress 文档了解如何使用 ingress 配置 Argo CD。

ArgoCD CLI

创建CD部署有两种选择,一种是通过CLI,一种是通过UI。我们这里使用CLI,因为它更具有声明性

admin帐户的初始密码是自动生成的,并以明文形式存储 在您的 Argo CD 安装命名空间中命名password的密码字段中。argocd-initial-admin-secret您可以使用以下方法简单地检索此密码kubectl

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

使用上面的用户名密码,登录Argo CD,也可通过webUI账号密码登录访问。

[root@master ~]# argocd login 10.177.9.244:31005 --insecure --username admin --grpc-web
Password: 
'admin:login' logged in successfully
Context '10.177.9.244:31005' updated
  • --insecure 跳过服务器证书和域验证
  • --grpc-web 启用grpc-web协议

Create Application

使用 CLI 创建 Argo 应用程序

argocd app create web-service \
--repo http://10.177.9.244:31002/gstrain/project.git \
--path webservice \
--dest-server https://kubernetes.default.svc \
--dest-namespace webservice

我们创建了指向源repo和path清单文件存储的位置,定义了在集群部署应用程序的位置。

在这里插入图片描述

ArgoCD 还支持各种类型的模板工具,例如 Kustomize 和 Helm。这里我们使用 Helm,它定义了模板或 K8s 资源的集合。使用可配置的值文件可以灵活地表示不同类型的应用程序或部署阶段。

Helm chaim

​ 为了进行设置,我们通过运行以下命令创建名为webservice的helm chart: helm create webservice该项目的结构如下

[root@sztcyl-177-9-244 ~]# cd project/webservice/
[root@sztcyl-177-9-244 webservice]# ls
charts  Chart.yaml  templates  values.yaml
[root@sztcyl-177-9-244 webservice]# 
如果对Helm不熟悉,可通过官网学习了解 Helm

查看**Chart.yaml**文件,它描述了图表信息以及应用程序版本。此**appVersion**参数是推送新版本时 CI 将更新的位置。接下来,**values.yaml**文件是要传递给模板的声明变量。例如,您可以看到**deployment.yaml** 模板如何使用来自repositoryappVersion定义容器图像的值。

[root@sztcyl-177-9-244 webservice]# cat values.yaml 
# Default values for webservice.
# This is a YAML-formatted file.
# Declare variables to be passed into your templates.

replicaCount: 1

image:
  repository: hub.17usoft.com/gstrain/web-service
  pullPolicy: IfNotPresent
  # Overrides the image tag whose default is the chart appVersion.
  tag: "master-e428d31"

imagePullSecrets: [{ name: first-registry}]
nameOverride: "webservice"
fullnameOverride: "webservice"

serviceAccount:
  # Specifies whether a service account should be created
  create: true
  # Annotations to add to the service account
  annotations: {}
  # The name of the service account to use.
  # If not set and create is true, a name is generated using the fullname template
  name: ""

podAnnotations: {}

podSecurityContext: {}
  # fsGroup: 2000

securityContext: {}
  # capabilities:
  #   drop:
  #   - ALL
  # readOnlyRootFilesystem: true
  # runAsNonRoot: true
  # runAsUser: 1000

service:
  type: NodePort
  port: 9090

ingress:
  enabled: false
  className: ""
  annotations: {}
    # kubernetes.io/ingress.class: nginx
    # kubernetes.io/tls-acme: "true"
  hosts:
    - host: chart-example.local
      paths:
        - path: /
          pathType: ImplementationSpecific
  tls: []
  #  - secretName: chart-example-tls
  #    hosts:
  #      - chart-example.local

resources: {}
  # We usually recommend not to specify default resources and to leave this as a conscious
  # choice for the user. This also increases chances charts run on environments with little
  # resources, such as Minikube. If you do want to specify resources, uncomment the following
  # lines, adjust them as necessary, and remove the curly braces after 'resources:'.
   limits:
     cpu: 100m
     memory: 128Mi
   requests:
     cpu: 100m
     memory: 128Mi

autoscaling:
  enabled: false
  minReplicas: 1
  maxReplicas: 100
  targetCPUUtilizationPercentage: 80
  # targetMemoryUtilizationPercentage: 80

nodeSelector: {}

tolerations: []

affinity: {}
You have new mail in /var/spool/mail/root

使用Helm创建APP,参数会参照value.yaml文件补齐,然后create

在这里插入图片描述

持续交付

上篇文章tekton构建CI/CD流水线(二)新增了一个名为Modify listing的task,它的作用就是帮我们去修改清单内容,修改成功之后Argo CD检测sync进行同步发布操作。上篇我们使用的是yaml清单来对我们的应用进行部署,修改的是containers[0].image部分,现在我们是用helm进行部署,和之前类似,只不过只用修改values.yaml中的镜像tag即可。

Helm不太熟悉的同学可以了解下这片文章

task内容修改如下:

    - name: IMAGE_URL_TAG
      type: string
      description: |
        The latest build image tag
      default: "$(tasks.fetch-repo.results.short-branch-name)-$(tasks.fetch-repo.results.commit)"

    - name: GIT_SCRIPT
      description: The git script to run.
      type: string
      default: |
        ls -l
        echo $subdirectory
        cd $subdirectory
        git clone --branch master --depth 1  http://gstrain:zz52130++@10.177.9.244:31002/gstrain/project.git manifests
        cd manifests/$subdirectory
        ls -la
        echo old value:
        cat values.yaml | yq r - 'image.tag'
        echo replacing with new value:
        yq w -i values.yaml 'image.tag' "$IMAGE_URL_TAG"
        echo verifying new value :
        yq r values.yaml image.tag
        if ! git diff-index --quiet HEAD --; then
          git status
          git add .
          git commit -m "auto updated yaml by tekton pipeline"
          git push
        else
            echo "no changes, git repository is up to date"
        fi

结合前面tekton的内容,我们的发布流程到这里就结束了,了解GitOps, GitOps 也是 CI/CD 的扩展,而 CI/CD 是 GitOps 的核心。为什么要用也呢?我想大家最早都听过DevOps,和GitOps都是一种理念,如果没有 CI/CD 自动化工具和流程,GitOps 就毫无意义。

参考文献

https://argo-cd.readthedocs.io/en/stable/

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
5月前
|
Kubernetes Devops 应用服务中间件
基于 Azure DevOps 与阿里云 ACK 构建企业级 CI/CD 流水线
本文介绍如何结合阿里云 ACK 与 Azure DevOps 搭建自动化部署流程,涵盖集群创建、流水线配置、应用部署与公网暴露,助力企业高效落地云原生 DevOps 实践。
574 1
|
7月前
|
Cloud Native 中间件 调度
云原生信息提取系统:容器化流程与CI/CD集成实践
本文介绍如何通过工程化手段解决数据提取任务中的稳定性与部署难题。结合 Scrapy、Docker、代理中间件与 CI/CD 工具,构建可自动运行、持续迭代的云原生信息提取系统,实现结构化数据采集与标准化交付。
251 1
云原生信息提取系统:容器化流程与CI/CD集成实践
|
12月前
|
Cloud Native Serverless 数据中心
阿里云ACK One:注册集群支持ACS算力——云原生时代的计算新引擎
ACK One注册集群已正式支持ACS(容器计算服务)算力,为企业的容器化工作负载提供更多选择和更强大的计算能力。
|
12月前
|
Cloud Native Serverless 数据中心
阿里云ACK One:注册集群支持ACS算力——云原生时代的计算新引擎
阿里云ACK One:注册集群支持ACS算力——云原生时代的计算新引擎
351 10
|
存储 Kubernetes 开发者
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
Docker 是一种开源的应用容器引擎,允许开发者将应用程序及其依赖打包成可移植的镜像,并在任何支持 Docker 的平台上运行。其核心概念包括镜像、容器和仓库。镜像是只读的文件系统,容器是镜像的运行实例,仓库用于存储和分发镜像。Kubernetes(k8s)则是容器集群管理系统,提供自动化部署、扩展和维护等功能,支持服务发现、负载均衡、自动伸缩等特性。两者结合使用,可以实现高效的容器化应用管理和运维。Docker 主要用于单主机上的容器管理,而 Kubernetes 则专注于跨多主机的容器编排与调度。尽管 k8s 逐渐减少了对 Docker 作为容器运行时的支持,但 Doc
551 5
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
|
Kubernetes Cloud Native 微服务
云原生入门与实践:Kubernetes的简易部署
云原生技术正改变着现代应用的开发和部署方式。本文将引导你了解云原生的基础概念,并重点介绍如何使用Kubernetes进行容器编排。我们将通过一个简易的示例来展示如何快速启动一个Kubernetes集群,并在其上运行一个简单的应用。无论你是云原生新手还是希望扩展现有知识,本文都将为你提供实用的信息和启发性的见解。
|
Kubernetes Cloud Native 云计算
云原生入门:Kubernetes 和容器化基础
在这篇文章中,我们将一起揭开云原生技术的神秘面纱。通过简单易懂的语言,我们将探索如何利用Kubernetes和容器化技术简化应用的部署和管理。无论你是初学者还是有一定经验的开发者,本文都将为你提供一条清晰的道路,帮助你理解和运用这些强大的工具。让我们从基础开始,逐步深入了解,最终能够自信地使用这些技术来优化我们的工作流程。
|
存储 Cloud Native 数据处理
从嵌入式状态管理到云原生架构:Apache Flink 的演进与下一代增量计算范式
本文整理自阿里云资深技术专家、Apache Flink PMC 成员梅源在 Flink Forward Asia 新加坡 2025上的分享,深入解析 Flink 状态管理系统的发展历程,从核心设计到 Flink 2.0 存算分离架构,并展望未来基于流批一体的通用增量计算方向。
439 0
从嵌入式状态管理到云原生架构:Apache Flink 的演进与下一代增量计算范式
|
6月前
|
运维 监控 Cloud Native
从本土到全球,云原生架构护航灵犀互娱游戏出海
本文内容整理自「 2025 中企出海大会·游戏与互娱出海分论坛」,灵犀互娱基础架构负责人朱晓靖的演讲内容,从技术层面分享云原生架构护航灵犀互娱游戏出海经验。
578 16
|
6月前
|
运维 监控 Cloud Native
从本土到全球,云原生架构护航灵犀互娱游戏出海
内容整理自「 2025 中企出海大会·游戏与互娱出海分论坛」,灵犀互娱基础架构负责人朱晓靖的演讲内容,从技术层面分享云原生架构护航灵犀互娱游戏出海经验。

热门文章

最新文章

推荐镜像

更多