EKS Study 1주차 첫번째

덴고·2026년 3월 15일

오랜만에 가시다님이 주관하는 스터디에 참여했습니다
거두절미하고 공유바로 하겠습니다!

아래와 같이 환경 세팅을 진행합니다.

# 변수 지정
aws ec2 describe-key-pairs --query "KeyPairs[].KeyName" --output text
export TF_VAR_KeyName=$(aws ec2 describe-key-pairs --query "KeyPairs[].KeyName" --output text)
export TF_VAR_ssh_access_cidr=$(curl -s ipinfo.io/ip)/32
echo $TF_VAR_KeyName $TF_VAR_ssh_access_cidr

# 배포 : 12분 정도 소요
terraform init
terraform plan
nohup sh -c "terraform apply -auto-approve" > create.log 2>&1 &
tail -f create.log


# 자격증명 설정
aws eks update-kubeconfig --region ap-northeast-2 --name myeks

# k8s config 확인 및 rename context
cat ~/.kube/config
cat ~/.kube/config | grep current-context | awk '{print $2}'
kubectl config rename-context $(cat ~/.kube/config | grep current-context | awk '{print $2}') myeks
cat ~/.kube/config | grep current-context

이처럼 코드를 실행해주면 생성까지 약 12분정도 소요


이제 정보를 확인해보자

# eks 클러스터 정보 확인
kubectl cluster-info
Kubernetes control plane is running at https://21BE5A00506BBD27CFF5875AF7D6E1C1.gr7.ap-northeast-2.eks.amazonaws.com
CoreDNS is running at https://21BE5A00506BBD27CFF5875AF7D6E1C1.gr7.ap-northeast-2.eks.amazonaws.com/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
...

# endpoint 확인
CLUSTER_NAME=myeks
aws eks describe-cluster --name $CLUSTER_NAME | jq
...
      "endpointPublicAccess": true,
      "endpointPrivateAccess": false,
      "publicAccessCidrs": [
        "0.0.0.0/0"
       ...

aws eks describe-cluster --name $CLUSTER_NAME | jq -r .cluster.endpoint

## dig 조회 : 해당 IP 소유 리소스는 어떤것일까요? : 자신의 PC에서도 해당 도메인 질의 조회 해보자
APIDNS=$(aws eks describe-cluster --name $CLUSTER_NAME | jq -r .cluster.endpoint | cut -d '/' -f 3)
dig +short $APIDNS

curl -s ipinfo.io/13.125.96.102
"org": "AS16509 Amazon.com, Inc."
...

# eks 노드 그룹 정보 확인
aws eks describe-nodegroup --cluster-name $CLUSTER_NAME --nodegroup-name $CLUSTER_NAME-node-group | jq
...
    "capacityType": "ON_DEMAND",
    "scalingConfig": {
      "minSize": 1,
      "maxSize": 4,
      "desiredSize": 2
    },
    "instanceTypes": [
      "t3.medium"
    ],
   ...
    "amiType": "AL2023_x86_64_STANDARD",
   ...

# 노드 정보 확인 : OS와 컨테이너런타임 확인
kubectl get node --label-columns=node.kubernetes.io/instance-type,eks.amazonaws.com/capacityType,topology.kubernetes.io/zone
kubectl get node --label-columns=node.kubernetes.io/instance-type
kubectl get node --label-columns=eks.amazonaws.com/capacityType # 노드의 capacityType 확인
kubectl get node
kubectl get node -owide


# 인증 정보 확인 : 자세한 정보는 보안에서 다룸
kubectl get node -v=6
I0423 02:00:38.691443    5535 loader.go:374] Config loaded from file:  /root/.kube/config
I0423 02:00:39.519097    5535 round_trippers.go:553] GET https://C813D20E6263FBDC356E60D2971FCBA7.gr7.ap-northeast-2.eks.amazonaws.com/api/v1/nodes?limit=500 200 OK in 818 milliseconds
...

cat ~/.kube/config
kubectl config view


## Get a token for authentication with an Amazon EKS cluster
AWS_DEFAULT_REGION=ap-northeast-2
aws eks get-token help
aws eks get-token --cluster-name $CLUSTER_NAME --region $AWS_DEFAULT_REGION | jq
  • 엔드포인트 확인
    엔드포인트확인
  • 노드 그룹도 확인
# 파드 정보 확인 : 온프레미스 쿠버네티스의 파드 배치와 다른점은? , 파드의 IP의 특징이 어떤가요? 자세한 네트워크는 2주차에서 다룸
kubectl get pod -n kube-system
kubectl get pod -n kube-system -o wide
kubectl get pod -A


# kube-system 네임스페이스에 모든 리소스 확인
kubectl get deploy,ds,pod,cm,secret,svc,ep,endpointslice,pdb,sa,role,rolebinding -n kube-system

# 모든 파드의 컨테이너 이미지 정보 확인 : dkr.ecr 저장소 확인!
kubectl get pods --all-namespaces -o jsonpath="{.items[*].spec.containers[*].image}" | tr -s '[[:space:]]' '\n' | sort | uniq -c


# kube-proxy : iptables mode, bind 0.0.0.0, conntrack 등
kubectl describe pod -n kube-system -l k8s-app=kube-proxy
kubectl get cm -n kube-system kube-proxy -o yaml
kubectl get cm -n kube-system kube-proxy-config -o yaml


# coredns 
kubectl describe pod -n kube-system -l k8s-app=kube-dns
kubectl get cm -n kube-system coredns -o yaml
kubectl get pdb -n kube-system coredns -o jsonpath='{.spec}' | jq


# aws-node : 2개의 컨테이너 - aws-node(cni plugin), aws-eks-nodeagent(network policy agent)
kubectl describe pod -n kube-system -l k8s-app=aws-node
  • 파드 정보도 확인해보자

에드온 정보도 확인

# 클러스터에 설치된 Addon 목록 확인
aws eks list-addons --cluster-name myeks | jq


# 특정 Addon 상세 정보
aws eks describe-addon --cluster-name myeks --addon-name vpc-cni | jq

# 전체 Addon 상세 정보  
aws eks list-addons --cluster-name myeks \
| jq -r '.addons[]' \
| xargs -I{} aws eks describe-addon \
     --cluster-name myeks \
     --addon-name {}
  • 확인

노드정보도 확인해보자
노드 ssh 접속

# 노드 IP 확인 및 공인IP 변수 지정
aws ec2 describe-instances --query "Reservations[*].Instances[*].{PublicIPAdd:PublicIpAddress,PrivateIPAdd:PrivateIpAddress,InstanceName:Tags[?Key=='Name']|[0].Value,Status:State.Name}" --filters Name=instance-state-name,Values=running --output table
NODE1=13.124.172.105
NODE2=15.164.250.203

# 노드의IP ping 테스트
ping -c 1 $NODE1
ping -c 1 $NODE2

# 노드 보안그룹 확인
aws ec2 describe-security-groups | jq
aws ec2 describe-security-groups --filters "Name=tag:Name,Values=myeks-node-group-sg" | jq
aws ec2 describe-security-groups --filters "Name=tag:Name,Values=myeks-node-group-sg" --query 'SecurityGroups[*].IpPermissions' --output text


# 워커 노드 SSH 접속
ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no ec2-user@$NODE1 hostname
ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no ec2-user@$NODE2 hostname
ssh -o StrictHostKeyChecking=no ec2-user@$NODE1 hostname
ssh -o StrictHostKeyChecking=no ec2-user@$NODE2 hostname


# Tip. ssh config
cat ~/.ssh/config       
...
Host *
    User ec2-user
    IdentityFile ~/.ssh/kp-gasida.pem
    
ssh ec2-user@$NODE1
exit

ssh ec2-user@$NODE2
exit
  • 명령어로 확인

이제는 노드에 직접 접속해서 정보를 확인해보자

# 관리자 전환
sudo su - 
whoami

# 호스트 정보 확인
hostnamectl
...
  Virtualization: amazon
Operating System: Amazon Linux 2023.10.20260302
     CPE OS Name: cpe:2.3:o:amazon:amazon_linux:2023
          Kernel: Linux 6.12.73-95.123.amzn2023.x86_64
    Architecture: x86-64
 Hardware Vendor: Amazon EC2
  Hardware Model: t3.medium
  
# SELinux 설정 : Kubernetes는 Permissive 권장
getenforce
sestatus   

# Swap 비활성화
free -h
cat /etc/fstab

# cgroup 확인 : 버전2
stat -fc %T /sys/fs/cgroup/
cgroup2fs

# overlay 커널 모듈 로드 확인 : https://interlude-3.tistory.com/47
lsmod | grep overlay

# containerd 스냅샷 목록 보기
ctr -n k8s.io snapshots ls
ls -la /var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/
tree /var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/ -L 3

# 커널 파라미터 확인
tree /etc/sysctl.d/
cat /etc/sysctl.d/00-defaults.conf
cat /etc/sysctl.d/99-sysctl.conf
cat /etc/sysctl.d/99-amazon.conf 
cat /etc/sysctl.d/99-kubernetes-cri.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
  • 확인

    컨테이너 정보 확인
# 기본 정보 확인
nerdctl info
# 동작 중인 컨테이너 확인
nerdctl ps

nerdctl images
nerdctl images | grep localhost
  • 확인

Time Server도 확인해보자

cat /usr/share/amazon-chrony-config/amazon-pool_aws.sources
  • 확인

kubelet 정보도 확인

# 프로세스 확인
ps afxuwww
systemctl status kubelet --no-pager
cat /etc/systemd/system/kubelet.service

# 관련 파일 확인
tree /etc/kubernetes/

# k8s ca 인증서 확인 : 10년 유효 기간
cat /etc/kubernetes/pki/ca.crt | openssl x509 -text -noout

# kubelet 설정 파일 확인
cat /etc/kubernetes/kubelet/config.json | jq

cat /etc/kubernetes/kubelet/config.json.d/40-nodeadm.conf 

# 관련 디렉터리 확인
tree /var/lib/kubelet -L 2


# kubelet(client) -> eks api server(server) 호출 시
cat /var/lib/kubelet/kubeconfig 

# eks api server(client) -> kubelet(server) 호출 시 : kubelet 이 https 서버 동작 시 TLS 서버 인증서
# 아래 SAN IP 'IP Address:192.168.2.110, IP Address:54.180.255.23' 는 해당 노드의 '사설, 공인' IP
curl ipinfo.io/ip ; echo


cat /var/lib/kubelet/pki/kubelet-server-current.pem | openssl x509 -text -noout


# (참고) 인증서 발급 시 사용한 csr 확인 : ec2 노드가 아니라 자신의 pc에서 확인!
kubectl get csr
  • 확인 참고로 kublet은 매우 중요한 정보!

CNI 정보도 확인해보자

# cni 바이너리 확인
tree -pug /opt/cni/
/opt/cni/bin/aws-cni -h
cat /opt/cni/bin/aws-cni-support.sh

# aws vpc cni 플러그인 설정 확인
tree /etc/cni
/etc/cni
└── net.d
    └── 10-aws.conflist

cat /etc/cni/net.d/10-aws.conflist | jq
  • 확인

스토리지와 네트워크도 체크해보자

# network 정보 확인
ip route
ip addr # eni 와 veth 확인
lsns -t net

# iptables 규칙 확인
iptables -t nat -S
iptables -t filter -S
iptables -t mangle -S

##스토리지 확인
lsblk
df -hT
findmnt
  • check

cgroup 정보 확인해보자

# cgroup 확인 : 버전2
stat -fc %T /sys/fs/cgroup/
findmnt |grep -i cgroup

# EKS node 전체 cgroup 구조
tree /sys/fs/cgroup/ -L 1

# 관련 툴
systemd-cgls
systemd-cgtop
  • check
profile
클라우드엔지니어

0개의 댓글