我们有一个 ArgoCD 项目。在这个项目中,我们有多个应用程序(我们称它们为 A、B 和 C),它们通过 Kafka 集群相互传递消息。为此,需要创建主题。
应用程序 A 负责管理 Kafka 集群(除其他外)。我们在应用程序 A 中有一个 PreSync 挂钩,用于在更新应用程序 B 和 C 所依赖的其他资源之前创建和配置主题的作业。
这意味着我们需要应用程序 A 在其他应用程序之前同步,以确保顺利推出。为了尝试管理这个问题,我们将应用程序 A 添加到 SyncWave -1,其他应用程序处于默认状态0
kind: Application
metadata:
name: "A"
annotations:
argocd.argoproj.io/sync-wave: "-1"
Run Code Online (Sandbox Code Playgroud)
我们最初的假设(也许是愚蠢的)是同步协调应用于项目内,但是,它似乎仅应用于应用程序内。
因此,应用程序 A 中的资源会等待 PreSync 挂钩按预期配置主题,但应用程序 B 和 C 不会等待应用程序 A 同步。
有没有办法控制项目内应用程序之间同步的顺序/依赖关系?
我见过提到“应用程序的应用程序”模式,其中您有一个应用程序部署所有其他应用程序。这样做是否允许我们利用 SyncWave 确保应用程序 A 在尝试同步应用程序 B 和 C 之前完全解析?如果没有,还有其他办法吗?
有构建环境变量(https://argoproj.github.io/argo-cd/user-guide/build-environment/),因此可以在 application/helm yaml 文件中注入类似的内容$ARGOCD_APP_NAME,并将其解析为实际值。
有没有一种方法可以设置自定义环境变量,以便可以在 argocd 应用程序 yaml 文件上解析它?
例如,在下面的 argocd 应用程序 yaml 中,需要设置 ENV 值,以便 helm 可以知道要使用哪些values.yaml。
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
...
spec:
...
source:
...
helm:
valueFiles:
- values_${ENV}.yaml
Run Code Online (Sandbox Code Playgroud) 我正在寻找 ArgoCD for Kubernetes 以 GitOps 方式部署应用程序。
只是想知道是否有适用于 AWS ECS 和 Hashicorp Nomad 的类似产品。
我知道AWS Proton,它不像ArgoCD那么简单。对于AWS ECS,我只是在寻找一些可以读取ECS任务定义和服务定义并将其与AWS ECS同步的工具。
我已经开始使用 k8s 和 argoCD 进行 GitOps 之旅,使用应用程序源和部署文件(清单、环境配置等)的单独存储库,并且我试图弄清楚,如果应用程序源代码更改还需要更改环境配置。
示例:应用程序已部署并在测试/QA 环境中运行,我想推送代码更改,这需要新的“DB_ConnectionString”环境变量。由于此环境变量是新的,因此它不存在于我的部署/gitops 存储库的配置文件中(假设它是 Helm value-QA.yml)。
如果我推送这个新的代码更改,CI 将构建应用程序并更新容器,这会提示 argoCD 部署新的容器版本 - 但因为我还没有更新 GitOps 存储库,所以它缺少这个新变量,并且部署将失败。
我想我很难理解,如果在这些情况下,我被迫始终确保我的 GitOps 存储库在我的应用程序存储库之前更新,以及是否有最佳实践来处理此流程?
我查看了所有 ArgoCD文档,但不知何故我似乎找不到答案。我有一个像这样的应用程序规范:
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: myapp
namespace: argocd
spec:
destination:
namespace: default
server: https://kubernetes.default.svc
project: default
source:
helm:
valueFiles:
- my-values.yaml
path: .
repoURL: ssh://git@blah.git
targetRevision: HEAD
Run Code Online (Sandbox Code Playgroud)
但是,我还需要指定一个特定的 helm 值(就像您在 helm 命令中所做的那样)--set。我在 ArgoCD Web UI 中看到它有一个Values位置,但我已经尝试了我能想到的所有条目组合(somekey=somevalue, somekey:somevalue, somekey,somevalue)。我也尝试直接编辑清单,但尝试这样做时仍然遇到类似的错误。
该错误是一长串废话,结尾为error unmarshaling JSON: while decoding JSON: json: cannot unmarshal string into Go value of type map[string]interface {}
通过 Web UI 或清单文件设置单个值的正确语法是什么?
我正在尝试在我们公司引入 GitOps。大多数情况下,我们都有用 Django 编写的微服务(但是,它也可以是任何其他 Web 框架)。我对数据库迁移有一个概念性问题。向前迁移很简单:您可以将它们作为作业或 init 容器或 helm 中的钩子来运行。但是向后迁移呢?假设我想从 v1.1 回滚到 v1.0,并且我有一些迁移需要取消应用。现在怎么办?我想使用 argo cd 或 Flux。
有一篇非常好的文章:https://www.weave.works/blog/how-to- Correctly-handle-db-schemas-during-kubernetes-rollouts 。然而,它需要一些 Django 中没有的纪律
如何停止/启动ArgoCD中部署的应用程序?
我只看到删除或同步或部署/重新部署选项。我正在运行服务器应用程序,并且我想暂时停止(关闭)它们在集群中的功能。或者我在这个概念中遗漏了一些东西?
我是否需要为我的服务器应用程序实现某种自定义接口,以使启动/停止功能成为可能并直接与我的应用程序通信?(所以它不属于ArgoCD的责任 - 即它不像Linux服务管理系统 - 我需要自己在应用程序级别实现它)
continuous-integration continuous-deployment continuous-delivery kubernetes argocd
我有一个我认为常见的用例,但我真的很难找到解决方案:
我想Kustomize在我们的部署中重用补丁中的变量。具体来说,我们使用提交 ID 来引用图像标签(用例 A)和与部署相关的 k8s 作业(用例 B)。
我们使用的设置中,对于每个 ArgoCD 应用程序,我们都有一个/base/文件夹/overlays/[environment-name],并且该基础用kustomization.yaml.
一个非常简单的用法 -/overlays/[environment-name]我们有一个kustomization.yaml使用:
images:
- name: our-aws-repo-url
newName: our-aws-repo-url
newTag: commit-id
Run Code Online (Sandbox Code Playgroud)
工作起来就像一个魅力,因为我们可以将其重新用于部署本身及其相关作业,所有这些都只需一个提交引用。
问题:
我们使用 N 个作业来进行 0 停机部署的迁移,其中我们运行运行迁移的 alembic 容器,并且我们有一个waitforit initContainer监听作业完成的容器,即当迁移成功时才能进行部署。
现在的问题是,我需要触摸一个服务覆盖层中的 4 个文件来修补各处的 id(我们用它来识别作业):
- image: groundnuty/k8s-wait-for:v1.4
imagePullPolicy: IfNotPresent
args:
- "job"
- "job-commit-id"
Run Code Online (Sandbox Code Playgroud)
apiVersion: batch/v1
kind: Job
metadata:
name: job-commit-id
Run Code Online (Sandbox Code Playgroud)
我认为应该可行的是:
我们有时希望在部署新版本应用程序之前运行一些数据库迁移作业。ArgoCD 中的常见方法似乎是使用 PreSync 挂钩,我已经测试过它并且似乎有效,但我发现它在功能方面有点有限,并且不确定我是否遗漏了某些内容或如果事情就是这样的话。
我希望它的工作方式是仅在数据库迁移作业以某种方式发生更改(很可能是新映像)时才运行,但是预同步作业的设计方式(并且可以理解)是始终运行每次同步时指定作业。从功能上来说,这很好,迁移作业将需要约 20 秒的时间来启动和完成,最终什么也不做,但是对于每个不相关的更改都发生这种情况显然并不理想。
我希望有某种方法可以实现我所缺少的“ArgoCD 本机”。
我当前使用的作业模板(并且运行每次同步)是这样的:
{{- define "project.migration_job" -}}
{{- $appsettings := (get .Values.global.apps .name) }}
---
apiVersion: batch/v1
kind: Job
metadata:
generateName: {{ .name }}-
annotations:
argocd.argoproj.io/hook: PreSync
spec:
template:
spec:
automountServiceAccountToken: false
containers:
- name: {{ .name }}
image: "{{ .Values.global.repo }}/{{ .name }}:{{ $appsettings.image }}"
resources:
requests:
memory: {{ $appsettings.memory | default "256Mi" | quote }}
cpu: {{ $appsettings.cpu | default "75m" | quote }}
limits:
memory: {{ $appsettings.memory | …Run Code Online (Sandbox Code Playgroud) 我有以下内容:
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: crm
namespace: default
spec:
project: default
source:
repoURL: <my url
targetRevision: argocd
path: argocd/
destination:
server: https://kubernetes.default.svc
namespace: default
syncPolicy:
syncOptions:
- CreateNamespace=true
automated:
selfHeal: true
prune: true
Run Code Online (Sandbox Code Playgroud)
这正在将 argocd 与主分支连接起来,但是如果我希望它遵循不同的分支怎么办?
谢谢。
argocd ×10
gitops ×5
kubernetes ×5
amazon-ecs ×1
argoproj ×1
fluxcd ×1
github ×1
kustomize ×1
yaml ×1