前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >外包精通--在 ArgoCD 中加载现有的 Helm 应用程序

外包精通--在 ArgoCD 中加载现有的 Helm 应用程序

原创
作者头像
Godev
修改2023-07-31 19:31:50
3K0
修改2023-07-31 19:31:50
举报
文章被收录于专栏:Godev

GitOps 是为云原生应用程序实施持续部署的推荐方式。它通过在部署应用程序时最大限度地减少手动错误来帮助组织,因为 Git 将是唯一的真实来源。因此,可以轻松地跨团队跟踪更改。

本文旨在帮助那些希望通过 ArgoCD 在已经部署并在 Kubernetes 集群中运行的应用程序上采用 GitOps 文化的工程师。

由于 GitOps 相对较新,人们可能会对如何在不重新部署其微服务的情况下将现有应用程序载入 ArgoCD 产生疑问。让我们看看如何解决这个问题。

Prerequisites

  • Kubernetes cluster
  • Helm v3

Application via Helm repository

在 ArgoCD 中,您可以通过两种方式安装基于 Helm 的应用程序。其中之一是直接通过远程 Helm 存储库安装应用程序。这可以是 Gitlab 的 Helm 存储库、自托管选项(如 Chartmusem)或 GitHub Pages。

让我们使用 helm 存储库安装应用程序。在通过 ArgoCD 安装它之前,此步骤尝试模拟已经在通过 helm install 命令部署的集群中运行的应用程序。nginx-ingress

代码语言:txt
复制
#add the helm repo
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx

#install the helm chart
helm install ingress-nginx ingress-nginx/ingress-nginx --version 4.4.0 --set controller.service.type=ClusterIP

#kubectl get pod
NAME                                        READY   STATUS    RESTARTS   AGE
ingress-nginx-controller-6f7bd4bcfb-dp57x   1/1     Running   0          3m50s

Pod 运行后,让我们将 ArgoCD 安装到我们的集群中。

代码语言:txt
复制
#add the helm repo
helm repo add argo https://argoproj.github.io/argo-helm

#install the helm chart
helm install argocd argo/argo-cd --set-string configs.params."server\.disable\.auth"=true --version 5.12.0 --create-namespace -n argocd

验证 ArgoCD pod 正在运行并处于 READY 状态。

代码语言:txt
复制
kubectl get pod -n argocd

NAME                                                READY   STATUS    RESTARTS   AGE
argocd-application-controller-0                     1/1     Running   0          14m
argocd-applicationset-controller-6cb8549cd9-ms2tr   1/1     Running   0          14m
argocd-dex-server-77b996879b-j2zd8                  1/1     Running   0          14m
argocd-notifications-controller-6456d4b685-kb6hn    1/1     Running   0          14m
argocd-redis-cdf4df6bc-xg7v6                        1/1     Running   0          14m
argocd-repo-server-8b9dd576b-xfv8s                  1/1     Running   0          14m
argocd-server-b9f6c4ccd-7vdjz                       1/1     Running   0          14m

现在 ArgoCD 正在运行,让我们为我们的应用程序创建 ArgoCD 应用程序清单。

代码语言:txt
复制
cat <<EOF >> nginx-ingress.yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: ingress-nginx
  namespace: argocd
spec:
  project: default
  destination:
    namespace: default  #update namespace name if you wish
    name: in-cluster   #update cluster name if its different
  source:
    repoURL: https://kubernetes.github.io/ingress-nginx
    targetRevision: "4.4.0"
    chart: ingress-nginx
    helm:
      values: |
        controller:
          service:
            type: ClusterIP    
EOF

上述清单中有几点需要注意:

  • 如果您是 ArgoCD 的新手并且不了解应用程序清单的结构,我建议您在此处阅读有关 ArgoCD 应用程序的信息。
  • 您希望在默认 helm 值上覆盖的任何 helm 自定义值都需要添加到helm 值部分。
  • 将来,每当您需要升级应用程序/图表版本时,您只需更新targetRevisionhelm 图表版本的 git 标签,ArgoCD 就会拉取该图表并应用更改。这可以通过编辑此文件或通过 ArgoCD UI 更新标签来完成。
  • [**metadata.name**](<http://metadata.name>)应该与 helm 版本名称完全匹配。否则这将被视为新版本。

这里的主要思想是通过 ArgoCD 指定的 helm 值配置应该与helm 安装或升级时指定的配置(值文件)完全匹配。

例如,在 helm 安装期间,如果服务类型是ClusterIP,ArgoCD 应用程序清单也应该具有该配置。如果您不指定,ArgoCD 将覆盖默认图表值,这将导致停机。

这主要需要处理依赖的第三方图表,例如 MongoDB、Redis 等。

好的。让我们应用我们使用命令创建的清单。

代码语言:txt
复制
kubectl apply -f nginx-ingress.yaml

#application.argoproj.io/my-ingress-nginx created

要访问 Argo UI,让端口转发 argocd-server 服务并在浏览器中打开:https://localhost:8080

代码语言:txt
复制
kubectl port-forward service/argocd-server 8080:8080 -n argocd

现在,如果您转到 nginx-ingress 应用程序,它的状态是 OutOfSync。

的具体应用中,对于几乎所有的 Kubernetes 资源,都需要来自 ArgoCD 端的注解。这就是 ArgoCD 跟踪它需要跟踪的资源的方式。您可以在此处的文档中阅读有关此注释的更多信息。

让我们的sync应用程序将在所有资源上应用该 ArgoCD 注释。

同步后,您可以看到没有资源被删除或重新创建。

代码语言:txt
复制
kubectl get all -l app.kubernetes.io/name=ingress-nginx

NAME                                            READY   STATUS    RESTARTS   AGE
pod/ingress-nginx-controller-6f7bd4bcfb-dp57x   1/1     Running   0          21m

NAME                                         TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGE
service/ingress-nginx-controller             ClusterIP   10.96.156.40   <none>        80/TCP,443/TCP   21m
service/ingress-nginx-controller-admission   ClusterIP   10.96.118.65   <none>        443/TCP          21m

NAME                                       READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/ingress-nginx-controller   1/1     1            1           21m

NAME                                                  DESIRED   CURRENT   READY   AGE
replicaset.apps/ingress-nginx-controller-6f7bd4bcfb   1         1         1       21m

通过 Git 存储库的应用程序

如果您的 helm chart 未托管在 helm 存储库中,而是存储在 GitHub 或任何其他 SCM 工具(如 GitLab 或 BitBucket)中,则也可以轻松完成该 helm 应用程序的迁移。

分叉示例应用程序存储库:https://github.com/kernelpod/podinfo

克隆存储库并将 values.yaml 中的 replicacount 从 1 更新为 3。

代码语言:txt
复制
#clone your fork
git clone https://github.com/kernelpod/podinfo && cd podinfo/charts/podinfo

#update  replcaCount to 3
sed -i -e '/replicaCount/ s/: .*/: 3/' values.yaml

将此更改推送到您的 GitHub 存储库。

通过 helm 部署 helm 图表。

代码语言:txt
复制
helm install podinfo-git . -f values.yaml -n default

创建一个 ArgoCD 应用程序清单,它将指向您的存储库和存储 helm chart 的存储库内的路径。

代码语言:txt
复制
cat <<EOF >> podinfo-app-git.yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: podinfo-git
  namespace: argocd
spec:
  project: default  
  destination:
    namespace: default  #update namespace name if you wish
    name: in-cluster   #update cluster name if its different
  source:
    repoURL: 'https://github.com/tanmay-bhat/podinfo'  #replace with your username
    path: charts/podinfo
    targetRevision: HEAD
    helm:
      valueFiles:
        - values.yaml       #any custom value file you want to apply.
EOF

ArgoCD 会自动检测到在您指定的路径中,应用程序必须作为 Helm 图表而不是通过 Kubernetes 清单文件加载。它通过在您指定的路径中扫描来了解该类型以检测应用程序的种类。在我的例子中是在存储库中。您可以在此处阅读有关自动工具检测的更多信息。Chart.yaml ``chart.yaml``charts/podinfo

将您创建的清单应用到argocd命名空间中。

代码语言:txt
复制
kubectl apply -f podinfo-app-git.yaml -n argocd               

#application.argoproj.io/podinfo configured

就像之前的迁移一样,这个应用程序也会与注释更改更新不同步。Sync审查后的申请。App Diff

从上面的快照中可以看出,没有重新创建 pod 和其他资源。

如果你通过 UI查看这个,我们可以看到它已将配置同步到我们的 GitHub 存储库。App Details

Gotchas

  • 我没有在 ArgoCD 应用程序定义中添加自动同步选项,因为最好查看应用程序的差异、审查然后同步。
  • 某些应用程序(如 Grafana)在其模板定义中有。
代码语言:txt
复制

checksum/secret

代码语言:txt
复制
  • 迁移到 ArgoCD 时,需要应用其自己的注释,如上所示。
  • 一旦该注解应用于秘密,其校验和就会发生变化,并且该校验和将在部署中得到更新
  • 因此,对于像这样的应用程序配置,pod 将被重新创建。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Prerequisites
  • Application via Helm repository
  • 通过 Git 存储库的应用程序
    • Gotchas
    相关产品与服务
    容器服务
    腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档