Kubernetes 전반을 한번 정리해야 겠다는 생각을 하던차에 Elastic Kubernetes 스터디에 참여하게 되었다. 회사에서는 Google Cloud를 주로 사용하는데 스터디를 참여하면서 AWS도 익혀보려고 한다.
AEWS 스터디에서는 AWS의 관리형 Kubernetes인 Elastic Kubernetes의 다양한 기능들을 실습해보면서 익혀본다. 이 글은 스터디를 참여하면서 학습한 내용을 정리하는 연재 글이다. 스터디 진도에 맞춰 글을 작성한다.
이 글에서는 Amzaon EKS의 아키텍처를 알아보고 실습 환경을 배포해본다.
1. Amazon EKS
Amazon EKS 란?
Amazon EKS는 Kubernetes를 쉽게 실행할 수 있는 AWS 관리형 서비스이다. Amazon EKS를 사용하면 AWS 환경에서 Kubernetes 컨트롤 플레인 또는 노드를 직접 설치, 운영 및 유지할 필요가 없다.
Kubernetes 컨트롤 플레인 영역에 대해 1) 인스턴스의 크기 자동 조정 2) 비정상 인스턴스를 감지, 교체 3) 자동화된 버전 업데이트 및 패치 4) 오픈소스 Kubernetes 소프트웨어의 최신 버전 사용 으로 5) Kubernetes 커뮤니티에서 모든 기존 플러그인과 도구를 사용 가능 하다.
AWS 를 사용한다면 여러 AWS 서비스와 통합하여 사용할 수 있다.
- 컨테이너 이미지 저장소인 Amazon ECR(Elastic Container Registry)
- 로드 분산을 위한 AWS ELB(Elastic Load Balancing)
- 인증을 위한 AWS IAM
- 격리된 Amazon VPC
지원 버전은 보통 4개의 마이너 버전 지원 (23.04.30 현재 1.22~1.26), 평균 3개월마다 새 버전 제공하여 각 버전은 12개월 정도 지원한다.
EKS 아키텍처
Amazon EKS 클러스터는 두 가지 기본 구성 요소로 구성된다.
- EKS Control Plane: 클러스터의 전반적인 상태를 제어한다. etcd 및 Kubernetes API 등의 관리를 담당하는 요소들로 구성된다.
- EKS Data Plane: 실제로 애플리케이션을 실행하는 노드 그룹에서 실행 중인 Pod와 컨테이너를 관리한다.
먼저 EKS Control Plane 내부의 구성요소를 살펴보면 다음과 같다.
etcd: Kubernetes는 각 컨트롤러와 노드가 실행 중인 모든 컨테이너 및 관련 자원의 상태 정보를 etcd에 저장합니다. 이 정보는 클러스터에서 실행되는 모든 컨테이너 및 관련 자원의 현재 상태를 유지 관리하는 데 사용됩니다.
API Server: Kubernetes API Server는 Kubernetes 클러스터를 제어하고 모니터링하는 데 사용되는 중앙 집중식 인터페이스 역할을 합니다.
이외 파드 배치 작업을 하는 kube-scheduler, 관리자가 바라는 상태인 Desired-state를 유지해주는 controller가 있다.
다음은 EKS Data Plane의 구성요소이다.
kubelet: Control Plane에서 내려지는 명령을 처리해서 노드에서 파드를 생성하고 정상적으로 동작하는지 관리하는 역할을 담당한다. 예를들어 Pod 생성 명령이 떨어지면 kube-apiserver에서 kubelet으로 명령이 전송된다고 보면된다.
kube-proxy: 쿠버네티스 클러스터 내부에서 네트워크 요청을 전달하는 역할을 한다.
2. 실습환경 배포
기본 인프라 배포
우선 아래 워커노드 부분의 인프라를 배포한다. 스터디에서 만들어준 AWS CloudFormation으로 생성한다. SSH 키페어는 미리 생성하여 사용해야한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
# yaml 파일 다운로드
curl -O https://s3.ap-northeast-2.amazonaws.com/cloudformation.cloudneta.net/K8S/myeks-1week.yaml
# 배포
# aws cloudformation deploy --template-file ~/Downloads/myeks-1week.yaml --stack-name mykops --parameter-overrides KeyName=<My SSH Keyname> SgIngressSshCidr=<My Home Public IP Address>/32 --region <리전>
예시) aws cloudformation deploy --template-file ~/Downloads/myeks-1week.yaml \
--stack-name myeks --parameter-overrides KeyName=kp-gasida SgIngressSshCidr=$(curl -s ipinfo.io/ip)/32 --region ap-northeast-2
aws cloudformation deploy --template-file myeks-1week.yaml \
--stack-name myeks --parameter-overrides KeyName=ygpark SgIngressSshCidr=$(curl -s ipinfo.io/ip)/32 --region ap-northeast-2
# CloudFormation 스택 배포 완료 후 EC2 IP 출력
aws cloudformation describe-stacks --stack-name myeks --query 'Stacks[*].Outputs[*].OutputValue' --output text
예시) 3.35.137.31
3.36.87.42
# ec2 에 SSH 접속
예시) ssh -i <My SSH Keyfile> ec2-user@3.35.137.31
ssh -i /mnt/c/vswork/_aews/secret/ygpark.pem ec2-user@$(aws cloudformation describe-stacks --stack-name myeks --query 'Stacks[*].Outputs[0].OutputValue' --output text)
|
cs |
작업용 EC2에는 미리 CloudFormation의 UserData 부분으로 각종 툴을 설치하도록 세팅되어 있다.
기본정보를 확인 해본다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
|
# (옵션) cloud-init 실행 과정 로그 확인
sudo tail -f /var/log/cloud-init-output.log
__| __|_ )
_| ( / Amazon Linux 2 AMI
___|\___|___|
https://aws.amazon.com/amazon-linux-2/
No packages needed for security; 7 packages available
Run "sudo yum update" to apply all updates.
[root@myeks-host ~]# sudo tail -f /var/log/cloud-init-output.log
| ..X=X.*o |
| + ..* |
| . o o.o |
| + .S.. . |
|E . + o o |
| . o o . |
|. + |
| . . |
+----[SHA256]-----+
Cloud-init v. 19.3-46.amzn2 finished at Sun, 23 Apr 2023 10:51:23 +0000. Datasource DataSourceEc2. Up 66.15 seconds
# 사용자 확인
sudo su -
Last login: Sun Apr 23 19:54:06 KST 2023 on pts/1
whoami
root
# 기본 툴 및 SSH 키 설치 등 확인
kubectl version --client=true -o yaml | yh
gitVersion: v1.25.7-eks-a59e1f0
clientVersion:
buildDate: "2023-03-09T20:05:58Z"
compiler: gc
gitCommit: bde397a9c9f0d2ca03219bad43a4c2bef90f176f
gitTreeState: clean
gitVersion: v1.25.7-eks-a59e1f0
goVersion: go1.19.6
major: "1"
minor: 25+
platform: linux/amd64
kustomizeVersion: v4.5.7
eksctl version
0.138.0
aws --version
aws-cli/2.11.15 Python/3.11.3 Linux/4.14.311-233.529.amzn2.x86_64 exe/x86_64.amzn.2 prompt/off
ls /root/.ssh/id_rsa*
# 도커 엔진 설치 확인
docker info
Client:
Context: default
Debug Mode: false
Plugins:
buildx: Docker Buildx (Docker Inc., 0.0.0+unknown)
...
|
cs |
IAM User 자격 증명 설정 및 VPC 확인 및 변수 지정한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
|
# 자격 구성 설정 없이 확인
aws ec2 describe-instances
Unable to locate credentials. You can configure credentials by running "aws configure".
# IAM User 자격 구성 : 실습 편리를 위해 administrator 권한을 가진 IAM User 의 자격 증명 입력
aws configure
AWS Access Key ID [None]: AKI...
AWS Secret Access Key [None]: kWe...
Default region name [None]: ap-northeast-2
Default output format [None]: json
# 자격 구성 적용 확인 : 노드 IP 확인
aws ec2 describe-instances
{
"Reservations": [
{
"Groups": [],
"Instances": [
{
"AmiLaunchIndex": 0,
"ImageId": "ami-0a5546ae8688f4f97",
"InstanceId": "i-0f506dee4128c2a9b",
"InstanceType": "t3.medium",
"KeyName": "ygpark",
"LaunchTime": "2023-04-23T10:50:11+00:00",
"Monitoring": {
"State": "disabled"
},
"Placement": {
"AvailabilityZone": "ap-northeast-2a",
"GroupName": "",
"Tenancy": "default"
},
"PrivateDnsName": "ip-192-168-1-100.ap-northeast-2.compute.internal",
"PrivateIpAddress": "192.168.1.100",
"ProductCodes": [],
"PublicDnsName": "ec2-3-36-87-42.ap-northeast-2.compute.amazonaws.com",
"PublicIpAddress": "3.36.87.42",
...
# EKS 배포할 VPC 정보 확인
aws ec2 describe-vpcs --filters "Name=tag:Name,Values=$CLUSTER_NAME-VPC" | jq
{
"Vpcs": [
{
"CidrBlock": "192.168.0.0/16",
"DhcpOptionsId": "dopt-04021ab758213a93b",
"State": "available",
"VpcId": "vpc-0bc0bdce00027b5a9",
"OwnerId": "991354587926",
"InstanceTenancy": "default",
"CidrBlockAssociationSet": [
{
"AssociationId": "vpc-cidr-assoc-0a33091ab5918d952",
"CidrBlock": "192.168.0.0/16",
"CidrBlockState": {
"State": "associated"
}
}
],
"IsDefault": false,
"Tags": [
{
"Key": "aws:cloudformation:logical-id",
"Value": "EksVPC"
},
{
"Key": "aws:cloudformation:stack-name",
"Value": "myeks"
},
{
"Key": "Name",
"Value": "myeks-VPC"
},
{
"Key": "aws:cloudformation:stack-id",
"Value": "arn:aws:cloudformation:ap-northeast-2:991354587926:stack/myeks/8b98cd00-e1c4-11ed-a805-06a38c535764"
}
]
}
]
}
aws ec2 describe-vpcs --filters "Name=tag:Name,Values=$CLUSTER_NAME-VPC" | jq Vpcs[]
aws ec2 describe-vpcs --filters "Name=tag:Name,Values=$CLUSTER_NAME-VPC" | jq Vpcs[].VpcId
aws ec2 describe-vpcs --filters "Name=tag:Name,Values=$CLUSTER_NAME-VPC" | jq -r .Vpcs[].VpcId
vpc-0bc0bdce00027b5a9
export VPCID=$(aws ec2 describe-vpcs --filters "Name=tag:Name,Values=$CLUSTER_NAME-VPC" | jq -r .Vpcs[].VpcId)
echo "export VPCID=$VPCID" >> /etc/profile
echo $VPCID
# EKS 배포할 VPC에 속한 Subnet 정보 확인
aws ec2 describe-subnets --filters "Name=vpc-id,Values=$VPCID" --output json | jq
aws ec2 describe-subnets --filters "Name=vpc-id,Values=$VPCID" --output yaml | yh
## 퍼블릭 서브넷 ID 확인
aws ec2 describe-subnets --filters Name=tag:Name,Values="$CLUSTER_NAME-PublicSubnet1" | jq
aws ec2 describe-subnets --filters Name=tag:Name,Values="$CLUSTER_NAME-PublicSubnet1" --query "Subnets[0].[SubnetId]" --output text
export PubSubnet1=$(aws ec2 describe-subnets --filters Name=tag:Name,Values="$CLUSTER_NAME-PublicSubnet1" --query "Subnets[0].[SubnetId]" --output text)
export PubSubnet2=$(aws ec2 describe-subnets --filters Name=tag:Name,Values="$CLUSTER_NAME-PublicSubnet2" --query "Subnets[0].[SubnetId]" --output text)
echo "export PubSubnet1=$PubSubnet1" >> /etc/profile
echo "export PubSubnet2=$PubSubnet2" >> /etc/profile
echo $PubSubnet1
subnet-0181ed589ebc33b1e
echo $PubSubnet2
subnet-0f792371c151e0c00
|
cs |
3. Amazon EKS 배포
위에서 지정한 변수들로 EKS를 배포해본다.
관리형 노드 그룹 vpc.subnets.public 부분 정보를 보면 위에서 변수 지정한 PubSubnet1, PubSubnet2로 매칭된다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
|
# 변수 확인
echo $AWS_DEFAULT_REGION
echo $CLUSTER_NAME
echo $VPCID
vpc-0bc0bdce00027b5a9
echo $PubSubnet1,$PubSubnet2
subnet-0181ed589ebc33b1e,subnet-0f792371c151e0c00
# 옵션 [터미널1] EC2 생성 모니터링
#while true; do 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 text ; echo "------------------------------" ; sleep 1; done
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
-------------------------------------------------------------
| DescribeInstances |
+--------------+-----------------+---------------+----------+
| InstanceName | PrivateIPAdd | PublicIPAdd | Status |
+--------------+-----------------+---------------+----------+
| myeks-host | 192.168.1.100 | 3.36.87.42 | running |
+--------------+-----------------+---------------+----------+
# eks 클러스터 & 관리형노드그룹 배포 전 정보 확인
eksctl create cluster --name $CLUSTER_NAME --region=$AWS_DEFAULT_REGION --nodegroup-name=$CLUSTER_NAME-nodegroup --node-type=t3.medium \
--node-volume-size=30 --vpc-public-subnets "$PubSubnet1,$PubSubnet2" --version 1.24 --ssh-access --external-dns-access --dry-run | yh
...
vpc:
autoAllocateIPv6: false
cidr: 192.168.0.0/16
clusterEndpoints:
privateAccess: false
publicAccess: true
id: vpc-0bc0bdce00027b5a9
manageSharedNodeSecurityGroupRules: true
nat:
gateway: Disable
subnets:
public:
ap-northeast-2a:
az: ap-northeast-2a
cidr: 192.168.1.0/24
id: subnet-0181ed589ebc33b1e
ap-northeast-2c:
az: ap-northeast-2c
cidr: 192.168.2.0/24
id: subnet-0f792371c151e0c00
# eks 클러스터 & 관리형노드그룹 배포: 총 16분(13분+3분) 소요
eksctl create cluster --name $CLUSTER_NAME --region=$AWS_DEFAULT_REGION --nodegroup-name=$CLUSTER_NAME-nodegroup --node-type=t3.medium \
--node-volume-size=30 --vpc-public-subnets "$PubSubnet1,$PubSubnet2" --version 1.24 --ssh-access --external-dns-access --verbose 4
...
023-04-23 01:32:22 [▶] setting current-context to admin@myeks.ap-northeast-2.eksctl.io
2023-04-23 01:32:22 [✔] saved kubeconfig as "/root/.kube/config"
...
|
cs |
노드 SSH 접속
배포된 노드 IP를 확인하고 핑 테스트 및 접속을 해봅니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
|
# 노드 IP 확인 및 PrivateIP 변수 지정
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
N1=192.168.1.83
N2=192.168.2.10
------------------------------------------------------------------------------
| DescribeInstances |
+-----------------------------+----------------+-----------------+-----------+
| InstanceName | PrivateIPAdd | PublicIPAdd | Status |
+-----------------------------+----------------+-----------------+-----------+
| myeks-myeks-nodegroup-Node | 192.168.2.191 | 43.200.191.121 | running |
| myeks-myeks-nodegroup-Node | 192.168.1.35 | 3.36.54.188 | running |
| myeks-host | 192.168.1.100 | 3.36.87.42 | running |
+-----------------------------+----------------+-----------------+-----------+
export N1=192.168.2.191
export N2=192.168.1.35
# eksctl-host 에서 노드의IP나 coredns 파드IP로 ping 테스트
ping <IP>
ping -c 2 $N1
ping -c 2 $N2
# 노드 보안그룹 ID 확인
aws ec2 describe-security-groups --filters Name=group-name,Values=*nodegroup* --query "SecurityGroups[*].[GroupId]" --output text
NGSGID=$(aws ec2 describe-security-groups --filters Name=group-name,Values=*nodegroup* --query "SecurityGroups[*].[GroupId]" --output text)
echo $NGSGID
sg-007cb9ac09d47f0a3
# 노드 보안그룹에 eksctl-host 에서 노드(파드)에 접속 가능하게 룰(Rule) 추가 설정
aws ec2 authorize-security-group-ingress --group-id $NGSGID --protocol '-1' --cidr 192.168.1.100/32
{
"Return": true,
"SecurityGroupRules": [
{
"SecurityGroupRuleId": "sgr-0db53df52a13ebd4e",
"GroupId": "sg-007cb9ac09d47f0a3",
"GroupOwnerId": "991354587926",
"IsEgress": false,
"IpProtocol": "-1",
"FromPort": -1,
"ToPort": -1,
"CidrIpv4": "192.168.1.100/32"
}
]
}
# eksctl-host 에서 노드의IP나 coredns 파드IP로 ping 테스트
ping -c 2 $N1
PING 192.168.2.191 (192.168.2.191) 56(84) bytes of data.
64 bytes from 192.168.2.191: icmp_seq=1 ttl=255 time=0.943 ms
64 bytes from 192.168.2.191: icmp_seq=2 ttl=255 time=0.916 ms
--- 192.168.2.191 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 0.916/0.929/0.943/0.033 ms
ping -c 2 $N2
# 워커 노드 SSH 접속
ssh -i ~/.ssh/id_rsa ec2-user@$N1 hostname
ip-192-168-2-191.ap-northeast-2.compute.internal
ssh -i ~/.ssh/id_rsa ec2-user@$N2 hostname
ip-192-168-1-35.ap-northeast-2.compute.internal
ssh -i ~/.ssh/id_rsa ec2-user@$N1
exit
ssh -i ~/.ssh/id_rsa ec2-user@$N2
exit
|
cs |
노드 네트워크 정보 확인
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
# AWS VPC CNI 사용 확인
kubectl -n kube-system get ds aws-node
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
aws-node 2 2 2 2 2 <none> 94m
kubectl describe daemonset aws-node --namespace kube-system | grep Image | cut -d "/" -f 2
# 파드 IP 확인
kubectl get pod -n kube-system -o wide
kubectl get pod -n kube-system -l k8s-app=kube-dns -owide
ssh -i ~/.ssh/id_rsa ec2-user@$N1 sudo ip -c addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc mq state UP group default qlen 1000
link/ether 0a:71:63:09:3e:08 brd ff:ff:ff:ff:ff:ff
inet 192.168.2.191/24 brd 192.168.2.255 scope global dynamic eth0
valid_lft 3168sec preferred_lft 3168sec
inet6 fe80::871:63ff:fe09:3e08/64 scope link
valid_lft forever preferred_lft forever
ssh -i ~/.ssh/id_rsa ec2-user@$N2 sudo ip -c addr
ssh -i ~/.ssh/id_rsa ec2-user@$N1 sudo ip -c route
default via 192.168.2.1 dev eth0
169.254.169.254 dev eth0
192.168.2.0/24 dev eth0 proto kernel scope link src 192.168.2.191
ssh -i ~/.ssh/id_rsa ec2-user@$N2 sudo ip -c route
ssh -i ~/.ssh/id_rsa ec2-user@$N1 sudo iptables -t nat -S
ssh -i ~/.ssh/id_rsa ec2-user@$N2 sudo iptables -t nat -S
|
cs |
노드 프로세스 정보 확인
pstree로 연결구조를 확인해 볼 수 있다. 컨테이너 런타임은 containerd를 사용하는 것으로 확인 할 수 있다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
|
ssh -i ~/.ssh/id_rsa ec2-user@$N1 sudo systemctl status kubelet
ssh -i ~/.ssh/id_rsa ec2-user@$N1 sudo pstree
systemd-+-2*[agetty]
|-amazon-ssm-agen-+-ssm-agent-worke---8*[{ssm-agent-worke}]
| `-8*[{amazon-ssm-agen}]
|-auditd---{auditd}
|-chronyd
|-containerd---17*[{containerd}]
|-containerd-shim-+-kube-proxy---6*[{kube-proxy}]
| |-pause
| `-11*[{containerd-shim}]
|-containerd-shim-+-bash-+-aws-k8s-agent---7*[{aws-k8s-agent}]
| | `-tee
| |-pause
| `-11*[{containerd-shim}]
|-crond
|-dbus-daemon
|-2*[dhclient]
|-gssproxy---5*[{gssproxy}]
|-irqbalance---{irqbalance}
|-kubelet---13*[{kubelet}]
|-lvmetad
|-master-+-pickup
| `-qmgr
|-rngd
|-rpcbind
|-rsyslogd---2*[{rsyslogd}]
|-sshd---sshd---sshd---sudo---pstree
|-systemd-journal
|-systemd-logind
`-systemd-udevd
ssh -i ~/.ssh/id_rsa ec2-user@$N1 sudo ps afxuwww
ssh -i ~/.ssh/id_rsa ec2-user@$N1 sudo ps axf |grep /usr/bin/containerd
2728 ? Ssl 0:28 /usr/bin/containerd
2978 ? Sl 0:01 /usr/bin/containerd-shim-runc-v2 -namespace k8s.io -id 92e6786d52cc0382a91278df812cbd0ac9bb19c1957561220e206b16b94893e2 -address /run/containerd/containerd.sock
2979 ? Sl 0:06 /usr/bin/containerd-shim-runc-v2 -namespace k8s.io -id a9fc6266a55b3479150bd61bdaf27ef4b1218cebab2e7a44310f1815bb2895e9 -address /run/containerd/containerd.sock
ssh -i ~/.ssh/id_rsa ec2-user@$N1 sudo ls /etc/kubernetes/manifests/
ssh -i ~/.ssh/id_rsa ec2-user@$N2 sudo systemctl status kubelet
ssh -i ~/.ssh/id_rsa ec2-user@$N2 sudo pstree
ssh -i ~/.ssh/id_rsa ec2-user@$N2 sudo ps afxuwww
ssh -i ~/.ssh/id_rsa ec2-user@$N2 sudo ps axf |grep /usr/bin/containerd
ssh -i ~/.ssh/id_rsa ec2-user@$N2 sudo ls /etc/kubernetes/manifests/
|
cs |
노드 스토리지 정보 확인
1
2
3
4
5
|
ssh -i ~/.ssh/id_rsa ec2-user@$N1 lsblk
ssh -i ~/.ssh/id_rsa ec2-user@$N1 df -hT --type xfs
ssh -i ~/.ssh/id_rsa ec2-user@$N2 lsblk
ssh -i ~/.ssh/id_rsa ec2-user@$N2 df -hT --type xfs
|
cs |
4. EKS owned ENI 확인
이름 부터 의심이 가는 EKS owned ENI이다. 워커노드에 붙어있는 내가 소유한 VPC내부의 ENI이 이지만 영어 이름 그대로 EKS가 소유하고 있다.
1
2
3
4
5
6
7
8
9
10
|
# kubelet, kube-proxy 통신 Peer Address는 어딘인가요?
ssh -i ~/.ssh/id_rsa ec2-user@$N1 sudo ss -tnp
ssh -i ~/.ssh/id_rsa ec2-user@$N2 sudo ss -tnp
# [터미널] aws-node 데몬셋 파드 1곳에 bash 실행해두기
kubectl exec daemonsets/aws-node -it -n kube-system -c aws-node -- bash
# exec 실행으로 추가된 연결 정보의 Peer Address는 어딘인가요? >> AWS 네트워크 인터페이스 ENI에서 해당 IP 정보 확인
ssh -i ~/.ssh/id_rsa ec2-user@$N1 sudo ss -tnp
ssh -i ~/.ssh/id_rsa ec2-user@$N2 sudo ss -tnp
|
cs |
워커노드 내부에서 kubelet, kube-proxy 가 호출하는 Peer Address는 EKS 클러스터의 endpoint IP이다. kubectl로 aws-node 데몬셋 파드 1곳에 bash 추가된 연결 정보의 Peer Address를 확인해보면 소유자가 다른 ENI를 확인 할 수 있다.
'스터디 > Kubernetes' 카테고리의 다른 글
[AWES] EKS Networking 특징과 네트워크 흐름 (0) | 2023.05.07 |
---|---|
[AEWS] Amzaon EKS - Cluster Endpoint 구성 톱아보기 (0) | 2023.04.30 |
[PKOS] Kubernetes 보안 - kubescape, polaris, RBAC (2/2) (0) | 2023.04.10 |
[PKOS] Kubernetes 보안 - kubescape, polaris, RBAC (1/2) (0) | 2023.04.09 |
[PKOS] Kubernetes 모니터링과 로깅 - Prometheus, Grafana, Loki (0) | 2023.04.02 |