首页 > 其他分享 >在K8S中使用Argo CD做持续部署

在K8S中使用Argo CD做持续部署

时间:2024-09-26 10:14:42浏览次数:1  
标签:16h image argocd TCP CD Argo K8S server png

什么是ArgoCD

Argo CD is a declarative, GitOps continuous delivery tool for Kubernetes.

Argo CD是一个基于Kubernetes的声明式的GitOps工具。

在说Argo CD之前,我们先来了解一下什么是GitOps。

什么是GitOps

GitOps是以Git为基础,使用CI/CD来更新运行在云原生环境的应用,它秉承了DevOps的核心理念--“构建它并交付它(you built it you ship it)”。

概念说起来有点虚,我画了张图,看了你就明白了。

image.png

  • 当开发人员将开发完成的代码推送到git仓库会触发CI制作镜像并推送到镜像仓库
  • CI处理完成后,可以手动或者自动修改应用配置,再将其推送到git仓库
  • GitOps会同时对比目标状态和当前状态,如果两者不一致会触发CD将新的配置部署到集群中

其中,目标状态是Git中的状态,现有状态是集群的里的应用状态。

不用GitOps可以么?

当然可以,我们可以使用kubectl、helm等工具直接发布配置,但这会存在一个很严重的安全问题,那就是密钥共享。

为了让CI系统能够自动的部署应用,我们需要将集群的访问密钥共享给它,这会带来潜在的安全问题。

ArgoCD

Argo CD遵循GitOps模式,使用Git存储库存储所需应用程序的配置。

Kubernetes清单可以通过以下几种方式指定:

  • kustomize应用程序
  • helm图表
  • ksonnet应用程序
  • jsonnet文件
  • 基于YAML/json配置
  • 配置管理插件配置的任何自定义配置管理工具

Argo CD实现为kubernetes控制器,它持续监视运行中的应用程序,并将当前的活动状态与期望的目标状态进行比较(如Git repo中指定的那样)。如果已部署的应用程序的活动状态偏离了目标状态,则认为是OutOfSync。Argo CD报告和可视化这些差异,同时提供了方法,可以自动或手动将活动状态同步回所需的目标状态。在Git repo中对所需目标状态所做的任何修改都可以自动应用并反映到指定的目标环境中。

Argo CD就处在如下位置:

image.png

它的优势总结如下:

  • 应用定义、配置和环境信息是声明式的,并且可以进行版本控制;
  • 应用部署和生命周期管理是全自动化的,是可审计的,清晰易懂;
  • Argo CD是一个独立的部署工具,支持对多个环境、多个Kubernetes集群上的应用进行统一部署和管理

实践

前提:有一个可用的Kubernetes集群。

实验环境:

  • kubernetes:1.17.2
  • argo cd:latest

安装Argo CD

安装很简单,不过在实际使用中需要对数据进行持久化。

我这里直接使用官方文档的安装命令:

代码语言:javascript 复制
kubectl create namespace argocd
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml

执行成功后会在argocd的namespace下创建如下资源。

代码语言:javascript 复制
# kubectl get all -n argocd 
NAME                                      READY   STATUS    RESTARTS   AGE
pod/argocd-application-controller-0       1/1     Running   0          16h
pod/argocd-dex-server-74d9998fdb-mvpmh    1/1     Running   0          16h
pod/argocd-redis-59dbdbb8f9-msxrp         1/1     Running   0          16h
pod/argocd-repo-server-599bdc7cf5-ccv8l   1/1     Running   0          16h
pod/argocd-server-576b4c7ff4-cnp9d        1/1     Running   0          16h

NAME                            TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                      AGE
service/argocd-dex-server       ClusterIP   10.105.217.139   <none>        5556/TCP,5557/TCP,5558/TCP   16h
service/argocd-metrics          ClusterIP   10.97.116.36     <none>        8082/TCP                     16h
service/argocd-redis            ClusterIP   10.105.63.34     <none>        6379/TCP                     16h
service/argocd-repo-server      ClusterIP   10.111.153.131   <none>        8081/TCP,8084/TCP            16h
service/argocd-server           ClusterIP   10.105.229.250   <none>        80/TCP,443/TCP               16h
service/argocd-server-metrics   ClusterIP   10.104.8.45      <none>        8083/TCP                     16h

NAME                                 READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/argocd-dex-server    1/1     1            1           16h
deployment.apps/argocd-redis         1/1     1            1           16h
deployment.apps/argocd-repo-server   1/1     1            1           16h
deployment.apps/argocd-server        1/1     1            1           16h

NAME                                            DESIRED   CURRENT   READY   AGE
replicaset.apps/argocd-dex-server-74d9998fdb    1         1         1       16h
replicaset.apps/argocd-redis-59dbdbb8f9         1         1         1       16h
replicaset.apps/argocd-repo-server-599bdc7cf5   1         1         1       16h
replicaset.apps/argocd-server-576b4c7ff4        1         1         1       16h

NAME                                             READY   AGE
statefulset.apps/argocd-application-controller   1/1     16h

访问Argo server的方式有两种:

  • 通过web ui
  • 使用argocd 客户端工具

我这里直接使用web ui进行管理。

通过kubectl edit -n argocd svc argocd-server将service的type类型改为NodePort。改完后通过以下命令查看端口:

代码语言:javascript 复制
# kubectl get svc -n argocd 
NAME                    TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                      AGE
argocd-dex-server       ClusterIP   10.105.217.139   <none>        5556/TCP,5557/TCP,5558/TCP   17h
argocd-metrics          ClusterIP   10.97.116.36     <none>        8082/TCP                     17h
argocd-redis            ClusterIP   10.105.63.34     <none>        6379/TCP                     17h
argocd-repo-server      ClusterIP   10.111.153.131   <none>        8081/TCP,8084/TCP            17h
argocd-server           NodePort    10.105.229.250   <none>        80:32109/TCP,443:30149/TCP   17h
argocd-server-metrics   ClusterIP   10.104.8.45      <none>        8083/TCP                     17h

然后通过http://IP:32109访问页面,如下:

image.png

登录账号为admin,密码通过以下命令获取。

代码语言:javascript 复制
kubectl get pods -n argocd -l app.kubernetes.io/name=argocd-server -o name | cut -d'/' -f 2

然后进入如下界面。

image.png

创建应用

这里仅仅是为了测试argo,所以并没有做ci部分。

我在gitlab上准备了一个仓库,仓库里的文件很简单,如下:

image.png

其中manifests下就是一个deployment文件,内容如下:

代码语言:javascript 复制
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: devops-argocd-test
  name: devops-argocd-test
  namespace: default
spec:
  minReadySeconds: 60
  progressDeadlineSeconds: 600
  replicas: 1
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      app: devops-argocd-test
  template:
    metadata:
      labels:
        app: devops-argocd-test
    spec:
      containers:
        - name: devops-argocd-test
          image: registry.cn-hangzhou.aliyuncs.com/rookieops/argocd-test-app:v1
          imagePullPolicy: Always
          ports:
            - containerPort: 8080
              name: tcp-8080
              protocol: TCP
---
apiVersion: v1
kind: Service
metadata:
  labels:
    app: devops-argocd-test
  name: devops-argocd-test
  namespace: default
spec:
  ports:
    - name: tcp-8080
      port: 8080
      protocol: TCP
      targetPort: 8080
  selector:
    app: devops-argocd-test
  sessionAffinity: None
  type: NodePort

现在我们在Argo里创建应用,步骤如下:

(1)添加仓库地址,Settings → Repositories,点击 Connect Repo using HTTPS 按钮:

image.png

填入以下信息。

image.png

验证通过后显示如下:

image.png

(2)创建应用

image.png

image.png

创建完成后如下所示:

image.png

由于我设置的是手动SYNC,所以需要点以下下面的SYNC进行同步。

然后可以看到状态都变成正常。

image.png

这时候我们在集群里可以看到创建了v1版本的应用了。

代码语言:javascript 复制
# kubectl get pod | grep devops-argocd-test
devops-argocd-test-7f5fdd9fcf-xbzmp      1/1     Running   0          118s
# kubectl get svc | grep devops-argocd-test
devops-argocd-test   NodePort    10.97.159.140   <none>        8080:31980/TCP   2m6s

这时候访问应用,如下:

image.png

配置变更

接下来我手动进行配置变更,修改manifests下的deploymeny.yaml文件中的镜像为v2版本,如下:

image.png

然后提交到仓库。

这是到ArgoCD中可以看到状态变成了OutOfSync

image.png

这时候再手动sync以下,直到状态都变正常。再访问上面的应用。

image.png

image.png

可以看到应用已经更新部署了。

我们可以看到整个应用的关系状态,如下:

image.png

还可以看到部署历史。

image.png

也可以通过这个界面进行回滚。

image.png

不过这个回滚并不会回改gitlab上的代码哈。

我上面设置的是手动,你可以设置为自动,自己动手测试一番吧。

官方文档:https://argoproj.github.io/argo-cd/#features

标签:16h,image,argocd,TCP,CD,Argo,K8S,server,png
From: https://www.cnblogs.com/cheyunhua/p/18432914

相关文章

  • k8s常用取证命令
    显示和查找资源列出所有namespace中的所有service$kubectlgetservices列出所有namespace中的所有pod$kubectlgetpods--all-namespaces列出所有pod并显示详细信息$kubectlgetpods-owide列出指定deployment$kubectlgetdeploymentmy-dep列出该nam......
  • k8s安装并迁移jumpserver
    一、环境二、安装依赖服务以下操作按需操作1.安装Helmwgethttps://get.helm.sh/helm-v3.12.1-linux-amd64.tar.gztarxfhelm-v3.12.1-linux-amd64.tar.gzmvlinux-amd64/helm/usr/local/bin/helmversionhelmrepoaddjumpserverhttps://jumpserver.github.io/helm-char......
  • 大模型训练:K8s 环境中数千节点存储最佳实践
    今天这篇博客来自全栈工程师朱唯唯,她在前不久举办的KubeCon中国大会上进行了该主题分享。Kubernetes已经成为事实的应用编排标准,越来越多的应用在不断的向云原生靠拢。与此同时,人工智能技术的迅速发展,尤其是大型语言模型(LLM)的推进,导致企业需要处理的数据量急剧增加,例如,Llama......
  • 作为一名测试工程师如何学习Kubernetes(k8s)技能
    前言Kubernetes(K8s)作为云原生时代的关键技术之一,对于运维工程师、开发工程师以及测试工程师来说,都是一门需要掌握的重要技术。作为一名软件测试工程师,学习Kubernetes是一个有助于提升自动化测试、容器化测试以及云原生应用测试能力的重要过程。以下是一个系统性的学习路径......
  • BCD 工艺中的layer density 不足的解决办法
    DENSITY要求常见的density要求在ODPOLY和金属层的layer上,过高和过低的density都会直接影响产品的良率例如:金属密度过大,影响金属覆盖率。金属的覆盖比例Metalratio:30%-55%之间为最佳(根据所用工艺而言),比例偏离的话,铝腐蚀就不好,不干净或过腐蚀。不知道大家在交GDS的时候有......
  • ArgoWorkflow教程(五)---Workflow 的多种触发模式:手动、定时任务与事件触发A0
    合集-ArgoWorkflow(5)1.ArgoWorkflow教程(二)---快速构建流水线:Workflow&Template概念08-202.ArgoWorkflow教程(一)--DevOps另一选择?云原生CICD初体验08-063.ArgoWorkflow教程(三)---使用Artifacts实现步骤间文件共享08-29:milou加速器4.ArgoWorkflow教程(四)---Workfl......
  • 利用 Flink CDC 实现实时数据同步与分析
    1.概述1.1简要介绍什么是FlinkCDC(ChangeDataCapture)FlinkCDC(ChangeDataCapture)是一种用于实时捕获和处理数据库中数据变更的技术。它通过监控数据库的变更事件,将这些事件转化为流式数据,使得数据处理系统(如ApacheFlink)能够以流的方式实时处理和分析数据。FlinkC......
  • 2024年9月北京、广州、深圳CDGA/CDGP数据治理认证,来这就对
    DAMA-CDGA/CDGP数据治理认证是数据管理领域的认证,具有极高的行业认可度和含金量。它们不仅能够帮助个人提升数据治理的专业知识和技能水平,还能够为个人的职业发展提供有力保障和广阔空间。在数字化转型的浪潮中,掌握数据治理的核心能力将成为企业核心竞争力的关键要素。因此,对于有志......
  • CDN 底层原理
    背景笔者在近期秋招面试中,遇到了一位比较资深的开发者,他问的就相对于前面几轮面试更偏底层一些,其中聊到了CDN的底层原理,就这个问题讨论了很久。面试官:“你知道CDN的是怎么知道找到距离你最近的服务器,然后把资源分配给你的吗?”其实我在这个时候不太清楚,就凭印象想了一下之前学的......
  • k8s Ingress和 Ingress Controller
    一、Ingress和IngressController概述关于service四层代理介绍链接点我跳转1.1Ingressingress是k8s中的资源,主要是管理ingress-controller这个代理的配置文件。Ingress是对集群中服务的外部访问进行管理的API对象,典型的访问方式是HTTP,Ingress可以提供负载均衡、SSL终结和基......