You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在Argo GitOps托管Kubernetes配置场景下接收用户自定义输入

如何在Argo GitOps托管Kubernetes配置场景下接收用户自定义输入

看起来你现在卡在了GitOps场景下的一个棘手问题:既要让使用你托管K8s配置的团队能输入自定义内容,又得兼顾团队的技术能力(他们搞不定补丁和overlay),还不能违背GitOps的初衷——总不能给每个集群都加个overlay吧?我来给你几个实用的落地思路:

方案1:用Argo CD参数化+Kustomize占位符,让团队在Application里传参数

这是最直接的方案,完全不用团队维护额外配置,只需要在他们的Application里加几行参数就行。

首先,你需要在自己的devex-argo仓库里,把需要自定义的部分做成可替换的占位符。比如用Kustomize的ConfigMap来承载配置项:

# environments/devex-stable/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- ../base
# 用ConfigMap来存放可自定义的配置
configMapGenerator:
- name: devex-team-config
  envs:
  - config.env
# 如果需要把配置注入到其他资源里,可以用vars关联
vars:
- name: TEAM_WORKLOAD_NAMESPACE
  objref:
    kind: ConfigMap
    name: devex-team-config
    apiVersion: v1
  fieldref:
    fieldpath: data.WORKLOAD_NAMESPACE

然后在config.env里设置默认值:

WORKLOAD_NAMESPACE=default
ENABLE_ADVANCED_FEATURE=false

接下来,团队只需要在他们的Application里添加source.parameters字段,就能覆盖这些默认值:

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: asterix
  namespace: argo
spec:
  project: default
  source:
    repoURL: 'git@github.com:repo/devex-argo.git'
    targetRevision: feat/feast
    path: 'environments/devex-stable'
    # 这里就是团队需要填写的自定义参数
    parameters:
    - name: WORKLOAD_NAMESPACE
      value: asterix-team
    - name: ENABLE_ADVANCED_FEATURE
      value: "true"
  destination:
    server: 'https://kubernetes.default.svc'
    namespace: argo
  syncPolicy:
    automated:
      prune: true
      selfHeal: true

Argo CD在构建Kustomize的时候,会自动把这些参数替换到你的ConfigMap里,团队完全不用碰你的仓库,也不用搞复杂的overlay。

方案2:用Application Set自动生成带参数的应用(适合批量团队/集群)

如果你的团队数量多,或者是按集群划分的,可以用Argo CD的Application Set来自动化这件事——让团队只需要给集群打个标签,就能自动生成带他们自定义参数的Application。

比如你先创建一个Application Set模板:

apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
  name: devex-managed-apps
  namespace: argo
spec:
  # 用集群标签来筛选需要启用托管配置的集群
  generators:
  - clusters:
      selector:
        matchLabels:
          devex-enabled: "true"
      # 从集群标签里提取自定义参数
      values:
        workloadNs: "{{metadata.labels.team-workload-ns}}"
        enableFeature: "{{metadata.labels.enable-advanced-feature}}"
  # 自动生成Application的模板
  template:
    metadata:
      name: "{{name}}-devex"
    spec:
      project: default
      source:
        repoURL: 'git@github.com:repo/devex-argo.git'
        targetRevision: feat/feast
        path: 'environments/devex-stable'
        parameters:
        - name: WORKLOAD_NAMESPACE
          value: "{{values.workloadNs}}"
        - name: ENABLE_ADVANCED_FEATURE
          value: "{{values.enableFeature}}"
      destination:
        server: "{{server}}"
        namespace: argo
      syncPolicy:
        automated:
          prune: true
          selfHeal: true

这样,只要运维给集群打上devex-enabled: trueteam-workload-ns: asterix-team这类标签,Application Set就会自动生成对应的Application,团队连手动创建Application的步骤都省了。

方案3:轻量级Kustomize远程引用(适合能维护极简配置的团队)

如果团队能接受维护一个超简单的本地配置文件(只有几行,不用管复杂的overlay),可以让他们在自己的仓库里创建一个极简的Kustomize文件,直接引用你的托管配置,然后覆盖参数:

比如团队自己仓库里的kustomization.yaml

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
# 直接引用你的托管配置作为远程base
resources:
- git@github.com:repo/devex-argo.git//environments/devex-stable?ref=feat/feast
# 用replace行为覆盖你的默认ConfigMap
configMapGenerator:
- name: devex-team-config
  behavior: replace
  envs:
  - local-team-config.env

然后他们只需要在local-team-config.env里写自己的参数:

WORKLOAD_NAMESPACE=asterix-team
ENABLE_ADVANCED_FEATURE=true

这个方案的好处是你完全不用管参数传递,团队只需要维护一个小文件,但前提是团队能接受这一点点配置工作——如果他们连这个都搞不定,还是优先用前两个方案。


备注:内容来源于stack exchange,提问作者Bok

火山引擎 最新活动