EKS Baseline App Upgrade
aws-ebs-csi-driver
AWS EBS ๋ณผ๋ฅจ์ Kubernetes ์์ ๋์ ์ผ๋ก ํ๋ก๋น์ ๋ํ๊ณ ํ๋ ๋ผ์ดํ์ฌ์ดํด์ ๋ง์ถฐ attach/detach ๋ฅผ ์๋ํํ๋ CSI ๋๋ผ์ด๋ฒ๋ค. StorageClass ์ PVC ๋ฅผ ํตํด ํ์ํ ํฌ๊ธฐ ๋ฐ ํ์ (gp3, io2 ๋ฑ) AZ ์ ์ฝ ๋ฑ์ ์ ์ธ์ ์ผ๋ก ์ ์ํ ์ ์์ผ๋ฉฐ, ๋ ธ๋ ์ฅ์ ์ ์ฌ์ค์ผ์ค๋ ํ๋์ ๋ณผ๋ฅจ์ ์ฌ๋ถ์ฐฉํด ๊ฐ์ฉ์ฑ์ ๋์ธ๋ค.
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: aws-ebs-csi-driver
namespace: argocd
spec:
project: default
source:
repoURL: https://kubernetes-sigs.github.io/aws-ebs-csi-driver
chart: aws-ebs-csi-driver
targetRevision: X.Y.Z # ์ฐจํธ ๋ฒ์ ๊ณ ์
helm:
values: |
controller:
serviceAccount:
create: true
# annotations:
# eks.amazonaws.com/role-arn: arn:aws:iam::<ACCOUNT_ID>:role/<ROLE_NAME>
destination:
server: https://kubernetes.default.svc
namespace: kube-system
syncPolicy:
automated:
prune: true
selfHeal: trueArgoCD ์ Helm Chart ๋ก Kubernetes Cluster ์ ๊ฐํธํ๊ฒ ์ค์นํ ์ ์๋ค. ์๋ก์ด ๋ฒ์ ๋ฆด๋ฆฌ์ฆ๊ฐ ๋์ค๋ฉด targetRevision ์ ์ ์ฐจํธ ๋ฒ์ ์ผ๋ก ์ฌ๋ฆฌ๊ณ Sync, ๋กค๋ฐฑ์ ์ด์ ๋ฒ์ ์ผ๋ก ๋๋๋ฆฐ ํ Sync.
aws-efs-csi-driver
EFS ํ์ผ ์์คํ ์ Kubernetes ํ๋์ ๊ณต์ ์คํ ๋ฆฌ์ง๋ก ์ ๊ณตํ๋ CSI ๋๋ผ์ด๋ฒ๋ค.
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: aws-efs-csi-driver
namespace: argocd
spec:
project: default
source:
repoURL: https://kubernetes-sigs.github.io/aws-efs-csi-driver
chart: aws-efs-csi-driver
targetRevision: X.Y.Z
helm:
values: |
controller:
serviceAccount:
create: true
# annotations:
# eks.amazonaws.com/role-arn: arn:aws:iam::<ACCOUNT_ID>:role/<ROLE_NAME>
destination:
server: https://kubernetes.default.svc
namespace: kube-systemArgoCD ์ Helm Chart ๋ก Kubernetes Cluster ์ ๊ฐํธํ๊ฒ ์ค์นํ ์ ์๋ค. ์๋ก์ด ๋ฒ์ ๋ฆด๋ฆฌ์ฆ๊ฐ ๋์ค๋ฉด targetRevision ์ ์ ์ฐจํธ ๋ฒ์ ์ผ๋ก ์ฌ๋ฆฌ๊ณ Sync, ๋กค๋ฐฑ์ ์ด์ ๋ฒ์ ์ผ๋ก ๋๋๋ฆฐ ํ Sync.
aws-load-balancer-controller
Ingress ์ Service ๋ฆฌ์์ค๋ฅผ ๊ด์ฐฐํ์ฌ ALB/NLB ๋ฑ AWS ๋ก๋๋ฐธ๋ฐ์๋ฅผ ์ ์ธ์ ์ผ๋ก ๊ด๋ฆฌํ๋ ์ปจํธ๋กค๋ฌ๋ค. ALB Ingress ์ ๊ฒฝ์ฐ ๋ฆฌ์ค๋ ๊ท์น/ํ๊น๊ทธ๋ฃน/๋ณด์๊ทธ๋ฃน/์๋ธ๋ท ํ๊น ์๊ฑด ๋ฑ์ ์ด๋ ธํ ์ด์ ์ผ๋ก ์ ์ดํ๊ณ , NLB๋ L4 ์์ค์ ๊ณ ์ฑ๋ฅ ํธ๋ํฝ ๋ถ์ฐ์ ์ ๊ณตํ๋ค.
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: aws-load-balancer-controller
namespace: argocd
spec:
project: default
source:
repoURL: https://aws.github.io/eks-charts
chart: aws-load-balancer-controller
targetRevision: X.Y.Z
helm:
values: |
clusterName: <EKS_CLUSTER_NAME>
serviceAccount:
create: true
# annotations:
# eks.amazonaws.com/role-arn: arn:aws:iam::<ACCOUNT_ID>:role/<ROLE_NAME>
destination:
server: https://kubernetes.default.svc
namespace: kube-systemArgoCD ์ Helm Chart ๋ก Kubernetes Cluster ์ ๊ฐํธํ๊ฒ ์ค์นํ ์ ์๋ค. ์๋ก์ด ๋ฒ์ ๋ฆด๋ฆฌ์ฆ๊ฐ ๋์ค๋ฉด targetRevision ์ ์ ์ฐจํธ ๋ฒ์ ์ผ๋ก ์ฌ๋ฆฌ๊ณ Sync, ๋กค๋ฐฑ์ ์ด์ ๋ฒ์ ์ผ๋ก ๋๋๋ฆฐ ํ Sync.
coredns
ํด๋ฌ์คํฐ ๋ด๋ถ ์๋น์ค ๋์ค์ปค๋ฒ๋ฆฌ๋ฅผ ๋ด๋นํ๋ DNS ์๋ฒ๋ก, ํ๋์์์ DNS ์ฟผ๋ฆฌ๋ฅผ kube-dns/CoreDNS ๋ก ๋ผ์ฐํ ํ์ฌ ์๋น์ค ์ด๋ฆ์ IP ๋ก ํด์ํ๋ค. EKS ์์๋ ๊ด๋ฆฌํ ์ ๋์จ์ผ๋ก ์ด์ํ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ด๋ฉฐ, ์ง์ Helm ์ผ๋ก ๋ฐฐํฌํ ๊ฒฝ์ฐ kube-system ๋ค์์คํ์ด์ค ๋ด ๊ธฐ์กด ๊ตฌ์ฑ๊ณผ ์ถฉ๋ํ์ง ์๋๋ก ์ฃผ์ํด์ผ ํ๋ค.
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: coredns
namespace: argocd
spec:
project: default
source:
repoURL: https://coredns.github.io/helm
chart: coredns
targetRevision: X.Y.Z
helm:
values: |
replicaCount: 2
destination:
server: https://kubernetes.default.svc
namespace: kube-systemArgoCD ์ Helm Chart ๋ก Kubernetes Cluster ์ ๊ฐํธํ๊ฒ ์ค์นํ ์ ์๋ค. ๊ด๋ฆฌํ ์ ๋์จ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์ค๋ณต ๋ฐฐํฌ๋ฅผ ํผํ๊ณ , ์ ๊ทธ๋ ์ด๋ ์์๋ targetRevision ๋ง ์ ๋ฒ์ ์ผ๋ก ์ฌ๋ฆฐ ๋ค Sync ํ์.
datadog-agent
ํด๋ฌ์คํฐ/๋ ธ๋/ํ๋ ์์ค์ ๋ฉํธ๋ฆญ, ๋ก๊ทธ, ํธ๋ ์ด์ค๋ฅผ ์์งํด Datadog ์ผ๋ก ์ ์กํ๋ ์์ด์ ํธ ํจํค์ง๋ค. DaemonSet ์์ด์ ํธ(์ธํ๋ผ/๋ก๊ทธ)์ APM(Trace) ์์ด์ ํธ๋ฅผ ์กฐํฉํด ๋ฐฐํฌํ๋ฉฐ, kube-state-metrics, cluster-agent ๋ฑ๊ณผ์ ํตํฉ์ผ๋ก ์ปจํธ๋กคํ๋ ์ธ/์ค๋ธ์ ํธ ์ํ ๋ฉํธ๋ฆญ๊น์ง ์์งํ ์ ์๋ค.
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: datadog-agent
namespace: argocd
spec:
project: default
source:
repoURL: https://helm.datadoghq.com
chart: datadog
targetRevision: X.Y.Z
helm:
values: |
datadog:
site: datadoghq.com
apiKeyExistingSecret: datadog-secret
logs:
enabled: true
apm:
enabled: true
destination:
server: https://kubernetes.default.svc
namespace: datadogArgoCD ์ Helm Chart ๋ก Kubernetes Cluster ์ ๊ฐํธํ๊ฒ ์ค์นํ ์ ์๋ค. ์๋ก์ด ๋ฒ์ ๋ฆด๋ฆฌ์ฆ๊ฐ ๋์ค๋ฉด targetRevision ์ ์ ์ฐจํธ ๋ฒ์ ์ผ๋ก ์ฌ๋ฆฌ๊ณ Sync, ํ์ ์ ์ด๋ฏธ์ง ํ๊ทธ๋ฅผ values ๋ก ์ค๋ฒ๋ผ์ด๋ํ๋ฉฐ, ๋กค๋ฐฑ์ ์ด์ ๋ฒ์ ์ผ๋ก ๋๋๋ฆฐ ํ Sync.
external-dns
Ingress, Service, Gateway ๋ฑ์ ๋ณ๊ฒฝ์ ๊ฐ์ํด Route53 ๊ฐ์ DNS ์ ๊ณต์์ A/AAAA/CNAME/TXT ๋ ์ฝ๋๋ฅผ ์๋์ผ๋ก ์์ฑ, ๊ฐฑ์ , ์ ๋ฆฌํ๋ ์ปจํธ๋กค๋ฌ๋ค. ์ฌ๋ฌ ํด๋ฌ์คํฐ๋ฅผ ๋์ผํ ๋๋ฉ์ธ์ ์ฐ๊ฒฐํ ๋๋ txtOwnerId ์ domainFilters ๋ฅผ ํตํด ์์ ๊ถ ์ถฉ๋๊ณผ ์ค์๋์ ๋ฐฉ์งํ๋ค.
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: external-dns
namespace: argocd
spec:
project: default
source:
repoURL: https://kubernetes-sigs.github.io/external-dns/
chart: external-dns
targetRevision: X.Y.Z
helm:
values: |
provider: aws
policy: upsert-only
txtOwnerId: <CLUSTER_NAME>
# domainFilters:
# - example.com
serviceAccount:
annotations:
# IRSA ์์
# eks.amazonaws.com/role-arn: arn:aws:iam::<ACCOUNT_ID>:role/<ROLE_NAME>
destination:
server: https://kubernetes.default.svc
namespace: external-dnsArgoCD ์ Helm Chart ๋ก Kubernetes Cluster ์ ๊ฐํธํ๊ฒ ์ค์นํ ์ ์๋ค. ์๋ก์ด ๋ฒ์ ๋ฆด๋ฆฌ์ฆ๊ฐ ๋์ค๋ฉด targetRevision ์ ์ ์ฐจํธ ๋ฒ์ ์ผ๋ก ์ฌ๋ฆฌ๊ณ Sync, ๋กค๋ฐฑ์ ์ด์ ๋ฒ์ ์ผ๋ก ๋๋๋ฆฐ ํ Sync.
istio
์๋น์ค ๋ฉ์ ์๋ฃจ์ ์ผ๋ก, ํธ๋ํฝ ๋ผ์ฐํ (๊ฐ์ค์น/์นด๋๋ฆฌ/๋ฏธ๋ฌ๋ง), ๋ณด์(mTLS/์ ์ฑ ), ๊ด์ฐฐ์ฑ(๋ฉํธ๋ฆญ/๋ก๊ทธ/ํธ๋ ์ด์ค)์ ์ ๊ณตํ๋ค. ์ค์น๋ ๋ณดํต CRD ๋ฅผ ํฌํจํ base โ ์ปจํธ๋กคํ๋ ์ธ(istiod) โ ๋ฐ์ดํฐํ๋ ์ธ(gateway) ์์ผ๋ก ์งํํ๋ฉฐ, ๋ค์์คํ์ด์ค ์๋ ์ฌ์ด๋์นด ์ฃผ์ ์ค์ ๊ณผ ๋ฆฌ์์ค ์์ฒญ/์ ํ ์กฐ์ ์ด ์ด๊ธฐ ์์ ์ฑ์ ์ค์ํ๋ค. ์ ๊ทธ๋ ์ด๋๋ ์ปจํธ๋กคํ๋ ์ธ์ ๋จผ์ ์ฌ๋ฆฐ ๋ค ์ํฌ๋ก๋ ์ฌ์ด๋์นด๋ฅผ ์ ์ง์ ์ผ๋ก ๋กค๋งํ๋ค.
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: istio-base
namespace: argocd
spec:
project: default
source:
repoURL: https://istio-release.storage.googleapis.com/charts
chart: istio-base
targetRevision: X.Y.Z
destination:
server: https://kubernetes.default.svc
namespace: istio-system
---
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: istiod
namespace: argocd
spec:
project: default
source:
repoURL: https://istio-release.storage.googleapis.com/charts
chart: istiod
targetRevision: X.Y.Z
destination:
server: https://kubernetes.default.svc
namespace: istio-systemArgoCD ์ Helm Chart ๋ก Kubernetes Cluster ์ ๊ฐํธํ๊ฒ ์ค์นํ ์ ์๋ค. ์ ๊ทธ๋ ์ด๋๋ baseโistiodโgateway ์์๋ก targetRevision ์ ์ฌ๋ฆฐ ๋ค Sync ํ๋ฉฐ, ๋ฐ์ดํฐํ๋ ์ธ ์ฌ์ด๋์นด ๋กค๋ง์ ๋ณํํ๋ค.
kong-ingress-controller
Kong API ๊ฒ์ดํธ์จ์ด๋ฅผ Kubernetes Ingress/Gateway ์ปจํธ๋กค๋ฌ๋ก ํตํฉํด L7 ๋ผ์ฐํ ๊ณผ ์ธ์ฆ, ์๋์ ํ, ๊ด์ธก ํ๋ฌ๊ทธ์ธ์ ํ์ฉํ ์ ์๊ฒ ํ๋ค.
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: kong-ingress-controller
namespace: argocd
spec:
project: default
source:
repoURL: https://charts.konghq.com
chart: kong
targetRevision: X.Y.Z
helm:
values: |
ingressController:
enabled: true
destination:
server: https://kubernetes.default.svc
namespace: kongArgoCD ์ Helm Chart ๋ก Kubernetes Cluster ์ ๊ฐํธํ๊ฒ ์ค์นํ ์ ์๋ค. ์๋ก์ด ๋ฒ์ ๋ฆด๋ฆฌ์ฆ๊ฐ ๋์ค๋ฉด targetRevision ์ ์ ์ฐจํธ ๋ฒ์ ์ผ๋ก ์ฌ๋ฆฌ๊ณ Sync, ๋กค๋ฐฑ์ ์ด์ ๋ฒ์ ์ผ๋ก ๋๋๋ฆฐ ํ Sync.
vault
์ํฌ๋ฆฟ ์ ์ฅ๊ณผ ๋์ ํฌ๋ฆฌ๋ด์ ๋ฐ๊ธ(PKI/DB/ํด๋ผ์ฐ๋ ์๊ฒฉ์ฆ๋ช )์ ์ ๊ณตํ๋ฉฐ, K8s Auth์ Injector๋ก ํ๋์ ์ํฌ๋ฆฟ์ ์์ ํ๊ฒ ์ฃผ์ ํ๋ค.
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: vault
namespace: argocd
spec:
project: default
source:
repoURL: https://helm.releases.hashicorp.com
chart: vault
targetRevision: X.Y.Z
helm:
values: |
server:
ha:
enabled: true
# injector:
# enabled: true
destination:
server: https://kubernetes.default.svc
namespace: vaultArgoCD ์ Helm Chart ๋ก Kubernetes Cluster ์ ๊ฐํธํ๊ฒ ์ค์นํ ์ ์๋ค. ์๋ก์ด ๋ฒ์ ๋ฆด๋ฆฌ์ฆ๊ฐ ๋์ค๋ฉด targetRevision ์ ์ ์ฐจํธ ๋ฒ์ ์ผ๋ก ์ฌ๋ฆฌ๊ณ Sync, ๋กค๋ฐฑ์ ์ด์ ๋ฒ์ ์ผ๋ก ๋๋๋ฆฐ ํ Sync.
Troubleshooting
error when patching "/dev/shm/3212118736": StorageClass.storage.k8s.io "gp3" is invalid: volumeBindingMode: Invalid value: "WaitForFirstConsumer": field is immutable
/dev/shm์ ๋ฆฌ๋ ์ค์ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ ์์ญ- tmpfs ๋ก ๋ง์ดํธ๋์ด ์๊ณ RAM ๊ธฐ๋ฐ์ด๋ผ ๋น ๋ฆ
- ์ฃผ๋ก IPC ๋ ์ผ์์ ์ธ ๋ฐ์ดํฐ ๋ฒํผ๋ง์ ์ฌ์ฉ๋จ
- ์ฌ๋ถํ ์ ํ๋ฐ๋๋ ๊ณต๊ฐ
/dev/shm/3212118736์ ๋ณดํต ์์๋ก ์์ฑ๋ Manifest ๋ฑ์ ์ ์ฅํ๊ธฐ ์ํ ํ์ผ- ArgoCD ๊ฐ Git ์์ ๊ฐ์ ธ์จ Desired Manifest ๋ฅผ ์ ์์ ํ์ผ๋ก ์ ์ฅํ๊ณ kubectl ๋ฅผ ์คํํ๋ ๋์ค ์๋ฌ ๋ฐ์
StorageClass์volumeBindingModeํ๋๋ ๋ถ๋ณ์ธ๋ฐ ArgoCD ๊ฐ ๋ณ๊ฒฝ์ ์๋ํด์ ๋ฐ์- Live Manifest ๋
Immediate์ธ๋ฐ Desired Manifest ๋WaitForFirstConsumer
level=fatal msg="failed to sync *v1.EndpointSlice: context deadline exceeded with timeout 1m0s"
external-dns์ ๊ทธ๋ ์ด๋ ์คCrashLoopBackOff์ด์external-dns๋ฐ์ด๋๋ฆฌ๋0.17.0์์0.19.0์ผ๋ก ์ ๊ทธ๋ ์ด๋- chart version ์
1.17.0์์1.19.0์ผ๋ก ์ฌ๋ฆฌ์ง ์์์ ๋ฐ์ํ ์ด์ - chart ์
EndpointSliceAPI ์ ๊ทผ์ด ํ์ํ๊ฒ ๋ณ๊ฒฝ๋์๋๋ฐ RBAC ์ด0.17.0๋ฐ์ด๋๋ฆฌ ๊ธฐ์ค์ด๋ผ ๋ฐ์
0/3 nodes are available: 1 Insufficient cpu, 1 Insufficient memory, 1 node(s) didn't match pod topology spread constraints. preemption: 0/3 nodes are available: 3 No preemption victims found for incoming pod.
- ๋ง ๊ทธ๋๋ก ๋ฆฌ์์ค๊ฐ ๋ถ์กฑํด์ ๋ฐ์
kubectl describe nodes | grep -A5 "Allocated resources"
- ์ ๋ช ๋ น์ด๋ก cpu, memory Request ๋ฅผ ํ์ธํ๋ฉด ๋จ
Restarting istio-enabled services
kubectl get deploy,sts -A --field-selector "$(
kubectl get ns -l istio.io/rev!=stable -o name \
| sed -E 's#^[^/]+/#metadata.namespace!=#' \
| paste -sd, -
)" -o json
- istio ๋ฅผ ์ฌ์ฉ์ค์ธ namespace ์ ์๋ ๋ชจ๋ deployment ์ sts ๋ฅผ ์ถ์ถํ๋ ๋ช ๋ น์ด
- istio sidecar proxy ๊ฐ ์ฌ์์ํด์ผ ์ ๊ทธ๋ ์ด๋๊ฐ ์๋ฃ๋๊ธฐ ๋๋ฌธ์ ์ ๋ช ๋ น์ด๋ฅผ ํตํด ์ฌ์์ํ ๋ฆฌ์์ค๋ค์ ๊ตฌ๋ถ
ArgoCD v3 Degraded issue
Schema violations found: spec.preserveUnknownFields: Invalid value: true: must be false
- ArgoCD v2 ์์ v3 ๋ก ๋์ด๊ฐ์ ์๊ธด ์ด์
- ๋ช๋ช CRD ๊ฐ Degraded status
- replace ๋ก ํด๊ฒฐํ ์ ์์, replace ๋ ์ด๋ฏธ ์์ฑ๋ CR ๋ค์ ์ํฅ์ ์ฃผ์ง ์์
- ๊ด๋ จ docs
helm-git ์๋ฌ
Failed to load target state: failed to generate manifest for source 1 of 1: rpc error: code = Unknown desc = Manifest generation error (cached): plugin sidecar failed. error generating manifests in cmp: rpc error: code = Unknown desc = error generating manifests: /home/argocd/cmp-server/config/cmp.sh failed exit status 1: Error: no matches found Error: Chart.yaml file is missing Error: plugin "helm-git" exited with error
cmp.sh์์ ์คํ๋๋ helm template ๋ช ๋ น์ด์์ valueFiles ์ ํฌํจ๋ git repoURL ์ด ์กด์ฌํ์ง ์์ ๊ฒฝ์ฐ ๋ฐ์- ์๋ก์ด ํด๋ฌ์คํฐ๋ฅผ ๋ง๋ ํ์์ ํด๋ฌ์คํฐ ์ ์ฉ value ํ์ผ์ ์์ฑํ์ง ์์์ ์๊ธด ์ด์
- templating ์ผ๋ก ์๋ ์์ฑ๋ ๋ผ์ธ์ด์์, git repoURL ์ ๋ง๋ ํ์ผ์ ์์ฑํด์ ํด๊ฒฐ