小哥之哥 小哥之哥
首页
    • Prometheus
    • Kubertenes
    • Docker
    • MySQL
  • Go
  • Python
  • Vue
  • Jenkins
  • ELK
  • LDAP
  • 随笔
  • 最佳实践
  • 博客搭建
  • 问题杂谈
关于
友链
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

小哥之哥

运维扫地僧
首页
    • Prometheus
    • Kubertenes
    • Docker
    • MySQL
  • Go
  • Python
  • Vue
  • Jenkins
  • ELK
  • LDAP
  • 随笔
  • 最佳实践
  • 博客搭建
  • 问题杂谈
关于
友链
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • Kubertenes

    • 安装部署

    • 技术杂谈

    • 最佳实践

      • k8s-apollo分布式部署
      • k8s-Argocd部署
        • k8s-Argo CD实践
        • k8s-helm使用
        • k8s-Minio集群迁移
        • cert-manager自动签发Lets Encrypt
    • Prometheus

    • Docker

    • 数据库

    • 运维利器

    • 运维
    • Kubertenes
    • 最佳实践
    tchua
    2023-06-05
    目录

    k8s-Argocd部署

    # 一、概念


    # 1.1 什么是ArgoCD

    Argocd (opens new window)是k8s的一个声明式GitOps (opens new window)持续交付工具。

    # 1.2 Argocd优势
    • 应用程序定义、配置和环境应该是声明性的和版本控制的。应用程序部署和生命周期管理应自动化、可审核且易于理解。
    • ArgoCD是以Kubernetes作为基础设施,遵循声明式GitOps理念的持续交付(Continuous Delivery, CD)工具,支持多种配置管理工具。
    # 1.3 Argocd原理

    Argocd通过一个 Kubernetes 控制器来实现的,它持续 watch 正在运行的应用程序并将当前的实时状态与所需的目标状态( Git 存储库中指定的)进行比较。已经部署的应用程序的实际状态与目标状态有差异,则被认为是 状态,Argo CD 会报告显示这些差异,同时提供工具来自动或手动将状态同步到期望的目标状态。在 Git 仓库中对期望目标状态所做的任何修改都可以自动应用反馈到指定的目标环境中去。

    Argo CD Architecture

    # 1.4 主要组件
    • Argo CD Server(argocd-server): Argo CD 服务器是 Argo CD 的核心组件,负责管理和协调整个系统。它与 Git 存储库进行交互,从中读取应用程序的声明性配置,并将配置与 Kubernetes 环境进行同步。Argo CD 服务器还提供 Web 用户界面和 API,用于管理应用程序和监视其状态。
    • Git Repository(argocd-repo-server):Git 存储库是存储应用程序配置的地方。Argo CD 从配置存储库中获取应用程序的清单文件,并使用它们来部署和管理应用程序。Argo CD 支持多种 Git 存储库的类型,包括公共 Git 存储库(如 GitHub、GitLab 等)和私有 Git 存储库。
    • Application Controller(argocd-application-controller-0):应用程序控制器负责监视应用程序的状态并执行必要的操作以将其与期望状态保持一致。它根据应用程序的配置和状态信息,自动化应用程序的部署和更新,并与 Git 存储库进行同步。
    • Argo CD ApplicationSets(argocd-applicationset-controller): argocd-applicationset-controller 是 Argo CD 的 ApplicationSet 控制器。它负责管理和执行 ApplicationSet 对象,用于生成和管理多个应用程序实例。 是"App of Apps"部署模式的演变。它采用了"App of Apps"的理念并将其扩展为更加灵活并处理广泛的用例。ArgoCD ApplicationSets 作为自己的控制器运行,并补充了 Argo CD 应用程序 CRD 的功能。
    • Agro CD Dex(argocd-dex-server):Dex 是一个开源的身份验证和授权工具,Argo CD 可以与 Dex 集成以实现身份验证和授权功能。Dex 可以连接到各种身份提供商(如 LDAP、Active Directory、OAuth 等),以提供灵活的用户身份验证和访问控制机制。
    • Argo CD Notify(argocd-notifications-controller): Argo CD 的通知控制器,用于管理和触发通知事件。它负责在 Argo CD 中监视应用程序的状态变化,并基于预定义的规则和配置触发相应的通知。
    • Argo CD Redis(argocd-redis): 用于缓存资源,主要包括: 应用程序配置和状态信息、Git 存储库的访问结果、Git 存储库的访问结果、用户和权限信息等。
    # 1.5 名词解释
    • Application:应用,一组由资源清单定义的 K8s 资源,这是一个 CRD 资源对象

    • Application source type:用来构建应用的工具,如: Git、Helm、Repo、Kustomize、Directory

    • Target state: 目标状态,指应用程序所需的期望状态,由 Git 存储库中的文件表示

    • Live state:实时状态,指应用程序实时的状态,比如部署了哪些 Pods 等真实状态

    • Sync status:同步状态,指实时状态是否与目标状态一致,部署的应用是否与Git(构建工具)中描述一样

    • Sync:同步指将应用程序迁移到期望目标状态的过程,比如通过对 Kubernetes 集群应用部署变更

    • Sync operation status:同步操作状态指的是同步是否成功,主要有以下几种状态:

      • Synced,同步完成
      • OutOfSync,不同步
      • Unknown, 未知
      • Syncing, 同步中
      • Error,同步错误,可能应用程序配置错误、权限问题或其他问题导致的
    • Refresh:刷新是指将 Git 中的最新代码与实时状态进行比较

    • Health:应用程序的健康状况,主要有以下几种:

      • Healthy:健康
      • Degraded:降级,表示应用程序的某些组件或资源出现了问题,但仍然能够运行。这可能意味着某些功能或服务不可用或性能下降。
      • Progressing:进行中,指应用在部署或更新中
      • Suspended:暂停,指应用程序的同步操作已被暂停,不再进行任何更新
      • Missing:缺失,指表ArgoCD 无法找到应用程序的健康检查结果
    • Tool:工具指从文件目录创建清单的工具,例如 Kustomize 或 Ksonnet 等

    # 1.6 安装

    安装方式有很多种,这里直接选择官方提供资源清单文件

    kubectl create namespace argocd
    kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
    
    1
    2

    img

    # 二、Ingress Web页面配置


    # 2.1 ingrss配置
    • 清单 ingress.yaml
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: argocd-server-http-ingress
      namespace: argocd
      annotations:
        nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
        nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
        nginx.ingress.kubernetes.io/ssl-passthrough: "true"
    spec:
      ingressClassName: nginx
      rules:
        - http:
            paths:
              - path: /
                pathType: Prefix
                backend:
                  service:
                    name: argocd-server
                    port:
                      name: https
          host: ingress-nginx-controller
      tls:
        - hosts:
            - argocd.tchua.com
          secretName: argocd-secret # do not change, this is provided by Argo CD
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    # 2.2 访问
    如果你没有在域名平台进行解析之对应的ingress-nginx-controller主机IP,则需要配置主机hots解析之ingress-nginx-controller主机IP。
    这里浏览器输入: https://argocd.tchua.com 即可
    
    1
    2

    image-20230601103502798

    # 2.3 获取密码
    # 查看admin初始密码
    [root@k8s-master01 argocd]# kubectl get secrets -n argocd argocd-initial-admin-secret -o yaml
    apiVersion: v1
    data:
      password: ZWpMeXRSdGxzelh4bnRqaQ==
    kind: Secret
    metadata:
      creationTimestamp: "2023-05-31T03:06:17Z"
      name: argocd-initial-admin-secret
      namespace: argocd
      resourceVersion: "9743060"
      uid: fa792350-cf35-4478-8ec3-6e5380bc881d
    type: Opaque
    # base64解析
    [root@k8s-master01 argocd]# echo ZWpMeXRSdGxzelh4bnRqaQ== |base64 -d
    ejLytRtlszXxntji
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16

    image-20230601103745520

    # 2.4 安装CLI工具

    Argo CD 我们也可以通过客户端命令进行管理

    • 下载客户端命令
    [root@k8s-master01 ~]# wget https://github.com/argoproj/argo-cd/releases/download/v2.7.3/argocd-linux-amd64
    
    1
    • 安装
    [root@k8s-master01 ~]# install -m 555 argocd-linux-amd64 /usr/local/bin/argocd
    
    1
    • 登录

    需要注意的是,argocd.tchua.com需要再master节点进行hosts解析,否则无法进行连接,如果使用dns平台解析,则无需hosts解析

    [root@k8s-master01 ~]# argocd login argocd.tchua.com
    WARNING: server certificate had error: x509: certificate is valid for ingress.local, not argocd.tchua.com. Proceed insecurely (y/n)? yes
    WARN[0004] Failed to invoke grpc call. Use flag --grpc-web in grpc calls. To avoid this warning message, use flag --grpc-web. 
    Username: admin
    Password: 
    'admin:login' logged in successfully
    Context 'argocd.tchua.com' updated
    
    1
    2
    3
    4
    5
    6
    7

    # 三、部署应用


    # 3.1 Web UI 部署应用
    # 3.1.1 参数配置

    这里为了演示方便,直接使用官方提供示例进行部署argoproj/argocd-example-apps (opens new window),使用guestbook (opens new window)项目进行演示。

    登录Argo CD后台管理后,可以直接点击+NEW APP按钮,弹出新建APP应用的对话框,配置好项目对象信息之后,点击CREATE创建即可:

    • 基本配置

    image-20230605111922810

    • 仓库源配置

    image-20230605112234167

    • 目标集群配置

    image-20230605112343391

    注意

    • 基本配置里面的Project Name,这里我们可以根据自己需要创建不同的项目名称,一般来说都会根据不同环境或者不同的项目创建,这里可以对应集群中命名空间,方便后续管理。
    # 3.1.2 应用部署

    上面创建应用后,由于我们填写的更新策略为手动更新,因此这里并不会自动部署,也可以看到该应用的状态处于OutOfSync

    image-20230605113106223

    点击应用,可以进入应用详情,我们可以看到,该仓库对应的guestbook项目,有svc和deploy资源清单文件:

    image-20230605113255432

    点击应用详情页,上面菜单中的SYNC按钮,可以触发相关资源的部署以及登录集群查看资源的情况:

    image-20230605134125495

    • 资源部署

    image-20230605134348870

    image-20230605134407811

    注意

    我们可以看到argo cd已经按照把相关资源部署至集群,这里看到pod部署的时候失败了,查看集群中pod状态为ImagePullBackOff,这是因为官方的示例文件中,给的项目镜像地址为gcr.io,我们没办法下载镜像,不过这其实并不重要,我们主要是看到资源的部署,已经按照我们的预期进行部署,后面实践部分,我们只需要把仓库中的资源清单文件,替换为我们业务应用清单文件即可。

    # 3.2 通过 CLI 部署应用

    使用CLI部署应用之前,我们先删除上一步通过Web UI创建的应用,这里还是使用官方提供的示例清单文件进行演示,当然还是会出现pod因为镜像地址无法正常部署的问题,不过我们这里只要看到能按照预期进行调度即可。

    # 3.2.1 登录

    我们上面部署CLI工具时已经登录,如果没有进行登录过,则直接执行以下命令,输入用户名密码即可完成登录

    [root@k8s-master01 ~]# argocd login argocd.tchua.com
    
    1
    # 3.2.2 创建应用
    [root@k8s-master01 ~]# argocd app create guestbook \
      --repo https://github.com/argoproj/argocd-example-apps.git \
      --path guestbook \
      --dest-server https://kubernetes.default.svc \
      --dest-namespace default
    
    1
    2
    3
    4
    5
    # 3.2.3 查看部署应用
    [root@k8s-master01 ~]# argocd app get guestbook
    Name:               argocd/guestbook
    Project:            default
    Server:             https://kubernetes.default.svc
    Namespace:          default
    URL:                https://argocd.tchua.com/applications/guestbook
    Repo:               https://github.com/argoproj/argocd-example-apps.git
    Target:             
    Path:               guestbook
    SyncWindow:         Sync Allowed
    Sync Policy:        <none>
    Sync Status:        OutOfSync from  (53e28ff)
    Health Status:      Missing
    
    GROUP  KIND        NAMESPACE  NAME          STATUS     HEALTH   HOOK  MESSAGE
           Service     default    guestbook-ui  OutOfSync  Missing        
    apps   Deployment  default    guestbook-ui  OutOfSync  Missing 
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    # 3.2.3 触发应用部署集群
    [root@k8s-master01 ~]# argocd app sync guestbook
    TIMESTAMP                  GROUP        KIND   NAMESPACE                  NAME    STATUS    HEALTH        HOOK  MESSAGE
    2023-06-05T14:05:25+08:00            Service     default          guestbook-ui  OutOfSync  Missing              
    2023-06-05T14:05:25+08:00   apps  Deployment     default          guestbook-ui  OutOfSync  Missing              
    2023-06-05T14:05:25+08:00            Service     default          guestbook-ui  OutOfSync  Missing              service/guestbook-ui created
    2023-06-05T14:05:25+08:00   apps  Deployment     default          guestbook-ui  OutOfSync  Missing              deployment.apps/guestbook-ui created
    2023-06-05T14:05:25+08:00            Service     default          guestbook-ui    Synced  Healthy                  service/guestbook-ui created
    2023-06-05T14:05:25+08:00   apps  Deployment     default          guestbook-ui    Synced  Progressing              deployment.apps/guestbook-ui created
    
    Name:               argocd/guestbook
    Project:            default
    Server:             https://kubernetes.default.svc
    Namespace:          default
    URL:                https://argocd.tchua.com/applications/guestbook
    Repo:               https://github.com/argoproj/argocd-example-apps.git
    Target:             
    Path:               guestbook
    SyncWindow:         Sync Allowed
    Sync Policy:        <none>
    Sync Status:        Synced to  (53e28ff)
    Health Status:      Progressing
    
    Operation:          Sync
    Sync Revision:      53e28ff20cc530b9ada2173fbbd64d48338583ba
    Phase:              Succeeded
    Start:              2023-06-05 14:05:24 +0800 CST
    Finished:           2023-06-05 14:05:25 +0800 CST
    Duration:           1s
    Message:            successfully synced (all tasks run)
    
    GROUP  KIND        NAMESPACE  NAME          STATUS  HEALTH       HOOK  MESSAGE
           Service     default    guestbook-ui  Synced  Healthy            service/guestbook-ui created
    apps   Deployment  default    guestbook-ui  Synced  Progressing        deployment.apps/guestbook-ui created
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    # 3.2.4 查看资源状态

    可以看到资源的部署服务预期

    image-20230605140714287

    # 3.2.5 通过CRD方式部署

    上面我们使用了agcd cli命令进行部署,其实我们还可以想其他资源配置一样,使用定义应用清单文件,下面是一个简单的例子

    • 清单文件
    # cat guestbook-app.yaml
    apiVersion: argoproj.io/v1alpha1
    kind: Application
    metadata:
      name: guestbook
      namespace: argocd
    spec:
      project: default
      source:
        repoURL: https://github.com/argoproj/argocd-example-apps.git
        targetRevision: HEAD
        path: guestbook
      destination:
        server: https://kubernetes.default.svc
        namespace: guestbook
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    • 资源部署

    这里部署后,其实后续操作也可以直接使用argocd命令或者web ui进行管理

    [root@k8s-master01 ~]# kubectl apply -f guestbook-app.yaml
    
    1
    编辑 (opens new window)
    #k8s
    上次更新: 2024/01/02, 18:20:30
    k8s-apollo分布式部署
    k8s-Argo CD实践

    ← k8s-apollo分布式部署 k8s-Argo CD实践→

    最近更新
    01
    cert-manager自动签发Lets Encrypt
    09-05
    02
    Docker构建多架构镜像
    08-02
    03
    Prometheus数据迁移至VMstorage
    08-01
    更多文章>
    Theme by Vdoing | Copyright © 2023-2024 |豫ICP备2021026650号
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式