【 云原生 | 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/

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
25天前
|
Kubernetes Cloud Native 微服务
云原生入门与实践:Kubernetes的简易部署
云原生技术正改变着现代应用的开发和部署方式。本文将引导你了解云原生的基础概念,并重点介绍如何使用Kubernetes进行容器编排。我们将通过一个简易的示例来展示如何快速启动一个Kubernetes集群,并在其上运行一个简单的应用。无论你是云原生新手还是希望扩展现有知识,本文都将为你提供实用的信息和启发性的见解。
|
1月前
|
Kubernetes Cloud Native 开发者
云原生入门:Kubernetes的简易指南
【10月更文挑战第41天】本文将带你进入云原生的世界,特别是Kubernetes——一个强大的容器编排平台。我们将一起探索它的基本概念和操作,让你能够轻松管理和部署应用。无论你是新手还是有经验的开发者,这篇文章都能让你对Kubernetes有更深入的理解。
|
1月前
|
运维 Kubernetes Cloud Native
云原生技术入门:Kubernetes和Docker的协同工作
【10月更文挑战第43天】在云计算时代,云原生技术成为推动现代软件部署和运行的关键力量。本篇文章将带你了解云原生的基本概念,重点探讨Kubernetes和Docker如何协同工作以支持容器化应用的生命周期管理。通过实际代码示例,我们将展示如何在Kubernetes集群中部署和管理Docker容器,从而为初学者提供一条清晰的学习路径。
|
1月前
|
Kubernetes 负载均衡 Cloud Native
探索Kubernetes:云原生应用的基石
探索Kubernetes:云原生应用的基石
|
27天前
|
Kubernetes Cloud Native 云计算
云原生入门:Kubernetes 和容器化基础
在这篇文章中,我们将一起揭开云原生技术的神秘面纱。通过简单易懂的语言,我们将探索如何利用Kubernetes和容器化技术简化应用的部署和管理。无论你是初学者还是有一定经验的开发者,本文都将为你提供一条清晰的道路,帮助你理解和运用这些强大的工具。让我们从基础开始,逐步深入了解,最终能够自信地使用这些技术来优化我们的工作流程。
|
存储 运维 Kubernetes
阿里云数字新基建系列:云原生操作系统Kubernetes-第1章(4)
阿里云数字新基建系列包括5本书,题材涉及Kubernetes、混合云架构、云数据库、CDN原理与流媒体技术、云服务器运维(Windows),囊括了领先的云技术知识与阿里云技术团队独到的实践经验,是国内IT技术图书中又一套重磅作品! 本书是阿里云容器服务产品线上实践的技术沉淀,主要包括理论篇和实践篇两部分内容。理论篇注重理论介绍,核心是Kubernetes on Cloud,即着重介绍Kubernetes和阿里云产品的结合。实践篇是疑难问题的诊断案例,希望通过案例来和读者分享Kubernetes深度问题诊断......
阿里云数字新基建系列:云原生操作系统Kubernetes-第1章(4)
|
运维 Kubernetes Cloud Native
阿里云数字新基建系列:云原生操作系统Kubernetes-第1章(3)
阿里云数字新基建系列包括5本书,题材涉及Kubernetes、混合云架构、云数据库、CDN原理与流媒体技术、云服务器运维(Windows),囊括了领先的云技术知识与阿里云技术团队独到的实践经验,是国内IT技术图书中又一套重磅作品! 本书是阿里云容器服务产品线上实践的技术沉淀,主要包括理论篇和实践篇两部分内容。理论篇注重理论介绍,核心是Kubernetes on Cloud,即着重介绍Kubernetes和阿里云产品的结合。实践篇是疑难问题的诊断案例,希望通过案例来和读者分享Kubernetes深度问题诊断......
阿里云数字新基建系列:云原生操作系统Kubernetes-第1章(3)
|
存储 弹性计算 Kubernetes
阿里云数字新基建系列:云原生操作系统Kubernetes-第1章(2)
阿里云数字新基建系列包括5本书,题材涉及Kubernetes、混合云架构、云数据库、CDN原理与流媒体技术、云服务器运维(Windows),囊括了领先的云技术知识与阿里云技术团队独到的实践经验,是国内IT技术图书中又一套重磅作品! 本书是阿里云容器服务产品线上实践的技术沉淀,主要包括理论篇和实践篇两部分内容。理论篇注重理论介绍,核心是Kubernetes on Cloud,即着重介绍Kubernetes和阿里云产品的结合。实践篇是疑难问题的诊断案例,希望通过案例来和读者分享Kubernetes深度问题诊断......
阿里云数字新基建系列:云原生操作系统Kubernetes-第1章(2)
|
弹性计算 运维 Kubernetes
阿里云数字新基建系列:云原生操作系统Kubernetes-第1章(1)
  阿里云数字新基建系列包括5本书,题材涉及Kubernetes、混合云架构、云数据库、CDN原理与流媒体技术、云服务器运维(Windows),囊括了领先的云技术知识与阿里云技术团队独到的实践经验,是国内IT技术图书中又一套重磅作品! 本书是阿里云容器服务产品线上实践的技术沉淀,主要包括理论篇和实践篇两部分内容。理论篇注重理论介绍,核心是Kubernetes on Cloud,即着重介绍Kubernetes和阿里云产品的结合。实践篇是疑难问题的诊断案例,希望通过案例来和读者分享Kubernetes深度问题诊断......
阿里云数字新基建系列:云原生操作系统Kubernetes-第1章(1)
|
11天前
|
存储 Kubernetes 关系型数据库
阿里云ACK备份中心,K8s集群业务应用数据的一站式灾备方案
本文源自2024云栖大会苏雅诗的演讲,探讨了K8s集群业务为何需要灾备及其重要性。文中强调了集群与业务高可用配置对稳定性的重要性,并指出人为误操作等风险,建议实施周期性和特定情况下的灾备措施。针对容器化业务,提出了灾备的新特性与需求,包括工作负载为核心、云资源信息的备份,以及有状态应用的数据保护。介绍了ACK推出的备份中心解决方案,支持命名空间、标签、资源类型等维度的备份,并具备存储卷数据保护功能,能够满足GitOps流程企业的特定需求。此外,还详细描述了备份中心的使用流程、控制台展示、灾备难点及解决方案等内容,展示了备份中心如何有效应对K8s集群资源和存储卷数据的灾备挑战。
下一篇
DataWorks