본문 바로가기

공부

[AWS] VPC 피어링 설정 및 이슈 해결 (eks-ec2)

반응형

 

 

VPC Peering

 

#1. 도입 배경

현재 상황이 EKS를 실행할 때 airflow 의 sshoperator 를 사용하여 EC2 instance를 실행하고 있다.

K8S의 경우 IP도 많이 사용할 수 있기 때문에 EC2 instance 의 VPC 와 분리를 했다.

안정성을 확보하기 위해서 다른 VPC에 있는 인스턴스들을 연결하기 위해(이전의 상황을 복원할 수 있도록) VPC Peering 을 사용하기로 했다.

 

 

#2. VPC Peering

AWS 상의 가상 네트워크인 VPC(Virtual Private Cloud)는 같은 AWS Cloud 지만, 논리적으로 분리되어있다.

VPC Peering 은 논리적으로 분리된 복수개 VPC 간에 트래픽을 라우팅할 수 있도록 네트워크를 연결해준다.

 

같은 계정 내 VPC, 타 계정의 VPC끼리 연결이 가능하다.

동일 AZ내 Networking은 무료로 구성이 가능하나, 다른 가용영역 및 리전에서는 비용이 발생한다.

Amazon Virtual Private Cloud(VPC) 자체를 생성하고 사용하는 데 추가 비용은 없지만 사용량 기반 GB에 0.2USD 요금으로 선택적 VPC 기능에 대해 비용을 지불한다고 한다.

 

 

#3. 방법

 

Step 1 : VPC Peering 연결 설정

AWS 콘솔 -> VPC 서비스 -> 좌측 메뉴에서 Peering Connections

 

1. Create peering connections 클릭

2. Peering connection name

3. VPC requester : EKS가 있는 VPC(EKS 클러스터가 배포된 VPC)

4. VPC accepter : 계정이 같으면 EC2 인스턴스가 있는 VPC 선택, 다른 계정이라면 계정 ID, VPC ID 수동 입력

5. Create Peering Connection 클릭

6. 생성 후 → Peering 연결 상태가 Pending

 

Step 2 : Peering Connection 수락

1. Peering Connections 목록에서 방금 생성한 연결 선택

2. [Actions] → Accept request

 

Step 3 : 라우팅 테이블 수정

양쪽 VPC 모두에 라우팅 추가가 필요하다. (EKS VPC의 Route Table, EC2 VPC의 Route Table 수정)

  1. VPC → Route Tables 메뉴
  2. EKS VPC에 연결된 Route Table 선택
  3. Routes 탭 → Edit routes
  4. Add route:
    • Destination: EC2 VPC의 CIDR (예: 172.31.0.0/16)
    • Target: pcx-xxxxxxx (Peering 연결 ID)

 

Step 4 : 보안 그룹 수정

EC2 인스턴스의 SG (Inbound 규칙)

- Type: SSH (TCP 22)

- Source: EKS VPC의 CIDR 범위

 

Step 5 : 연결 테스트

그 다음에 연결 테스트를 하려고 했다.

kubectl exec -it <pod-name> -n airflow -- bash
ssh -i /opt/airflow/.ssh/featuringeg-batch.pem ec2-user@<EC2-Private-IP> -vvv

 

근데 마주한 문제가, 172.27.0.0/16 에 대한 ping 이 안된다는 것이었다.

 

VPC peering 설정 이후에 해당 문제가 바로 안됐던 것이니, 다시 라우팅 테이블을 확인해보자.

확인해본 라우팅 테이블에서 EC2 의 인바운드는 잘 설정이 되어있는데,

내가 이것저것 만져본 이슈로 굉장히 많은 route table 이 많았다.

luna 가 들어간 라우팅 테이블을 모두 추가해주었다.

4개 정도 있어서 다 172.31.0.0/16 을 추가해주었다.

 

그래도 안된다. webserver가 띄우기를 거절해준다.

포트는 10250 인데, 해당 포트가 Kubelet API 포트이다. 

즉, 클라이언트에서 EKS 워커 노드의 10250 포트로 연결이 안되나 싶었다. (eks 의 CIDR은 172.27.0.0/16)

 

그러나 테스트 용으로 0.0.0.0/0 인바운드 허용을 해놨는데, 왜 안되는지,,

다시 한번 CIDR을 명시해봤다.

 

그래도 안되어서, 그러던 도중에 찾아본 것은

Network ACL 을 설정이 필요해보였다. (https://potato-yong.tistory.com/84, https://library.gabia.com/contents/8892/)

- 같은 서브넷끼리 통신할 때 : Security Group 정책을 거치면서 통신

- 다른 서브넷끼리 통신할 때 : NACL의 정책을 먼저 거친 후 , Security Group의 정책을 거치면서 통신

 

보안 그룹만 신경써주면 된다고 생각했는데, 그건 아니었나보다.

근데 아래 문제는 아니었던 것 같다. 제거해도 정상 작동함(애초에 위에 모든 트래픽을 인아웃 허용하니 상관이 없었을지도)

 

그래서 이것 저것 시도해보고 테스트해보다가

EKS 노드 보안 그룹 (보통 sg-08XXXXX)에서 Egress 허용 확인 값이 비어있었다.

aws ec2 describe-security-groups \
  --group-ids sg-08XXXXX \
  --query "SecurityGroups[].IpPermissionsEgress"
[
    []
]

그래서 아래 명령어로 추가해주었더니 드디어 실행 완료

aws ec2 authorize-security-group-egress \
  --group-id sg-08XXXXX \
  --protocol -1 \
  --cidr 0.0.0.0/0 \
  --region ap-northeast-2
{
    "Return": true,
    "SecurityGroupRules": [
        {
            "SecurityGroupRuleId": "sgr-09XXXXX",
            "GroupId": "sg-08XXXXXX",
            "GroupOwnerId": "XXXXXXXXXXX",
            "IsEgress": true,
            "IpProtocol": "-1",
            "FromPort": -1,
            "ToPort": -1,
            "CidrIpv4": "0.0.0.0/0",
            "SecurityGroupRuleArn": "arn:aws:ec2:ap-northeast-2:XXXXXXXXXXX:security-group-rule/sgr-09XXXXX"
        }
    ]
}

 

즉, 문제는 EKS 노드에서 나가는 트래픽(Egress)가 차단되어있었다.

Airflow WebServer / kubectl exec / port-forward 요청 → EKS 노드의 kubelet(10250 포트)으로 전송

-> 요청은 인바운드 규칙에 의해 노드로 도달함 (Ingress OK)

-> 그러나 응답 패킷이 외부(예: kubectl을 실행한 PC 또는 EC2)로 나가려면 EKS 노드의 보안 그룹이 이를 허용 필요

-> Egress 정책이 없거나 제한되어 있으면, EKS 노드는 응답 패킷을 보낼 수 없고 타임아웃

 

 

진짜 신경쓸게 많고, 나에게는 생소한 것들이라서 접근하기 어려웠다.

근데 재미있다. 내가 무조건 틀렸고, 무조건 답을 찾으면 나온다는게 보물찾기 하는 느낌이다.

airflow on eks 를 해결하면 고양될 줄 알았는데, 그것까지는 아니고

역시나 명심해야 하는 것은

어떤 문제인지를 문제 파악을 명확하게 하는 것과

다른 문제를 얽혀서 생각하지 않는 것

정말 중요하다.

선배님의 조언이 현재 나에게 정말 필요한 조언이었다.

덕분에 조금 더 빠르게 해결할 수 있었던 것 같다.

VPC : 사용자 AWS 계정 전용 가상 네트워크로 Virtual Private Cloud(VPC)
EC2 : 컴퓨팅 자원으르 클라우드에서 제공하는 웹 서비스
VPC 피어링 : 퍼블릭이 아닌 프라이빗 주소로 통신 가능
Route 53 : 도메인의 DNS 서비스로 사용
EBS(Elastic Block Store) : 인스턴스에서 사용할 수 있는 블록 수준 스토리지 볼륨 제공

 

 

 

출처 및 참고

- https://aws.amazon.com/ko/vpc/pricing/

- https://kyounggu.tistory.com/62

- https://jirak.net/wp/aws-범용-클라우드-아키텍처의-데이터-전송-비용-알아보/

- https://velog.io/@bjlee0689/AWS-VPC-Peering-구성

반응형

'공부' 카테고리의 다른 글

AWS EKS 설정 톺아보기 auto mode, network, vpc  (0) 2025.04.23
ECS vs EKS (ing)  (0) 2025.04.18
컨테이너 오케스트레이션 종류  (0) 2025.04.18
도커(Docker) 란 무엇인가?  (0) 2025.04.17
[aws] aws ec2, ssm 명령어 사용기  (0) 2025.04.16