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

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๋ ๋ณต๊ธฐํ๋ค๊ฐ ์ด๋ก ์ ์ผ๋ก๋ ๊ฐ๋จ(๊ณผ์ฐ?)ํด๋ณด์ฌ๋
์ค์ ๊ตฌ๋๋ฐฉ์ ์ดํด ์์ฒด๊ฐ ์ด๋ฐ์ ์๋์, ์ฌํ ๋จ์ง ๊ฑธ๋ฆฐ ๋์ ๋ ์ด๋ ค์ ๋ ๊ฒ ๊ฐ์ต๋๋ค.
๊ทธ ์ธ
- myeks-bastion-2์ ์ ์ ์, ํจ๊ป ์งํํ ๋๋
ssh {Public IP}๋ก ์ ์ ์๋๋ ๊ฑธ ๋ดค๋๋ฐ ์ ์ ํผ์ ํ ๋ ์ ์์ด ๋์ง์์์ต๋๋ค.- Amazon Linux์์๋ ssh ec2-user@{Public IP}๋ก ์ ์ํด์ผํจ
(ํ์ํ ๊ฒฝ์ฐ sshํค๋ ํฌํจ) - AWS Public AMI์์ ์ ๊ณต๋๋ Ubuntu AMI์ ๊ฒฝ์ฐ,
ubuntu@{Public IP}๋ก ์ ์๊ฐ๋ฅ - ์ถ์ : ๊ณต์ ๋ ๋จธ์ ์ ๋ค๋ฅธ ์ค์ ์ด ์ด์๊ฐ ๋๋ ๊ฒ์ผ๋ก ์ถ์ ๋ฉ๋๋ค.

- Amazon Linux์์๋ ssh ec2-user@{Public IP}๋ก ์ ์ํด์ผํจ
- IAM User(testuser)๋ ์น์ฝ์์์ ์ญ์ ํ๋ ๊ฒ์ด ํธ๋ฆฌํฉ๋๋ค.
- ์๋๋ฉด, ์๋์ฒ๋ผ detach ํ๋ค๋ ๋๋์ผ๋ก ์์ฐจ์ ์คํํฉ๋๋ค.
- list-attached-role-policies && detach-role-policy
- list-access-keys && delete-access-key
- delete-user

- ์๋๋ฉด, ์๋์ฒ๋ผ detach ํ๋ค๋ ๋๋์ผ๋ก ์์ฐจ์ ์คํํฉ๋๋ค.
- CLI๋ก IAM Trust Relationship ์กฐํ
- ์น ์ฝ์์ ๊ตณ์ด ๋ค์ด๊ฐ์ผํ๋ ํ๊ณ , ๋ฌธ๋ ํธ๊ธฐ์ฌ์ ์๋ํ๋ค๊ฐ ์๊ฐ์ด ๋ ์๊ฐ์ต๋๋ค.
- ๊ฒฐ๋ก : ํ๋์ฝ์ดํ ํ์ฑ..
jq -r '.[].status.roleARN' | rev | cut -d '/' -f1 | rev- chatGPT์๊ฒ ์๋์ ๊ฐ์ด ๊ต์ ๋ฐ์์ง๋ง, ํํ์น ์์..
jq -r '.[].status.roleARN' | grep -oE '[^/]+$'

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๋ฅผ ๋งคํ(์กฐํฉ)ํ ์ ๋ณด

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

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์ฃผ์ฐจ ์ฐธ๊ณ

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์ฃผ์ฐจ์ ์ค์ตํ๋ ๋ด์ฉ๋ค์ ๋ฏธ๋ฆฌ ๋ฐฐํฌ
- AWS LB
- ExternalDNS
- kube-ops-view
- context ์ด๋ฆ ๋ณ๊ฒฝ
- ์ง๋ ๋ฒ๊น์ง pkos๊ฐ ๋จ๋ ํ์์ด ์์๋๋ฐ, ๋๋ค์์ ๋ณ๋ ์ง์ ํ ์ ์์
- EFS ์์ฑ ๊ด๋ จ cloudformation์ด ์ถ๊ฐ๋์์
- EFS FS ID ์กฐํ๋ฅผ ํ๊ธฐ ์ํด aws-cli ํํฐ ํ์ฉ (์ถ์ฒ: AWS Docs)
# ์ค์ต 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์ ์ํ๋ฅผ ๋ณผ ์ ์๋ ํด
- ์๋๋ ์ค ์์๋๋ฐ, ๋ทฐ์ด๊ฐ ๋ฐ ๋๊น์ง ์๊ฐ์ด ๊ฑธ๋ฆฌ๋ ๊ฒ์ด์์.

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)

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์์ ๊ด๋ฆฌํด์ค๋๋ค.
- ์์ปค๋
ธ๋๋
- ์ฌ์ฉ์๊ฐ AMI๋ฅผ ๊ตฌ์ฑํ์ฌ ์ด๋ฅผ ์ฌ์ฉ
- AWS์์ ์ ๊ณตํ๋ Fargate๋ก VM์ ํ ๋นํ์ฌ ์ฌ์ฉ
- ์์ปค๋
ธ๋๋
- kOps์๋ ์ ์ฌํ์ง๋ง, ๋ค๋ฅธ AWS ์๋น์ค์์ ์ฐ๋์ด ์ฉ์ดํฉ๋๋ค.
๊ฐ์ธ์ ์ผ๋ก๋ ACM์ ์ธ์ฆ์ ์ฌ์ฉ์ ์์ด ๋ ํธํ ๊ฒ์ด๋ผ ์๊ฐ์ ํ์ต๋๋ค.- ECR์ ์ ์ฅํ ์ปจํ ์ด๋ ์ด๋ฏธ์ง๋ฅผ ํ์ฉ๊ฐ๋ฅ
- IAM์ ํตํ ๊ถํ ๊ด๋ฆฌ
- ELB๋ฅผ ํตํ ๋ก๋๋ฐธ๋ฐ์ฑ
- VPC๋ฅผ ํตํ ๋คํธ์ํฌ ๊ด๋ฆฌ
- ์คํ์์ค k8s ๊ธฐ๋ฐ์ด๊ธฐ์ EKS๋ก์ ์ฉ์ดํ ๋ง์ด๊ทธ๋ ์ด์
API ์๋ฒ Cluster Endpoint ๊ตฌ์ฑ
-
EKS๋ Control Plane์ ๊ด๋ฆฌํด์ฃผ๋, ๋ง์คํฐ ๋ ธ๋์ ์ ๊ทผ์ด ํ์ํ ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค.
์ด๋ฅผ ์ํด, Cluster Endpoint๋ฅผ ๊ตฌ์ฑํ์ฌ ๋ง์คํฐ ๋ ธ๋์ ์ ๊ทผํ ์ ์์ต๋๋ค.