IP 주소 지정과 연결성
IP 주소 지정과 연결성 (IP addressing and connectivity)
OpenStack 배포에서 VM이 외부 세계에 도달하지 못하고 외부에서도 VM에 도달하지 못한다면 쓸모가 크게 떨어져요. 이 문서는 Calico 기반 OpenStack 배포를 구성해서 외부 세계와 원하는 연결성을 확보하는 방법을 설명해요. IPv4/IPv6 주소 범위 계획, 게이트웨이 라우팅, Neutron 네트워크 설정을 함께 다뤄요.
출처: 문서
본문
OpenStack 배포에서 VM이 외부 세계에 도달하지 못하고 외부에서도 VM에 도달하지 못한다면 쓸모가 크게 떨어져요. 이 문서는 Calico 기반 OpenStack 배포를 구성해서 외부 세계와 원하는 연결성을 확보하는 방법을 설명할 거예요.
표준 OpenStack과의 주요 차이
OpenStack을 배포해 본 적이 있다면 라우터, 플로팅 IP, 외부 네트워크 같은 개념을 떠올릴 거예요. Calico는 단순성에 초점을 맞추기 때문에 이 개념들을 하나도 사용하지 않아요. 이 섹션은 대체로 경고에 가까워요. 내가 뭘 하고 있는지 안다고 생각하더라도 이 글의 나머지 부분을 꼭 읽어 보세요. 놀랄 수도 있거든요!
연결성 설정
파트 0: 주소 범위 결정
Calico에서는 다음 세 가지 옵션에서 사용할 주소 범위를 최대 세 개 고르는 게 가장 좋아요. 가능하다면 세 개를 모두 사용하세요.
첫 번째 옵션은 IPv6 주소 범위예요. VM에 IPv6 연결성을 주고 싶을 때 해당돼요. 데이터센터 네트워크가 IPv6 트래픽을 라우팅할 수 있을 때만 이 범위를 쓸 수 있다는 점에 유의하세요. 모든 IPv6 주소는 '외부에서 도달 가능'한 것으로 간주해야 해요. 따라서 게이트웨이 라우터로 라우팅되는 범위여야 하고, 이상적으로는 전역 스코프(global scope)여야 해요.
두 번째 옵션은 '프라이빗' IPv4 범위예요. VM에 IPv4 연결성을 주고 싶을 때 해당돼요. 가장 흔히 구성하게 될 범위예요. 이 범위에는 데이터센터 외부에서 시작된 트래픽이 도달할 수 없는 모든 VM이 들어가요.
세 번째 옵션은 '퍼블릭' IPv4 범위예요. VM에 IPv4 연결성을 주고 싶을 때 해당돼요. 이 범위에는 데이터센터 외부에서 시작된 트래픽이 도달하기를 원하는 모든 VM이 들어가요. 데이터센터 밖에서 이 범위로 향하는 트래픽이 게이트웨이로 라우팅되도록 반드시 확인하세요. 그렇지 않으면 아무것도 동작하지 않아요!
최소 요구 사항은 이 주소 범위 중 하나예요.
파트 1: 패브릭 구성
Calico 배포에는 게이트웨이 라우터가 필요해요. 대부분의 실무 시나리오에서는 고성능 라우터겠지만, (테스트 목적 같은) 작은 네트워크를 배포하면서 그런 장비가 없다면 Linux 서버가 그 역할을 대신할 수 있어요.
게이트웨이 라우터는 모든 컴퓨트 호스트의 기본 라우트(default route)에 있어야 해요. 그래야 데이터센터를 떠날 트래픽이 모두 게이트웨이를 경로해요. 즉, 플랫 L3 토폴로지에서는 게이트웨이 라우터가 넥스트 홉으로 설정되어야 해요. 멀티티어 L3 토폴로지처럼 더 복잡한 구성에서는 넥스트 홉이 조금 더 가까울 수 있어요. 예를 들어 top-of-rack 라우터가 넥스트 홉이 되고, 그 라우터가 다시 게이트웨이 라우터 쪽으로 라우팅하는 식이에요.
그다음, 게이트웨이 라우터는 Calico 네트워크의 BGP 피어여야 해요. 하나 이상의 라우트 리플렉터의 피어일 수도 있고, 작은 토폴로지에서는 컴퓨트 호스트와 직접 피어링할 수도 있어요. 그래야 모든 VM으로 가는 라우트를 알 수 있고, 그 VM들로 향하는 트래픽을 어느 방향으로 보낼지 판단할 수 있어요. 게이트웨이(및 필요하다면 BGP 라우트 리플렉터)를 구성하는 방법은 이 문서의 범위를 벗어나요. 방법을 모르거나 기존 배포에 Calico가 어떻게 맞아들어가는지 알고 싶다면 메일링 리스트로 문의하세요. 이 문제에 대한 범용 해법을 이 글에 담기는 어렵거든요.
게이트웨이가 eBGP로 외부에 라우트를 광고한다면, 위에서 구성한 프라이빗 IPv4 주소 범위의 라우트를 내보내지 않도록 게이트웨이에 BGP 정책을 구성해야 해요. 그렇지 않다면, 작은 배포에서는 VM을 목적지로 하는 외부 트래픽이 게이트웨이로 라우팅되기만 하면 돼요. 방법은 이 문서의 범위를 벗어나니 메일링 리스트에서 도움을 요청하세요.
마지막으로, IPv4 내부 범위에서 오는 모든 트래픽에 대해 상태 기반 PNAT(stateful PNAT)를 수행하도록 게이트웨이를 구성하세요. 이렇게 하면 외부 네트워크에서 직접 도달할 수 없는 VM도 스스로 서버에 연락해서 소프트웨어 업데이트를 요청하는 일을 할 수 있어요. 이 구성 방식 역시 라우터에 따라 달라져요.
파트 2: OpenStack 설정
OpenStack에서는 두 개의 공유(shared) Neutron 네트워크를 설정하면 돼요. 첫 번째 네트워크에는 'external' IPv4 범위를 담는 IPv4 서브넷 하나를 추가하세요. 서브넷에 게이트웨이 IP가 있고 DHCP가 활성화되어 있는지 확인하세요. 추가로 IPv6 범위의 절반을 담는 IPv6 서브넷 하나를 추가하는데, 역시 게이트웨이 IP와 DHCP를 켜요. 이 네트워크의 이름이 '외부에서 접근 가능한' VM용이라는 걸 분명히 알 수 있게 지으세요. Calico 동작에는 영향이 없지만 'external' 네트워크로 표시해도 괜찮아요.
두 번째 네트워크에는 'private' IPv4 범위를 담는 IPv4 서브넷과 IPv6 범위의 나머지 절반을 담는 IPv6 서브넷을 추가하고, 둘 다 게이트웨이 IP와 DHCP를 켜세요. 이 네트워크 이름도 'private' VM용이라는 게 분명히 드러나게 지으세요. 이 네트워크에 IPv6 범위 일부를 주면 이 VM들은 모두 IPv6로 도달 가능해진다는 점에 유의하세요. 모든 사용자가 이런 식으로 배포하기를 기대하지만, 원하지 않는다면 이 VM들에 IPv6 주소를 아예 주지 않거나, 게이트웨이가 광고하지 않는 프라이빗 IPv6를 주면 돼요.
그다음, 모든 테넌트의 기본 네트워크, 서브넷, 라우터, 플로팅 IP 쿼터를 0으로 설정해서 테넌트가 네트워크를 더 만들어 스스로 혼란에 빠지지 않게 하세요!
샘플 구성은 아래와 같아요. 네트워크 두 개와 네 개의 서브넷 중 두 개를 보여 줘요(주소 범위만 다를 뿐 나머지 구성은 같아요).
컨트롤러에서 다음 Neutron CLI 명령을 실행하세요.
neutron net-list
네트워크 목록이 반환돼요.
+--------------------------------------+----------+----------------------------------------------------------+
| id | name | subnets |
+--------------------------------------+----------+----------------------------------------------------------+
| 8d5dec25-a6aa-4e18-8706-a51637a428c2 | external | 54db559c-5e1d-4bdc-83b0-c479ef2a0ead 172.18.208.0/24 |
| | | cf6ceea0-dde0-4018-ab9a-f8f68935622b 2001:db8:a41:2::/64 |
| fa52b704-7b3c-4c83-8698-244807352711 | internal | 301b3e63-5324-4d62-8e22-ed8dddd50689 10.65.0.0/16 |
| | | bf94ccb1-c57c-4c9a-a873-c20cbfa4ecaf 2001:db8:a41:3::/64 |
+--------------------------------------+----------+----------------------------------------------------------+
다음으로 external 네트워크의 상세 정보를 확인하세요.
neutron net-show external
다음과 비슷한 결과가 반환될 거예요.
+---------------------------+--------------------------------------+
| Field | Value |
+---------------------------+--------------------------------------+
| admin_state_up | True |
| id | 8d5dec25-a6aa-4e18-8706-a51637a428c2 |
| name | external |
| provider:network_type | local |
| provider:physical_network | |
| provider:segmentation_id | |
| router:external | True |
| shared | True |
| status | ACTIVE |
| subnets | 54db559c-5e1d-4bdc-83b0-c479ef2a0ead |
| | cf6ceea0-dde0-4018-ab9a-f8f68935622b |
| tenant_id | ed34337f935745bb911eeb741bc4374b |
+---------------------------+--------------------------------------+
internal 네트워크의 상세 정보를 확인하세요.
neutron net-show internal
다음과 비슷한 결과가 반환될 거예요.
+---------------------------+--------------------------------------+
| Field | Value |
+---------------------------+--------------------------------------+
| admin_state_up | True |
| id | fa52b704-7b3c-4c83-8698-244807352711 |
| name | internal |
| provider:network_type | local |
| provider:physical_network | |
| provider:segmentation_id | |
| router:external | False |
| shared | True |
| status | ACTIVE |
| subnets | 301b3e63-5324-4d62-8e22-ed8dddd50689 |
| | bf94ccb1-c57c-4c9a-a873-c20cbfa4ecaf |
| tenant_id | ed34337f935745bb911eeb741bc4374b |
+---------------------------+--------------------------------------+
external4 서브넷을 확인하세요.
neutron subnet-show external4
다음과 비슷한 결과가 반환될 거예요.
+------------------+----------------------------------------------------+
| Field | Value |
+------------------+----------------------------------------------------+
| allocation_pools | {"start": "172.18.208.2", "end": "172.18.208.255"} |
| cidr | 172.18.208.0/24 |
| dns_nameservers | |
| enable_dhcp | True |
| gateway_ip | 172.18.208.1 |
| host_routes | |
| id | 54db559c-5e1d-4bdc-83b0-c479ef2a0ead |
| ip_version | 4 |
| name | external4 |
| network_id | 8d5dec25-a6aa-4e18-8706-a51637a428c2 |
| tenant_id | ed34337f935745bb911eeb741bc4374b |
+------------------+----------------------------------------------------+
external6 서브넷을 확인하세요.
neutron subnet-show external6
다음과 비슷한 결과가 반환될 거예요.
+------------------+-----------------------------------------------------------------------------+
| Field | Value |
+------------------+-----------------------------------------------------------------------------+
| allocation_pools | {"start": "2001:db8:a41:2::2", "end": "2001:db8:a41:2:ffff:ffff:ffff:fffe"} |
| cidr | 2001:db8:a41:2::/64 |
| dns_nameservers | |
| enable_dhcp | True |
| gateway_ip | 2001:db8:a41:2::1 |
| host_routes | |
| id | cf6ceea0-dde0-4018-ab9a-f8f68935622b |
| ip_version | 6 |
| name | external6 |
| network_id | 8d5dec25-a6aa-4e18-8706-a51637a428c2 |
| tenant_id | ed34337f935745bb911eeb741bc4374b |
+------------------+-----------------------------------------------------------------------------+
파트 3: 네트워크 사용 시작
이 시점에서 모든 구성이 끝났어요! 새 VM을 띄울 때 데이터센터 밖에서 연락 가능하게 만들지 결정해야 해요. 그렇다면 external 네트워크에 네트워크 인터페이스를 연결하고, 아니라면 internal 네트워크에 연결하세요. 물론 원래 도달 불가였던 머신도 external 네트워크에 새 인터페이스를 연결하면 도달 가능하게 만들 수 있어요.
현재는 주소 이동성(address mobility)을 지원하지 않아서, 주소는 해당 포트가 더 이상 사용되지 않을 때까지 하나의 포트에 묶여 있어요. 이 부분은 앞으로 개선할 계획이에요.
OpenStack 배포 구성의 다음 단계는 보안 구성이에요. 관련 문서를 곧 제공할 예정이에요.
더 알아보기 (Learn more)
Calico OpenStack 배포에서는 라우터·플로팅 IP 같은 표준 OpenStack 개념 대신 게이트웨이 라우터와 BGP 피어링으로 외부 연결성을 만들어요. 프라이빗/퍼블릭 IPv4와 IPv6 주소 범위를 미리 계획해 두면 Neutron 네트워크 구성이 훨씬 수월해요. 외부 트래픽이 반드시 게이트웨이로 라우팅되는지 확인하는 것이 성공의 열쇠예요.