EKS

Monitoring CoreDNS in EKS with Grafana Cloud

  • kkumtree

2024-10-30T23:44:01+09:00

Grafana Cloud ์ฒซ ์‚ฌ์šฉ๊ธฐ

CloudNet@์—์„œ ์ง„ํ–‰ํ•˜๊ณ  ์žˆ๋Š” K8s Advanced Network Study(์ดํ•˜, KANS)๋ฅผ ํ†ตํ•ด ํ•™์Šตํ•œ ๋‚ด์šฉ์„ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

์ด๋ฒˆ ์ฃผ์ฐจ๋Š” ์‹ค๊ฐ์ด ์•„์ง ์•ˆ๋‚˜๋Š”๋ฐ, ์Šคํ„ฐ๋”” ๋งˆ์ง€๋ง‰ ์ฃผ์ฐจ์ž…๋‹ˆ๋‹ค.
๊ทธ๋ž˜์„œ ์—ฌ๋Ÿฌ๋ถ„์ด ์ž˜ ์•Œ๊ณ , ๋งค์šฐ ์ข‹์•„ํ•˜๋Š” EKS๋ฅผ ํ†ตํ•ด, CoreDNS ์ด์Šˆ๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๋Š” Hands-on์„ ์ฐจ๊ทผ์ฐจ๊ทผ ๋”ฐ๋ผํ•ด๋ณด๋ ค๊ณ ํ•ฉ๋‹ˆ๋‹ค.

์œ„์˜ Blog๋ฅผ ๊ทธ๋Œ€๋กœ ๋”ฐ๋ผํ•ด๋ณผ ๊ฒ๋‹ˆ๋‹ค.

0. EKS Cluster ์ƒ์„ฑ

์Šคํ„ฐ๋””์—์„œ ์ œ๊ณต๋œ CloudFormation์„ ํ†ตํ•ด EKS Cluster๋ฅผ ์ƒ์„ฑํ•ด๋ณผ๊นŒํ•ฉ๋‹ˆ๋‹ค.
eksctl์ด ์–ธ๊ธ‰๋˜์–ด ์žˆ์–ด์„œ ์™ ์ง€… ๋‚˜์ค‘์— ๋กค๋ฐฑํ•˜๊ณ  ํƒœ์ดˆ๋งˆ์„๋ถ€ํ„ฐ eksctl ๊ธฐ๋ฐ˜ CloudFormation ๋ฐฐํฌ๋ฅผ ํ•  ๊ฒƒ ๊ฐ™์€ ๋ถˆ์•ˆํ•จ์ด ์žˆ์ง€๋งŒ ํ•ด๋ณด์ฃ (?).

AWS EKS ์Šคํ„ฐ๋”” 7์ฃผ์ฐจ - Automation

  • kkumtree

2023-06-10T15:13:19+09:00

EKS ์Šคํ„ฐ๋””๋„ ๋งˆ์ง€๋ง‰ 7์ฃผ์ฐจ๋ฅผ ๋งž์ดํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด๋ฒˆ์—๋Š” AWS Controller for k8s(ACK)์™€ flux๋ฅผ ๊ฐ€๋ณ๊ฒŒ ์‹ค์Šตํ•ด๋ณด๊ณ 
์ž๋™ํ™”์— ๋Œ€ํ•ด ๋ง›๋ณด๊ธฐ๋ฅผ ํ•ด๋ณด์•˜์Šต๋‹ˆ๋‹ค.

์•ž์„œ ํ•™์Šตํ•ด๋ณธ IRSA ๊ฐœ๋… ์™ธ์—๋„ CRD(CustomResourceDefinition)์„ ํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค.

1. ์‹ค์Šตํ™˜๊ฒฝ ๋ฐฐํฌ

์‹ค์Šต์„ ์œ„ํ•œ YAMLํŒŒ์ผ์ด ๋ณ€๊ฒฝ๋œ๊ฑฐ ๋ง๊ณ ๋Š” 6์ฃผ์ฐจ์™€ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

curl -O https://s3.ap-northeast-2.amazonaws.com/cloudformation.cloudneta.net/K8S/eks-oneclick6.yaml

# ์ดํ•˜ ์ค‘๋žต

# CERT_ARN(ACM)์˜ ๊ฒฝ์šฐ์—๋Š” /etc/profile์— ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์ €์žฅ์„ ์•ˆํ•ด๋‘ฌ์„œ  
# ์„ธ์…˜์ด ๋งŒ๋ฃŒ๋˜๋ฉด, ๋‹ค์‹œ ์žฌ์„ค์ • ํ•„์š”

CERT_ARN=`aws acm list-certificates --query 'CertificateSummaryList[].CertificateArn[]' --output text`
echo $CERT_ARN

2. ACK(AWS Controller for k8s)

  • ์›น์ฝ˜์†”์— ์ ‘๊ทผํ•˜์ง€ ์•Š๊ณ ๋„, AWS ์„œ๋น„์Šค ๋ฆฌ์†Œ์Šค๋ฅผ ์ง์ ‘ k8s์—์„œ ์ •์˜ ๋ฐ ์‚ฌ์šฉ๊ฐ€๋Šฅ
  • ์ˆœ์„œ: ACK ์ปจํŠธ๋กค๋Ÿฌ ์„ค์น˜ -> IRSA ์„ค์ • -> AWS ๋ฆฌ์†Œ์Šค ์ปจํŠธ๋กค
    • ๊ฐ™์€ ํŒจํ„ด์œผ๋กœ ์ด๋ฃจ์–ด์ ธ์žˆ๋Š”๋ฐ, Cloudformation์„ ์“ฐ๋‹ค๋ณด๋‹ˆ ์ค‘๊ฐ„์ค‘๊ฐ„ ๋Œ€๊ธฐ ์‹œ๊ฐ„ ๋ฐœ์ƒ
  • (23/05/29) GA: 17๊ฐœ ์„œ๋น„์Šค, Preview: 10๊ฐœ ์„œ๋น„์Šค

2-1. S3

  • [ACK S3 Controller ์„ค์น˜]
# ์„œ๋น„์Šค๋ช… ๋ณ€์ˆ˜ ์ง€์ •
export SERVICE=s3

# helm ์ฐจํŠธ ๋‹ค์šด๋กœ๋“œ
export RELEASE_VERSION=$(curl -sL https://api.github.com/repos/aws-controllers-k8s/$SERVICE-controller/releases/latest | grep '"tag_name":' | cut -d'"' -f4 | cut -c 2-)
helm pull oci://public.ecr.aws/aws-controllers-k8s/$SERVICE-chart --version=$RELEASE_VERSION
tar xzvf $SERVICE-chart-$RELEASE_VERSION.tgz

# helm chart ํ™•์ธ
tree ~/$SERVICE-chart

# ACK S3 Controller ์„ค์น˜
export ACK_SYSTEM_NAMESPACE=ack-system
export AWS_REGION=ap-northeast-2
helm install --create-namespace -n $ACK_SYSTEM_NAMESPACE ack-$SERVICE-controller --set aws.region="$AWS_REGION" ~/$SERVICE-chart

# ์„ค์น˜ ํ™•์ธ
helm list --namespace $ACK_SYSTEM_NAMESPACE
kubectl -n ack-system get pods
kubectl get crd | grep $SERVICE

kubectl get all -n ack-system
kubectl get-all -n ack-system
kubectl describe sa -n ack-system ack-s3-controller
  • [IRSA ์„ค์ •] AmazonS3FullAccess
    • ์„ค์ • ํ›„์—๋Š” rollout์œผ๋กœ ๋ฐ˜์˜ํ•ด์ฃผ์–ด์•ผํ•จ
# Create an iamserviceaccount - AWS IAM role bound to a Kubernetes service account
eksctl create iamserviceaccount \
  --name ack-$SERVICE-controller \
  --namespace ack-system \
  --cluster $CLUSTER_NAME \
  --attach-policy-arn $(aws iam list-policies --query 'Policies[?PolicyName==`AmazonS3FullAccess`].Arn' --output text) \
  --override-existing-serviceaccounts --approve

# ํ™•์ธ
eksctl get iamserviceaccount --cluster $CLUSTER_NAME
kubectl get sa -n ack-system
kubectl describe sa ack-$SERVICE-controller -n ack-system

# Restart ACK service controller deployment using the following commands.
kubectl -n ack-system rollout restart deploy ack-$SERVICE-controller-$SERVICE-chart

# IRSA ์ ์šฉ์œผ๋กœ Env, projected Volume ์ถ”๊ฐ€ ํ™•์ธ
kubectl describe pod -n ack-system -l k8s-app=$SERVICE-chart

ISRA with override

AWS EKS ์Šคํ„ฐ๋”” 6์ฃผ์ฐจ - Security

  • kkumtree

2023-06-04T06:56:52+09:00

์ด๋ฒˆ์—๋Š” ๋ณด์•ˆ์„ ์œ„ํ•œ ์ธ์ฆ ๋ฐ ์ธ๊ฐ€, ๊ทธ๋ฆฌ๊ณ  IRSA๋ฅผ ์ค‘์‹ฌ์œผ๋กœ EKS์˜ ๋ณด์•ˆ์— ๋Œ€ํ•ด ํ•™์Šตํ•ด๋ณด์•˜์Šต๋‹ˆ๋‹ค.

kops ์Šคํ„ฐ๋”” ๋•Œ์—๋Š” ์ž˜ ๋ชฐ๋ž๋Š”๋ฐ, RBAC ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋ณต๊ธฐํ•˜๋‹ค๋ณด๋‹ˆ…

  • [4-1] projected Volume
  • [4-2] AWS Load Balancer Controller IRSA ๋ฐ LB Pod mutating

์œ„์˜ ๋‘ ๊ฐ€์ง€๊ฐ€ ์ค‘์š”ํ•œ ํŒŒํŠธ๋ฅผ ์ฐจ์ง€ํ•˜๊ณ  ์žˆ์—ˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
Network(2์ฃผ์ฐจ)๊ฐ€ ๋งค๋ฒˆ ๋ญ”๊ฐ€ ์ผ๋ถ€๊ฐ€ ์•„๋ฆฌ์†กํ•˜์˜€๋‹ค๋ฉด
Security๋Š” ๋ณต๊ธฐํ•˜๋‹ค๊ฐ€ ์ด๋ก ์ ์œผ๋กœ๋Š” ๊ฐ„๋‹จ(๊ณผ์—ฐ?)ํ•ด๋ณด์—ฌ๋„
์‹ค์ œ ๊ตฌ๋™๋ฐฉ์‹ ์ดํ•ด ์ž์ฒด๊ฐ€ ์ดˆ๋ฐ˜์— ์•ˆ๋˜์„œ, ์‚ฌํ˜ ๋‚จ์ง“ ๊ฑธ๋ฆฐ ๋•์— ๋” ์–ด๋ ค์› ๋˜ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๊ทธ ์™ธ

  1. myeks-bastion-2์— ์ ‘์† ์‹œ, ํ•จ๊ป˜ ์ง„ํ–‰ํ•  ๋•Œ๋Š” ssh {Public IP}๋กœ ์ž˜ ์ ‘์†๋˜๋Š” ๊ฑธ ๋ดค๋Š”๋ฐ ์ •์ž‘ ํ˜ผ์ž ํ•  ๋• ์ ‘์†์ด ๋˜์ง€์•Š์•˜์Šต๋‹ˆ๋‹ค.
    • Amazon Linux์—์„œ๋Š” ssh ec2-user@{Public IP}๋กœ ์ ‘์†ํ•ด์•ผํ•จ
      (ํ•„์š”ํ•œ ๊ฒฝ์šฐ sshํ‚ค๋„ ํฌํ•จ)
    • AWS Public AMI์—์„œ ์ œ๊ณต๋˜๋Š” Ubuntu AMI์˜ ๊ฒฝ์šฐ,
      ubuntu@{Public IP}๋กœ ์ ‘์†๊ฐ€๋Šฅ
    • ์ถ”์ •: ๊ณต์œ ๋œ ๋จธ์‹ ์— ๋‹ค๋ฅธ ์„ค์ •์ด ์ด์Šˆ๊ฐ€ ๋˜๋Š” ๊ฒƒ์œผ๋กœ ์ถ”์ •๋ฉ๋‹ˆ๋‹ค. ssh failure 1 ssh failure 2
  2. IAM User(testuser)๋Š” ์›น์ฝ˜์†”์—์„œ ์‚ญ์ œํ•˜๋Š” ๊ฒƒ์ด ํŽธ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
    • ์•„๋‹ˆ๋ฉด, ์•„๋ž˜์ฒ˜๋Ÿผ detach ํ•œ๋‹ค๋Š” ๋А๋‚Œ์œผ๋กœ ์ˆœ์ฐจ์  ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
      • list-attached-role-policies && detach-role-policy
      • list-access-keys && delete-access-key
      • delete-user delete user with cli
  3. CLI๋กœ IAM Trust Relationship ์กฐํšŒ
    • ์›น ์ฝ˜์†”์— ๊ตณ์ด ๋“ค์–ด๊ฐ€์•ผํ•˜๋‚˜ ํ•˜๊ณ , ๋ฌธ๋“ ํ˜ธ๊ธฐ์‹ฌ์— ์‹œ๋„ํ•˜๋‹ค๊ฐ€ ์‹œ๊ฐ„์ด ๋‚ ์•„๊ฐ”์Šต๋‹ˆ๋‹ค.
    • ๊ฒฐ๋ก : ํ•˜๋“œ์ฝ”์–ดํ•œ ํŒŒ์‹ฑ..
      • jq -r '.[].status.roleARN' | rev | cut -d '/' -f1 | rev
      • chatGPT์—๊ฒŒ ์•„๋ž˜์™€ ๊ฐ™์ด ๊ต์ • ๋ฐ›์•˜์ง€๋งŒ, ํƒํƒ์น˜ ์•Š์Œ..
        jq -r '.[].status.roleARN' | grep -oE '[^/]+$'
        iam trust relationship with cli

1. ์‹ค์Šต ํ™˜๊ฒฝ ๋ฐฐํฌ

  • ๋ชจ์˜๊ณต๊ฒฉ(?) ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•ด 2๊ฐœ์˜ bastion ์„œ๋ฒ„๊ฐ€ ๊ตฌ์„ฑ๋œ ํ™˜๊ฒฝ ๋ฐฐํฌ
  • p8s ๋ฐ grafana์˜ ๊ฒฝ์šฐ, ์„ ํƒ์ ์œผ๋กœ ๋ฐฐํฌํ•ด๋„ ๋˜์„œ ๊ธฐ์ˆ  ์ƒ๋žต
curl -O https://s3.ap-northeast-2.amazonaws.com/cloudformation.cloudneta.net/K8S/eks-oneclick5.yaml

# ์ดํ•˜ ์ค‘๋žต

# CERT_ARN(ACM)์˜ ๊ฒฝ์šฐ์—๋Š” /etc/profile์— ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์ €์žฅ์„ ์•ˆํ•ด๋‘ฌ์„œ  
# ์„ธ์…˜์ด ๋งŒ๋ฃŒ๋˜๋ฉด, ๋‹ค์‹œ ์žฌ์„ค์ • ํ•„์š”

CERT_ARN=`aws acm list-certificates --query 'CertificateSummaryList[].CertificateArn[]' --output text`
echo $CERT_ARN

2. k8s ์ธ์ฆ/์ธ๊ฐ€

  • .kube/config ํŒŒ์ผ์„ ๊ธฐ๋ฐ˜
    • cluster: k8s API ์„œ๋ฒ„ ์ ‘์†์ •๋ณด
    • users: API ์„œ๋ฒ„์— ์ ‘์†ํ•˜๊ธฐ ์œ„ํ•œ ์œ ์ € ์ธ์ฆ์ •๋ณด ๋ชฉ๋ก
    • contexts: cluster๋ฐ user๋ฅผ ๋งคํ•‘(์กฐํ•ฉ)ํ•œ ์ •๋ณด

kubeconfig

AWS EKS ์Šคํ„ฐ๋”” 5์ฃผ์ฐจ - Autoscaling

  • kkumtree

2023-05-22T19:23:37+09:00

์ด๋ฒˆ ์ฃผ์ฐจ๋Š” ์˜คํ† ์Šค์ผ€์ผ๋ง์„ ๋ฉ”์ธ์œผ๋กœ ํ•˜์—ฌ, ์ˆ˜ํ‰/์ˆ˜์ง ํ”„๋กœ๋น„์ €๋‹์„ ํ•™์Šตํ•ด๋ณด์•˜์Šต๋‹ˆ๋‹ค.
๋งˆ์ง€๋ง‰์—๋Š” ๊ณ ์„ฑ๋Šฅ ์˜คํ† ์Šค์ผ€์ผ๋Ÿฌ์ธ Karpenter๋ฅผ ๋ณ„๋„๋กœ ์‹ค์Šตํ•ด๋ณด์•˜์Šต๋‹ˆ๋‹ค. ํŠนํžˆ..

  • HPA custom metrics(์‚ฌ์šฉ์ž ์ •์˜ ๋ฉ”ํŠธ๋ฆญ) ์ ์šฉ

  • YAML ์„ค์ •๊ฐ’์„ CPU๋กœ ๋งž์ถ˜ ๊ฒƒ์„ ์žŠ๊ณ , ํ”„๋กœ๋น„์ €๋‹์„ ์ž˜๋ชป ์˜ˆ์ธกํ•œ ๊ฒƒ๋„ ํ•จ๊ป˜ ๊ณต์œ ํ•ฉ๋‹ˆ๋‹ค.

  • AutoScaling

    • HPA: Horizontal Pod Autoscaler
    • VPA: Vertical Pod Autoscaler
    • CA: Cluster Autoscaler
      • ๊ฐ CSP ์˜์กด์ , ์›Œ์ปค ๋…ธ๋“œ ๋ ˆ๋ฒจ์—์„œ์˜ ์˜คํ† ์Šค์ผ€์ผ๋ง

1. ์‹ค์Šต ํ™˜๊ฒฝ ๋ฐฐํฌ

  • 4์ฃผ์ฐจ์˜ ์ดˆ๊ธฐ ๋ฐฐํฌ ๋‚ด์šฉ์— p8s ๋ฐ Grafana๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ๋ฐฐํฌ
    • verticalPodAutoscaler ํ™œ์„ฑํ™”
    • ์ถ”์ฒœ ๋Œ€์‹œ๋ณด๋“œ: 15757, 17900, 15172
curl -O https://s3.ap-northeast-2.amazonaws.com/cloudformation.cloudneta.net/K8S/eks-oneclick4.yaml

# ์ดํ•˜ ์ค‘๋žต

## Prometheus & Grafana ์„ค์น˜

# ์ธ์ฆ์„œ ARN
CERT_ARN=`aws acm list-certificates --query 'CertificateSummaryList[].CertificateArn[]' --output text`
echo $CERT_ARN

# ํŒŒ๋ผ๋ฏธํ„ฐ ํŒŒ์ผ ์ƒ์„ฑ ๋ฐ ๋ฐฐํฌ
cat <<EOT > monitor-values.yaml
prometheus:
  prometheusSpec:
    podMonitorSelectorNilUsesHelmValues: false
    serviceMonitorSelectorNilUsesHelmValues: false
    retention: 5d
    retentionSize: "10GiB"

  verticalPodAutoscaler:
    enabled: true

  ingress:
    enabled: true
    ingressClassName: alb
    hosts: 
      - prometheus.$MyDomain
    paths: 
      - /*
    annotations:
      alb.ingress.kubernetes.io/scheme: internet-facing
      alb.ingress.kubernetes.io/target-type: ip
      alb.ingress.kubernetes.io/listen-ports: '[{"HTTPS":443}, {"HTTP":80}]'
      alb.ingress.kubernetes.io/certificate-arn: $CERT_ARN
      alb.ingress.kubernetes.io/success-codes: 200-399
      alb.ingress.kubernetes.io/load-balancer-name: myeks-ingress-alb
      alb.ingress.kubernetes.io/group.name: study
      alb.ingress.kubernetes.io/ssl-redirect: '443'

grafana:
  defaultDashboardsTimezone: Asia/Seoul
  adminPassword: prom-operator

  ingress:
    enabled: true
    ingressClassName: alb
    hosts: 
      - grafana.$MyDomain
    paths: 
      - /*
    annotations:
      alb.ingress.kubernetes.io/scheme: internet-facing
      alb.ingress.kubernetes.io/target-type: ip
      alb.ingress.kubernetes.io/listen-ports: '[{"HTTPS":443}, {"HTTP":80}]'
      alb.ingress.kubernetes.io/certificate-arn: $CERT_ARN
      alb.ingress.kubernetes.io/success-codes: 200-399
      alb.ingress.kubernetes.io/load-balancer-name: myeks-ingress-alb
      alb.ingress.kubernetes.io/group.name: study
      alb.ingress.kubernetes.io/ssl-redirect: '443'

defaultRules:
  create: false
kubeControllerManager:
  enabled: false
kubeEtcd:
  enabled: false
kubeScheduler:
  enabled: false
alertmanager:
  enabled: false
EOT

kubectl create ns monitoring
helm install kube-prometheus-stack prometheus-community/kube-prometheus-stack --version 45.27.2 \
--set prometheus.prometheusSpec.scrapeInterval='15s' --set prometheus.prometheusSpec.evaluationInterval='15s' \
-f monitor-values.yaml --namespace monitoring

# metrics-server ๋ฐฐํฌ
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml

1-1. EKS Node Viewer ์„ค์น˜

  • ํŒŒ๋“œ ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ์š”์ฒญ ์ •๋ณด๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” ๋Œ€์‹œ๋ณด๋“œ
    • ํ•ด๋‹น ๋…ธ๋“œ์— ํ• ๋‹น ๊ฐ€๋Šฅํ•œ ์šฉ๋Ÿ‰์„ ์‹œ๊ฐ์ ์œผ๋กœ ํ‘œ์‹œ
  • ์‹ค์ œ ์‚ฌ์šฉ๋Ÿ‰์ด ์•„๋‹ˆ๋ผ, ์š”์ฒญ๋œ ๋ฆฌ์†Œ์Šค(CPU, Memory)์— ๋Œ€ํ•œ ํ‘œ์‹œ
  • ์‹ค์Šต ์Šค์ฑ… ์ƒ์—์„œ go ์„ค์น˜ ๋ฐ ๋ทฐ์–ด ์„ค์น˜์‹œ ๋‹ค์†Œ ์‹œ๊ฐ„์ด ์†Œ์š” (์•ฝ 5๋ถ„)
  • Karpenter ์‹ค์Šต ์‹œ์—๋„ ์–ธ๊ธ‰๋˜๊ฒ ์ง€๋งŒ, EKS๊ฐ€ ๊ตฌ์ถ•๋œ ๋’ค์— ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
# go ๋ฐ EKS Node Viewer ์„ค์น˜
yum install -y go
go install github.com/awslabs/eks-node-viewer/cmd/eks-node-viewer@latest

# EKS Node Viewer ์‹คํ–‰
tree ~/go/bin
cd ~/go/bin && ./eks-node-viewer

## EKS Node Viewer ๋ช…๋ น ์ƒ˜ํ”Œ
# Display both CPU and Memory Usage
./eks-node-viewer --resources cpu,memory

# Karenter nodes only
./eks-node-viewer --node-selector "karpenter.sh/provisioner-name"

# Display extra labels, i.e. AZ
./eks-node-viewer --extra-labels topology.kubernetes.io/zone

# Specify a particular AWS profile and region
AWS_PROFILE=myprofile AWS_REGION=ap-northeast-2

## ๊ธฐ๋ณธ ์˜ต์…˜ ํ™˜๊ฒฝ ๋ณ€์ˆ˜
# select only Karpenter managed nodes
node-selector=karpenter.sh/provisioner-name

# display both CPU and memory
resources=cpu,memory

EKS node viewer

AWS EKS ์Šคํ„ฐ๋”” 4์ฃผ์ฐจ - Observability

  • kkumtree

2023-05-21T06:13:52+09:00

์ด๋ฒˆ ์ฃผ์ฐจ์—๋Š” Observability์— ๋Œ€ํ•ด ์Šคํ„ฐ๋””๊ฐ€ ์ง„ํ–‰๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
์ž์› ๋ชจ๋‹ˆํ„ฐ๋ง ํˆด๋“ค์˜ ์ ์šฉ ๋ฐ ์‚ฌ์šฉ์ด ์ค‘์‹ฌ์ž…๋‹ˆ๋‹ค.

๊ทธ๋‚˜์ €๋‚˜ k8s 1.26์—์„œ metrics์˜ ์ผ๋ถ€ ๋ช…์นญ์ด ๋ฐ”๋€Œ๋Š” ๊ฑธ ๋ณด๊ณ  ์‹๊ฒํ–ˆ์Šต๋‹ˆ๋‹ค.
(etcd_db_total_size_bytes ๋Œ€์‹ , apiserver_storage_db_total_size_in_bytes ์œผ๋กœ ๋ณ€๊ฒฝ)
๋˜ํ•œ kubecost์˜ ๊ฒฝ์šฐ, cloudformation ์Šคํƒ ์ œ๊ฑฐ ํ›„์—๋„ ๋ณผ๋ฅจ ๋ฐ์ดํ„ฐ๊ฐ€ ๋‚จ์•„์žˆ์–ด์„œ ๋ณ„๋„๋กœ ์‚ญ์ œํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค.

1. ์‹ค์Šตํ™˜๊ฒฝ ๋ฐฐํฌ

  • NAT๊ฒŒ์ดํŠธ์›จ์ด, EBS addon, IAM role, ISRA for LB/EFS, PreCommand ํฌํ•จ
  • ๋…ธ๋“œ: t3.xlarge
    • t3a.xlarge(AMD)๋Š” ์„œ์šธ ๋ฆฌ์ „ b AZ(ap-northeast-2b)์—์„œ ๋ฏธ์ง€์›
  • ๋” ๋งŽ์€ ๊ฐ’๋“ค์ด ์ž…๋ ฅ๋˜์–ด์„œ, ์ƒ์„ฑ ์™„๋ฃŒ๊นŒ์ง€ ๋” ๋งŽ์€ ์‹œ๊ฐ„์ด ์†Œ์š” (์•ฝ 20์—ฌ๋ถ„ ์ด๋‚ด)
curl -O https://s3.ap-northeast-2.amazonaws.com/cloudformation.cloudneta.net/K8S/eks-oneclick3.yaml

# ์ดํ•˜ ์ƒ๋žต, 3์ฃผ์ฐจ ์ฐธ๊ณ 

cloudformation

AWS EKS ์Šคํ„ฐ๋”” 3์ฃผ์ฐจ - Storage

  • kkumtree

2023-05-12T05:36:38+09:00

์ด๋ฒˆ ์ฃผ์ฐจ์—๋Š” ์Šคํ† ๋ฆฌ์ง€์— ๋Œ€ํ•ด ์‹ค์Šต์„ ์ง„ํ–‰ํ•ด๋ณด์•˜์Šต๋‹ˆ๋‹ค. ์ง€๋‚œ๋ฒˆ kOps ์Šคํ„ฐ๋””์—์„œ ๋‹ค๋ฃจ์—ˆ๋˜ ๋‚ด์šฉ์ด์ง€๋งŒ, ๋ถ€์กฑํ–ˆ๋˜ ๋‚ด์šฉ์„ ๋ณด์ถฉํ•˜๋ฉด์„œ ์ž‘์„ฑ์„ ํ•ด๋ณด์•˜์Šต๋‹ˆ๋‹ค.

์ฃผ์š”ํ•œ ๋‚ด์šฉ์€…

  • NodeAffinity๋ฅผ ์ด์šฉํ•œ ๋ผ๋ฒจ๋ง
  • AWS EBS controller์˜ ๊ฒฝ์šฐ, AWS managed policy๋ฅผ ํ™œ์šฉ
  • AWS Volume SnapShots Controller๋ฅผ ํ†ตํ•œ ๋ณผ๋ฅจ ๋ฐฑ์—…
  • AWS EFS controller์—์„œ์˜ ๋™์  ํ”„๋กœ๋น„์ €๋‹
  • AWS EKS ์‹ ๊ทœ ๋…ธ๋“œ๊ทธ๋ฃน ์ƒ์„ฑ

๋ณ„๋„๋กœ kube-ops-view์˜ ๊ฒฝ์šฐ, ์›น์œผ๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ์„ ๋•Œ๊นŒ์ง€ ์‹œ๊ฐ„์ด ์†Œ์š”๋œ๋‹ค๋Š” ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

1. ์‹ค์Šต ํ™˜๊ฒฝ ๋ฐฐํฌ

  • 2์ฃผ์ฐจ์— ์‹ค์Šตํ–ˆ๋˜ ๋‚ด์šฉ๋“ค์„ ๋ฏธ๋ฆฌ ๋ฐฐํฌ
    1. AWS LB
    2. ExternalDNS
    3. kube-ops-view
  • context ์ด๋ฆ„ ๋ณ€๊ฒฝ
    • ์ง€๋‚œ ๋ฒˆ๊นŒ์ง€ pkos๊ฐ€ ๋œจ๋Š” ํ˜„์ƒ์ด ์žˆ์—ˆ๋Š”๋ฐ, ๋‹‰๋„ค์ž„์„ ๋ณ„๋„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Œ
  • EFS ์ƒ์„ฑ ๊ด€๋ จ cloudformation์ด ์ถ”๊ฐ€๋˜์—ˆ์Œ
# ์‹ค์Šต YAML ํŒŒ์ผ
curl -O https://s3.ap-northeast-2.amazonaws.com/cloudformation.cloudneta.net/K8S/eks-oneclick2.yaml

# cloudformation ์Šคํƒ ์ƒ์„ฑ
aws cloudformation deploy --template-file eks-oneclick2.yaml --stack-name myeks --parameter-overrides KeyName=aews SgIngressSshCidr=$(curl -s ipinfo.io/ip)/32  MyIamUserAccessKeyID=AKIA5... MyIamUserSecretAccessKey=CVNa2... ClusterBaseName=myeks --region ap-northeast-2

ssh -i ~/.ssh/aews.pem ec2-user@$(aws cloudformation describe-stacks --stack-name myeks --query 'Stacks[*].Outputs[0].OutputValue' --output text)

# default ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์ ์šฉ
kubectl ns default

# (์˜ต์…˜) context ์ด๋ฆ„ ๋ณ€๊ฒฝ
NICK=kkumtree
kubectl ctx
kubectl config rename-context [email protected] $NICK@myeks

# EFS ํ™•์ธ : AWS ๊ด€๋ฆฌ์ฝ˜์†” EFS ํ™•์ธ
EfsFsId=$(aws efs describe-file-systems --query 'FileSystems[*].FileSystemId' --output text)
echo $EfsFsId
mount -t nfs4 -o nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,noresvport $EfsFsId.efs.ap-northeast-2.amazonaws.com:/ /mnt/myefs
df -hT --type nfs4
mount | grep nfs4
echo "Test efs exist with file " > /mnt/myefs/memo.txt
cat /mnt/myefs/memo.txt
rm -f /mnt/myefs/memo.txt

# ์Šคํ† ๋ฆฌ์ง€ํด๋ž˜์Šค ๋ฐ CSI ๋…ธ๋“œ ํ™•์ธ
kubectl get sc
kubectl get sc gp2 -o yaml | yh
kubectl get csinodes

# ๋…ธ๋“œ ์ •๋ณด ํ™•์ธ
kubectl get node --label-columns=node.kubernetes.io/instance-type,eks.amazonaws.com/capacityType,topology.kubernetes.io/zone
eksctl get iamidentitymapping --cluster myeks

# ๋…ธ๋“œ IP ํ™•์ธ ๋ฐ PrivateIP ๋ณ€์ˆ˜ ์ง€์ •
N1=$(kubectl get node --label-columns=topology.kubernetes.io/zone --selector=topology.kubernetes.io/zone=ap-northeast-2a -o jsonpath={.items[0].status.addresses[0].address})
N2=$(kubectl get node --label-columns=topology.kubernetes.io/zone --selector=topology.kubernetes.io/zone=ap-northeast-2b -o jsonpath={.items[0].status.addresses[0].address})
N3=$(kubectl get node --label-columns=topology.kubernetes.io/zone --selector=topology.kubernetes.io/zone=ap-northeast-2c -o jsonpath={.items[0].status.addresses[0].address})
echo "export N1=$N1" >> /etc/profile
echo "export N2=$N2" >> /etc/profile
echo "export N3=$N3" >> /etc/profile
echo $N1, $N2, $N3

# ๋…ธ๋“œ ๋ณด์•ˆ๊ทธ๋ฃน ID ํ™•์ธ
NGSGID=$(aws ec2 describe-security-groups --filters Name=group-name,Values=*ng1* --query "SecurityGroups[*].[GroupId]" --output text)
aws ec2 authorize-security-group-ingress --group-id $NGSGID --protocol '-1' --cidr 192.168.1.100/32

# ์›Œ์ปค ๋…ธ๋“œ SSH ์ ‘์†
ssh ec2-user@$N1 hostname
ssh ec2-user@$N2 hostname
ssh ec2-user@$N3 hostname

# ๋…ธ๋“œ์— ํˆด ์„ค์น˜
ssh ec2-user@$N1 sudo yum install links tree jq tcpdump sysstat -y
ssh ec2-user@$N2 sudo yum install links tree jq tcpdump sysstat -y
ssh ec2-user@$N3 sudo yum install links tree jq tcpdump sysstat -y

# AWS LB, ExternalDNS ์„ค์น˜
helm repo add eks https://aws.github.io/eks-charts
helm repo update
helm install aws-load-balancer-controller eks/aws-load-balancer-controller -n kube-system --set clusterName=$CLUSTER_NAME \
  --set serviceAccount.create=false --set serviceAccount.name=aws-load-balancer-controller

# ExternalDNS
MyDomain=awskops.click
MyDnzHostedZoneId=$(aws route53 list-hosted-zones-by-name --dns-name "${MyDomain}." --query "HostedZones[0].Id" --output text)
echo $MyDomain, $MyDnzHostedZoneId
curl -s -O https://raw.githubusercontent.com/gasida/PKOS/main/aews/externaldns.yaml
MyDomain=$MyDomain MyDnzHostedZoneId=$MyDnzHostedZoneId envsubst < externaldns.yaml | kubectl apply -f -

1-1. kube-ops-view

  • ์‹œ๊ฐ์ ์œผ๋กœ ํ˜„์žฌ k8s์˜ ์ƒํƒœ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋Š” ํˆด
  • ์•ˆ๋˜๋Š” ์ค„ ์•Œ์•˜๋Š”๋ฐ, ๋ทฐ์–ด๊ฐ€ ๋œฐ ๋•Œ๊นŒ์ง€ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ๋Š” ๊ฒƒ์ด์—ˆ์Œ.

1-kube-ops-view

AWS EKS ์Šคํ„ฐ๋”” 2์ฃผ์ฐจ - Network

  • kkumtree

2023-05-07T07:30:52+09:00

# ์•„์‰ฝ๊ฒŒ๋„ ์‹ ๊ทœ ํ•ญ๋ชฉ์ธ istio, kube-ops-view๋Š” ์‹ค์Šต ์‹คํŒจ
- istio: `myhome.yaml` ์„ ์–ด๋–ป๊ฒŒ ์ƒ์„ฑํ• ์ง€ ๋ชฐ๋ผ์„œ ์ค‘๋‹จ
- kube-ops-view: A๋ ˆ์ฝ”๋“œ์— ์ œ๋Œ€๋กœ ์žกํžˆ์ง€ ์•Š์Œ

์ง€๋‚œ 1์ฃผ์ฐจ์— ์ด์–ด, ์ด๋ฒˆ ์ฃผ์—๋Š” EKS์˜ ๋„คํŠธ์›Œํฌ ๊ตฌ์„ฑ์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๋Š” ์‹œ๊ฐ„์ด์—ˆ์Šต๋‹ˆ๋‹ค.

์ง์ „ ์Šคํ„ฐ๋””์—์„œ๋„ ๋ฐ”๋กœ ๊ด‘ํƒˆ๋‹นํ•˜๋‚˜?ํ•˜๋ฉฐ ๋ฐค๊ณผ ์ฃผ๋ง์„ ํ•˜์–—๊ฒŒ ๋ถˆํƒœ์› ์„ ์ •๋„๋กœ
๊ฐ€์žฅ ๊ณ ๋‚œ๋„๋ผ๊ณ  ์ƒ๊ฐํ–ˆ๋˜ ๋„คํŠธ์›Œํฌ๋ฅผ ๋‹ค์‹œ ๋งŒ๋‚˜๋‹ˆ ์ด์ œ 1% ์นœ๊ทผ๊ฐ์ด ๋А๊ปด์ง€๊ณ  ์žˆ๋„ค์š”.

์ดํ•ดํ–ˆ๋ƒ๊ณ ์š”?

์ž ๊ทธ๋Ÿผ ํ•ด๋ณด๋„๋ก ํ•ฉ์‹œ๋‹ค.

1. cloudformation์„ ํ™œ์šฉํ•œ EKS ์›ํด๋ฆญ ๊ตฌ์„ฑ

  • ํ•™์Šต์„ ์œ„ํ•ด, ์ด๋ฒˆ์—๋„ ๊ฐ€์‹œ๋‹ค๋‹˜์ด ์ค€๋น„ํ•ด์ฃผ์‹  ์›ํด๋ฆญ ๋ฐฐํฌ yaml์„ ํ™œ์šฉํ•˜์—ฌ ๋ฐฐํฌ.
  • ์™„์ „ ๋ฐฐํฌ๊นŒ์ง€ ๋Œ€๋žต 20๋ถ„ ๊ฐ€๋Ÿ‰ ์†Œ์š”
  • IAM์—์„œ ๋ฏธ๋ฆฌ ๋ฐœ๊ธ‰ํ•ด๋‘” ์•ก์„ธ์Šคํ‚ค/์‹œํฌ๋ฆฟํ‚ค๋ฅผ ์•Œ์•„๋‘์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.
# ์›ํด๋ฆญ ์…‹์—…
aws cloudformation deploy --template-file ~/Documents/aews/eks-oneclick.yaml --stack-name myeks --parameter-overrides KeyName=aews SgIngressSshCidr=$(curl -s ipinfo.io/ip)/32 MyIamUserAccessKeyID={ACSSKEY|AKIA..}  MyIamUserSecretAccessKey={SECUKEY|7ob..} ClusterBaseName=myeks --region ap-northeast-2

# ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ(๋งˆ์Šคํ„ฐ๋…ธ๋“œ) ์ ‘์† ํ™•์ธ
ssh -i ~/.ssh/aews.pem ec2-user@$(aws cloudformation describe-stacks --stack-name myeks --query 'Stacks[*].Outputs[0].OutputValue' --output text)

oneclick_templete

AWS EKS ์Šคํ„ฐ๋”” 1์ฃผ์ฐจ

  • kkumtree

2023-04-30T03:00:15+09:00

์ตœ๊ทผ CloudNet@์—์„œ ์ง„ํ–‰ํ•˜๊ณ  ์žˆ๋Š”
AWS EKS Workshop Study(์ดํ•˜, AEWS)์— ์ฐธ์—ฌํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

k8s๊ฐ€ ์›Œ๋‚™ ์ธ๊ธฐ๊ฐ€ ๋งŽ๊ธฐ๋„ ํ•˜์ง€๋งŒ, ์ง€๋‚œ kOps ์Šคํ„ฐ๋””๋ฅผ ํ†ตํ•ด ๊ด€๋ฆฌ์š”์†Œ๊ฐ€ ์ฐธ ๋งŽ์€ ๊ฒƒ์„ ๋А๊ผˆ์—ˆ๊ณ ,
์ข€๋” ์ˆ˜์›”ํ•˜๊ฒŒ ์ดํ•ด๋ฅผ ํ•ด๋ณด๊ณ ์ž AWS ์„œ๋น„์Šค์ธ
EKS(Elastic Kubernetes Service)๋ฅผ ์ด๋ฒˆ ๊ธฐํšŒ์— ์‚ดํŽด๋ณด๊ธฐ๋กœ ํ–ˆ์Šต๋‹ˆ๋‹ค.

EKS ์‚ฌ์šฉ์— ์žˆ์–ด ๊ณ ๋ ค์‚ฌํ•ญ

EKS๋Š” ๊ด€๋ฆฌํ˜• ์„œ๋น„์Šค(managed service)์ด๊ธฐ์— ์•„๋ž˜์™€ ๊ฐ™์€ ์žฅ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • ํด๋Ÿฌ์Šคํ„ฐ๋ง์„ ์œ„ํ•œ Control Plane(์ผ๋ช…, ๋งˆ์Šคํ„ฐ ๋…ธ๋“œ)์„ AWS์—์„œ ๊ด€๋ฆฌํ•ด์ค๋‹ˆ๋‹ค.
    • ์›Œ์ปค๋…ธ๋“œ๋Š”
      1. ์‚ฌ์šฉ์ž๊ฐ€ AMI๋ฅผ ๊ตฌ์„ฑํ•˜์—ฌ ์ด๋ฅผ ์‚ฌ์šฉ
      2. AWS์—์„œ ์ œ๊ณตํ•˜๋Š” Fargate๋กœ VM์„ ํ• ๋‹นํ•˜์—ฌ ์‚ฌ์šฉ
  • kOps์™€๋„ ์œ ์‚ฌํ•˜์ง€๋งŒ, ๋‹ค๋ฅธ AWS ์„œ๋น„์Šค์™€์˜ ์—ฐ๋™์ด ์šฉ์ดํ•ฉ๋‹ˆ๋‹ค.
    ๊ฐœ์ธ์ ์œผ๋กœ๋Š” ACM์˜ ์ธ์ฆ์„œ ์‚ฌ์šฉ์— ์žˆ์–ด ๋” ํŽธํ•  ๊ฒƒ์ด๋ผ ์ƒ๊ฐ์„ ํ–ˆ์Šต๋‹ˆ๋‹ค.
    1. ECR์— ์ €์žฅํ•œ ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€๋ฅผ ํ™œ์šฉ๊ฐ€๋Šฅ
    2. IAM์„ ํ†ตํ•œ ๊ถŒํ•œ ๊ด€๋ฆฌ
    3. ELB๋ฅผ ํ†ตํ•œ ๋กœ๋“œ๋ฐธ๋Ÿฐ์‹ฑ
    4. VPC๋ฅผ ํ†ตํ•œ ๋„คํŠธ์›Œํฌ ๊ด€๋ฆฌ
  • ์˜คํ”ˆ์†Œ์Šค k8s ๊ธฐ๋ฐ˜์ด๊ธฐ์— EKS๋กœ์˜ ์šฉ์ดํ•œ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜

API ์„œ๋ฒ„ Cluster Endpoint ๊ตฌ์„ฑ

  • EKS๋Š” Control Plane์„ ๊ด€๋ฆฌํ•ด์ฃผ๋‚˜, ๋งˆ์Šคํ„ฐ ๋…ธ๋“œ์— ์ ‘๊ทผ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
    ์ด๋ฅผ ์œ„ํ•ด, Cluster Endpoint๋ฅผ ๊ตฌ์„ฑํ•˜์—ฌ ๋งˆ์Šคํ„ฐ ๋…ธ๋“œ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

kkumtree

Source code on GitHub

ยฉ 2025 kkumtree and contributors All rights reserved.
Licensed under
CC BY-NC-ND 4.0