Skip to content

Instantly share code, notes, and snippets.

@csantanapr
Last active March 17, 2025 16:47
Show Gist options
  • Save csantanapr/df2958bf62219530cbacde705a174dad to your computer and use it in GitHub Desktop.
Save csantanapr/df2958bf62219530cbacde705a174dad to your computer and use it in GitHub Desktop.
ArgoCD application set karpenter ec2node tags

Example of gitops-bridge on how to pass structure metadata annotations to helm charts in ArgoCD application sets using tempaltePAtch

Original idea from grayson user in CNCF ArgoCD Slack https://cloud-native.slack.com/archives/C01U45M2SVB/p1742224380346179?thread_ts=1741717876.631309&cid=C01U45M2SVB

apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
  name: karpenter
  namespace: argocd
spec:
  goTemplate: true
  goTemplateOptions: ["missingkey=error"]
  generators:
    - clusters:
        selector:
          matchLabels:
            prod: "false"
            
  template:
    metadata:
      name: "{{lower .name}}-karpenter"
      namespace: argocd
    spec:
      project: default
      source:
        repoURL: <...>
        targetRevision: <...>
        path: <...>
        helm:
          ignoreMissingValueFiles: true
          valueFiles:
            - values.yaml
      destination:
        name: "{{.name}}"
        namespace: karpenter
      syncPolicy:
        automated: {}
        syncOptions:
          - CreateNamespace=true
  templatePatch: |
    spec:
      source:
        helm:
          values: |
            ec2NodeClasses:
            {{- range $nodeclass := list "default" "gvisor" }}
              {{ $nodeclass }}:
                enabled: "true"
                role: role-{{$.name}}
                securityGroupSelectorTerms:
                - tags:
                    karpenter.sh/discovery: {{$.name}}
                subnetSelectorTerms:
                {{- range $subnetId := index $.metadata.annotations "karpenter-subnet-ids" | fromJson }}
                - id: {{ $subnetId }}
                {{- end }}
                {{- $tagJson := index $.metadata.annotations "karpenter-node-tags" | fromJson }}
                {{- if not (empty $tagJson) }}
                tags:
                {{- range $tag, $tagValue := $tagJson }} 
                  "{{ $tag }}": "{{ $tagValue }}"
                {{- end }}
                {{- end }}
            {{- end }}

Cluster Secret:

kind: Secret
metadata:
  annotations:
    karpenter-node-tags: '{"team": "A-Team"}'
    karpenter-subnet-ids: '["subnet-abcd", "subnet-def1"]'
  labels:
    argocd.argoproj.io/secret-type: cluster
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment