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