오랜만에 가시다님이 주관하는 스터디에 참여했습니다
거두절미하고 공유바로 하겠습니다!
아래와 같이 환경 세팅을 진행합니다.
# 변수 지정
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

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

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
