openstack-helm 으로 구축한 환경의 네트워크 구조

개요

해당 문서는 openstack-on-kubernetes-terraform 을 사용하여 처음 OpenStack 을 설치한 사용자가 전체 네트워크 구조의 뼈대를 잡을 수 있도록 돕기 위한 목적으로 작성되었습니다.

openstack-on-kubernetes-terraform 에 작성된 단계에 따라 OpenStack 서비스를 Kubernetes 로 배포한 환경을 전제하고 있으며, make init → make up → make ready → make osh-deploy → make osh-vm 을 완료한 시점을 기준으로 네트워크 구조와 주요 구성 요소의 역할을 설명합니다.

설치 절차보다는 각 네트워크가 어디에 존재하고, 무엇과 연결되며, 어떤 구성 요소가 이를 관리하는지에 집중하여 작성되었습니다. CNI 와 Neutron 이 한 노드에서 공존하는 구조는 CNI 와 Neutron 의 공존 에서 개념으로 다룹니다.

또한 openstack-helm 을 통해 구축된 인프라의 전체 네트워크를 총 다섯 개의 하위 네트워크로 나누어서 구분하였습니다.

배포 결과로 생성된 네트워크 인프라
│
├── AWS Network
├── EC2 Host Network
├── Kubernetes Network
├── OpenStack Service Network
└── Neutron Tenant VM Network

전체 네트워크

전체 네트워크의 구조를 간략하게 나타내면 다음과 같습니다.

AWS VPC
└── EC2 Host
    ├── Kubernetes Network
    │   └── OpenStack Service Pods
    │       ├── Nova
    │       ├── Keystone
    │       └── ...
    │
    └── Open vSwitch Data Plane
        └── Neutron Tenant Network
            └── test-vm

하나의 EC2 Host 안에는 OpenStack 서비스를 실행하는 Kubernetes Network 와 Tenant VM 의 패킷을 전달하는 Open vSwitch Data Plane 이 함께 구성됩니다.

OpenStack API 를 호출하는 요청 은 Kubernetes Service 를 통해 Nova, Keystone 등의 OpenStack Service Pod 로 전달됩니다. OpenStack 서비스 사이의 API 요청과 내부 메시지도 Kubernetes Network 를 통해 전달됩니다.

반면 Tenant VM 으로 향하거나 Tenant VM 에서 나오는 패킷은 OpenStack API Pod 를 통과하지 않습니다. Neutron 이 정의한 Network 와 Port 상태가 Open vSwitch 에 반영되면, test-vm 이 송수신하는 패킷은 Open vSwitch Data Plane 을 통해 Neutron Tenant Network 내부로 전달됩니다.

AWS Network

OpenStack 과 Kubernetes 가 실행되는 EC2 는 10.0.0.0/16 VPC 의 10.0.1.0/24 Public Subnet 에 배치됩니다. EC2 의 Primary ENI 에는 해당 Subnet 의 Private IPv4 가 할당됩니다.

AWS Cloud 는 사용자가 구성하는 VPC 영역과 AWS 가 운영하는 관리형 서비스 영역으로 구분할 수 있습니다.

AWS Cloud
├── 사용자 VPC (10.0.0.0/16)
│   ├── Internet Gateway
│   └── Public Subnet (10.0.1.0/24)
│       └── EC2 Primary ENI
│           └── Private IPv4: 10.0.1.x
│
└── AWS 관리형 서비스
    └── AWS Systems Manager

Public Subnet 의 Route Table 에는 0.0.0.0/0 → Internet Gateway 경로가 설정됩니다. EC2 는 이 경로를 통해 패키지와 컨테이너 이미지를 내려받습니다.

본 배포에서 EC2 의 Security Group 은 아웃바운드 통신만 허용 하고 있으며 인바운드 통신은 허용하고 있지 않습니다. 따라서 사용자는 EC2 의 Public IPv4 나 SSH 를 통해 직접 접속하지 않습니다.

EC2 내부의 SSM Agent 가 AWS Systems Manager 에 아웃바운드 관리 채널을 생성하며, make ssm 과 OpenStack 배포 명령도 이 채널을 통해 전달됩니다.

구성 요소

역할

VPC

EC2 가 배치되는 10.0.0.0/16 AWS 가상 네트워크

Public Subnet

EC2 의 Primary ENI 가 배치되는 10.0.1.0/24 주소 대역

Internet Gateway

Public Subnet 과 외부 네트워크 사이의 통신 경로

Primary ENI

AWS Network 와 EC2 Host Network 간 연결

Security Group

인바운드 차단 및 모든 아웃바운드 통신 허용

AWS Systems Manager

SSH 없는 EC2 명령 전달 및 관리 세션 생성

EC2 Host Network

EC2 Host Network 는 AWS Network, Kubernetes Network 및 Neutron Tenant VM Network 가 함께 존재하는 호스트 내부 네트워크입니다.

본 프로젝트에서는 하나의 EC2 가 Kubernetes Node 이자 OpenStack Compute Host 역할을 수행합니다.

EC2 Instance
├── Linux Network Stack
│   ├── Primary Network Interface
│   │   └── Private IPv4: 10.0.1.x
│   ├── br_netfilter
│   └── IPv4 Forwarding
│
└── Open vSwitch Data Plane
    ├── br-int
    │   └── VM Port와 Tenant Network 연결
    ├── br-tun
    │   └── VXLAN 처리
    └── br-ex
        └── provider1
            └── Linux Dummy Interface

Primary Network Interface 는 AWS 의 Primary ENI 에 대응하며, EC2 운영체제와 AWS VPC 를 연결합니다.

Open vSwitch 는 여러 VM 이 같은 Tenant Network 에서 통신할 수 있도록 EC2 Host 안에 가상 스위치 구조를 만듭니다. Neutron OVS Agent 는 Neutron 에 정의된 Network 와 Port 정보를 바탕으로 Open vSwitch 의 Bridge 와 연결 상태를 구성합니다.

br-int 는 여러 VM 의 Virtual NIC 가 연결되는 중심 Bridge 입니다. 같은 Tenant Network 에 속한 VM 과 DHCP Port 사이의 패킷을 전달합니다.

br-tun 은 서로 다른 Compute Host 사이에서 Tenant Network 의 패킷을 VXLAN 으로 전달할 때 사용됩니다. 현재는 단일 Compute Host 환경이므로 실제 Host 간 VXLAN Tunnel 트래픽은 발생하지 않습니다.

br-ex 는 VM 이 Provider Network 나 외부 네트워크로 접근할 때 사용하는 Bridge 입니다. 본 배포에서는 실제 외부 NIC 대신 provider1 Dummy Interface 가 연결되므로 AWS VPC 나 인터넷으로 이어지는 외부 경로는 구성되지 않습니다.

구성 요소

역할

Primary Network Interface

AWS VPC 와 EC2 Host Network 간 연결

Linux Network Stack

Host 의 Routing 및 패킷 전달 처리

Neutron OVS Agent

Neutron Network 상태의 OVS Bridge·Port·Flow 구현

br-int

VM Port 와 Neutron Tenant Network 간 연결

br-tun

VXLAN Segment 및 다중 Compute Host 간 Tunnel 처리

br-ex

Neutron Provider Network 의 Host 측 연결 지점

provider1

실제 외부 NIC 를 대신해 br-ex 에 연결된 Dummy Interface

br_netfilter 와 net.ipv4.ip_forward = 1 은 별도의 Network Interface 가 아니라 Linux Kernel 의 패킷 처리 설정입니다.

br_netfilter
└── Bridge를 통과하는 패킷에 Netfilter 규칙 적용

net.ipv4.ip_forward = 1
└── 서로 다른 Interface와 Network Namespace 사이의 패킷 전달 허용

Kubernetes Network

Kubernetes Network 는 Node Communication, Pod Network, Service Network 라는 서로 다른 역할의 영역으로 나누어 이해할 수 있습니다.

Node Communication 은 Kubernetes Node 자체의 통신을 담당하고, Pod Network 는 일반 Pod 에 독립된 IP 와 통신 환경을 제공합니다. Service Network 는 여러 Pod 를 하나의 고정된 가상 주소로 연결합니다.

본 프로젝트에서는 하나의 EC2 가 단일 Kubernetes Node 로 사용되므로 Node 간 통신은 발생하지 않습니다.

Kubernetes Node
(= EC2 Instance)
│
└── Kubernetes Network
    ├── Node Communication
    │   └── Node InternalIP: 10.0.1.x
    │
    ├── Pod Network
    │   ├── Pod CIDR: 192.168.0.0/16
    │   └── Pod Network Namespace
    │       └── eth0: 192.168.x.x
    │
    └── Service Network
        ├── Service CIDR: 10.96.0.0/12
        │   └── kubeadm 기본값
        └── ClusterIP
            └── Endpoint Pod IP로 전달

Node Communication 에서는 EC2 의 Primary Private IPv4 인 10.0.1.x 가 Node InternalIP 로 사용됩니다. Kubernetes 전체를 대표하는 별도의 Network Interface 가 생성되는 것은 아닙니다.

Pod Network 에서는 일반 Pod 에 독립된 Network Namespace 와 eth0 이 구성되고, 192.168.0.0/16 범위에서 개별 IP 가 할당됩니다. 본 프로젝트에서는 Calico CNI 가 Pod Network 를 구성합니다.

Service Network 는 Pod IP 가 변경되더라도 동일한 주소로 접근할 수 있도록 ClusterIP 를 제공합니다. 본 프로젝트는 Service CIDR 을 별도로 지정하지 않으므로 kubeadm 기본값인 10.96.0.0/12 를 사용합니다.

kube-proxy 는 ClusterIP 로 들어온 요청을 실제 Endpoint Pod IP 와 Port 로 전달하는 규칙을 구성합니다.

구성 요소

역할

Node InternalIP

Kubernetes 의 Node 식별 주소

Primary Network Interface

Node InternalIP 의 기반이 되는 Private IPv4 보유 EC2 Host Interface

Pod CIDR

일반 Pod IP 할당을 위한 192.168.0.0/16 주소 범위

Calico CNI

일반 Pod 의 Network Namespace·Interface·IP·통신 경로 구성

Pod eth0

일반 Pod 의 기본 패킷 송수신 Network Interface

Service CIDR

ClusterIP 할당을 위한 10.96.0.0/12 주소 범위(kubeadm 기본값)

ClusterIP

여러 Endpoint Pod 를 대표하는 고정 가상 주소

kube-proxy

ClusterIP 요청의 Endpoint Pod 전달 규칙 구성

참고

ClusterIP 는 특정 Network Interface 에 직접 할당되는 실제 IP 가 아닙니다. kube-proxy 가 전달 규칙을 구성하고, 실제 패킷 변환과 전달은 Linux Kernel 이 수행합니다.

OpenStack Service Network

OpenStack Service Network 는 OpenStack API Service 와 Kubernetes Pod 위에 배포된 openstack Service 가 통신하는 네트워크 영역입니다.

Kubernetes Network
└── Namespace: openstack
    ├── osc Pod
    │
    ├── Keystone Service
    │   └── Keystone API Pod
    │
    ├── Glance Service
    │   └── Glance API Pod
    │
    ├── Nova Service
    │   └── Nova API Pod
    │
    ├── Neutron Service
    │   └── Neutron Server Pod
    │
    └── ...

openstack Namespace 는 OpenStack 관련 Kubernetes Resource 를 구분하고 관리하는 논리적 범위입니다.

각 OpenStack API 는 Kubernetes Service 를 통해 노출됩니다. Service 는 고정된 DNS 이름과 ClusterIP 를 제공하며, 해당 Service 로 전달된 요청을 연결된 API Pod 로 전달합니다.

osc Pod 는 Keystone, Glance, Nova 및 Neutron Service 에 API 요청을 보냅니다.

osc Pod
└── OpenStack Service
    └── OpenStack API Pod

이 과정에서 Service 의 ClusterIP 로 전달된 요청은 Node 의 Linux Network Stack 에서 kube-proxy 가 구성한 전달 규칙에 따라 해당 Service 의 Endpoint Pod IP 로 변환됩니다.

변환된 패킷은 Kubernetes Pod Network 를 통해 대상 Pod 로 전달됩니다.

구성 요소

역할

openstack Namespace

OpenStack 관련 Kubernetes Resource 의 논리적 관리 범위

osc Pod

OpenStack API 요청을 보내는 Client Pod

OpenStack Service

OpenStack API 접근을 위한 DNS 이름과 ClusterIP 제공

OpenStack API Pod

Service 를 통해 전달된 OpenStack API 요청 처리

Neutron Tenant VM Network

Neutron Tenant VM Network 는 OpenStack VM 에 독립된 IP 와 Layer 2 통신 환경을 제공하는 Data Plane 네트워크입니다.

Tenant Network 는 OpenStack 사용자가 VM 을 연결하기 위해 생성하는 논리적인 가상 네트워크입니다. 같은 Tenant Network 에 연결된 VM 은 동일한 Layer 2 네트워크에 속하며, 다른 Network 와 분리된 환경에서 통신합니다.

Neutron Server 는 Network, Subnet 및 Port 정보를 관리하고, Neutron Agent 는 해당 정보를 EC2 Host 의 네트워크 구조에 반영합니다.

본 환경의 demo-net, demo-subnet 및 test-vm 은 VM 생성과 Tenant Network 의 동작을 확인하기 위한 테스트용 Resource 입니다.

이 절에서는 해당 구성을 기준으로 Tenant Network 의 구조와 VM 패킷 전달 경로를 설명합니다.

Neutron Tenant VM Network
├── demo-net
│   └── demo-subnet
│       ├── CIDR: 10.10.10.0/24
│       ├── DHCP: Enabled
│       └── Neutron Port
│           ├── Fixed IP: 10.10.10.x
│           └── test-vm Virtual NIC
│
└── VM Data Path

demo-net 은 test-vm 이 연결되는 테스트용 Tenant Network 입니다.

Neutron Agent 가 Network 와 Port 정보를 EC2 Host 에 반영하면, VM 패킷을 전달하기 위한 Open vSwitch Data Plane 이 구성됩니다.

test-vm 은 Neutron Port 를 통해 demo-net 에 연결됩니다. Neutron Port 에는 VM 에 할당된 Fixed IP 와 MAC Address 가 저장되며, VM 과 Tenant Network 의 연결을 나타냅니다.

VM 의 Virtual NIC 는 EC2 Host 에 생성된 TAP Interface 와 연결됩니다. TAP Interface 로 전달된 패킷은 qbr 와 qvb·qvo 를 거쳐 Open vSwitch 의 br-int 로 전달됩니다.

test-vm Virtual NIC
└── TAP Interface
    └── qbr
        └── qvb / qvo
            └── br-int
                └── demo-net의 다른 Port

이 경로는 VM 패킷에 Host Network 규칙을 적용한 뒤, 같은 Tenant Network 에 연결된 다른 Port 로 전달하기 위해 사용됩니다.

구성 요소

역할

demo-net

VM 생성과 Tenant Network 동작 확인을 위한 테스트용 Network

demo-subnet

10.10.10.0/24 주소 범위와 DHCP 설정을 제공하는 테스트용 Subnet

Neutron Port

VM 의 Fixed IP·MAC Address·Network 연결 정의

TAP Interface

VM Virtual NIC 와 EC2 Host Network Data Plane 간 연결

qbr·qvb·qvo

Host Network 규칙 적용 및 TAP Interface 와 br-int 사이의 연결 경로

br-int

같은 Tenant Network 에 연결된 Port 사이의 Layer 2 패킷 전달

br-tun

VXLAN Segment 와 다중 Compute Host 간 Tunnel 처리

DHCP Namespace

demo-subnet 에 연결된 VM 을 대상으로 DHCP 응답 제공

demo-net 이 VXLAN Network 로 구성된 경우, br-tun 은 서로 다른 Compute Host 사이의 VXLAN Tunnel 처리에 사용됩니다.

현재는 단일 Compute Host 환경이므로 다른 Compute Host 로 전달되는 VXLAN Tunnel 트래픽은 발생하지 않습니다.

br-ex 와 provider1 은 Provider Network 를 위한 Host 측 구성입니다. 현재 환경에는 External Network, Neutron Router 및 Floating IP 가 없으므로 demo-net 과 br-ex 사이의 패킷 전달 경로는 구성되지 않습니다.

참고

현재 test-vm 은 demo-net 내부 통신과 DHCP 를 사용할 수 있지만, Neutron Router 를 통한 외부 연결이 없으므로 AWS VPC 나 인터넷에는 접근할 수 없습니다.