Bootstrap 과정 이해하기 Part. 2

Bootstrap 과정 이해하기 Part. 2에서는 Kustomization 이후 ArgoCD가 구성되고, Boostrap 하위의 Helm Chart들이 구성되는 과정에 대해 살펴보도록 하겠습니다.

Boostrap Template 구조

먼저 Bootstrap Template 구조를 살펴보기 위해 k8s-common-chart의 bootstrap directory에서 tree명령어를 입력하면 아래와 같이 출력되는 것을 확인할 수 있습니다.

k8s-common-chart/bootstrap > tree
.
├── Chart.yaml
├── templates
   ├── actions-runner-controller.yaml
   ├── argo-rollouts.yaml
   ├── aws-load-balancer-controller.yaml
   ├── aws-node-termination-handler.yaml
   ├── cert-manager.yaml
   ├── external-dns.yaml
   ├── istio-base.yaml
   ├── istio-control.yaml
   ├── istio-egressgateway.yaml
   ├── istio-ingressgateway.yaml
   ├── karpenter.yaml
   └── metrics-server.yaml
└── values.yaml

2 directories, 14 files

ArgoCD를 구성할 때 k8s-chart-value/eksdapne2-aolu/argocd/kustomization.yaml가 있는 경로에서 kustomize build 후 kubectl apply를 쳤었습니다. 이 때 argocd/add-boostrap-variables.yaml이 ArgoCD를 생성할 때 Application 중 하나로 생성된 bootstrap application에 kustomization.yaml에 지정된 것처럼 patch를 하게 됩니다. 이 때 helm teamplate에 대해 value가 주입되게 됩니다.

(... 생략 ...)
  # Add the bootstrap variables
  - target:
      group: argoproj.io
      version: v1alpha1
      kind: Application
      name: bootstrap
    path:  patches/add-bootstrap-variables.yaml
(... 생략 ...)    

각 Application들을 Template 최상단에 보시다시피 특정 app에 대한 if 조건문을 통해 선택적으로 구성할 수 있게 됩니다.

{{- if or (not .Values.karpenter) (.Values.karpenter.enabled ) -}}
---
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  namespace: argocd
  name: karpenter
  finalizers:
    - resources-finalizer.argocd.argoproj.io
spec:
  project: infra
  source:
    repoURL: public.ecr.aws/karpenter
    targetRevision: 0.37.0
    chart: karpenter
    helm:
      values: |-
        serviceAccount:
          annotations:
            eks.amazonaws.com/role-arn: arn:aws:iam::{{ .Values.accountId }}:role/eks-{{ .Values.clusterName }}-karpenter-controller
        settings:
          clusterName: {{ .Values.clusterName }}
          clusterEndpoint: {{ .Values.clusterEndpoint }}
        featureGates:
          drift: {{ .Values.karpenter.enable_drift }}
          spotToSpotConsolidation: {{ .Values.karpenter.enable_spotToSpotConsolidation }}
        affinity: 
          nodeAffinity:
            requiredDuringSchedulingIgnoredDuringExecution:
              nodeSelectorTerms:
              - matchExpressions:
                - key: karpenter.sh/provisioner-name
                  operator: DoesNotExist
              - matchExpressions:
                - key: eks.amazonaws.com/nodegroup
                  operator: In
                  values:
                  - {{ .Values.clusterName }}-ng-ondemand
                  - {{ .Values.clusterName }}-ng-spot
                    #        topologySpreadConstraints:
                    #        - maxSkew: 1
                    #          topologyKey: capacity-spread
                    #          whenUnsatisfiable: DoNotSchedule
  destination:
    server: https://kubernetes.default.svc
    namespace: karpenter
  syncPolicy:
    automated:
      prune: true
      selfHeal: true
    syncOptions:
      - CreateNamespace=true
{{- end }}

Last updated