EKS 에서 운영에 필요한 인프라 구성요소를 Helm chart 로 설치하는 방법을 정리
chart/ 디렉토리에서 Git 관리설치 대상
| 구성요소 | chart | namespace | 용도 |
|---|---|---|---|
| PostgreSQL | bitnami/postgresql | db | RDB |
| Redis | bitnami/redis | db | 캐시/세션 |
| OpenSearch | opensearch/opensearch | db | 검색/분석 |
| Prometheus + Grafana | kube-prometheus-stack | monitoring | 모니터링 |
| PushGateway | prometheus-pushgateway | monitoring | 배치 메트릭 수집 |
| Fluent-bit | fluent/fluent-bit | kube-system | 로그 수집 |
nodeSelector:
nodegroup: "<node_pool>"
tolerations:
- key: "nodegroup"
operator: "Equal"
value: "<node_pool>"
effect: "NoSchedule"
helm repo add bitnami https://charts.bitnami.com/bitnami
helm install pg-dev bitnami/postgresql -n db -f values.yaml
image:
repository: bitnami/postgresql
tag: latest
auth:
username: admin
password: "<password>"
database: <db_name>
primary:
nodeSelector:
nodegroup: "<node_pool>"
tolerations:
- key: "nodegroup"
operator: "Equal"
value: "<node_pool>"
effect: "NoSchedule"
persistence:
enabled: true
storageClass: gp3
size: 20Gi
resources:
requests:
cpu: 200m
memory: 512Mi
limits:
cpu: 500m
memory: 1Gi
readReplicas:
enabled: false
# standalone
helm install redis bitnami/redis -n db -f values.yaml
# cluster
helm install redis bitnami/redis -n db -f cluster_values.yaml
architecture: standalone
auth:
enabled: false
master:
nodeSelector:
nodegroup: "<node_pool>"
tolerations:
- key: "nodegroup"
operator: "Equal"
value: "<node_pool>"
effect: "NoSchedule"
persistence:
enabled: true
storageClass: gp3
size: 10Gi
resources:
requests:
cpu: "2"
memory: "2Gi"
limits:
cpu: "4"
memory: "16Gi"
# Redis config override
redis:
configmap: |-
save 900 1
save 300 10
save 60 10000
rdbcompression yes
rdbchecksum yes
maxmemory 16GB
maxmemory-policy volatile-ttl
appendonly no
helm install opensearch-dev opensearch/opensearch -n db -f values.yaml
clusterName: opensearch-cluster
replicas: 3
image:
repository: opensearchproject/opensearch
tag: "3.1.0"
# 인증 정보는 Secret 으로 분리
envFrom:
- secretRef:
name: opensearch-admin-password
persistence:
enabled: true
storageClass: gp3
size: 50Gi
resources:
requests:
cpu: 500m
memory: 2Gi
limits:
cpu: "1"
memory: 4Gi
nodeSelector:
nodegroup: "<node_pool>"
tolerations:
- key: "nodegroup"
operator: "Equal"
value: "<node_pool>"
effect: "NoSchedule"
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update
kubectl create namespace monitoring
helm upgrade --install kps prometheus-community/kube-prometheus-stack \
-f values.yaml -n monitoring
fullnameOverride: kps
prometheus:
prometheusSpec:
retention: 15d
storageSpec:
volumeClaimTemplate:
spec:
accessModes: ["ReadWriteOnce"]
storageClassName: gp3
resources:
requests:
storage: 50Gi
scrapeInterval: 30s
evaluationInterval: 30s
# 모든 namespace 의 ServiceMonitor 를 수집
serviceMonitorSelectorNilUsesHelmValues: false
podMonitorSelectorNilUsesHelmValues: false
alertmanager:
enabled: false
# 각 노드 OS 지표
prometheus-node-exporter:
enabled: true
# K8s 오브젝트 상태 지표
kube-state-metrics:
enabled: true
nodeSelector:
nodegroup: "<node_pool>"
tolerations:
- key: "nodegroup"
operator: "Equal"
value: "<node_pool>"
effect: "NoSchedule"
serviceMonitorSelectorNilUsesHelmValues: falseservice.type: LoadBalancer 로 설정하여 ALB 로 직접 접근# LoadBalancer 주소 확인
kubectl get svc kps-grafana -n monitoring -o jsonpath='{.status.loadBalancer.ingress[0].hostname}'
# 또는 포트포워딩
kubectl port-forward --namespace monitoring svc/kps-grafana 3000:80
helm install pushgateway prometheus-community/prometheus-pushgateway \
-n monitoring \
--set serviceMonitor.enabled=true \
--set serviceMonitor.namespace=monitoring \
--set serviceMonitor.additionalLabels.release=prometheus-stack
additionalLabels.release=prometheus-stack : Prometheus 가 이 ServiceMonitor 를 수집하도록 label 매칭aws eks describe-cluster \
--name <cluster_name> \
--query "cluster.identity.oidc.issuer" \
--output text
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Federated": "arn:aws:iam::<account_id>:oidc-provider/<oidc_provider>"
},
"Action": "sts:AssumeRoleWithWebIdentity",
"Condition": {
"StringEquals": {
"<oidc_provider>:sub": "system:serviceaccount:kube-system:fluent-bit"
}
}
}
]
}
aws iam create-role \
--role-name fluent-bit-iam-role \
--assume-role-policy-document file://trust-policy.json
aws iam attach-role-policy \
--role-name fluent-bit-iam-role \
--policy-arn arn:aws:iam::aws:policy/CloudWatchAgentServerPolicy
apiVersion: v1
kind: ServiceAccount
metadata:
name: fluent-bit
namespace: kube-system
annotations:
eks.amazonaws.com/role-arn: arn:aws:iam::<account_id>:role/fluent-bit-iam-role
helm repo add fluent https://fluent.github.io/helm-charts
helm upgrade --install fluent-bit fluent/fluent-bit \
-n kube-system -f fluent-bit-values.yaml
config:
service: |
[SERVICE]
Flush 1
Log_Level info
HTTP_Server On
HTTP_Listen 0.0.0.0
HTTP_Port 2020
inputs: |
[INPUT]
Name tail
Path /var/log/containers/*<app_name>*.log
multiline.parser docker, cri
Tag app.*
Mem_Buf_Limit 5MB
Skip_Long_Lines On
filters: |
[FILTER]
Name kubernetes
Match app.*
Merge_Log On
Keep_Log Off
outputs: |
[OUTPUT]
Name cloudwatch_logs
Match app.*
region ap-northeast-1
log_group_name /eks/app/<app_name>
log_stream_prefix <app_name>-
auto_create_group true
serviceAccount:
create: false
name: fluent-bit
tolerations:
- key: "nodegroup"
operator: "Equal"
value: "infra"
effect: "NoSchedule"
# Helm release 삭제
helm uninstall <release_name> -n <namespace>
# PVC 도 정리할 경우 (데이터 삭제됨)
kubectl delete pvc -n <namespace> --all