OpenStack Essentials - 2

SangYeon Min·2025년 1월 15일

STUDY-OPENSTACK

목록 보기
2/5
post-thumbnail

Horizon

  • Standard Openstack Installation은 non-encerypted HTTP Channel을 사용한다
  • 하지만 SSL Support를 Enable할 수도 있다

Main Functions

  1. 인스턴스 관리:

    • 가상 머신(VM) 생성, 삭제, 수정, 재부팅 등 다양한 작업 수행 가능
    • SSH 키 페어 관리 및 이미지 선택 기능 제공
  2. 네트워크 관리:

    • 가상 네트워크 생성 및 설정
    • 서브넷, 라우터, 플로팅 IP 관리 가능
  3. 스토리지 관리:

    • 블록 스토리지(볼륨) 생성, 삭제 및 연결 관리
    • 오브젝트 스토리지(Container) 관리
  4. 사용자 및 프로젝트 관리:

    • 사용자 계정 및 역할(Role) 설정
    • 프로젝트(테넌트) 생성 및 관리
  5. 모니터링 및 로그:

    • 리소스 사용량 모니터링
    • 시스템 이벤트 및 로그 조회

Horizon vs Horizon Dashboard

Horizon

  • OpenStack의 웹 기반 인터페이스 프레임워크를 지칭하는 이름
  • Django 프레임워크를 기반으로 개발되었으며, 확장성과 플러그인 개발을 지원
  • OpenStack 대시보드를 포함하여 다른 사용자 정의 대시보드를 만들거나 확장하는 데 사용될 수 있음
  • 만약 어떤 서비스가 Horizon과 통합되도록 개발되었다면, Connection을 위한 Hook를 생성할 것

Horizon Dashboard

  • Horizon 프레임워크를 기반으로 개발된 기본 OpenStack 대시보드
  • OpenStack의 리소스 관리(인스턴스, 네트워크, 스토리지 등)에 초점을 맞춘 기본 제공 인터페이스
  • 사용자가 OpenStack 환경과 상호작용할 수 있도록 Horizon 프레임워크를 통해 제공되는 구체적인 구현
  • Dashboard로 조작되는 모든 동작은 API Call을 통해 이루어진다
항목HorizonHorizon Dashboard
역할웹 프레임워크OpenStack 기본 대시보드
확장성사용자 정의 대시보드 제작 가능확장성은 제한적
포커스프레임워크 기능 자체OpenStack 관리 및 UI 제공

User, Project(Tenant) Creation

Project와 User는 Keystone을 통해 관리된다.

이는 Horizon의 Identity에서 확인할 수 있다.

이후 위와 같이 GUI를 통해 admin 프로젝트에 assign된 demo User를 생성한다.

이후 first-project라는 프로젝트를 생성한다.

현재 우리가 생성한 클라우드에는 default라는 도메인만이 존재하기 때문애 해당 입력 폼이 비활성화되어 있다.

Default Domain은 OpenStack 설치 시 기본적으로 제공되며, 새로운 Domain을 생성하여 커스터마이징이 가능하다.

이후 위와 같이 Project에 Memeber를 추가한다.

Quota 옵션으로 해당 클라우드의 Resource의 Capacity를 조정하고 할당할 수 있다.

이후 demo user로 다시 로그인 했을 때 해당 user가 여러 프로젝트에 속해있다면, 위와 같이 drop down 메뉴에서 프로젝트를 선택할 수 있다.


Services Walkthrough

Compute

Instances

  • 클라우드 환경에서 생성된 가상 머신(Virtual Machine)을 의미
  • Nova(Compute 서비스)를 통해 생성되며, 사용자는 다양한 설정(IP, 이미지, 플레이버 등)을 기반으로 인스턴스를 배포하고 관리할 수 있음

Images

  • 가상 머신(Instance)을 생성하기 위한 디스크 이미지 파일
  • 운영 체제(OS), 애플리케이션, 설정 정보 등이 포함된 템플릿 역할을 하며, Glance(Image 서비스)에 의해 관리

Key Pairs

  • 가상 머신(Instance)에 안전하게 접근하기 위해 사용되는 SSH 키의 쌍을 의미
  • Public Key와 Private Key로 구성되며, Nova(Compute 서비스)에 의해 관리

Server Groups

  • 인스턴스(Instance) 배치 전략을 관리하기 위한 논리적 그룹
  • 특정 규칙(정책)을 기반으로 인스턴스를 어떻게 물리적 호스트에 배치할지를 결정하여, 고가용성(HA) 또는 워크로드 최적화를 지원
  • Affinity: 같은 물리적 호스트에 인스턴스가 배치되도록 강제
  • Anti-affinity: 다른 물리적 호스트에 인스턴스가 분산되도록 강제

Compute - Admin

Hypervisors

  • 가상 머신(Instance)을 생성하고 실행하기 위한 가상화 소프트웨어
  • 물리적 하드웨어를 가상화하여 다수의 가상 머신을 실행할 수 있도록 함

Host Aggregates

  • 물리적 컴퓨트 노드(Compute Nodes)를 논리적으로 그룹화하여 리소스를 분리하고 관리하기 위한 메커니즘
  • 컴퓨트 노드를 특성(예: CPU 유형, 지역, 스토리지 유형)별로 그룹화하여 특정 워크로드에 적합한 노드에 인스턴스를 배치
  • Host Aggregates는 메타데이터(키-값 쌍)를 정의하여 노드의 속성을 설명하고 관리
  • Host Aggregates는 Availability Zones와 결합하여 물리적 리소스의 고가용성 설계를 지원

Flavors

  • 가상 머신(Instance)의 컴퓨팅 리소스(CPU, 메모리, 디스크 크기 등)를 정의한 템플릿
  • 사용자는 Instance를 생성할 때 원하는 크기와 구성을 선택하기 위해 Flavor를 사용

Volume

Volumes

  • 가상 머신(Instance)에 연결하여 사용할 수 있는 블록 스토리지(Block Storage)를 의미
  • 독립적으로 관리되는 스토리지 장치로, Cinder(Block Storage Service)에 의해 생성 및 관리
  • Volume은 Instance와 별도로 존재하며, 필요에 따라 다른 Instance에 재사용하거나 연결할 수 있음

Volume Snapshot

  • Volume의 특정 시점 상태를 캡처한 읽기 전용 복제본
  • Cinder에 의해 관리되며, 데이터 백업 및 복구, 복제본 생성에 사용

Groups

  • Cinder에서 여러 개의 Volume을 논리적으로 그룹화하여 관리하기 위한 기능
  • 여러 Volume을 묶어 공동의 작업(스냅샷, 복제 등)을 수행할 수 있도록 지원

Groups Snapshot

  • Volume Group의 특정 시점 데이터를 캡처한 복제본
  • 여러 Volume이 포함된 Group의 상태를 한 번에 캡처하여 데이터의 일관성을 유지하고, 백업 또는 복구를 지원

Volume - Admin

Volume Types

  • 블록 스토리지(Volume)에 대해 스토리지 계층(성능, 특성 등)을 정의하기 위한 분류 체계
  • 다양한 스토리지 백엔드(예: SSD, HDD, 고성능 스토리지)를 구분하여 사용자 요구에 맞는 Volume을 생성할 수 있도록 지원

Network

Network Topology

  • 클라우드 환경에서 가상 네트워크의 구조와 구성을 시각적으로 보여주는 기능
  • 네트워크, 라우터, 서브넷, 인스턴스 간의 연결 관계를 시각적으로 관리

Networks

  • 가상 머신(Instance) 및 기타 리소스 간의 통신을 지원하기 위해 제공되는 가상 네트워크
  • Neutron(Networking 서비스)에 의해 관리되며, 사용자 정의 네트워크를 생성, 연결, 관리
  • Private Network, Public Network, Floating IP 등을 통해 다양한 네트워크 아키텍처 구성 가능
  • DHCP, 라우팅, 보안 그룹, 로드 밸런싱 등의 네트워크 서비스 지원

다양한 네트워크 유형

  • Flat Network: 네트워크 격리가 없는 단순 네트워크.
  • VLAN (802.1Q): 태깅된 VLAN을 통한 네트워크 격리.
  • VXLAN: 가상 네트워크 ID를 사용한 격리.
  • GRE: 터널링을 통한 네트워크 격리.

Routers

  • 가상 네트워크 간 트래픽을 전달하고, 가상 네트워크(Private Network)를 외부 네트워크(Public Network)와 연결하는 네트워크 컴포넌트
  • 라우팅 및 NAT(Network Address Translation)를 지원

NAT

  • Private Network의 IP 주소를 Public Network의 Floating IP로 변환하여 외부와 통신 가능

DHCP 및 DNS 중계

  • 서브넷에 DHCP 또는 DNS 정보를 전달하여 네트워크 구성 자동화 지원

Security Groups

  • 인스턴스(Instance) 네트워크 트래픽을 제어하기 위한 방화벽 규칙의 모음
  • Ingress(수신)Egress(송신) 트래픽에 대한 규칙을 정의하여, 인스턴스가 허용된 트래픽만 송수신하도록 보안 계층을 제공
  • Security Group은 IP 주소, 포트, 프로토콜을 기반으로 인스턴스의 트래픽을 허용 또는 차단
  • Security Group 규칙 변경 시 즉시 적용되어 인스턴스를 재부팅할 필요 없음

Floating IP

  • 가상 머신(Instance) 또는 리소스에 동적으로 할당할 수 있는 공용 IP 주소
  • 주로 Private Network에 연결된 Instance가 Public Network를 통해 외부 네트워크(예: 인터넷)와 통신할 수 있도록 설정할 때 사용

Use Case

  1. 외부 네트워크 연결:
    • 웹 서버나 애플리케이션 서버와 같은 Instance가 인터넷에서 접근 가능하도록 설정.
  2. Instance 관리:
    • Floating IP를 사용해 SSH 또는 원격 접속 도구를 통해 Instance 관리.
  3. 멀티테넌트 환경:
    • 프로젝트별로 Floating IP를 할당하여 공용 네트워크 자원 분리.

ex.

  • Private IP: 192.168.1.10 (Instance의 내부 IP)
  • Floating IP: 203.0.113.10 (외부에서 접근 가능한 공용 IP)

Trunks

  • 네트워크 인터페이스(포트)를 통해 여러 VLAN 서브넷을 하나의 가상 머신(Instance)에 연결할 수 있도록 지원하는 기능
  • Trunks를 사용하면 단일 네트워크 포트로 여러 VLAN(802.1Q 태그 기반)을 처리할 수 있음

Network QoS

  • 네트워크 트래픽에 대해 대역폭 관리트래픽 제어 정책을 설정할 수 있는 기능
  • 네트워크 성능을 보장하고, 특정 트래픽 유형에 우선순위를 부여하거나 제한을 적용하는 데 사용

Network - Admin

RBAC Policies

  • 역할 기반 액세스 제어 정책으로, 특정 리소스(예: 네트워크, 프로젝트 등)에 대한 액세스를 역할(Role)에 따라 관리
  • Neutron 및 기타 서비스에서 RBAC 정책을 사용하여 리소스 접근 권한을 세부적으로 제어

Object Store

Containers

  • 애플리케이션과 그 종속성을 단일 패키지로 격리하여 실행하는 가상화된 환경
  • OpenStack Zun(Container Service)을 통해 컨테이너를 관리
  • Docker, Kubernetes 등과 통합하여 컨테이너 기반 애플리케이션을 운영할 수 있습

System - Admin

  • default quota를 관리하는 것이 가능
  • System Information 에서 다양 서비스에 대한 정보와 엔드포인트 확인 가능

Metadata Definitions

  • 리소스(예: 인스턴스, 볼륨, 네트워크 등)에 사용자 정의 메타데이터를 추가하여 리소스를 설명하거나 관리할 수 있도록 하는 기능
  • 사용자 정의 속성, 태그 또는 추가 정보를 저장하는 데 사용되며, OpenStack Horizon 대시보드 또는 CLI를 통해 설정 및 관리할 수 있음

Identity

Project

  • 리소스(컴퓨팅, 네트워크, 스토리지 등)를 논리적으로 구분하고 할당하기 위한 테넌트(Tenant) 또는 작업 공간
  • 주로 사용자의 그룹이나 특정 애플리케이션, 환경을 위한 리소스 격리 단위로 사용
  • ex. 회사의 부서별 Project:
    • HR_Project: HR 부서 리소스 관리
    • IT_Project: IT 부서 리소스 관리
  • ex. 개발 환경별 Project:
    • Dev_Project: 개발 환경
    • Prod_Project: 운영 환경

Tenant

  • OpenStack에서 Tenant는 특정 사용자 그룹이나 애플리케이션에 리소스를 격리하여 할당하는 논리적 단위
  • Project와 동일한 개념으로, 초기 OpenStack에서는 Tenant라는 용어를 사용

Multitenancy

Multitenancy는 여러 Tenant(Project)가 하나의 OpenStack 클라우드 인프라를 공유하면서도, 서로의 리소스와 데이터가 격리되도록 지원하는 개념

Domain

  • 사용자(User)Project(Tenant)를 그룹화하고 격리하는 최상위 관리 단위
  • Domain 간 리소스 및 데이터가 격리되어 독립적으로 운영 가능
  • 각 Domain은 별도의 관리 정책을 가질 수 있음
  • OpenStack Identity 서비스(Keystone)에서 제공하며, 주로 멀티테넌트 환경에서 사용자와 리소스의 관리를 효율적으로 수행하기 위해 사용

Groups

  • 사용자(User)를 논리적으로 묶어 관리하기 위한 단위
  • Keystone을 통해 그룹을 생성하고, 사용자에게 그룹을 할당하여 접근 권한을 효율적으로 관리

Roles

  • 사용자(User) 또는 그룹(Group)이 특정 프로젝트(Project) 또는 도메인(Domain) 내에서 수행할 수 있는 작업을 정의하는 권한 집합
  • Keystone을 통해 관리되며, 역할 기반 접근 제어(RBAC)를 구현하는 데 사용

Application Credentials

  • 애플리케이션이 특정 OpenStack 리소스에 안전하게 접근하도록 하기 위해 생성된 임시 인증 정보
  • 사용자의 주요 인증 정보(예: 사용자 이름과 비밀번호)를 노출하지 않고도 애플리케이션이 OpenStack API에 접근할 수 있도록 함
  • Application Credentials는 만료 기간을 설정할 수 있어, 필요 이상으로 사용되지 않도록 관리 가능
  • 인증에 비밀키와 ID를 사용하여 애플리케이션의 인증 절차를 단순화

Use Case

  1. API 기반 애플리케이션:

    • 외부 애플리케이션이 OpenStack 리소스를 제어할 때, 사용자 비밀번호를 대신하여 Application Credentials를 사용
  2. 자동화 스크립트:

    • 자동화 스크립트가 리소스를 생성, 삭제, 관리할 때 필요한 인증 정보 제공
  3. 권한 분리:

    • 민감한 작업과 일반 작업을 구분하여 필요한 권한만 부여
  4. CI/CD 파이프라인:

    • 지속적 통합/배포 도구가 OpenStack과 안전하게 상호작용할 수 있도록 지원

CLI Client

OS Credential은 OpenStack Credential과는 아예 다르기 때문에, 별도로 인증해주어야 한다

CLI Credential

  • Credential File은 RC File이라고 불린다

1. 직접 RC File 활용

  • Practical하지 않음
$ cat keystonerc_admin 
unset OS_SERVICE_TOKEN
    export OS_USERNAME=admin
    export OS_PASSWORD='8cbcacb658684041'
    export OS_REGION_NAME=RegionOne
    export OS_AUTH_URL=http://10.0.2.15:5000/v3
    export PS1='[\u@\h \W(keystone_admin)]\$ '
    
export OS_PROJECT_NAME=admin
export OS_USER_DOMAIN_NAME=Default
export OS_PROJECT_DOMAIN_NAME=Default
export OS_IDENTITY_API_VERSION=3
# keystonerc_admin 적용
$ source keystonerc_admin

source

셸 스크립트나 환경 파일을 현재 셸에 로드하여, 환경 변수 또는 셸 설정을 적용하는 데 사용되는 명령어

$ cp keystonerc_admin demo_rc
$ vi demo_rc
unset OS_SERVICE_TOKEN
    export OS_USERNAME=demo
    export OS_PASSWORD=demo
    export OS_REGION_NAME=RegionOne
    export OS_AUTH_URL=http://10.0.2.15:5000/v3
    export PS1='[\u@\h \W(demo)]\$ '

export OS_PROJECT_NAME=admin
export OS_USER_DOMAIN_NAME=Default
export OS_PROJECT_DOMAIN_NAME=Default
export OS_IDENTITY_API_VERSION=3

새로운 Credential을 생성하고자 했을 때 위와 같이 기존의 Credential을 복사하고 수정하는 것이 좋은 방법이다.

이떄 이전에 Horizon Dashboard에서 생성했던 것과 마찬가지로 demo User를 생성해준다.

[root@localhost ~(demo)]# openstack flavor create --disk 1 --ram 768 --id 20 newflavor
HttpException: 403: Client Error for url: http://10.0.2.15:8774/v2.1/flavors, Policy doesn't allow os_compute_api:os-flavor-manage:create to be performed.

[root@localhost ~(demo)]# source keystonerc_admin 
[root@localhost ~(keystone_admin)]# openstack flavor create --disk 1 --ram 768 --id 20 newflavor
+----------------------------+-----------+
| Field                      | Value     |
+----------------------------+-----------+
| OS-FLV-DISABLED:disabled   | False     |
| OS-FLV-EXT-DATA:ephemeral  | 0         |
| description                | None      |
| disk                       | 1         |
| id                         | 20        |
| name                       | newflavor |
| os-flavor-access:is_public | True      |
| properties                 |           |
| ram                        | 768       |
| rxtx_factor                | 1.0       |
| swap                       |           |
| vcpus                      | 1         |
+----------------------------+-----------+

위와 같이 각 user의 권한에 따라 동일한 명렁어가 동작하지 않거나, 동작하는 모습을 볼 수 있다.

2. OS 환경변수로 설정

  • Practical한 방법

Unified Comand Line

# nova boot
openstack server create

# neutron net-create
openstack network create

# glance image-list
openstack image list

# cinder create
openstack volume create
  • 이전 openstack 버전에서는 주석과 같이 각 서비스별로 다른 명렁어를 사용해야 했다
  • 하지만 최신 OpenStack 버전에서는 아래와 같이 통합된 CLI 명령어를 지원한다

Keystone

Keystone concepts

User: 사람, 서비스 및 Auth를 획득하는 어떤 것을 지칭

  • User는 Token읕 통해 Auth 및 API Call을 할 수 있음

Project: 리소스를 논리적으로 구분하고 할당하기 위한 작업공간

Role: User의 Operational Right

  • Globally scoped, Project scoped

Token: Openstack API에 접근할 수 있게 하는 Alphanumerical String

  • User가 Service를 Call하면 User의 Role을 해석
  • Authorization을 여러 scope에서 구분할 수 있는 도구

Scope: API 요청이나 역할(Role)이 적용되는 범위를 정의하는 데 사용

  • 리소스의 접근 및 관리 권한을 제어
  • 프로젝트(Project)와 도메인(Domain) 수준에서 역할과 권한을 분리

Catalog: 일종의 directory 서비스 (서비스 엔드포인트 목록)

  • User가 OpenStack의 다른 서비스에 접근하기 위해 필요한 URL과 정보를 제공

Keystone Architecture

  • Authentication System
  • Service와 Endpoint의 중앙 Catalog
  • LDAP, AD, MySQL 지원
  • 별도의 Auth와 Request를 위한 토큰 지원

  • 인증, 인가에 대한 모든 정보를 SQL DB 형태로 관리
  • 해당 DB는 다른 Backend 서비스에 통합될 수 있음

Authentication process flow

  1. User → Keystone: Credentials
  • 사용자가 Keystone(Identity 서비스)에 인증 요청(자격 증명) 전달
  1. Keystone → User: Token

    • Keystone이 사용자를 인증하고 토큰을 발급
  2. User → Nova: Token + Request for VM

    • 사용자가 Nova(Compute 서비스)에 토큰과 함께 가상 머신(VM) 생성 요청
  3. Nova → Keystone: Verify Token

    • Nova가 Keystone에 토큰의 유효성을 검증 요청
  4. Keystone → Nova: Verify Token

    • Keystone이 토큰이 유효함을 Nova에 확인
  5. Nova → Glance: Token + Request for Image

    • Nova가 Glance(Image 서비스)에 토큰과 함께 이미지 조회 요청
  6. Glance → Nova: Image

    • Glance가 요청한 이미지 데이터를 Nova에 전달
  7. Nova → Keystone: Verify Token

    • Nova가 다시 Keystone에 토큰 유효성 검증 요청
  8. Nova → Neutron: Token + Request to Plug VIF into Net

    • Nova가 Neutron(Networking 서비스)에 네트워크 인터페이스(VIF) 연결 요청
  9. Neutron → Keystone: Token + Verify User

    • Neutron이 Keystone에 토큰 및 사용자 확인 요청
  10. Neutron → Nova: Access to VIF

    • Neutron이 네트워크 인터페이스 연결 결과를 Nova에 전달
  11. Nova → User: Successful Response

    • Nova가 요청된 가상 머신 생성 완료 결과를 사용자에게 응답

Policies and authorization

  • 리소스 접근 및 작업 수행 권한을 정의하기 위한 규칙의 집합
  • RBAC(Role-Based Access Control)을 기반으로 동작하며, 특정 사용자가 특정 작업을 수행할 수 있는지 제어
{
    "admin_required": "role:admin",
    "compute:start": "role:admin or role:member",
    "compute:stop": "role:admin or role:member",
    "compute:get_all": "role:admin or role:reader",
    "network:create": "role:admin",
    "network:list": "role:admin or role:member or role:reader"
}
  • JSON 형식의 policy.json 또는 policy.yaml 파일로 관리되며, 서비스마다 별도의 정책 파일 존재
  • policy.json을 수정하더라도 서비스 재시작 없이 바로 반영됨

Manage from CLI

$ source keystone_admin
$ openstack endpoint list 
+----------------------------------+-----------+--------------+--------------+---------+-----------+---------------------------------------------+
| ID                               | Region    | Service Name | Service Type | Enabled | Interface | URL                                         |
+----------------------------------+-----------+--------------+--------------+---------+-----------+---------------------------------------------+
| 0ed880ae06824bf7ae6c1de30a98aeee | RegionOne | cinderv3     | volumev3     | True    | admin     | http://10.0.2.15:8776/v3                    |
| 19394e13249040078c6e189adf74f580 | RegionOne | cinderv3     | volumev3     | True    | internal  | http://10.0.2.15:8776/v3                    |
| 26552cbc5c8647068c3602bb2886e169 | RegionOne | neutron      | network      | True    | admin     | http://10.0.2.15:9696                       |
| 3e5e85abd6f54b5aa179830b5615c7e3 | RegionOne | gnocchi      | metric       | True    | admin     | http://10.0.2.15:8041                       |
| 406506b6e89e44bdaf74e276b7fea26c | RegionOne | nova         | compute      | True    | internal  | http://10.0.2.15:8774/v2.1                  |
| 4bcbb56166424817bb34edec212229ef | RegionOne | placement    | placement    | True    | public    | http://10.0.2.15:8778                       |
| 5f7da72c06db40798203f40d1e289b6e | RegionOne | glance       | image        | True    | public    | http://10.0.2.15:9292                       |
| 66899c0113894673995b0faa0426329c | RegionOne | swift        | object-store | True    | admin     | http://10.0.2.15:8080/v1/AUTH_%(tenant_id)s |
| 66dc081dc0a24348a2395ad97e3b7086 | RegionOne | aodh         | alarming     | True    | internal  | http://10.0.2.15:8042                       |
| 78bd86b9efbb4f57aefedd507eb82bc2 | RegionOne | placement    | placement    | True    | admin     | http://10.0.2.15:8778                       |
| 7dcc552be42341499b46cd8e3bd7044a | RegionOne | gnocchi      | metric       | True    | internal  | http://10.0.2.15:8041                       |
| 7eaa875799424db482f7efa7756a15c0 | RegionOne | swift        | object-store | True    | public    | http://10.0.2.15:8080/v1/AUTH_%(tenant_id)s |
| 8028fbe9f6b747fdbe7552c796068ed1 | RegionOne | aodh         | alarming     | True    | admin     | http://10.0.2.15:8042                       |
| 8845f0b6b7a64a9fb46e0021608aba0f | RegionOne | glance       | image        | True    | admin     | http://10.0.2.15:9292                       |
| a7e9bb6a022f4323bcf9cb388ddaeb49 | RegionOne | swift        | object-store | True    | internal  | http://10.0.2.15:8080/v1/AUTH_%(tenant_id)s |
| b31e4ee5a01a4a11bdaa7bf74ea35493 | RegionOne | neutron      | network      | True    | internal  | http://10.0.2.15:9696                       |
| b5adf7aa1f45423990b18d7002571096 | RegionOne | keystone     | identity     | True    | admin     | http://10.0.2.15:5000                       |
| b7a07e07fdc144b782371a4945325b82 | RegionOne | placement    | placement    | True    | internal  | http://10.0.2.15:8778                       |
| b7dbcfae941b4d88aa6193ec15ad4719 | RegionOne | cinderv3     | volumev3     | True    | public    | http://10.0.2.15:8776/v3                    |
| c5dfda13de9840618d5748d43c36c84a | RegionOne | glance       | image        | True    | internal  | http://10.0.2.15:9292                       |
| c9d35af259dc4561a5c113e843c362c2 | RegionOne | neutron      | network      | True    | public    | http://10.0.2.15:9696                       |
| d4604b6649d5466893766af22ff6d062 | RegionOne | aodh         | alarming     | True    | public    | http://10.0.2.15:8042                       |
| d91eca2e939f438f8f06de2a2d549ca7 | RegionOne | keystone     | identity     | True    | public    | http://10.0.2.15:5000                       |
| deca57b3145e45c18fd2963e7b857f89 | RegionOne | nova         | compute      | True    | admin     | http://10.0.2.15:8774/v2.1                  |
| ed4e0109019244799312102a2d51e89c | RegionOne | gnocchi      | metric       | True    | public    | http://10.0.2.15:8041                       |
| f8eb7281cc0a48d9a41b56fda326bb0f | RegionOne | nova         | compute      | True    | public    | http://10.0.2.15:8774/v2.1                  |
| fd4a82d2b8a74afa9cb1a29bdc306589 | RegionOne | keystone     | identity     | True    | internal  | http://10.0.2.15:5000                       |
+----------------------------------+-----------+--------------+--------------+---------+-----------+---------------------------------------------+

openstack endpoint list을 통해 Openstack에 존재하는 모든 endpoint들의 list를 확인할 수 있다.

openstack endpoint show b5adf7aa1f45423990b18d7002571096
+--------------+----------------------------------+
| Field        | Value                            |
+--------------+----------------------------------+
| enabled      | True                             |
| id           | b5adf7aa1f45423990b18d7002571096 |
| interface    | admin                            |
| region       | RegionOne                        |
| region_id    | RegionOne                        |
| service_id   | 47a94d62cac4428e80796111c41a6609 |
| service_name | keystone                         |
| service_type | identity                         |
| url          | http://10.0.2.15:5000            |
+--------------+----------------------------------+

이후 Keystone의 endpoint를 ID를 통해 확인하고

openstack catalog list
+-----------+--------------+----------------------------------------------------------------------------+
| Name      | Type         | Endpoints                                                                  |
+-----------+--------------+----------------------------------------------------------------------------+
| cinderv3  | volumev3     | RegionOne                                                                  |
|           |              |   admin: http://10.0.2.15:8776/v3                                          |
|           |              | RegionOne                                                                  |
|           |              |   internal: http://10.0.2.15:8776/v3                                       |
|           |              | RegionOne                                                                  |
|           |              |   public: http://10.0.2.15:8776/v3                                         |
|           |              |                                                                            |
| nova      | compute      | RegionOne                                                                  |
|           |              |   internal: http://10.0.2.15:8774/v2.1                                     |
|           |              | RegionOne                                                                  |
|           |              |   admin: http://10.0.2.15:8774/v2.1                                        |
|           |              | RegionOne                                                                  |
|           |              |   public: http://10.0.2.15:8774/v2.1                                       |
|           |              |                                                                            |
| keystone  | identity     | RegionOne                                                                  |
|           |              |   admin: http://10.0.2.15:5000                                             |
|           |              | RegionOne                                                                  |
|           |              |   public: http://10.0.2.15:5000                                            |
|           |              | RegionOne                                                                  |
|           |              |   internal: http://10.0.2.15:5000                                          |
|           |              |                                                                            |
| placement | placement    | RegionOne                                                                  |
|           |              |   public: http://10.0.2.15:8778                                            |
|           |              | RegionOne                                                                  |
|           |              |   admin: http://10.0.2.15:8778                                             |
|           |              | RegionOne                                                                  |
|           |              |   internal: http://10.0.2.15:8778                                          |
|           |              |                                                                            |
| neutron   | network      | RegionOne                                                                  |
|           |              |   admin: http://10.0.2.15:9696                                             |
|           |              | RegionOne                                                                  |
|           |              |   internal: http://10.0.2.15:9696                                          |
|           |              | RegionOne                                                                  |
|           |              |   public: http://10.0.2.15:9696                                            |
|           |              |                                                                            |
| gnocchi   | metric       | RegionOne                                                                  |
|           |              |   admin: http://10.0.2.15:8041                                             |
|           |              | RegionOne                                                                  |
|           |              |   internal: http://10.0.2.15:8041                                          |
|           |              | RegionOne                                                                  |
|           |              |   public: http://10.0.2.15:8041                                            |
|           |              |                                                                            |
| glance    | image        | RegionOne                                                                  |
|           |              |   public: http://10.0.2.15:9292                                            |
|           |              | RegionOne                                                                  |
|           |              |   admin: http://10.0.2.15:9292                                             |
|           |              | RegionOne                                                                  |
|           |              |   internal: http://10.0.2.15:9292                                          |
|           |              |                                                                            |
| aodh      | alarming     | RegionOne                                                                  |
|           |              |   internal: http://10.0.2.15:8042                                          |
|           |              | RegionOne                                                                  |
|           |              |   admin: http://10.0.2.15:8042                                             |
|           |              | RegionOne                                                                  |
|           |              |   public: http://10.0.2.15:8042                                            |
|           |              |                                                                            |
| swift     | object-store | RegionOne                                                                  |
|           |              |   admin: http://10.0.2.15:8080/v1/AUTH_8dc84595f82b4e6dac4a18f990b05c6d    |
|           |              | RegionOne                                                                  |
|           |              |   public: http://10.0.2.15:8080/v1/AUTH_8dc84595f82b4e6dac4a18f990b05c6d   |
|           |              | RegionOne                                                                  |
|           |              |   internal: http://10.0.2.15:8080/v1/AUTH_8dc84595f82b4e6dac4a18f990b05c6d |
|           |              |                                                                            |
+-----------+--------------+----------------------------------------------------------------------------+

위와 같이 Catalog를 확닌할 수 있다

Keystone은 다른 endpoint가 Cluster 내에서 서로를 식별할 수 있도록 Catalog를 위와 같이 제공한다.

$ openstack project create newProject
$ openstack project set --description "for testing purpose" newProject
$ openstack project show newProject
+-------------+----------------------------------+
| Field       | Value                            |
+-------------+----------------------------------+
| description | for testing purpose              |
| domain_id   | default                          |
| enabled     | True                             |
| id          | 8522df3c87154fb194986b039ac84620 |
| is_domain   | False                            |
| name        | newProject                       |
| options     | {}                               |
| parent_id   | default                          |
| tags        | []                               |
+-------------+----------------------------------+

또한 위와 같이 새로운 프로젝트를 생성하고 열럼할 수 있다.

openstack user create --project newProject --password-prompt developer1

모든 User는 생성시 프로젝트를 지정해줘야 한다

$ openstack role list
+----------------------------------+---------------+
| ID                               | Name          |
+----------------------------------+---------------+
| 3900fedccc434aa9aa3725fb646bd0a8 | ResellerAdmin |
| 5b89ece9caa54eab9412350f9d274307 | SwiftOperator |
| 6e7a20510cc84177921cf699cec334eb | reader        |
| 7aa56e6571e0466e984d7d6b6f91334b | member        |
| 8026203f634c40ba84a07413f5fe9c2a | admin         |
| e5eee3c15ddd4ba3996984b306225d7e | _member_      |
+----------------------------------+---------------+

$ openstack role assignment list --project newProject --user developer1

위와 같이 User가 생성되어도 default하게 role이 부여되지는 않는 것을 볼 수 있기에

$ openstack role add --project newProject --user developer1 admin
$ openstack role add --project newProject --user developer1 _member_
$ openstack role assignment list --project newProject --user developer1
+----------------------------------+----------------------------------+-------+----------------------------------+--------+--------+-----------+
| Role                             | User                             | Group | Project                          | Domain | System | Inherited |
+----------------------------------+----------------------------------+-------+----------------------------------+--------+--------+-----------+
| 8026203f634c40ba84a07413f5fe9c2a | b2eb1472e5554ee788a64a46b9a0c7d0 |       | 8522df3c87154fb194986b039ac84620 |        |        | False     |
| e5eee3c15ddd4ba3996984b306225d7e | b2eb1472e5554ee788a64a46b9a0c7d0 |       | 8522df3c87154fb194986b039ac84620 |        |        | False     |
+----------------------------------+----------------------------------+-------+----------------------------------+--------+--------+-----------+

User에 직접 이를 할당해주어야 한다.

Horizon Dashboard에서도 이를 확인할 수 있다.

$ openstack command list | grep openstack.identity -A 40
| openstack.identity.v3      | access rule delete                          |
|                            | access rule list                            |
|                            | access rule show                            |
|                            | access token create                         |
|                            | application credential create               |
|                            | application credential delete               |
|                            | application credential list                 |
|                            | application credential show                 |
|                            | catalog list                                |
|                            | catalog show                                |
|                            | consumer create                             |
|                            | consumer delete                             |
|                            | consumer list                               |
|                            | consumer set                                |
|                            | consumer show                               |
|                            | credential create                           |
|                            | credential delete                           |
|                            | credential list                             |
|                            | credential set                              |
|                            | credential show                             |
|                            | domain create                               |
|                            | domain delete                               |
|                            | domain list                                 |
|                            | domain set                                  |
|                            | domain show                                 |
|                            | ec2 credentials create                      |
|                            | ec2 credentials delete                      |
|                            | ec2 credentials list                        |
|                            | ec2 credentials show                        |
|                            | endpoint add project                        |
|                            | endpoint create                             |
|                            | endpoint delete                             |
|                            | endpoint group add project                  |
|                            | endpoint group create                       |
|                            | endpoint group delete                       |
|                            | endpoint group list                         |
|                            | endpoint group remove project               |
|                            | endpoint group set                          |
|                            | endpoint group show                         |
|                            | endpoint list                               |
|                            | endpoint remove project                     |

또한 openstack.identity 명령어를 통해 OpenStack Identity의 명령어를 확인할 수 있다.

  • access: 리소스 접근과 관련된 작업을 처리하는 명령어
  • application: 애플리케이션 자격 증명과 관련된 작업을 처리하는 명령어
  • catalog: 서비스 카탈로그를 관리하는 명령어
  • consumer: Consumer 엔터티를 관리하는 명령어
  • credential: 사용자 자격 증명을 관리하는 명령어
  • domain: 도메인을 관리하는 명령어
  • ec2: EC2 서비스와 관련된 자격 증명을 관리하는 명령어
  • endpoint: 엔드포인트를 관리하는 명령어
  • federation: 페더레이션(연합 인증) 설정을 관리하는 명령어
  • group: 사용자 그룹을 관리하는 명령어
  • identity: Identity Provider를 관리하는 명령어
  • implied: 역할 간 암시적 관계를 설정하는 명령어
  • limit: 자원 사용 제한을 관리하는 명령어
  • mapping: 페더레이션 매핑 규칙을 관리하는 명령어
  • policy: 정책을 관리하는 명령어
  • project: 프로젝트를 관리하는 명령어
  • region: 리전을 관리하는 명령어
  • registered: 등록된 자원 제한을 관리하는 명령어
  • request: 요청 토큰을 관리하는 명령어
  • role: 역할을 관리하는 명령어
  • service: 서비스 엔터티를 관리하는 명령어
  • token: 토큰 발급 및 관리를 처리하는 명령어
  • trust: 신뢰 관계를 관리하는 명령어
  • user: 사용자를 관리하는 명령어

Glance - Image Service

  • Cloud Image와 Snapshot을 저장
  • RESTFul API를 통해 톨신
  • Swift나 다른 Object store 지원
  • Layered Architecture로 구성됨

Glance Architecture

Glance Domain Controller

  • 주요 Glance 기능을 구현하는 Middleware
  • Authorization, Notification, Policy, DB Commentcion 수행

Glance Store Driver

  • Supported Storage와 통신하기 위한 Unified Interface 제공
  • 실제 이미지는 Supported BE Storage에 저장됨

Database Abstraction Layer

  • Glance, Registry Layer, Glance DB와 통신하는 API 제공
  • Registry Layer는 Metadata Processing 수행

Image Types

  • Raw: 원시 디스크 이미지로, 특정 포맷으로 변환되지 않은 상태
  • QCOW2: QEMU에서 사용하는 이미지 포맷으로, 효율적인 스토리지 사용과 스냅샷 지원을 제공
  • VHD: Microsoft의 Hyper-V에서 사용되는 디스크 이미지 포맷
  • VHDX: VHD의 확장 버전으로, 더 큰 디스크와 향상된 안정성을 지원
  • VMDK: VMware에서 사용하는 가상 디스크 포맷
  • ISO: 광학 디스크 이미지 포맷으로, 운영 체제 설치 미디어로 주로 사용
  • VDI: Oracle VirtualBox에서 사용하는 가상 디스크 이미지 포맷
  • PLOOP: Virtuozzo에서 사용하는 디스크 이미지 포맷으로, 컨테이너 기반 가상화를 지원

Cloud Images

  • AlmaLinux: Red Hat Enterprise Linux의 커뮤니티 기반 호환 OS
  • Alpine Linux: 경량화된 보안 중심의 리눅스 배포판
  • Arch Linux: 단순함과 최신 패키지를 지향하는 롤링 릴리즈 기반의 리눅스 배포판
  • BSD:
    • DragonFlyBSD: 고성능 파일 시스템과 네트워크 성능에 중점을 둔 BSD 배포판
    • FreeBSD: 강력한 네트워킹과 안정성을 제공하는 오픈소스 BSD 운영체제
    • NetBSD: 다양한 하드웨어 아키텍처를 지원하는 BSD 운영체제
    • OpenBSD: 보안과 안정성에 중점을 둔 BSD 운영체제
  • CentOS: Red Hat Enterprise Linux의 커뮤니티 기반 호환 배포판
  • CirrOS: 테스트 및 개발 환경에 사용되는 경량화된 운영체제
  • Debian: 안정성과 보안성을 강조하는 커뮤니티 기반 리눅스 배포판
  • Fedora: 최신 기술과 소프트웨어를 실험하는 Red Hat의 커뮤니티 배포판
  • Kali Linux: 침투 테스트와 보안 연구를 위한 리눅스 배포판
  • Microsoft Windows: 다양한 서버 및 데스크톱 환경에서 사용하는 상용 운영체제
  • openSUSE 및 SUSE Linux Enterprise Server: 사용하기 쉬운 인터페이스와 강력한 엔터프라이즈 기능을 제공하는 리눅스 배포판
  • Red Hat Enterprise Linux: 엔터프라이즈급 안정성과 지원을 제공하는 상용 리눅스 배포판
  • Rocky Linux: CentOS의 대체를 목표로 하는 커뮤니티 기반 리눅스 배포판
  • Ubuntu: 데스크톱, 서버 및 클라우드 환경에 널리 사용되는 사용자 친화적인 리눅스 배포판
    https://docs.openstack.org/image-guide/obtain-images.html

Glance CLI

$ openstack command list | grep openstack.image -A 10
| openstack.image.v2         | image add project                           |
|                            | image create                                |
|                            | image delete                                |
|                            | image list                                  |
|                            | image member list                           |
|                            | image remove project                        |
|                            | image save                                  |
|                            | image set                                   |
|                            | image show                                  |
|                            | image unset                                 |
| openstack.key_manager.v1   | acl delete                                  |

우선 위와 같이 Glance와 관련된 명령어를 확인한다.

  • image add: 이미지에 관련 리소스 또는 속성을 추가하는 명령어
  • image create: 새로운 이미지를 생성하는 명령어
  • image delete: 기존 이미지를 삭제하는 명령어
  • image list: 모든 이미지 목록을 조회하는 명령어
  • image member: 이미지에 대한 멤버 정보를 관리하는 명령어
  • image remove: 이미지에서 관련 리소스 또는 속성을 제거하는 명령어
  • image save: 이미지를 다운로드하거나 로컬 저장소에 저장하는 명령어
  • image set: 이미지의 속성을 설정하거나 수정하는 명령어
  • image show: 특정 이미지의 세부 정보를 조회하는 명령어
  • image unset: 이미지에서 설정된 속성을 해제하는 명령어

Glance는 Openstack 프로젝트 중에서 그리 Major하지 않기 때문에 명령어가 많이 존재하지 않는다.

$ curl -o ./cirros-0.6.2-x86_64-disk.img https://download.cirros-cloud.net/0.6.2/cirros-0.6.2-x86_64-disk.img
$ openstack image create --min-disk 2 --private --disk-format qcow2 --file ./cirros-0.6.2-x86_64-disk.img cirros

$ openstack image list
+--------------------------------------+--------+--------+
| ID                                   | Name   | Status |
+--------------------------------------+--------+--------+
| 192715c9-65b6-4682-bbf5-d08c21e99d77 | cirros | active |
+--------------------------------------+--------+--------+

이후 테스트 하기 적합한 CirrOS를 다운로드 받는다.

이후 다운로드 받은 파일을 기반으로 이미지를 생성하고 이를 확인할 수 있다

  • --private 옵션을 통해 이미지를 생성하게 되면, 다른 프로젝트에 속해있는 user는 해당 image를 열람할 수 없다

Neutron

  • Network Connectivity를 서비스 레벨에서 관리
  • Network, Subnet, Port 추상화
  • Plugin들이 많은 기술을 추가적으로 지원
  • Modular Architecture (Central, or Distributed Deployment)

  • Internal Network 간의 Connectivity는 Virtual Router를 생성하여 달성
  • Floating IP가 Attach되어 External Network에 연결될 수도 있음

Benefits of Neutron

Nova Networking 대신 Neutron을 사용하는 이유는 아래와 같다

  1. Rich Topologies: Neutron은 복잡하고 다양한 네트워크 토폴로지를 지원하여 사용자 요구에 맞는 유연한 네트워크 설계가 가능

  2. Technology Agnostic: 특정 네트워크 기술에 종속되지 않고 다양한 하드웨어 및 네트워크 프로토콜과 호환 가능

  3. Pluggable Open Architecture: 플러그인 기반의 아키텍처를 통해 네트워크 기술 확장성과 타사 솔루션과의 통합 지원

  4. Enables Advanced Services: Nova Networking에서 제공하지 않는 고급 네트워크 서비스를 지원

    • Load Balancing: 부하 분산을 통해 애플리케이션 가용성을 향상
    • VPN: 가상 사설망으로 보안 네트워크 연결 제공
    • Firewall: 방화벽 기능으로 네트워크 트래픽을 제어하고 보호

Base Terminology & Abstraction

  1. Virtual Machine (VM): Nova에 의해 생성된 가상 머신으로, 클라우드 환경에서 실행되는 컴퓨팅 리소스

    • Instance1 (10.0.0.11), Instance2 (10.0.0.12)
  2. Virtual Interface (VIF): 가상 머신과 네트워크 간의 연결 인터페이스

    • 각 가상 머신은 네트워크와 통신하기 위해 VIF를 Plug in 하여 사용
  3. Virtual Port: Neutron에서 네트워크의 끝점을 나타내는 논리적 엔터티

    • VIF는 Virtual Port를 통해 L2 네트워크와 연결
  4. L2 Virtual Network: 2계층 가상 네트워크로, 가상 머신이 동일한 네트워크 내에서 IP를 기반으로 통신 가능

    • 네트워크 이름: Net1, 서브넷 범위: 10.0.0.0/24
  5. Virtual Subnet: 가상 네트워크 내의 IP 주소 범위를 정의하는 논리적 구획

    • 서브넷은 각 네트워크에 대해 IP 주소 할당을 관리
  • Network, Port, Subnet은 모든 Neutron Deployment에 존재하는 Core한 자원

Neutron Architecture

  1. Server (REST API)

    • Neutron의 핵심 컴포넌트로, 클라이언트와의 상호작용을 위한 REST API를 제공
    • 주요 역할:
      • 네트워크, 서브넷, 포트 등 네트워크 자원의 생성, 삭제, 수정, 조회 요청 처리
      • 인증 및 요청 유효성 검증
      • 요청을 Message Queue에 전달하여 Plugin으로 전달
  2. Plugin

    • 오직 하나만 Activate 상태
    • 네트워크 구현을 담당하는 백엔드 모듈로, 실제 네트워크 자원 생성 및 관리 수행
    • 다양한 네트워크 기술 및 장비와의 통합 지원 (Open vSwitch, Cisco, VMware NSX 등)
    • 주요 유형:
      • Core Plugin: 네트워크, 서브넷, 포트와 같은 핵심 자원을 관리
      • Service Plugin: 부가적인 네트워크 서비스 제공 (e.g., Load Balancer, Firewall, VPN)
  3. Message Queue

    • Neutron Server와 Plugin 간의 비동기 통신을 담당하는 메시징 시스템
    • 양방항 Agent Communication 활성화
    • 주요 역할:
      • Neutron Server에서 받은 API 요청을 Plugin으로 전달
      • Plugin에서 수행 결과를 Neutron Server로 반환
      • RabbitMQ와 같은 AMQP(Message Queue 프로토콜) 구현체를 주로 사용

ML2 : Modular Layer 2 Plugin

  1. ML2 Plugin (Modular Layer 2 Plugin)

    • OpenStack Neutron의 네트워크 구성 요소를 관리하는 핵심 플러그인
    • TypeDriver와 MechanismDriver를 통합하여 다양한 네트워크 기술 및 하드웨어를 지원
  2. TypeDriver

    • 네트워크 유형(L2 네트워크)을 정의하고 관리
    • 지원하는 네트워크 유형:
      • VLAN: Virtual LAN, 네트워크를 논리적으로 분리
      • GRE: Generic Routing Encapsulation, 터널링 프로토콜
      • VxLAN: Virtual Extensible LAN, 확장 가능한 가상 네트워크
      • Flat: 단일 네트워크로 분리되지 않은 구조
  3. MechanismDriver

    • 네트워크 트래픽이 실제 하드웨어 및 소프트웨어에 적용되는 방식을 정의
    • 지원하는 드라이버:
      • OpenvSwitch: 오픈소스 가상 스위치
      • Hyper-V: Microsoft의 하이퍼바이저
      • OpenDaylight: SDN 컨트롤러
      • Arista: Arista 네트워크 장비
      • Cisco Nexus: Cisco의 네트워크 스위치 장비

Interaction Flow

  1. 클라이언트 요청

    • 사용자가 Neutron REST API를 통해 네트워크 리소스 요청(생성, 삭제, 수정 등)을 보냄
    • 요청은 Neutron Server로 전달
  2. Neutron Server

    • 클라이언트의 요청을 수신하고 요청의 유효성을 검증
    • 요청 내용을 Message Queue에 비동기로 전달하여 관련 컴포넌트와 상호작용
  3. Neutron Plugin

    • Plugin은 Message Queue에서 요청을 수신하고 실제 네트워크 자원을 관리
    • 예: Open vSwitch(OVS) 또는 Linux Bridge를 통해 네트워크 설정 수행
    • 필요 시 외부 서비스(SDN 컨트롤러, 물리적 라우터)와 상호작용
  4. Neutron Agent (L2, L3, DHCP)

    • L2 Agent: 가상 머신과 테넌트 네트워크를 연결하고 L2 네트워크 구성 관리
    • L3 Agent: 라우팅 및 NAT을 통해 네트워크 트래픽을 관리
    • DHCP Agent: 테넌트 네트워크 내 가상 머신에 IP 주소를 동적으로 할당
  5. Compute Node (Nova)

    • Nova 컴퓨트 노드에서 가상 머신은 Open vSwitch(OVS) 또는 Linux Bridge를 통해 네트워크에 연결
    • 테넌트 네트워크를 통해 가상 머신 간 통신을 수행
  6. 데이터베이스

    • 네트워크 리소스 상태 및 메타데이터(네트워크, 서브넷, 포트 등)를 저장하고 관리
    • Neutron Server와 Plugin은 상태 정보를 공유하기 위해 데이터베이스를 사용
  7. 응답 반환

    • Plugin 또는 Agent가 요청을 처리한 결과를 Message Queue를 통해 Neutron Server로 전달
    • Neutron Server는 처리 결과를 클라이언트로 반환

Plugin Extenstions

기본 플러그인에 추가적인 기능을 제공하거나 확장할 수 있는 메커니즘으로, 사용자 정의 리소스와 고급 네트워크 기능을 구현할 수 있음

주요 특징

  1. Add Logical Resources to the REST API

    • 확장 플러그인은 REST API에 논리적 리소스를 추가하여 기본 플러그인에서 지원하지 않는 추가적인 네트워크 기능을 제공
    • ex. QoS 정책, 네트워크 ACL, 추가적인 속성이나 동작
  2. Common Extensions

    • Port Security: 포트에 보안 정책을 설정하여 트래픽 필터링
    • Quality of Service (QoS): 네트워크 트래픽에 대역폭 제한 및 우선순위 부여
    • Router Extra Attributes: 라우터에 추가 속성 설정 (예: 고가용성, 분산 라우터 설정)
    • L3 Extensions: 고급 L3 네트워크 기능 추가 (예: 외부 네트워크 연결, NAT)
      etc.

Network connectivity of physical servers

  1. Cloud Controller Node

    • OpenStack의 핵심 API와 인증, 데이터베이스, 스케줄링 기능을 담당
    • API 요청이 여기서 처리됨
    • 주요 컴포넌트:
      • neutron-server: 네트워크 서비스의 요청을 처리하고, Plugin과 통신
      • SQLdb: 네트워크 및 OpenStack 상태를 저장
      • nova-scheduler: 가상 머신 인스턴스 배치 결정
      • keystone: 인증 및 권한 관리
      • AMQP: 비동기 통신을 위한 메시지 브로커
      • nova-api: Compute와 관련된 API 요청 처리
  2. Network Node

    • 네트워크 서비스를 제공하고 가상 머신의 트래픽을 관리
    • 실제 환경에서는 수많은 Compute Node가 존재할 것이기 때문에, 여러 Network Node를 사용할 필요가 있음
    • 주요 컴포넌트:
      • neutron-metadata-agent: 가상 머신 메타데이터 요청 처리
      • neutron-DHCP-agent: 가상 머신에 IP 주소를 동적으로 할당
      • neutron-L3-agent: 라우팅, NAT, 외부 네트워크와의 연결 관리
      • neutron-*-plugin-agent: TypeDriver와 MechanismDriver를 활용하여 네트워크 트래픽 처리
  3. Compute Node

    • 가상 머신을 호스팅하고 네트워크 연결 제공
    • 주요 컴포넌트:
      • nova-compute: 가상 머신 생성, 삭제, 라이프사이클 관리
      • neutron-plugin-agent: 네트워크 플러그인을 통해 Compute 노드의 네트워크 구성
  4. SDN Service Node

    • 소프트웨어 정의 네트워킹(SDN) 컨트롤러로, 고급 네트워크 기능 및 정책을 관리
    • 네트워크 흐름과 트래픽 제어를 담당
  5. Dashboard Node

    • OpenStack Horizon 대시보드 제공
    • 사용자가 브라우저를 통해 OpenStack 자원을 관리할 수 있는 웹 인터페이스 제공
  6. External Network

    • 가상 머신이 외부 네트워크(예: 인터넷)와 통신할 수 있도록 연결 제공
  7. Guest Network

    • 가상 머신 간의 내부 네트워크 트래픽을 관리

Multitenancy, Provider & Project Networks

  1. Compute Node

    • 가상 머신(VM)을 호스팅하며 테넌트 네트워크와 연결
      • VM1, VM2: Tenant Network 1에 연결된 가상 머신
      • VM3, VM4: Tenant Network 2에 연결된 가상 머신
      • Tenant Network: 특정 프로젝트(테넌트)에 속하는 내부 네트워크. 테넌트 간 네트워크는 분리되어 독립적임
  2. Network Node

    • 네트워크 관리와 외부 통신을 담당
      • Neutron Router: Tenant Network와 Provider Network 간의 라우팅, NAT 및 외부 네트워크와의 연결 제공
      • Provider Network: 외부(물리적) 네트워크와 연결되며, 테넌트 네트워크가 인터넷 등과 통신할 수 있도록 지원
  3. Physical Network

    • Provider Network가 연결되는 실제 물리적 네트워크 인프라
    • 외부 인터넷 또는 데이터 센터 내 다른 네트워크와 연결

Provider Network

  • Provider Networks는 물리적 네트워크와 직접 연결되며, 가상 라우터 없이 외부 네트워크와 통신 가능

  • Provider Network는 어떻게 네트워크가 Physically하게 연결되었는지 표현

  • 실제 Data Center의 Physical 네트워크와 일치해야 함

    • 물리적 네트워크 리소스를 활용하여 테넌트 네트워크를 분리
  • Project에 Public Network에 Direct Access할 수 있도록 함

  • Flat, VLAN, VxLAN, GRE 등 지원

  • 높은 성능과 간단한 구조로 소규모 또는 HW Base L3 라우터를 활용하는 상황에 적합


1. Controller Node

  • 네트워크 관리를 담당하며 DHCP 및 가상 네트워크 브릿지를 포함
  • 주요 구성:
    • DHCP Namespace (qdhcp): 테넌트 네트워크 내 VM에 IP 주소를 할당
    • Provider Bridge (brq): Provider 네트워크와 연결되며, Controller Node의 인터페이스와 연동
  1. Compute Node

    • VM을 호스팅하며 Provider 네트워크와 연결
    • 주요 구성:
      • Provider Instance: VM의 네트워크 인터페이스 (eth0)
      • Provider Bridge (brq): Provider 네트워크와 물리적 네트워크를 연결
      • iptables: 네트워크 트래픽을 관리하고 필터링
  2. Physical Network Infrastructure

    • 물리적 네트워크를 통해 Provider 네트워크와 외부 인터넷을 연결
    • Provider 네트워크의 서브넷 (203.0.113.0/24)을 사용

Project(Tenant) Network

특징Provider 네트워크Project 네트워크
연결 방식물리적 네트워크와 직접 연결Neutron 라우터를 통해 연결
사용 범위모든 테넌트 공유 가능테넌트 간 독립적 격리
관리 주체네트워크 관리자테넌트 사용자
네트워크 유형Flat, VLANVXLAN, GRE
외부 네트워크 통신직접 연결Neutron 라우터 필요

  1. 가상 머신 통신

    • 동일한 Project Network 내의 VM 간에는 직접 통신 가능 (예: VM1과 VM2)
    • 다른 Project Network 간의 통신은 Neutron Router를 통해 이루어짐 (예: VM1과 VM3)
  2. 외부 네트워크 통신

    • Project Network는 Neutron Router를 통해 Provider Network와 연결
    • Provider Network는 Physical Network를 통해 인터넷과 통신

Supported Nerwork Types

Traffic Segmentation

  • 네트워크 트래픽 분리는 필수적
    • 네트워크 확장성, 보안, 관리 효율성
    • 대규모 네트워크는 성능 저하 초래
    • 테넌트 트래픽을 분리하여 독립성 보장

Network(Traffic) Segmentation
ex. 사내 Traffic 유형 분리

  • 설정:
    • VLAN 10: 일반 직원의 업무 트래픽
    • VLAN 20: 보안 감시 카메라의 영상 스트리밍 트래픽
    • VLAN 30: 데이터센터 백업 트래픽
  1. Local Network

    • 단일 호스트에서만 사용 가능한 네트워크
    • 외부 통신이 필요 없는 단순 구성에 적합
      (Test, Proof of Concept)
  2. Flat Network

    • 모든 인스턴스가 동일한 네트워크에 연결
      • Segmentation 없음
      • Single Broadcast Domain
    • VLAN 또는 터널링 없이 간단히 구성
    • Scalabe 하지 않음
  3. VLAN (IEEE 802.1Q)

    • L2 구현으로 분리된 Broadcast Domain
    • 물리적 네트워크에서 논리적으로 네트워크 Segmentation
    • 확장성과 성능이 요구되는 환경에 적합
    • 거의 모든 Router와 Switch에서 구현
      • 대부분의 NIC에서 지원
    • 최대 4096개의 VLAN ID를 지원
    • Neutron에서 생성하게 되면 VLAN ID 발급됨
    • 다른 VLAN에 속한 인스턴스 연결을 위해서는 L3 Router에서 VLAN Routing 필요
  4. Tunneling (GRE/VxLAN)

    • L2 트래픽을 L3 네트워크로 캡슐화하여 다른 네트워크 프로토콜 위에서 데이터를 전송하는 기술

    • 캡슐화를 통해 네트워크 간 안전하고 효율적인 통신 가능

    • 주로 데이터센터 간 연결, 멀티테넌시 환경에서 사용

    • GRE (Generic Routing Encapsulation)

      • MAC in IP encapsulation

      • L2 트래픽을 L3 네트워크로 캡슐화하는 단순 터널링 프로토콜

      • 단순성과 멀티프로토콜 캡슐화 지원 (IPv4, IPv6, MPLS 등)

      • 오버헤드 증가 (캡슐화로 인해 데이터 크기 증가)

      • 암호화 미지원 (보안 추가 필요)

      • 데이터센터 간 네트워크 연결

      • MPLS 기반의 L2 VPN 구현

    • VxLAN (Virtual Extensible LAN)

      • MAC in UDP encapsulation

      • L2 트래픽을 UDP 기반으로 캡슐화하여 L3 네트워크에서 전달하는 터널링 기술

      • 최대 16M 네트워크 세그먼트 지원 (VNI 사용)

      • UDP 기반 캡슐화로 효율적인 데이터 전송

      • 멀티테넌시 지원 및 데이터센터 확장성 강화

      • 클라우드 데이터센터에서 테넌트 네트워크 격리

      • 대규모 네트워크 확장 및 세분화

특징GREVxLAN
캡슐화 프로토콜Generic Routing EncapsulationVirtual Extensible LAN
네트워크 ID 범위제한적 (VLAN ID에 의존)최대 16M 개의 네트워크 세그먼트
캡슐화 방식Point-to-PointUDP 기반 L3 캡슐화
확장성제한적대규모 네트워크에 적합
보안기본 보안 미제공UDP 기반 캡슐화로 유연성 제공
사용 사례데이터센터 간 연결클라우드 멀티테넌시 환경
  1. Underlay Support
    • 오버레이 네트워크를 위한 기본 네트워크 제공
    • 물리적 네트워크와의 연동 필수

Common Neutron Agent

L2 Agent

Neutron에서 L2 트래픽을 처리하고 관리하는 에이전트
네트워크 플러그인 기반으로 작동 (ex. ML2 Plugin)

  • 기능:
    • 가상 머신의 가상 네트워크 인터페이스(VIF)를 가상 네트워크 스위치(예: Open vSwitch 또는 Linux Bridge)와 연결
    • VLAN, VXLAN, GRE 등 다양한 네트워크 기술을 지원하여 L2 네트워크 트래픽 캡슐화 및 전달
    • Neutron Server와 상호작용하여 네트워크 상태 및 구성을 동기화
  • 주요 역할:
    • 네트워크 포트 생성 및 삭제
    • L2 브로드캐스트 및 유니캐스트 트래픽 처리
    • 테넌트 간 네트워크 격리를 위한 캡슐화 관리
  • 사용 사례:
    • 다중 테넌트 환경에서 L2 네트워크 연결 제공
    • 데이터센터 내부 가상 머신 간의 통신 처리

OVS L2 Agent

Open vSwitch(OVS)를 기반으로 OpenStack Neutron의 L2 네트워크 트래픽을 처리하는 L2 에이전트

  • 기능:
    • Open vSwitch를 사용하여 가상 머신(VM)의 네트워크 인터페이스(VIF)를 브리지로 연결
    • VLAN, VXLAN, GRE 등 캡슐화 프로토콜을 지원하여 L2 트래픽 처리
    • Neutron Server와 통신하여 네트워크 상태와 설정을 동기화
  • 주요 역할:
    • OVS 브리지 생성 및 관리
    • 네트워크 포트(Virtual Port) 추가, 삭제, 업데이트
    • 캡슐화 프로토콜을 사용한 테넌트 간 네트워크 트래픽 격리
    • 브로드캐스트 및 유니캐스트 트래픽 라우팅
  • 특징:
    • 확장성: VXLAN, GRE 등 오버레이 네트워크를 통해 대규모 네트워크 지원
    • 유연성: Open vSwitch의 플로우 기반 트래픽 제어를 활용
    • 효율성: 데이터 플레인에서 높은 성능 제공
  • 사용 사례:
    • 클라우드 환경에서 L2 네트워크 트래픽 처리
    • 대규모 데이터센터에서 테넌트 간 네트워크 격리 및 통신

https://www.openvswitch.org/

L3 Agent

Neutron에서 L3 기능을 제공하는 에이전트로, 라우팅 및 NAT(Network Address Translation) 작업을 처리

  • Linux Namespace 사용
  • Network Node에서 구동
  • HA, High Availability 지원
  • 기능:
    • 테넌트 네트워크와 외부 네트워크 간의 라우팅 처리
    • SNAT(소스 NAT) 및 DNAT(목적지 NAT)를 활용하여 외부와의 통신 지원
    • Floating IP를 관리하여 가상 머신(VM)에 외부 네트워크 접근 가능성 제공
    • DHCP 및 메타데이터 요청 처리 지원
  • 주요 역할:
    • 테넌트 네트워크의 서브넷 간 라우팅 수행
    • Neutron Router 생성 및 관리
    • 외부 네트워크(Provider Network)와 테넌트 네트워크 간의 트래픽 전달
    • Virtual Router를 사용해 내부 네트워크를 인터넷과 연결
  • 특징:
    • 멀티테넌시 지원: 각 테넌트의 네트워크가 독립적으로 동작하며 격리된 상태 유지
    • 확장성: 대규모 라우팅 작업을 지원하며 네트워크 확장 가능
    • 유연성: 다양한 네트워크 토폴로지 구성 가능 (예: 분산 라우터)
  • 사용 사례:
    • 클라우드 환경에서 테넌트 네트워크와 인터넷 간의 통신 처리
    • 다중 서브넷 환경에서의 라우팅 및 트래픽 관리
    • Floating IP를 사용하여 외부 서비스에 접근 가능하도록 구성

HA, High Availability
시스템, 네트워크, 애플리케이션이 예상치 못한 장애가 발생해도 지속적으로 운영될 수 있도록 높은 가용성을 보장하는 기술적 설계와 구현 방법

  • 클러스터링:
    • 여러 시스템을 하나로 묶어 장애 시 다른 시스템이 역할을 대신 수행
  • 로드 밸런싱:
    • 트래픽을 여러 서버로 분산하여 부하를 균등하게 나누고 고가용성 보장
  • 데이터 복제:
    • 데이터를 여러 노드에 복제하여 장애 발생 시 데이터 손실 방지
  • Heartbeat 및 Failover:
    • 상태 확인(Heartbeat)을 통해 장애를 감지하고 다른 노드로 자동 전환(Failover)

Security Groups

Neutron에서 네트워크 트래픽을 제어하기 위한 가상 방화벽 역할을 수행하는 규칙 집합
VM 또는 포트에 적용되어 트래픽의 입출입을 제어

  • IP Table 규칙 집합:

    • Security Group은 IP Tables를 기반으로 Ingress(들어오는 트래픽)와 Egress(나가는 트래픽)를 제어하는 규칙을 정의
  • Ingress/Egress 규칙:

    • Ingress: VM으로 들어오는 트래픽을 제어
    • Egress: VM에서 나가는 트래픽을 제어
  • Overlapping IP 지원:

    • 같은 네트워크에서 중복된 IP를 사용하는 경우에도 보안 그룹을 통해 네트워크 격리 가능
  • IPv6 지원:

    • IPv4뿐만 아니라 IPv6 트래픽도 제어 가능
  • VIF(Virtual InterFace)별로 적용:

    • 각 VM의 Virtual Interface별로 보안 그룹 규칙을 적용
  • Multiple VIF를 가진 VM 지원:

    • 여러 VIF를 가진 VM에서도 각각의 인터페이스에 별도의 보안 그룹 적용 가능
  • Default 설정:

    • 모든 Egress 트래픽은 허용
    • 모든 Ingress 트래픽은 기본적으로 차단

NAT

네트워크 트래픽의 IP 주소를 변환하여 가상 네트워크와 외부 네트워크 간 통신을 가능하게 하는 기술입

  1. Source Address Translation (SNAT)
  • 내부 네트워크에서 외부 네트워크로 나가는 패킷의 소스 IP 주소를 변환하는 기술
  • 주요 기능:
    • 내부 네트워크의 비공개 IP 주소를 공인 IP 주소로 변환
    • 여러 가상 머신이 하나의 공인 IP 주소를 공유하여 외부 네트워크와 통신 가능
  • 사용 사례:
    • 테넌트 네트워크에서 인터넷으로 나가는 트래픽
    • 비공개 네트워크의 IP 주소를 숨기기 위한 보안 강화
  1. Destination Address Translation (DNAT)
  • 외부 네트워크에서 내부 네트워크로 들어오는 패킷의 목적지 IP 주소를 변환하는 기술
  • 주요 기능:
    • 외부에서 내부 네트워크의 가상 머신(VM)으로 트래픽을 전달
    • Floating IP를 사용하여 특정 VM과 외부 네트워크 간 통신 가능
  • 사용 사례:
    • 외부 사용자가 내부 VM의 서비스(ex. 웹 서버)에 접근할 수 있도록 설정
    • Floating IP를 활용한 특정 VM 노출
  1. Port Address Translation (PAT)**
  • 소스 또는 목적지 IP 주소뿐만 아니라 포트 번호를 변환하는 기술
  • 주요 기능:
    • 동일한 공인 IP 주소를 여러 가상 머신이 공유하도록 허용
    • 포트 번호를 기준으로 가상 머신 간 트래픽을 구분
  • 사용 사례:
    • 여러 VM이 동일한 공인 IP를 사용하며, 각 VM이 서로 다른 포트로 통신
    • NAT 게이트웨이에서 트래픽을 효율적으로 라우팅

Floating IP Addresses

VM(Instance)에 외부 네트워크와 통신할 수 있는 Public IP 주소를 할당하는 방식

  • Neutron L3 Agent의 역할:

    • Neutron은 소프트웨어 기반의 L3 라우터를 생성하여 VM(Instance)에 게이트웨이처럼 작동
    • Floating IP를 통해 가상 네트워크와 외부 네트워크 간 라우팅 처리
  • Static One-to-One Mapping:

    • Floating IP는 가상 머신의 Private IP와 Public IP를 1:1로 매핑
    • 이를 통해 가상 머신이 외부 네트워크에서 접근 가능해짐

DVR (Distributed Virtual Router)

L3 Agent의 기본 구조

  • OpenStack Neutron에서 L3 Agent는 네트워크 노드에서 중앙 집중화되어 작동
  • Inter-subnet VM Traffic:
    • 서브넷 간 트래픽은 항상 L3 Agent를 경유
  • 외부 네트워크 트래픽:
    • 외부에서 오는 모든 트래픽은 L3 Agent를 통해 전달

Distributed Virtual Router (DVR)

  • L3 라우팅을 분산 처리하여 성능 병목을 방지하는 OpenStack 네트워크 아키텍처

  • L3 Agent의 기능을 Compute Node에 분산

  • 특징:

    • 각 Compute Node에서 실행:
      • 라우터 기능이 네트워크 노드뿐만 아니라 각 Compute Node에서 실행
    • 성능 영향 완화:
      • 중앙 집중식 라우터로 인한 트래픽 병목 현상을 감소

Network Namespaces

네트워크 스택의 격리된 복사본을 제공하여 서로 독립적인 네트워크 환경을 구현하는 기술

Neutron에서 네트워크 리소스 간의 격리와 독립성을 보장하기 위해 사용

ip netns: 현재 생성된 네트워크 네임스페이스를 나열

  1. Isolated Copy of Network Stack:

    • 각 네트워크 네임스페이스는 독립적인 네트워크 스택(네트워크 디바이스, 라우팅 테이블, IP 주소 등)을 가짐
    • 하나의 호스트에서 다중 네트워크 환경을 시뮬레이션 가능
  2. Scope Limited to Each Namespace:

    • 네임스페이스 내에서 네트워크 설정은 해당 네임스페이스에만 적용되며 다른 네임스페이스와 격리됨
  3. Reusing Addresses:

    • 동일한 IP 주소를 여러 네임스페이스에서 중복 사용 가능
  4. Explicit Configuration Needed:

    • 네임스페이스 간 통신을 위해 명시적인 설정 필요 (예: 라우팅 또는 NAT)
  5. Supports Routing and Isolation:

    • 각 네임스페이스는 독립적인 라우팅 테이블을 가지며, 특정 네트워크 디바이스 및 트래픽 제어 가능

Neutron CLI

$ <pre>openstack network agent list
+--------------------------------------+--------------------+-----------------------+-------------------+-------+-------+---------------------------+
| ID                                   | Agent Type         | Host                  | Availability Zone | Alive | State | Binary                    |
+--------------------------------------+--------------------+-----------------------+-------------------+-------+-------+---------------------------+
| 0c144c1c-1737-47f1-959c-496f3e17eb90 | Metadata agent     | localhost.localdomain | None              | XXX   | UP    | neutron-metadata-agent    |
| 14f94549-0d8f-4239-9125-b6a699d1b194 | L3 agent           | localhost             | nova              | :-)   | UP    | neutron-l3-agent          |
| 218c4aca-953e-4545-8833-9a15e91ed10d | Open vSwitch agent | localhost             | None              | :-)   | UP    | neutron-openvswitch-agent |
| 4ae60024-c838-4fad-a54f-858639395da9 | DHCP agent         | localhost.localdomain | nova              | XXX   | UP    | neutron-dhcp-agent        |
| 4d0f06c6-7925-42ab-82bd-2d8eb3d8b29f | L3 agent           | localhost.localdomain | nova              | XXX   | UP    | neutron-l3-agent          |
| 4ef605ff-82bd-404f-bfce-f7f81afa8ea8 | Metering agent     | localhost.localdomain | None              | XXX   | UP    | neutron-metering-agent    |
| 507a9478-6777-4caa-8407-a7deccfa0a9d | Metering agent     | localhost             | None              | :-)   | UP    | neutron-metering-agent    |
| 907e81ce-3857-4c69-81e1-62eb623bf093 | DHCP agent         | localhost             | nova              | :-)   | UP    | neutron-dhcp-agent        |
| 912da6e4-20b1-4853-ad7f-b2317fb2c0a0 | Metadata agent     | localhost             | None              | :-)   | UP    | neutron-metadata-agent    |
| ece367e5-3f73-40d8-9790-07e4b9d87ffe | Open vSwitch agent | localhost.localdomain | None              | XXX   | UP    | neutron-openvswitch-agent |
+--------------------------------------+--------------------+-----------------------+-------------------+-------+-------+---------------------------+

우선 위와 같이 network agent들의 리스트를 볼 수 있다.

$ ovs-vsctl show
c7c4cbfc-1f94-4359-9287-b829ff0bddf9
    Manager "ptcp:6640:127.0.0.1"
        is_connected: true
    Bridge br-int
        Controller "tcp:127.0.0.1:6633"
            is_connected: true
        fail_mode: secure
        datapath_type: system
        Port br-int
            Interface br-int
                type: internal
        Port patch-tun
            Interface patch-tun
                type: patch
                options: {peer=patch-int}
        Port int-br-ex
            Interface int-br-ex
                type: patch
                options: {peer=phy-br-ex}
    Bridge br-ex
        Controller "tcp:127.0.0.1:6633"
            is_connected: true
        fail_mode: secure
        datapath_type: system
        Port phy-br-ex
            Interface phy-br-ex
                type: patch
                options: {peer=int-br-ex}
        Port enp0s3
            Interface enp0s3
        Port br-ex
            Interface br-ex
                type: internal
    Bridge br-tun
        Controller "tcp:127.0.0.1:6633"
            is_connected: true
        fail_mode: secure
        datapath_type: system
        Port patch-int
            Interface patch-int
                type: patch
                options: {peer=patch-tun}
        Port br-tun
            Interface br-tun
                type: internal
    ovs_version: "3.1.7-140.el9s"

Open vSwitch(OVS)의 전체 구성 정보를 출력할 수 있으며 의미는 다음과 같다.

  1. Manager

    • OVS 관리자가 연결된 주소를 표시 (ptcp:6640:127.0.0.1)
    • OVS 관리 인터페이스 상태를 확인 (is_connected: true)
  2. Bridge

    • OVS에서 생성된 가상 브리지
    • 주요 브리지:
      • br-int (Integration Bridge): 가상 머신과 네트워크 트래픽을 연결
      • br-ex (External Bridge): 외부 네트워크와 통신
      • br-tun (Tunnel Bridge): 터널링 트래픽 처리 (GRE/VXLAN)
    • Controller: 각 브리지에 연결된 OpenFlow 컨트롤러 (주소: tcp:127.0.0.1:6633)
    • Fail Mode: secure로 설정 시, 컨트롤러 장애 시에도 데이터 경로 유지
  3. Port

    • 각 브리지에 연결된 네트워크 포트
    • 주요 포트:
      • Patch Port: 브리지 간 트래픽 연결 (예: patch-tun, patch-int)
      • Physical Port: 실제 네트워크 인터페이스 (예: enp0s3 for br-ex)
      • Internal Port: 가상 네트워크 인터페이스 (예: br-int, br-tun)
  4. Interface

    • 각 포트에 연결된 인터페이스
    • Type: patch, internal, 또는 실제 네트워크 인터페이스
    • Options: Patch 포트는 peer를 통해 연결된 상대 포트 지정 (예: patch-tun ↔ patch-int)
  5. OVS Version

    • 현재 OVS 소프트웨어의 버전 (3.1.7-140.el9s)
$ openstack network create -h

openstack create network를 통해 새로운 네트워크를 생성할 수 있으며, 주요 파라미터에 대한 정보는 아래와 같다

  • --provider-network-type: 네트워크 유형 설정 (ex. vxlan, vlan, flat, gre)
  • --provider-physical-network: 물리적 네트워크와 매핑
  • --provider-segment: VLAN ID 또는 네트워크 세그먼트 ID 지정
  • --shared: 네트워크를 여러 프로젝트에서 공유 가능하도록 설정
  • --external: 외부 네트워크로 설정하여 인터넷 연결 가능
  • --mtu-size: 네트워크의 최대 패킷 크기 설정
  • --disable-port-security: 포트 보안을 비활성화하여 보안 그룹 필터링 해제
  • --description: 네트워크의 목적이나 역할에 대한 설명 추가
$ openstack network create intnet
+---------------------------+--------------------------------------+
| Field                     | Value                                |
+---------------------------+--------------------------------------+
| admin_state_up            | UP                                   |
| availability_zone_hints   |                                      |
| availability_zones        |                                      |
| created_at                | 2025-01-14T03:52:24Z                 |
| description               |                                      |
| dns_domain                | None                                 |
| id                        | 7b34e663-7d34-4c5c-b037-a7d5b47187d2 |
| ipv4_address_scope        | None                                 |
| ipv6_address_scope        | None                                 |
| is_default                | False                                |
| is_vlan_transparent       | None                                 |
| mtu                       | 1450                                 |
| name                      | intnet                               |
| port_security_enabled     | True                                 |
| project_id                | 8dc84595f82b4e6dac4a18f990b05c6d     |
| provider:network_type     | vxlan                                |
| provider:physical_network | None                                 |
| provider:segmentation_id  | 82                                   |
| qos_policy_id             | None                                 |
| revision_number           | 1                                    |
| router:external           | Internal                             |
| segments                  | None                                 |
| shared                    | False                                |
| status                    | ACTIVE                               |
| subnets                   |                                      |
| tags                      |                                      |
| updated_at                | 2025-01-14T03:52:24Z                 |
+---------------------------+--------------------------------------+

우선 intnet이라는 네트워크를 생성한다.

openstack subnet create subnet1 --subnet-range 10.5.5.0/24 --dns-nameserver 8.8.8.8 --network intnet
+----------------------+--------------------------------------+
| Field                | Value                                |
+----------------------+--------------------------------------+
| allocation_pools     | 10.5.5.2-10.5.5.254                  |
| cidr                 | 10.5.5.0/24                          |
| created_at           | 2025-01-14T03:54:48Z                 |
| description          |                                      |
| dns_nameservers      | 8.8.8.8                              |
| dns_publish_fixed_ip | None                                 |
| enable_dhcp          | True                                 |
| gateway_ip           | 10.5.5.1                             |
| host_routes          |                                      |
| id                   | 204c4ca0-3cba-4668-8b55-2ab7e1a132a2 |
| ip_version           | 4                                    |
| ipv6_address_mode    | None                                 |
| ipv6_ra_mode         | None                                 |
| name                 | subnet1                              |
| network_id           | 7b34e663-7d34-4c5c-b037-a7d5b47187d2 |
| project_id           | 8dc84595f82b4e6dac4a18f990b05c6d     |
| revision_number      | 0                                    |
| segment_id           | None                                 |
| service_types        |                                      |
| subnetpool_id        | None                                 |
| tags                 |                                      |
| updated_at           | 2025-01-14T03:54:48Z                 |
+----------------------+--------------------------------------+

이후 새로운 Subnet을 생성한다.

  • Neutron에서 Namespace는 각 DHCP 서버를 위한 Traffic Isolation을 가능하게 한다
  • 각 DHCP 서버에 새로운 Namespace가 생성되고 할당된다
  • 따라서 IP만으로 DHCP 서버에 접근이 불가능하지만, Linux 레벨에서 해당 IP의 Namespace를 먼저 알아낸 뒤 접근이 가능하다.
$ ip netns
qdhcp-7b34e663-7d34-4c5c-b037-a7d5b47187d2 (id: 0)

ip netns를 통해 현재 네트워크에 생성된 NS를 볼 수 있다.

$ ip netns exec qdhcp-7b34e663-7d34-4c5c-b037-a7d5b47187d2 ping 10.5.5.2
PING 10.5.5.2 (10.5.5.2) 56(84) bytes of data.
64 bytes from 10.5.5.2: icmp_seq=1 ttl=64 time=1.44 ms
64 bytes from 10.5.5.2: icmp_seq=2 ttl=64 time=0.037 ms
64 bytes from 10.5.5.2: icmp_seq=3 ttl=64 time=0.057 ms
...

DHCP가 같은 namespace 내애서 접근이 가능한 것을 볼 수 있다.

$ ip netns exec qdhcp-7b34e663-7d34-4c5c-b037-a7d5b47187d2 ip addr show
# loopback inferface
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
# DHCP agent's tap interface
7: tap177c8c39-42: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UNKNOWN group default qlen 1000
    link/ether fa:16:3e:cd:fc:be brd ff:ff:ff:ff:ff:ff
    inet 10.5.5.2/24 brd 10.5.5.255 scope global tap177c8c39-42
       valid_lft forever preferred_lft forever
    inet6 fe80::f816:3eff:fecd:fcbe/64 scope link 
       valid_lft forever preferred_lft forever

또한 해당 NS에 존재하는 네트워크 인터페아ㅣ스를 볼 수 있다.

Loopback Interface
네트워크 장치에서 자기 자신과 통신하기 위해 사용하는 가상 네트워크 인터페이스

  • 주요 특징:
    • 항상 활성화 상태 (127.0.0.1 주소 사용)
    • 내부 프로세스 간 통신 및 테스트 목적 사용
  • 사용 사례:
    • 애플리케이션 테스트
    • 네트워크 디바이스 간 연결 확인

DHCP Agent's Tap Interface
Neutron의 DHCP Agent가 사용하는 가상 네트워크 인터페이스

  • 주요 특징:
    • 테넌트 네트워크에 DHCP 서비스를 제공
    • 각 테넌트 서브넷마다 고유의 TAP 인터페이스 생성
  • 사용 사례:
    • VM에 동적으로 IP 주소, DNS 설정 제공
    • 테넌트 네트워크에서 IP 주소 관리
$ ovs-vsctl show
c7c4cbfc-1f94-4359-9287-b829ff0bddf9
    ...
        Port tap177c8c39-42
            tag: 1
            Interface tap177c8c39-42
                type: internal

새로운 네트워크를 생성하였기 때문에 OVS의 전체 구성정보를 출력해보면 tap 인터페이스가 생성된 것을 볼 수 있다.

또한 DHCP agent는 별도의 Network 노드에서 구동되는데 이전에 --all-in-one 모드로 설치를 진행했기에, 현재 Openstack의 Inegration Bridge 내에서 해당 노드가 존재한다.

$ openstack router create R2
+-------------------------+--------------------------------------+
| Field                   | Value                                |
+-------------------------+--------------------------------------+
| admin_state_up          | UP                                   |
| availability_zone_hints |                                      |
| availability_zones      |                                      |
| created_at              | 2025-01-14T04:19:11Z                 |
| description             |                                      |
| distributed             | False                                |
| enable_ndp_proxy        | None                                 |
| external_gateway_info   | null                                 |
| flavor_id               | None                                 |
| ha                      | False                                |
| id                      | 4358fd19-62ea-42d3-be7d-0ef3140dc249 |
| name                    | R2                                   |
| project_id              | 8dc84595f82b4e6dac4a18f990b05c6d     |
| revision_number         | 1                                    |
| routes                  |                                      |
| status                  | ACTIVE                               |
| tags                    |                                      |
| tenant_id               | 8dc84595f82b4e6dac4a18f990b05c6d     |
| updated_at              | 2025-01-14T04:19:11Z                 |
+-------------------------+--------------------------------------+

이후 Subnet을 위한 Router을 생성한다

$ openstack router add subnet R2 subnet1

이 시점에서 R2 라우터는 인터페이스가 붙지 않은 빈 라우터이기에, Private Subnet을 attach한다.

$ ovs-vsctl show
...
        Port qr-3fa254c3-77
            tag: 1
            Interface qr-3fa254c3-77
                type: internal

R2 라우터의 인터페이스인 qr-3fa254c3-77가 잘 생성된 것을 확인할 수 다

$ ip netns
qrouter-4358fd19-62ea-42d3-be7d-0ef3140dc249 (id: 1)
qdhcp-7b34e663-7d34-4c5c-b037-a7d5b47187d2 (id: 0)

또한 해당 인터페이스는 Router를 위해 별도로 생성된 Namespace 내에 존재한다.

$ ip netns exec qrouter-4358fd19-62ea-42d3-be7d-0ef3140dc249 ip address show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
8: qr-3fa254c3-77: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UNKNOWN group default qlen 1000
    link/ether fa:16:3e:78:a2:32 brd ff:ff:ff:ff:ff:ff
    inet 10.5.5.1/24 brd 10.5.5.255 scope global qr-3fa254c3-77
       valid_lft forever preferred_lft forever
    inet6 fe80::f816:3eff:fe78:a232/64 scope link 
       valid_lft forever preferred_lft forever
       
$ ip netns exec qrouter-4358fd19-62ea-42d3-be7d-0ef3140dc249 ip route
10.5.5.0/24 dev qr-3fa254c3-77 proto kernel scope link src 10.5.5.1 

해당 Namespace 내에서 네트워크 정보를 출력해보고

ip netns exec qrouter-4358fd19-62ea-42d3-be7d-0ef3140dc249 ping 10.5.5.1
PING 10.5.5.1 (10.5.5.1) 56(84) bytes of data.
64 bytes from 10.5.5.1: icmp_seq=1 ttl=64 time=0.285 ms
64 bytes from 10.5.5.1: icmp_seq=2 ttl=64 time=0.058 ms
64 bytes from 10.5.5.1: icmp_seq=3 ttl=64 time=0.054 ms
...

ping을 통해 해당 라우터로 접근이 가능한지 확인해야 한다.

$ neutron router-gateway-set R2 external_network
Set gateway for router R2

이후 external public networkR2 라우터에 attach하여 해당 라우터가 Traffic을 해당 네트워크를 통해 라우팅할 수 있게 한다.

# 현재 네트워크 리스트 확인
openstack network list
+--------------------------------------+------------------+--------------------------------------+
| ID                                   | Name             | Subnets                              |
+--------------------------------------+------------------+--------------------------------------+
| 61af13ca-6eb4-4916-9fe7-2e28d401e2bd | external_network | 5a7d4bd3-011c-4c42-9f77-15c1fa9d8b83 |
| 7b34e663-7d34-4c5c-b037-a7d5b47187d2 | intnet           | 204c4ca0-3cba-4668-8b55-2ab7e1a132a2 |
+--------------------------------------+------------------+--------------------------------------+
$  openstack server create --flavor m1.small --image cirros --network 7b34e663-7d34-4c5c-b037-a7d5b47187d2 test-instance

인스턴스를 성공적으로 생성한 이후, 해당 인스턴스에 접근하지 이전에 Security gorup rule을 수정해야 한다.

$ openstack security group list
+--------------------------------------+---------+------------------------+----------------------------------+------+
| ID                                   | Name    | Description            | Project                          | Tags |
+--------------------------------------+---------+------------------------+----------------------------------+------+
| 4dfe3e82-ec28-4b47-8090-e2173d047774 | default | Default security group | 8dc84595f82b4e6dac4a18f990b05c6d | []   |
| 672f6b64-8358-4f9d-ae1e-1c16a193af93 | default | Default security group | e13f274a863d4a91a95011b5dd06d8b1 | []   |
+--------------------------------------+---------+------------------------+----------------------------------+------+
$ openstack project list
+----------------------------------+---------------+
| ID                               | Name          |
+----------------------------------+---------------+
| 668c91225e6f4d17a99ed2e4c28afe98 | services      |
| 8522df3c87154fb194986b039ac84620 | newProject    |
| 8dc84595f82b4e6dac4a18f990b05c6d | admin         |
| e13f274a863d4a91a95011b5dd06d8b1 | first-project |
+----------------------------------+---------------+

정확히 어떤 Security Group이 어떤 Project에서 활성화되어 있는지 확인하였을 떄 newProject에 Security Group이 할당되지 않은 것을 확인하여

openstack security group create allow-icmp-ssh --project 8522df3c87154fb194986b039ac84620 --description "Allow ICMP and SSH (TCP:22)"
openstack security group rule create --remote-ip 0.0.0.0/0 --protocol icmp allow-icmp-ssh
openstack security group rule create --remote-ip 0.0.0.0/0 --protocol tcp --dst-port 22 allow-icmp-ssh

위와 같이 Security Group에 newProject에 지정하고 생성한 이후 Rule을 추가한다.

$  openstack security group list
+--------------------------------------+----------------+-----------------------------+----------------------------------+------+
| ID                                   | Name           | Description                 | Project                          | Tags |
+--------------------------------------+----------------+-----------------------------+----------------------------------+------+
| 1bbabbed-e7dc-478b-98a1-ff37035ef797 | allow-icmp-ssh | Allow ICMP and SSH (TCP:22) | 8522df3c87154fb194986b039ac84620 | []   |
| 4dfe3e82-ec28-4b47-8090-e2173d047774 | default        | Default security group      | 8dc84595f82b4e6dac4a18f990b05c6d | []   |
| 672f6b64-8358-4f9d-ae1e-1c16a193af93 | default        | Default security group      | e13f274a863d4a91a95011b5dd06d8b1 | []   |
| e6f1533e-2b32-4c87-84a4-979ad08f3e68 | default        | Default security group      | 8522df3c87154fb194986b039ac84620 | []   |
+--------------------------------------+----------------+-----------------------------+----------------------------------+------+

위와 같이 security group이 정상적으로 생성된 것을 확인할 수 있다.

최종적인 Network Topology는 위와 같다.

Trouble Shooting: Instance Namespace Connection Failure

이후 10.5.5.202 인스턴스에 대해 ping 및 ssh 요청을 해보았지만 지속적으로 실패하여 이를 해곃하고자 하였다

$ ip netns exec qrouter-4358fd19-62ea-42d3-be7d-0ef3140dc249 arp -n
Address                  HWtype  HWaddress           Flags Mask            Iface
10.5.5.202                       (incomplete)                              qr-3fa254c3-77
10.0.2.1                 ether   52:54:00:12:35:00   C                     qg-2e261868-ab

라우터에서 ARP 요청이 전달되는지 확인해본 결과 10.5.5.202에 대한 MAC 주소가 할당되지 않은 것을 볼 수 있었다.

ip netns exec qrouter-4358fd19-62ea-42d3-be7d-0ef3140dc249 ip neigh flush dev qr-3fa254c3-77

이후 Router Namespace에서 ARP 캐시를 초기화하였다

$ openstack network agent list
+--------------------------------------+--------------------+-----------------------+-------------------+-------+-------+---------------------------+
| ID                                   | Agent Type         | Host                  | Availability Zone | Alive | State | Binary                    |
+--------------------------------------+--------------------+-----------------------+-------------------+-------+-------+---------------------------+
| 0c144c1c-1737-47f1-959c-496f3e17eb90 | Metadata agent     | localhost.localdomain | None              | XXX   | UP    | neutron-metadata-agent    |
| 14f94549-0d8f-4239-9125-b6a699d1b194 | L3 agent           | localhost             | nova              | :-)   | UP    | neutron-l3-agent          |
| 218c4aca-953e-4545-8833-9a15e91ed10d | Open vSwitch agent | localhost             | None              | :-)   | UP    | neutron-openvswitch-agent |
| 4ae60024-c838-4fad-a54f-858639395da9 | DHCP agent         | localhost.localdomain | nova              | XXX   | UP    | neutron-dhcp-agent        |
| 4d0f06c6-7925-42ab-82bd-2d8eb3d8b29f | L3 agent           | localhost.localdomain | nova              | XXX   | UP    | neutron-l3-agent          |
| 4ef605ff-82bd-404f-bfce-f7f81afa8ea8 | Metering agent     | localhost.localdomain | None              | XXX   | UP    | neutron-metering-agent    |
| 507a9478-6777-4caa-8407-a7deccfa0a9d | Metering agent     | localhost             | None              | :-)   | UP    | neutron-metering-agent    |
| 907e81ce-3857-4c69-81e1-62eb623bf093 | DHCP agent         | localhost             | nova              | :-)   | UP    | neutron-dhcp-agent        |
| 912da6e4-20b1-4853-ad7f-b2317fb2c0a0 | Metadata agent     | localhost             | None              | :-)   | UP    | neutron-metadata-agent    |
| ece367e5-3f73-40d8-9790-07e4b9d87ffe | Open vSwitch agent | localhost.localdomain | None              | XXX   | UP    | neutron-openvswitch-agent |
+--------------------------------------+--------------------+-----------------------+-------------------+-------+-------+---------------------------+

이후 network agent들의 리스트를 점검하였다

hostnamectl set-hostname localhost

위 명령으로 hostname 적용을 보장한다

systemctl restart neutron-server
systemctl restart neutron-metadata-agent.service 
systemctl restart neutron-l3-agent.service
systemctl restart neutron-dhcp-agent.service
systemctl restart openvswitch.service 
systemctl restart neutron-metering-agent.service

이후 관련된 서비스를 모두 재시작하였다

Instance : No bootable device

openstack console log show 8013dacc-b5e3-48e3-b9df-08558f074b28

이후 해당 인스턴스의 로그에 아무것도 나오지 않는 것을 이상하게 여겨
위와 같이 Horizon Dashboard 콘솔에서 No bootable device이었다는 상황을 확인할 수 있었다.

yum install -y wget
wget http://download.cirros-cloud.net/0.6.2/cirros-0.6.2-x86_64-disk.img

기존 curl -o로 이미지 파일을 받을 경우 단순 텍스트 파일로 저장되기 때문에 wget을 통해서 이미지를 다시 다운로드 받고

https://chunghyup.tistory.com/82

$ openstack image list
+--------------------------------------+--------+--------+
| ID                                   | Name   | Status |
+--------------------------------------+--------+--------+
| 192715c9-65b6-4682-bbf5-d08c21e99d77 | cirros | active |
+--------------------------------------+--------+--------+

$ openstack image delete 192715c9-65b6-4682-bbf5-d08c21e99d77

$ openstack image create --disk-format qcow2 --container-format bare --public --file ./cirros-0.6.2-x86_64-disk.img cirros
+------------------+--------------------------------------------------------------------------------------------------------------------------------------------+
| Field            | Value                                                                                                                                      |
+------------------+--------------------------------------------------------------------------------------------------------------------------------------------+
| container_format | bare                                                                                                                                       |
| created_at       | 2025-01-14T11:07:09Z                                                                                                                       |
| disk_format      | qcow2                                                                                                                                      |
| file             | /v2/images/71905aa9-d10a-4bec-92ec-25ac00b0f81c/file                                                                                       |
| id               | 71905aa9-d10a-4bec-92ec-25ac00b0f81c                                                                                                       |
| min_disk         | 0                                                                                                                                          |
| min_ram          | 0                                                                                                                                          |
| name             | cirros                                                                                                                                     |
| owner            | 8dc84595f82b4e6dac4a18f990b05c6d                                                                                                           |
| properties       | os_hidden='False', owner_specified.openstack.md5='', owner_specified.openstack.object='images/cirros', owner_specified.openstack.sha256='' |
| protected        | False                                                                                                                                      |
| schema           | /v2/schemas/image                                                                                                                          |
| status           | queued                                                                                                                                     |
| tags             |                                                                                                                                            |
| updated_at       | 2025-01-14T11:07:09Z                                                                                                                       |
| visibility       | public                                                                                                                                     |
+------------------+--------------------------------------------------------------------------------------------------------------------------------------------+

위와 같이 이미지를 새로 생성한 이후

openstack server delete test-instance
openstack server create --flavor m1.small --image cirros --network intnet test-instance

인스턴스 또한 종료시키고 새롭게 생성해주었다

nova.exception.NoValidHost: No valid host was found.

OpenStack이 인스턴스를 배치할 수 있는 적합한 호스트를 찾지 못했음을 나타낸다
이 문제는
1. Nova 스케줄러가 적절한 컴퓨트 호스트를 찾지 못하거나
2. 호스트가 인스턴스를 실행하기 위한 리소스를 제공하지 못할 때 발생

따라서 Horizon Dashboard 종료하고

free -m

Host 머신에서도 메모리를 추가적으로 메모리를 확보한 이후 인스턴스를 다시 생성해주었다.

Exceeded maximum number of retries. Exhausted all hosts available for retrying build failures

해당 오류 또한 메모리가 부족하여 나타나는 현상이었기에

$ openstack console log show test-instance
...
=== network info ===
if-info: lo,up,127.0.0.1,8,,
if-info: eth0,up,10.5.5.104,24,fe80::f816:3eff:fe41:2108/64,
ip-route:default via 10.5.5.1 dev eth0  src 10.5.5.104  metric 1002 
ip-route:10.5.5.0/24 dev eth0 scope link  src 10.5.5.104  metric 1002 
ip-route:169.254.169.254 via 10.5.5.1 dev eth0  src 10.5.5.104  metric 1002 
ip-route6:fe80::/64 dev eth0  metric 256 
ip-route6:multicast ff00::/8 dev eth0  metric 256 
=== datasource: ec2 net ===
instance-id: i-0000000b
name: N/A
availability-zone: nova
local-hostname: test-instance.novalocal
launch-index: 0
=== cirros: current=0.6.2 latest=0.6.2 uptime=25.23 ===
  ____               ____  ____
 / __/ __ ____ ____ / __ \/ __/
/ /__ / // __// __// /_/ /\ \ 
\___//_//_/  /_/   \____/___/ 
   http://cirros-cloud.net

메모리를 확보하고 인스턴스를 실행시킨 이후 CirrOS 이미지의 인스턴스가 정상적으로 구동되는 것을 확인할 수 있었으며

ip netns exec qrouter-4358fd19-62ea-42d3-be7d-0ef3140dc249 ping 10.5.5.104
PING 10.5.5.104 (10.5.5.104) 56(84) bytes of data.
64 bytes from 10.5.5.104: icmp_seq=1 ttl=64 time=1.58 ms
64 bytes from 10.5.5.104: icmp_seq=2 ttl=64 time=1.33 ms
...

이전에 생성한 Gateway의 Namespace에서 ICMP 요청이 정상적으로 동작하는 것을 확인할 수 있었다.

ip netns exec qrouter-4358fd19-62ea-42d3-be7d-0ef3140dc249 ssh cirros@10.5.5.104
cirros@10.5.5.104's password: # gocubsgo
$ pwd
/home/cirros

위와 같이 정상적으로 SSH를 통해 접근할 수 있었다.

$ ping 10.5.5.1
PING 10.5.5.1 (10.5.5.1) 56(84) bytes of data.
64 bytes from 10.5.5.1: icmp_seq=1 ttl=64 time=1.70 ms
64 bytes from 10.5.5.1: icmp_seq=2 ttl=64 time=2.07 ms

이후 인스턴스 내에서 게이트웨이로의 연결 또한 확인한다.

$ openstack subnet list
+--------------------------------------+---------------+--------------------------------------+-------------+
| ID                                   | Name          | Network                              | Subnet      |
+--------------------------------------+---------------+--------------------------------------+-------------+
| 204c4ca0-3cba-4668-8b55-2ab7e1a132a2 | subnet1       | 7b34e663-7d34-4c5c-b037-a7d5b47187d2 | 10.5.5.0/24 |
| 5a7d4bd3-011c-4c42-9f77-15c1fa9d8b83 | public_subnet | 61af13ca-6eb4-4916-9fe7-2e28d401e2bd | 10.0.2.0/24 |
+--------------------------------------+---------------+--------------------------------------+-------------+

인스턴스는 External Network에서 Reachable 해야만 추가적인 작업을 진행할 수 있다.

이는 Floating IP를 통해 달성될 수 있는데, 우선 위와 같이 public_subnet의 ID를 확인하고

# openstack floating ip create --subnet <subnet_ID> <network_ID>
$ openstack floating ip create --subnet 5a7d4bd3-011c-4c42-9f77-15c1fa9d8b83 61af13ca-6eb4-4916-9fe7-2e28d401e2bd
+---------------------+--------------------------------------+
| Field               | Value                                |
+---------------------+--------------------------------------+
| created_at          | 2025-01-15T03:24:10Z                 |
| description         |                                      |
| dns_domain          | None                                 |
| dns_name            | None                                 |
| fixed_ip_address    | None                                 |
| floating_ip_address | 10.0.2.118                           |
| floating_network_id | 61af13ca-6eb4-4916-9fe7-2e28d401e2bd |
| id                  | 549b391c-9074-485a-8694-38552bab5030 |
| name                | 10.0.2.118                           |
| port_details        | None                                 |
| port_id             | None                                 |
| project_id          | 8dc84595f82b4e6dac4a18f990b05c6d     |
| qos_policy_id       | None                                 |
| revision_number     | 0                                    |
| router_id           | None                                 |
| status              | DOWN                                 |
| subnet_id           | 5a7d4bd3-011c-4c42-9f77-15c1fa9d8b83 |
| tags                | []                                   |
| updated_at          | 2025-01-15T03:24:10Z                 |
+---------------------+--------------------------------------+

위와 같이 Floating IP를 생성해준 후

openstack server add floating ip test-instance 10.0.2.118

이전에 생성한 인스턴스에 Floating IP를 할당하여준다.

$ ping 10.0.2.118
PING 10.0.2.118 (10.0.2.118) 56(84) bytes of data.
64 bytes from 10.0.2.118: icmp_seq=1 ttl=63 time=3.91 ms
64 bytes from 10.0.2.118: icmp_seq=2 ttl=63 time=2.36 ms
64 bytes from 10.0.2.118: icmp_seq=3 ttl=63 time=1.08 ms

default NS에서 해당 인스턴스로 Floating IP로 접근할 수 있는 것을 볼 수 있다.

$ ssh cirros@10.0.2.118
cirros@10.0.2.118's password: 
$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc pfifo_fast qlen 1000
    link/ether fa:16:3e:41:21:08 brd ff:ff:ff:ff:ff:ff
    inet 10.5.5.104/24 brd 10.5.5.255 scope global dynamic noprefixroute eth0
       valid_lft 82695sec preferred_lft 71895sec
    inet6 fe80::f816:3eff:fe41:2108/64 scope link 
       valid_lft forever preferred_lft forever
$

SSH또한 정상적으로 작동하며 인스턴스 내부에서 네트워크 인터페이스를 확인할 수 있다.

$ openstack ip availability list --project admin
+--------------------------------------+------------------+-----------+----------+
| Network ID                           | Network Name     | Total IPs | Used IPs |
+--------------------------------------+------------------+-----------+----------+
| 61af13ca-6eb4-4916-9fe7-2e28d401e2bd | external_network |       101 |        2 |
| 7b34e663-7d34-4c5c-b037-a7d5b47187d2 | intnet           |       253 |        3 |
+--------------------------------------+------------------+-----------+----------+

OpenStack 프로젝트에 할당된 네트워크의 IP 사용 상태를 확인하는 명령어는 위와 같다

openstack command list | grep openstack.network -A 100
  • Address Groups: 네트워크 정책 또는 구성에 사용할 IP 주소 그룹을 관리
  • Address Scopes: 라우팅 및 IP 관리를 위해 여러 서브넷에 걸쳐 공유되는 주소 범위를 정의
  • Floating IPs: 외부 액세스를 위해 인스턴스에 공인 IP를 할당, 관리, 라우팅
  • IP Availability: 네트워크 또는 서브넷 내 IP 주소의 가용성을 확인 및 표시
  • Local IPs: 특정 컴퓨트 호스트에 로컬로 사용되는 IP를 설정 및 관리
  • Network Agents: 네트워크 작업을 담당하는 Neutron 에이전트를 관리 및 구성
  • Networks: 네트워크를 생성, 삭제 및 설정하여 가상 네트워크를 구성
  • Network Flavors: 네트워크의 특성과 동작을 정의하고 관련 설정 관리
  • Network QoS: 네트워크 트래픽 품질을 보장하기 위한 정책 및 규칙 관리
  • Network RBAC: 네트워크 리소스에 대한 역할 기반 접근 제어 설정 및 관리
  • Network Segments: 네트워크 세그먼트를 생성, 삭제 및 설정하여 물리적 또는 논리적 네트워크를 분리
  • Network Service Providers: 네트워크 서비스 제공자를 나열 및 관리
  • Ports: 네트워크 포트를 생성, 삭제 및 설정
  • Routers: 라우터를 생성, 삭제 및 설정하여 네트워크 간 트래픽을 라우팅
  • Security Groups: 보안 그룹 및 규칙을 생성, 삭제 및 설정하여 네트워크 트래픽을 제어
  • Subnets: 서브넷을 생성, 삭제 및 설정하여 네트워크 내 IP 범위를 관리

0개의 댓글