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

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
简介: 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搭建和管理企业级网站应用
相关文章
|
5天前
|
Kubernetes Cloud Native Docker
云原生时代的容器化实践:Docker和Kubernetes入门
【10月更文挑战第37天】在数字化转型的浪潮中,云原生技术成为企业提升敏捷性和效率的关键。本篇文章将引导读者了解如何利用Docker进行容器化打包及部署,以及Kubernetes集群管理的基础操作,帮助初学者快速入门云原生的世界。通过实际案例分析,我们将深入探讨这些技术在现代IT架构中的应用与影响。
23 2
|
5天前
|
Kubernetes 监控 负载均衡
深入云原生:Kubernetes 集群部署与管理实践
【10月更文挑战第37天】在数字化转型的浪潮中,云原生技术以其弹性、可扩展性成为企业IT架构的首选。本文将引导你了解如何部署和管理一个Kubernetes集群,包括环境准备、安装步骤和日常维护技巧。我们将通过实际代码示例,探索云原生世界的秘密,并分享如何高效运用这一技术以适应快速变化的业务需求。
23 1
|
9天前
|
运维 Kubernetes Cloud Native
Kubernetes云原生架构深度解析与实践指南####
本文深入探讨了Kubernetes作为领先的云原生应用编排平台,其设计理念、核心组件及高级特性。通过剖析Kubernetes的工作原理,结合具体案例分析,为读者呈现如何在实际项目中高效部署、管理和扩展容器化应用的策略与技巧。文章还涵盖了服务发现、负载均衡、配置管理、自动化伸缩等关键议题,旨在帮助开发者和运维人员掌握利用Kubernetes构建健壮、可伸缩的云原生生态系统的能力。 ####
|
10天前
|
存储 运维 Kubernetes
云原生之旅:Kubernetes的弹性与可扩展性探索
【10月更文挑战第32天】在云计算的浪潮中,云原生技术以其独特的魅力成为开发者的新宠。本文将深入探讨Kubernetes如何通过其弹性和可扩展性,助力应用在复杂环境中稳健运行。我们将从基础架构出发,逐步揭示Kubernetes集群管理、服务发现、存储机制及自动扩缩容等核心功能,旨在为读者呈现一个全景式的云原生平台视图。
23 1
|
14天前
|
Kubernetes Cloud Native 调度
云原生批量任务编排引擎Argo Workflows发布3.6,一文解析关键新特性
Argo Workflows是CNCF毕业项目,最受欢迎的云原生工作流引擎,专为Kubernetes上编排批量任务而设计,本文主要对最新发布的Argo Workflows 3.6版本的关键新特性做一个深入的解析。
|
15天前
|
Kubernetes 负载均衡 Cloud Native
云原生应用:Kubernetes在容器编排中的实践与挑战
【10月更文挑战第27天】Kubernetes(简称K8s)是云原生应用的核心容器编排平台,提供自动化、扩展和管理容器化应用的能力。本文介绍Kubernetes的基本概念、安装配置、核心组件(如Pod和Deployment)、服务发现与负载均衡、网络配置及安全性挑战,帮助读者理解和实践Kubernetes在容器编排中的应用。
47 4
|
16天前
|
Kubernetes 监控 Cloud Native
云原生应用:Kubernetes在容器编排中的实践与挑战
【10月更文挑战第26天】随着云计算技术的发展,容器化成为现代应用部署的核心趋势。Kubernetes(K8s)作为容器编排领域的佼佼者,以其强大的可扩展性和自动化能力,为开发者提供了高效管理和部署容器化应用的平台。本文将详细介绍Kubernetes的基本概念、核心组件、实践过程及面临的挑战,帮助读者更好地理解和应用这一技术。
48 3
|
19天前
|
运维 Kubernetes Cloud Native
云原生入门:Kubernetes和容器化的未来
【10月更文挑战第23天】本文将带你走进云原生的世界,探索Kubernetes如何成为现代软件部署的心脏。我们将一起揭开容器化技术的神秘面纱,了解它如何改变软件开发和运维的方式。通过实际的代码示例,你将看到理论与实践的结合,感受到云原生技术带来的革命性影响。无论你是初学者还是有经验的开发者,这篇文章都将为你开启一段新的旅程。让我们一起踏上这段探索之旅,解锁云原生技术的力量吧!
|
3天前
|
Cloud Native 安全 数据安全/隐私保护
云原生架构下的微服务治理与挑战####
随着云计算技术的飞速发展,云原生架构以其高效、灵活、可扩展的特性成为现代企业IT架构的首选。本文聚焦于云原生环境下的微服务治理问题,探讨其在促进业务敏捷性的同时所面临的挑战及应对策略。通过分析微服务拆分、服务间通信、故障隔离与恢复等关键环节,本文旨在为读者提供一个关于如何在云原生环境中有效实施微服务治理的全面视角,助力企业在数字化转型的道路上稳健前行。 ####
|
5天前
|
运维 Kubernetes Cloud Native
云原生技术:容器化与微服务架构的完美结合
【10月更文挑战第37天】在数字化转型的浪潮中,云原生技术以其灵活性和高效性成为企业的新宠。本文将深入探讨云原生的核心概念,包括容器化技术和微服务架构,以及它们如何共同推动现代应用的发展。我们将通过实际代码示例,展示如何在Kubernetes集群上部署一个简单的微服务,揭示云原生技术的强大能力和未来潜力。