상세 시맨틱
상세 시맨틱 (Detailed semantics)
Calico 네트워크는 연결성이 calico 플러그인으로 구현되는 Neutron 네트워크예요. 이 페이지는 같은 네트워크에 붙은 인스턴스 간, 서로 다른 Calico 네트워크에 붙은 인스턴스 간, 그리고 인스턴스와 인터넷 사이에 Calico가 제공하는 연결성을 설명해요. 또한 이 연결성이 전통적인 Neutron API 시맨틱과 어떤 부분에서, 왜 다른지도 알려줘요.
출처: 문서
본문
Calico 네트워크는 그 연결성이 해당 네트워크에 인스턴스가 붙어 있는 모든 컴퓨트 호스트에서 calico 플러그인으로 구현되는 Neutron 네트워크(provider 또는 tenant)예요. Calico 네트워크는 하나만 있을 수도 있고, 원하는 만큼 많이 있을 수도 있어요. 이 페이지는 같은 네트워크에 붙은 인스턴스 간, 서로 다른 Calico 네트워크에 붙은 인스턴스 간, 그리고 인스턴스와 인터넷 사이에 Calico가 제공하는 연결성을 설명하고, 이 연결성이 전통적인 Neutron API 시맨틱과 몇몇 세부 사항에서 어떻게 그리고 왜 다른지 설명해요.
같은 네트워크에 있는 인스턴스 간 연결성
Calico는 같은 Calico 네트워크에 붙은 인스턴스 간에 IP 연결성은 제공하지만 레이어 2(L2) 인접성(adjacency)은 제공하지 않아요. 이 말은 곧:
-
한 인스턴스가 다른 인스턴스의 IP로 ping을 보내거나, 다른 인스턴스에 다른 IP 기반 연결을 만들 수 있어요. (보안 그룹 설정으로 제한되지 않는 한요.)
-
한 인스턴스가 다른 인스턴스로 가는 IP 경로를 조사하면 경로에 중간 IP 홉(hop)이 존재한다는 것, 즉 인스턴스가 직접 연결되어 있지 않다는 것을 알게 돼요.
-
OSPF 같은 라우팅 프로토콜처럼 실제로 L2 인접성이 필요한 애플리케이션이나 프로토콜은 Calico 네트워크의 인스턴스에서 제대로 동작하지 않아요. 하지만 IP 기반인 대다수 애플리케이션은 문제없이 잘 동작해요.
전통적으로 Neutron 네트워크는 항상 인스턴스 간 L2 인접성을 제공해 왔기 때문에, 이것이 Calico가 전통적인 Neutron 시맨틱과 다른 첫 번째 지점이에요. Mitaka 릴리스까지는 L2 인접성이 Neutron 네트워크의 당연한 속성으로 여겨졌어요. 그래서 Calico를 사용하는 배포 환경은 이 세부 사항에서 Calico 네트워크가 다르다는 것을 그저 이해해야만 했어요.
Newton 릴리스부터는 Calico의 IP 전용 연결성이 Neutron API에서 l2_adjacency 속성이 False인 Network로 표현될 수 있게 됐어요. 하지만 Calico 네트워크가 l2_adjacency False를 보고하도록 만드는 작업은 아직 필요하고, 현재 시점에서는 안타깝게도 API로 조회하면 l2_adjacency True를 반환하더라도 Calico 네트워크가 L2 인접성을 제공하지 않는다는 것을 여전히 이해해야 해요.
SECONDARY: IP 라우팅에 기반한 Calico의 연결성 설계는 유니캐스트 IP와 애니캐스트 IP를 허용해요. 애니캐스트 IP는 라우팅이 하나의 CIDR에 대해 여러 경로를 처리하도록(BIRD의
add_paths) 설정하고, ECMP 라우트를 로컬 커널에 프로그래밍하도록(BIRD의merge_paths) 설정하면 Neutron 플로팅 IP나 allowed-address-pairs로 구현할 수 있어요. 멀티캐스트 IP는 지원되지 않아요. 브로드캐스트 IP는 L2 인접성에 의존하기 때문에 불가능해요.
서로 다른 Calico 네트워크 간의 연결성
Calico는 서로 다른 Calico 네트워크의 인스턴스 간에도 같은 Calico 네트워크 내 인스턴스 간과 정확히 동일한 연결성을 제공해요.
이것이 'provider' 네트워크와 'tenant' 네트워크(즉, 클라우드 운영자가 프로비저닝한 네트워크, 또는 특정 테넌트/프로젝트가 프로비저닝한 네트워크) 모두에 동일하게 적용되고, 그런 네트워크들의 어떤 조합 간 연결성에도 동일하게 적용된다는 점이 중요해요. Calico로는 연결성 수준에서 기본적으로 격리된 테넌트 네트워크를 만들 수 없어요. Calico 테넌트 네트워크가 Neutron 라우터에 연결되어 있지 않더라도, 배포 환경에 Neutron 라우터가 전혀 없더라도 마찬가지예요. 라우터에 연결되지 않은 테넌트 네트워크는 표준 Neutron API 시맨틱에서 연결성 수준 격리를 제공하거든요.
Calico가 이렇게 동작하는 이유는, 인스턴스가 provider 네트워크에 직접 붙거나 (Neutron 데이터 모델 용어로) 라우터를 통해 provider 네트워크에 연결된 tenant 네트워크에 붙는 사용 사례를 겨냥하기 때문이에요. 후자의 한 가지 이유는 Calico에서 플로팅 IP를 사용하기 위해서인데, 현재 Neutron에서 플로팅 IP의 대상은 tenant 네트워크에 붙은 인스턴스여야 하거든요. 자세한 내용은 Floating IPs를 참고하세요.
플랫(flat) IP 주소 체계
네트워크 간의 그런 연결성이 함축하는 것은, Calico가 다루는 IP 주소가 모두 하나의 플랫한 주소 공간에 있다고 가정한다는 점이에요. 예를 들어 한 네트워크가 CIDR 10.65.0.0/24 서브넷을 갖고 다른 네트워크가 CIDR 172.18.0.0/16 서브넷을 갖는다면, IP 10.65.0.2를 가진 인스턴스는 다른 네트워크에서 IP 172.18.3.23을 가진 인스턴스를 직접 지정할 수 있고, IP 패킷은 출발지 IP 10.65.0.2와 목적지 IP 172.18.3.23을 유지한 채 양쪽 사이를 끝까지 이동해요. 이 데이터 경로 어디에도 NAT은 없어요.
Neutron 시맨틱 대비 평가
Calico는 두 가지 Neutron 데이터 모델 패턴에 해당하는 사용 사례를 겨냥해요.
첫째, 인스턴스가 provider 네트워크에 직접 붙는 경우:

둘째, 인스턴스가 외부와 연결된 tenant 네트워크에 붙는 경우:

일반적인 경우에는 이 패턴들이 조합될 수 있어요. 즉, 각 tenant 네트워크가 어떤 라우터를 통해 provider 네트워크에 연결되어 있기만 하면, 임의의 수의 Calico provider 네트워크와 임의의 수의 Calico tenant 네트워크가 존재할 수 있어요. tenant 네트워크를 사용하는(항상 provider 네트워크를 쓰는 대신) 목적은 오직 플로팅 IP를 가능하게 하기 위해서예요. 두 종류 중 어느 쪽이든 네트워크를 여러 개 프로비저닝하는(하나만 쓰는 대신) 목적은 보통 사용자가 인스턴스가 받을 고정 IP의 종류를 제어할 수 있게 하기 위해서예요.
Calico 네트워크가 몇 개든, 그 모든 IP 주소(관련된 Neutron 서브넷 또는 서브넷 풀 객체)는 하나의 플랫한 주소 공간에 속하는 것으로 정의되거나 이해되어야 해요.
마지막으로, 같은 네트워크에 붙은 인스턴스를 포함해 어떤 인스턴스 간에도 L2 인접성이 없다는 것을 이해해야 해요. 미래의 OpenStack 릴리스에서는 Calico 네트워크가 l2_adjacency False를 보고하도록 만들어 이를 명시적으로 드러내고자 해요.
이러한 제한과 이해를 전제로, Calico는 Neutron 시맨틱을 완전히 구현한다고 우리는 믿어요. 즉, 주어진 Neutron API 설정 호출 순서에 대해 운영자가 기대하는 연결성을 제공한다는 뜻이에요.
더 알아보기 (Learn more)
Calico의 OpenStack 연결성은 L2 인접성 없이 IP 라우팅 기반으로 동작한다는 점이 핵심이에요. OSPF 같은 L2 의존 프로토콜은 쓸 수 없지만 IP 기반 애플리케이션은 대부분 문제없어요. 네트워크 설계 전에 플랫 주소 공간 가정을 꼭 확인하세요.