---
title: "OpenStack 수동 설치 4 — Placement 자원 추적 서비스 설치"
description: "Placement 서비스는 compute 자원의 재고와 할당을 추적하기 위해 DB, 서비스 사용자, API 엔드포인트, Apache WSGI 설정 및 CLI 검증을 순차적으로 구성하고 확인하는 과정을 안내한다."
date: "2026-08-04"
last_modified: "2026-08-27T12:29:00.000Z"
type: "Post"
tags:
  - "openstack"
  - "install"
  - "ubuntu"
  - "mysql"
categories:
  - "📗 Docs"
series:
  - "오픈스택 설치"
canonical_url: "https://blog.pieroot.xyz/openstack-placement"
markdown_url: "https://blog.pieroot.xyz/openstack-placement.md"
---

# OpenStack 수동 설치 4 — Placement 자원 추적 서비스 설치

Placement 서비스는 compute 자원의 재고와 할당을 추적하기 위해 DB, 서비스 사용자, API 엔드포인트, Apache WSGI 설정 및 CLI 검증을 순차적으로 구성하고 확인하는 과정을 안내한다.

Glance까지 설치했다면 Nova를 올리기 전에 Placement를 준비해야 한다. Placement는 compute 노드가 가진 vCPU, 메모리, 디스크 재고와 인스턴스가 사용한 자원을 추적한다.

이번 글에서는 **Placement DB, 서비스 사용자, API endpoint, Apache WSGI, CLI 검증**을 순서대로 구성한다.

### 이 글에서 다루는 내용

- Resource Provider, Resource Class, Inventory, Allocation, Trait

- Placement DB와 서비스 사용자 생성

- 포트 8778 endpoint 등록

- `placement.conf` 설정과 DB 동기화

- `placement-status`와 osc-placement 검증

> **전제 환경**
> 
> - OpenStack 2026.1 (Gazpacho)
> 
> - Keystone과 Glance 설치 완료
> 
> - `~/admin-openrc` 사용 가능
> 
> - `PLACEMENT_DBPASS`, `PLACEMENT_PASS`는 실제 비밀번호로 교체

### Placement의 역할

- **Resource Provider**: 자원을 제공하는 주체. 일반적으로 compute 노드다.

- **Resource Class**: `VCPU`, `MEMORY_MB`, `DISK_GB` 같은 자원 종류다.

- **Inventory**: provider가 보유한 자원 총량이다.

- **Allocation**: 인스턴스가 실제로 점유한 자원이다.

- **Trait**: SSD, CPU 기능처럼 수량으로 표현하기 어려운 특성이다.

```mermaid
flowchart LR
    S["nova-scheduler"] -->|후보 조회| P["Placement API :8778"]
    C["nova-compute"] -->|재고 보고| P
    P --> DB[("MariaDB: placement")]
```

### 1. Placement 데이터베이스 생성

```bash
sudo mysql
```

```sql
CREATE DATABASE placement;
CREATE USER 'placement'@'localhost' IDENTIFIED BY 'PLACEMENT_DBPASS';
GRANT ALL PRIVILEGES ON placement.* TO 'placement'@'localhost';
CREATE USER 'placement'@'%' IDENTIFIED BY 'PLACEMENT_DBPASS';
GRANT ALL PRIVILEGES ON placement.* TO 'placement'@'%';
FLUSH PRIVILEGES;
EXIT;
```

```bash
mysql -u placement -p -e "SHOW DATABASES;"
```

### 2. 서비스 사용자 생성

```bash
source ~/admin-openrc
openstack user create --domain default --password-prompt placement
openstack role add --project service --user placement admin
```

![image](https://blog.pieroot.xyz/api/image-proxy?id=5bbb1561-54ee-4c3f-9762-4083ad64a8f1&kind=s3&pageId=b3686e6d-31ab-4b98-b398-0eb66a2c1222&source=block&blockId=c4714ecd-c0ae-48bb-a954-6ac5f72a7a10)

### 3. 서비스와 엔드포인트 등록

```bash
openstack service create --name placement \
  --description "Placement API" placement

openstack endpoint create --region RegionOne placement public \
  http://192.168.56.101:8778
openstack endpoint create --region RegionOne placement internal \
  http://controller:8778
openstack endpoint create --region RegionOne placement admin \
  http://controller:8778
```

![image](https://blog.pieroot.xyz/api/image-proxy?id=236688f6-0347-4a70-9606-1527780ca907&kind=s3&pageId=b3686e6d-31ab-4b98-b398-0eb66a2c1222&source=block&blockId=f424797b-f3e6-44c2-8d63-0fcfaf9ab13a)

```bash
openstack endpoint list --service placement
```

### 4. 패키지 설치

```bash
sudo apt install -y placement-api
```

### 5. `placement.conf` 설정

`/etc/placement/placement.conf`의 주요 항목을 설정한다.

```
[placement_database]
connection = mysql+pymysql://placement:PLACEMENT_DBPASS@controller/placement

[api]
auth_strategy = keystone

[keystone_authtoken]
auth_url = http://controller:5000/v3
memcached_servers = controller:11211
auth_type = password
project_domain_name = Default
user_domain_name = Default
project_name = service
username = placement
password = PLACEMENT_PASS
```

> Placement의 DB 섹션은 `[database]`가 아니라 `[placement_database]`다. 서비스별 설정 이름을 추측하지 말고 공식 문서와 실제 파일을 확인해야 한다.

### 6. DB 동기화와 Apache 재시작

```bash
sudo su -s /bin/sh -c "placement-manage db sync" placement
sudo apache2ctl configtest
sudo systemctl restart apache2
```

```bash
sudo mysql -e "USE placement; SHOW TABLES;" | head
curl http://controller:8778
ss -lntp | grep 8778
```

Placement는 Keystone처럼 Apache `mod_wsgi` 아래에서 동작한다. 장애가 발생하면 별도 Placement systemd 서비스보다 Apache 로그를 먼저 본다.

### 7. 상태 점검

```bash
source ~/admin-openrc
sudo placement-status upgrade check
```

![image](https://blog.pieroot.xyz/api/image-proxy?id=840fb0c8-0081-452c-870f-369147cb122a&kind=s3&pageId=b3686e6d-31ab-4b98-b398-0eb66a2c1222&source=block&blockId=7096bcd3-c06d-4679-b0ed-deaa99b0bee9)

각 검사 항목이 `Success`면 DB 상태가 정상이다.

### 8. Placement CLI 검증

```bash
sudo apt install -y python3-osc-placement
```

```bash
openstack --os-placement-api-version 1.2 \
  resource class list --sort-column name

openstack --os-placement-api-version 1.6 \
  trait list --sort-column name
```

`VCPU`, `MEMORY_MB`, `DISK_GB`와 `COMPUTE_*` trait가 조회되면 API와 인증이 정상이다.

이 시점에 `openstack resource provider list`가 비어 있어도 정상이다. 아직 `nova-compute`가 Placement에 자원 정보를 보고하지 않았기 때문이다.

### 오류를 확인하는 순서

```bash
sudo apache2ctl configtest
sudo tail -100 /var/log/apache2/error.log
```

### 핵심 정리

1. Placement는 compute 자원 재고와 할당을 추적한다.

1. API는 포트 8778에서 Apache WSGI로 제공된다.

1. Nova 설치 전에는 resource provider 목록이 비어 있는 것이 정상이다.

### 재발 방지 체크리스트

- [ ] Placement DB와 사용자가 생성됐다.

- [ ] Keystone 서비스 사용자와 admin 역할이 준비됐다.

- [ ] placement endpoint 3종이 등록됐다.

- [ ] DB 동기화 후 테이블이 존재한다.

- [ ] 포트 8778에서 JSON 응답을 받는다.

- [ ] resource class와 trait가 조회된다.

### 다음 단계

다음 설치 단계는 **Nova**다. controller의 API와 scheduler를 구성한 뒤 compute1의 `nova-compute`를 연결하고, Placement에 resource provider가 나타나는지 확인한다.

### 참고 자료

- [Placement Installation Guide](https://docs.openstack.org/placement/2026.1/install/)

- [Placement Verify Installation](https://docs.openstack.org/placement/2026.1/install/verify.html)
