AWS ECS에서 서비스를 배포 할 때 선택 할 수 있는 네트워크 모드가 아래와 같이 5개가 있다.
간략히 정리해보면
awsvpc모드는 인스턴스 실행할때 ENI와 IP가 추가로 할당이 되는 모드다.
bridge모드는 컨테이너 포트와 EC2에 동적포트를 매핑 해준다.
host모드는 컨테이너 포트를 EC2에 포트로 그대로 매핑한다.
default모드는 Windows 컨테이너에서만 지원되는 모드 이다.
아래와 같이 AWS문서에서는 awsvpc 네트워크모드를 권고 하고 있다.
- 원문내용참조 -
Amazon EC2 인스턴스에서 호스팅되는 Amazon ECS 태스크의 네트워킹 동작은 태스크 정의에 정의된 네트워크 모드에 따라 다릅니다. 다른 네트워크 모드를 사용해야 할 특별한 필요가 있지 않는 한 awsvpc 네트워크 모드를 사용하는 것이 좋습니다.
네트워크 모드 | EC2에서의 Linux 컨테이너 | EC2에서의 Windows 컨테이너 | Description |
awsvpc | 예 | 예 | 태스크에 고유한 탄력적 네트워크 인터페이스(ENI)와 기본 프라이빗 IPv4 주소가 할당됩니다. 이렇게 하면 태스크에 Amazon EC2 인스턴스와 동일한 네트워킹 속성이 적용됩니다. |
bridge | 예 | 아니요 | 태스크는 태스크를 호스팅하는 각 Amazon EC2 인스턴스 내부에서 실행되는 Docker의 기본 가상 네트워크를 이용합니다. Linux의 기본 가상 네트워크는 bridge Docker 네트워크 드라이버를 사용합니다. 이는 작업 정의에 네트워크 모드가 지정되지 않았을 때의 Linux의 기본 네트워크 모드입니다. |
host | 예 | 아니요 | 태스크는 해당 태스크를 호스팅하는 Amazon EC2 인스턴스의 ENI에 컨테이너 포트를 직접 매핑하여 Docker의 기본 가상 네트워크를 우회하는 호스트 네트워크를 사용합니다. 이 네트워크 모드에서는 동적 포트 매핑을 사용할 수 없습니다. 이 모드를 사용하는 작업 정의의 컨테이너는 특정hostPort 숫자를 지정해야 합니다. 호스트의 포트 번호는 여러 작업에서 사용할 수 없습니다. 따라서 단일 Amazon EC2 인스턴스에서 같은 태스크 정의를 가진 여러 태스크를 실행할 수 없습니다. |
none | 예 | 아니요 | 태스크에 외부 네트워크 연결이 없습니다. |
default | 아니요 | 예 | 태스크는 태스크를 호스팅하는 각 Amazon EC2 인스턴스 내부에서 실행되는 Windows에서의 Docker 기본 가상 네트워크를 이용합니다. Windows의 기본 가상 네트워크는nat Docker 네트워크 드라이버를 사용합니다. 이는 작업 정의에서 네트워크 모드가 지정되지 않았을 때의 Windows의 기본 네트워크 모드입니다. |
https://docs.aws.amazon.com/ko_kr/AmazonECS/latest/developerguide/task-networking.html
하지만 awsvpc 네트워크 모드를 사용하게 되면 ECS Task별 인스턴스는 고유한 ENI를 받게 되는데 문제는 이때 클러스터에서 사용하는 EC2의 타입에 따라서 (Max - 1)개 만큼만 인스턴스를 띄울 수 있게된다.
예를들어 아래의 r3.large Type을 사용한다면 ECS에서 해당 노드에 인스턴스를 2개 만 실행할 수 있다.
그래서 해당하는 EC2의 ENI 확인이 필요한데 각 EC2 타입별로 MAX ENI는 AWS CLI로 확인이 가능하다.
(EX) r3.* type 조회 예시
aws ec2 describe-instance-types \
> --filters "Name=instance-type,Values=r3.*" \
> --query "InstanceTypes[].{ \
> Type: InstanceType, \
> MaxENI: NetworkInfo.MaximumNetworkInterfaces, \
> IPv4addr: NetworkInfo.Ipv4AddressesPerInterface}" \
> --output table
--------------------------------------
| DescribeInstanceTypes |
+----------+----------+--------------+
| IPv4addr | MaxENI | Type |
+----------+----------+--------------+
| 10 | 3 | r3.large |
| 30 | 8 | r3.8xlarge |
| 15 | 4 | r3.2xlarge |
| 30 | 8 | r3.4xlarge |
| 15 | 4 | r3.xlarge |
+----------+----------+--------------+
aws ec2 describe-instance-types \
> --filters "Name=instance-type,Values=r5.*" \
> --query "InstanceTypes[].{ \
> Type: InstanceType, \
> MaxENI: NetworkInfo.MaximumNetworkInterfaces, \
> IPv4addr: NetworkInfo.Ipv4AddressesPerInterface}" \
> --output table
---------------------------------------
| DescribeInstanceTypes |
+----------+----------+---------------+
| IPv4addr | MaxENI | Type |
+----------+----------+---------------+
| 50 | 15 | r5.24xlarge |
| 10 | 3 | r5.large |
| 30 | 8 | r5.4xlarge |
| 50 | 15 | r5.16xlarge |
| 50 | 15 | r5.metal |
| 30 | 8 | r5.8xlarge |
| 15 | 4 | r5.xlarge |
| 15 | 4 | r5.2xlarge |
| 30 | 8 | r5.12xlarge |
+----------+----------+---------------+
- MAX ENI 참고문서
https://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/using-eni.html#AvailableIpPerENI
결론 MAX ENI보다 많은 수의 인스턴스가 필요하다면 Bridge 모드를 쓰면된다.
'IT > AWS' 카테고리의 다른 글
[AWS] NLB 클라이언트 IP 보존 방법 (0) | 2024.10.31 |
---|---|
[AWS] ALB Access log 활성화 방법 (0) | 2024.09.12 |
AWS ECS 서비스 배포시 ALB 두개 연결 방법 (0) | 2024.08.14 |
댓글