멀티 리전
멀티 리전 (Multiple regions)
OpenStack을 멀티 리전 배포로 운영할 때, Calico를 사용하면 리전이 다른 VM 사이의 보안 정책을 정의하기가 쉬워져요. 모든 리전이 하나의 etcd 데이터스토어를 공유하고 리전별 네임스페이스로 데이터를 나누는 구조예요. 리전 간 정책 구성 예시까지 함께 다뤄요.
출처: 문서
본문
아키텍처
동작 방식은 이래요. 모든 리전이 같은 Calico etcd 데이터스토어를 공유하지만, 각 리전은 서로 다른 Calico 네임스페이스를 사용해요. 예를 들어 "xyz-east" 리전의 Neutron 서버가 OpenStack VM과 보안 그룹에서 Calico WorkloadEndpoint와 NetworkPolicy 데이터를 자동으로 생성할 때, 그 데이터를 "openstack-region-xyz-east" 네임스페이스의 Calico 데이터스토어에 기록해요.
모든 정보가 같은 Calico 데이터스토어에 있기 때문에, 리전이 다른 VM 사이의 통신에 대한 Calico 정책을 정의할 수 있어요.
SECONDARY: 현재로서는 OpenStack API만으로 리전 간 정책을 정의하는 간단한 방법이 없어요. 보안 그룹이 원격 피어 집합(즉, 어떤 트래픽을 보내도 되거나 못 보내게 되는 대상)을 지정할 때, IP 프리픽스나 'remote' 보안 그룹 ID(그 보안 그룹에 속한 VM을 가리킴) 중 하나로 표현할 수 있어요. 하지만 'remote' 보안 그룹 ID는 보안 그룹이 정의된 것과 같은 리전에 있어야 하고, 같은 리전 안의 VM만 식별할 수 있어요.
설치
Calico를 사용하는 멀티 리전 OpenStack 배포를 설치하려면 리전별로 진행하면서 OpenStack 리전에 Calico를 추가하는 일반 절차를 따르되, 다음 사항만 다르게 하세요.
-
etcd 데이터베이스를 하나만 설치하고(리전마다 하나씩 설치하는 대신), 모든 리전이 그것을 Calico 데이터스토어로 사용하도록 구성해요.
-
각 컴퓨트 호스트의
/etc/calico/felix.cfg에 다음을 추가해요.[global] OpenStackRegion = <region><region>은 컴퓨트 호스트가 속한 리전의 이름이에요. -
각 컨트롤러 노드와 컴퓨트 노드의
/etc/neutron/neutron.conf에 다음을 추가해요.[calico] openstack_region = <region><region>은 노드가 속한 리전의 이름이에요.
SECONDARY:
OpenStackRegion과openstack_region에 지정하는 값은 영숫자 소문자 또는 '-'로 이루어진, 영숫자 문자로 시작하고 끝나는 문자열이어야 해요.
WARNING: 여기서 Felix 값과 Neutron 값이 일치하지 않으면, 그 리전의 Neutron 서버가 동작하는 컴퓨트 노드가 없다고 판단하기 때문에 OpenStack이 해당 리전에서 VM을 하나도 띄우지 못해요.
OpenStack 구성하기
이제 OpenStack 리전에 네트워크를 평소처럼 만들면 돼요. 예를 들면 다음과 같아요.
neutron net-create --shared calico
neutron subnet-create --gateway 10.65.0.1 --enable-dhcp --ip-version 4 --name calico-v4 calico 10.65.0.0/24
SECONDARY: Calico 네트워킹은 플랫(flat) L3 네트워크를 제공하기 때문에, 모든 리전에 걸친 서브넷은 겹치면 안 돼요. 예를 들어 한 리전에 10.1.0.0/16, 다른 리전에 10.2.0.0/16을 두는 것은 괜찮지만, 10.1.0.0/16과 10.1.200.0/24를 함께 두면 안 돼요.
리전 간 정책 구성하기
다음 상황을 가정해 볼까요?
-
리전이 두 개 있어요
-
한 리전에 보안 그룹 a7734e61-b545-452d-a3cd-0189cbd9747a에 속한 VM 집합이 있어요
-
다른 리전에 보안 그룹 85cc3048-abc3-43cc-89b3-377341426ac5에 속한 VM 집합이 있어요
-
두 번째 VM 집합이 첫 번째 집합의 80번 포트에 연결하도록 허용하고 싶어요
클러스터에 calicoctl을 설치하고 구성해야 해요. 그 다음 calicoctl로 다음 Calico 정책을 구성하면 원하는 연결성을 만들 수 있어요.
calicoctl apply -f - <<EOF
apiVersion: projectcalico.org/v3
kind: GlobalNetworkPolicy
metadata:
name: allow-tcp-80
spec:
selector: "has(sg.projectcalico.org/openstack-a7734e61-b545-452d-a3cd-0189cbd9747a)"
types:
- Ingress
ingress:
- action: Allow
protocol: TCP
source:
selector: "has(sg.projectcalico.org/openstack-85cc3048-abc3-43cc-89b3-377341426ac5)"
destination:
ports:
- 80
EOF
말로 풀면 이래요. a7734e61... 보안 그룹 레이블을 가진 VM의 80번 포트로 가는 연결을, 85cc3048... 보안 그룹 레이블을 가진 VM(어느 리전에 있든)에서 오는 경우에 허용한다는 뜻이에요.
selector 필드에는 Calico가 OpenStack VM 엔드포인트에 붙이는 레이블을 자유롭게 사용해, 정책이 적용될 VM 집합과 허용(또는 거부)할 클라이언트 집합을 식별할 수 있어요. 시작에 도움이 되는 셀렉터 예시를 더 소개할게요.
-
"one"이라는 이름의 리전에 있는 모든 VM을 선택하기:
projectcalico.org/namespace == 'openstack-region-one'. -
어느 리전에 있든 "production"이라는 이름의 보안 그룹에 속한 모든 VM을 선택하기:
has(sg-name.projectcalico.org/openstack-production).
source 또는 destination 아래의 selector 필드 대신 nets나 notNets를 사용해 클라이언트를 IP 주소로 식별할 수도 있어요.
더 알아보기 (Learn more)
핵심은 단일 etcd + 리전별 네임스페이스 조합이에요. 덕분에 Calico 정책 셀렉터로 리전 경계를 넘는 통신을 직접 제어할 수 있어요. 리전 이름은 영숫자 소문자와 '-'만 쓸 수 있고 Felix와 Neutron 설정이 정확히 일치해야 한다는 점만 조심하세요.