Kuryr-Kubernetes 환경에서 Pod와 서비스가 정상적으로 작동하려면, 쿠버네티스의 API 서버와 통신이 가능해야 하며, 이를 위해 **OpenStack의 Neutron 라우터가 Pod와 서비스 대역을 중계(L3 Connectivity)**해주어야 합니다.
신규 라우터를 생성할 수도 있지만, 이미 OpenStack Zed 수동 구축 과정에서 생성해 둔 router02를 활용하면 자원 효율성을 높일 수 있습니다. 이 라우터는 이미 외부 네트워크와 연결되어 있어 Pod와 Service의 외부 통신(SNAT)을 위한 게이트웨이 역할을 수행할 준비가 되어 있습니다.
Pod 서브넷(10.1.0.0/16)과 Service 서브넷(10.2.0.0/16)을 router02에 인터페이스로 연결하여 L3 계층의 통신 경로를 확보합니다.
Kuryr가 Pod와 Service 네트워크를 제어할 수 있도록, OpenStack 내부에 전용 네트워크와 서브넷을 구축하고 기존 라우터와 통합하는 과정입니다.
가장 먼저 격리된 네트워크를 생성합니다. Pod 대역과 서비스 대역을 분리하여 관리합니다.
# Pod 네트워크 생성
openstack network create pod
# Services 네트워크 생성
openstack network create services
각 네트워크의 IP 대역을 할당합니다. DHCP는 Kuryr가 담당하므로 --no-dhcp 옵션을 사용합니다.
# Pod 서브넷 생성 (10.1.0.0/16)
openstack subnet create --network pod --no-dhcp \
--gateway 10.1.255.254 \
--subnet-range 10.1.0.0/16 \
pod_subnet
# Services 서브넷 생성 (10.2.0.0/16)
openstack subnet create --network services --no-dhcp \
--gateway 10.2.255.254 \
--ip-version 4 \
--allocation-pool start=10.2.128.1,end=10.2.255.253 \
--subnet-range 10.2.0.0/16 \
service_subnet
생성한 서브넷들을 기존 router02에 연결하여 Pod와 외부, Pod와 서비스 간의 통신 경로를 확보합니다.
# 1. 게이트웨이 포트 생성
openstack port create --network pod --fixed-ip ip-address=10.1.255.254 pod_subnet_router
openstack port create --network services --fixed-ip ip-address=10.2.255.254 service_subnet_router
# 2. 라우터 연결 (생성된 포트의 ID를 입력하세요)
openstack router add port router02 <pod_subnet_router_ID>
openstack router add port router02 <service_subnet_router_ID>
Kuryr 환경에서 Pod는 독립적인 Neutron 포트를 할당받습니다. 따라서 Pod가 외부나 다른 대역으로 무분별하게 접근하지 않도록, **'서비스 대역으로만 통신을 허용'**하는 보안 그룹을 생성하고 적용해야 합니다.
service_pod_access_sg를 생성하여 Pod가 서비스 대역(10.2.0.0/16)의 트래픽 및 Pod 대역, 워커, 마스터 노드의 트래픽을 허용하도록 합니다.
# 1. 보안 그룹 생성
openstack security group create service_pod_access_sg
# 2. 서비스 서브넷 대역(10.2.0.0/16)에 대한 TCP 통신 허용 규칙 추가
openstack security group rule create \
--remote-ip 10.2.0.0/16 \
--ethertype IPv4 \
--protocol tcp \
[service_pod_access_sg의 id]
# 1. 워커, 마스터 노드 서브넷 전체 허용 (워커 노드 간 통신 및 CNI 트래픽 보장)
openstack security group rule create \
--remote-ip 192.168.100.0/24 \
--ethertype IPv4 \
--protocol tcp \
[service_pod_access_sg의 id]
# 2. Pod 서브넷 전체 허용 (Pod 간 통신 보장)
openstack security group rule create \
--remote-ip 10.1.0.0/16 \
--ethertype IPv4 \
--protocol tcp \
[service_pod_access_sg의 id]
# 1. 워커 노드 서브넷 UDP 53 포트 허용 (워커 노드 간 통신 및 CNI 트래픽 보장)
openstack security group rule create \
--ingress --ethertype IPv4 --protocol udp \
--dst-port 53:53 \
--remote-ip 192.168.100.0/24 \
[service_pod_access_sg의 id]
쿠버네티스 클러스터에서 Pod가 정상적으로 네트워크에 참여하려면 다음 조건이 충족되어야 합니다:

지금 우리가 수행하는 로드밸런서 구축 작업은 쿠버네티스 클러스터의 '뇌'인 API 서버와 '손과 발'인 Pod들을 연결하는 대동맥을 개통하는 과정과 같습니다. 이 작업이 중요한 이유는 다음과 같습니다.
Pod들이 API 서버와 안정적으로 통신할 수 있도록, OpenStack Octavia를 사용하여 로드밸런서를 생성하고 연결하는 과정입니다.
쿠버네티스 서비스 대역의 첫 번째 IP(10.2.0.1)를 VIP로 지정하여 로드밸런서를 생성합니다.
openstack loadbalancer create --vip-address 10.2.0.1 \ ##svc ip 대역의 첫번째 ip
--vip-subnet-id service_subnet \
--name default/kubernetes

API 서버들로 트래픽을 분산할 풀을 생성합니다. 알고리즘은 부하가 적은 곳으로 연결하는 LEAST_CONNECTIONS를 사용합니다.
openstack loadbalancer pool create --name default/kubernetes:HTTPS:443 \
--protocol HTTPS --lb-algorithm LEAST_CONNECTIONS \
--loadbalancer <LOADBALANCER_ID>
실제 API 서버가 구동 중인 마스터 노드를 멤버로 등록합니다. (여러 대일 경우 반복 수행)
openstack loadbalancer member create \
--name k8s-master-0 \
--address <MASTER_IP> \
--protocol-port 6443 \
<POOL_ID>
외부 요청을 받아 위에서 만든 풀로 전달하는 리스너를 생성합니다. 443 포트로 들어오는 요청을 받아 API 서버의 6443으로 전달합니다.
openstack loadbalancer listener create \
--name default/kubernetes:HTTPS:443 \
--protocol HTTPS \
--default-pool <POOL_ID> \
--protocol-port 443 \
<LOADBALANCER_ID>
| OpenStack Zed 수동 구축 - 11. kuryr-kubernetes(5) (0) | 2026.04.27 |
|---|---|
| OpenStack Zed 수동 구축 - 11. kuryr-kubernetes(3) (0) | 2026.04.20 |
| OpenStack Zed 수동 구축 - 11. kuryr-kubernetes(2) (0) | 2026.04.19 |
| OpenStack Zed 수동 구축 - 11. kuryr-kubernetes(1) (0) | 2026.04.19 |
| OpenStack Zed 수동 구축 - 10. Load Balancer 서비스 (Octavia) 사용해보기 (0) | 2026.04.16 |