Module 07 Private Cloud 5 labs

Private Cloud Architecture: OpenStack, vSphere, Nutanix Overview

Kiến trúc private cloud toàn diện: control plane, tenant model, compute/storage/network/identity tích hợp, self-service portal và quota — nền tảng để vận hành IaaS nội bộ quy mô doanh nghiệp.

Công cụ thực hành OpenStack CLI (openstack), Azure CLI, VS Code, Git, Docker
Nền tảng OpenStack (DevStack/MicroStack), VMware vSphere, Azure Portal (lab mô phỏng)
Thời điểm phát hành 23/05/2026
Ngày biên soạn 23/05/2026
Người biên soạn Trần Văn Hòa — Microsoft Certified Trainer (MCT)

Mục tiêu học tập

1. Lý thuyết cốt lõi

1.1. Private Cloud — từ ảo hóa đến IaaS tự phục vụ

Private cloud không chỉ là "nhiều VM trên Hyper-V" — đó là lớp orchestration và self-service phía trên hypervisor, cho phép người dùng (developer, team) tự yêu cầu tài nguyên qua API/portal mà không cần admin can thiệp mỗi lần. Theo Multi-Cloud Strategy for Cloud Architects (Jeroen Mulder), cấu trúc này gồm ba tầng:

Kiến trúc 3 tầng Private Cloud

  • Infrastructure Layer — hardware (server, storage, network) + hypervisor (KVM, ESXi, Hyper-V). Không thay đổi thường xuyên.
  • Control Plane — phần mềm orchestration (OpenStack, vCenter, Nutanix Prism) nhận yêu cầu, lập lịch tài nguyên, gọi xuống hypervisor API. Đây là "não" của private cloud.
  • Tenant / Self-Service Layer — portal (Horizon, vSphere Client, Nutanix Prism Self-Service) hoặc CLI/API mà end-user dùng để tạo VM, network, volume mà không cần biết infrastructure bên dưới.

1.2. OpenStack — kiến trúc thành phần

OpenStack là nền tảng IaaS open-source phổ biến nhất cho private cloud. Mỗi thành phần là một service độc lập giao tiếp qua REST API và message queue (RabbitMQ/Oslo Messaging):

ServiceCode nameChức năngTương đương AWS
IdentityKeystoneAuthn/Authz, token, domain/projectIAM
ComputeNovaTạo/xóa VM, lập lịch trên compute nodeEC2
ImageGlanceLưu trữ và quản lý disk image (catalog)AMI / EC2 Image Builder
NetworkNeutronVirtual network, subnet, floating IP, security groupVPC
Block StorageCinderPersistent volume, snapshot, backupEBS
Object StorageSwiftDistributed object store (S3-compatible)S3
DashboardHorizonWeb UI self-service cho tenantAWS Console

1.3. Tenant Model — cô lập & phân quyền

Trong OpenStack, Domain là đơn vị tổ chức cấp cao nhất (vd: một công ty); Project (tenant) là đơn vị cô lập tài nguyên (vd: team DevOps, team Finance). Mỗi project có quota riêng, network riêng, không thấy tài nguyên của project khác. Role xác định quyền: admin (quản trị toàn hệ thống), member (tạo/quản lý VM trong project), reader (chỉ xem). Trong vSphere, tương đương là vCenter RBAC: Datacenter → Cluster → Resource Pool → VM Folder, mỗi cấp gán role riêng.

1.4. VMware vSphere & Nutanix — so sánh nhanh

Tiêu chíVMware vSphere 8Nutanix AOS / AHVOpenStack (KVM)
HypervisorESXi (proprietary)AHV (KVM-based, bundled)KVM / Xen / Hyper-V
Control PlanevCenter ServerPrism CentralNova + các services
StorageVMFS, vSAN (HCI)Nutanix DSF (HCI native)Ceph, LVM, NetApp…
Self-servicevRA (VMware Aria)Prism Self-ServiceHorizon, Heat
LicenseCommercial (Broadcom)CommercialOpen-source (Apache 2.0)
Phù hợpEnterprise đã có VMwareHCI, edge, SMB muốn đơn giảnTelco, cloud provider, research

1.5. Quota & Resource Governance

Quota là cơ chế ngăn một tenant "ăn" hết tài nguyên chung. OpenStack hỗ trợ quota trên nhiều chiều: instances (số VM tối đa), cores (vCPU), ram (MB), volumes, gigabytes, floating_ips, security_groups. Admin đặt quota per-project qua openstack quota set; khi tenant vượt quota, API trả HTTP 403 với message rõ ràng. Đây là nền tảng của chargeback/showback — đo chi phí tài nguyên theo team.

2. Thực hành (Labs)

📌 Môi trường lab: Các lab dưới đây dùng DevStack (cài nhanh trên Ubuntu 22.04 VM) hoặc MicroStack (snap package). Lệnh openstack CLI yêu cầu biến môi trường từ file admin-openrc.sh (DevStack tạo tự động tại ~/devstack/openrc). Nếu không có môi trường OpenStack, các bước có hướng dẫn mô phỏng tương đương bằng Azure CLI.
LAB-031

Thiết kế Private Cloud Tenant Model

OpenStack CLI · Azure CLI · VS Code

🎯 Mục tiêu: Tạo cấu trúc domain → project → user → role trong OpenStack (hoặc mô phỏng bằng Azure Resource Group / RBAC), đảm bảo team DevOps và team Finance hoàn toàn cô lập tài nguyên.

🧰 Công cụ / nền tảng: OpenStack CLI (openstack) với DevStack/MicroStack, hoặc Azure CLI (az) cho phần mô phỏng. VS Code + Git để lưu script.

📦 Chuẩn bị: DevStack đã cài trên Ubuntu 22.04 VM; hoặc Azure subscription với quyền Owner; OpenStack CLI: pip install python-openstackclient.

▶️ Các bước — OpenStack CLI:

# Load admin credentials
source ~/devstack/openrc admin admin

# 1. Tạo Domain "hoatranlab-corp"
openstack domain create hoatranlab-corp \
  --description "HoaTranLab Corporate Domain"

# 2. Tạo Project cho DevOps team
openstack project create devops-prod \
  --domain hoatranlab-corp \
  --description "DevOps Production Project"

# 3. Tạo Project cho Finance team
openstack project create finance-prod \
  --domain hoatranlab-corp \
  --description "Finance Production Project"

# 4. Tạo user cho DevOps team
openstack user create devops-user1 \
  --domain hoatranlab-corp \
  --password "DevOps@2026!" \
  --email [email protected]

# 5. Gán role "member" cho devops-user1 trong project devops-prod
openstack role add --project devops-prod \
  --project-domain hoatranlab-corp \
  --user devops-user1 \
  --user-domain hoatranlab-corp \
  member

# 6. Xác nhận cô lập: login bằng devops-user1, thử list project finance
openstack --os-username devops-user1 \
  --os-password "DevOps@2026!" \
  --os-project-name finance-prod \
  --os-user-domain-name hoatranlab-corp \
  --os-project-domain-name hoatranlab-corp \
  server list
# Output mong đợi: ERROR 403 – không có quyền truy cập finance-prod

# 7. Xem toàn bộ cấu trúc
openstack project list --domain hoatranlab-corp
openstack user list --domain hoatranlab-corp
openstack role assignment list --project devops-prod --names

▶️ Mô phỏng bằng Azure CLI (nếu không có OpenStack):

# Login Azure
az login

# 1. Tạo Resource Group cho DevOps (tương đương OpenStack Project)
az group create --name rg-devops-prod --location southeastasia
az group create --name rg-finance-prod --location southeastasia

# 2. Tạo Service Principal cho devops-user1
az ad sp create-for-rbac --name sp-devops-user1 \
  --role Contributor \
  --scopes /subscriptions/$(az account show --query id -o tsv)/resourceGroups/rg-devops-prod

# 3. Thử truy cập rg-finance-prod bằng service principal vừa tạo
# → Kết quả mong đợi: AuthorizationFailed

# 4. Tóm tắt cấu trúc
az group list --output table
az role assignment list --resource-group rg-devops-prod --output table

✅ Kết quả mong đợi: devops-user1 chỉ thấy tài nguyên trong devops-prod; không truy cập được finance-prod (HTTP 403); openstack project list trả về ≥2 project trong domain hoatranlab-corp.

🧹 Cleanup: openstack project delete devops-prod finance-prodopenstack user delete devops-user1; Azure: az group delete --name rg-devops-prod --yes --no-wait.

LAB-032

Tạo Catalog VM Image

OpenStack Glance CLI · Docker · Azure CLI

🎯 Mục tiêu: Upload disk image vào Glance (image catalog của OpenStack) và tạo catalog với metadata chuẩn để tenant có thể tự chọn image khi tạo VM — tương tự AMI catalog trên AWS.

🧰 Công cụ / nền tảng: OpenStack Glance CLI (openstack image); Docker (tạo image tùy chỉnh); tùy chọn Azure CLI + Azure Compute Gallery.

📦 Chuẩn bị: DevStack đang chạy; wget hoặc curl để tải cloud image; quyền admin OpenStack.

▶️ Các bước — OpenStack Glance:

source ~/devstack/openrc admin admin

# 1. Tải Ubuntu 22.04 cloud image
cd /tmp
wget https://cloud-images.ubuntu.com/jammy/current/jammy-server-cloudimg-amd64.img \
  -O ubuntu2204-cloud.img

# Kiểm tra format
file ubuntu2204-cloud.img
# Output: QEMU QCOW2 Image (v3), ...

# 2. Upload image vào Glance với metadata đầy đủ
openstack image create "Ubuntu-22.04-LTS" \
  --file /tmp/ubuntu2204-cloud.img \
  --disk-format qcow2 \
  --container-format bare \
  --public \
  --property os_distro=ubuntu \
  --property os_version=22.04 \
  --property hw_disk_bus=virtio \
  --property hw_vif_model=virtio \
  --property owner_specified.openstack.md5=$(md5sum /tmp/ubuntu2204-cloud.img | awk '{print $1}')

# 3. Upload thêm CentOS Stream 9
wget https://cloud.centos.org/centos/9-stream/x86_64/images/CentOS-Stream-GenericCloud-9-latest.x86_64.qcow2 \
  -O centos9-cloud.qcow2

openstack image create "CentOS-Stream-9" \
  --file /tmp/centos9-cloud.qcow2 \
  --disk-format qcow2 \
  --container-format bare \
  --public \
  --property os_distro=centos \
  --property os_version=9

# 4. Xem catalog image
openstack image list --public
# Output:
# +------+-------------------+--------+
# | ID   | Name              | Status |
# +------+-------------------+--------+
# | ...  | Ubuntu-22.04-LTS  | active |
# | ...  | CentOS-Stream-9   | active |
# +------+-------------------+--------+

# 5. Xem chi tiết metadata một image
openstack image show "Ubuntu-22.04-LTS"

# 6. Đặt image là private cho một project cụ thể
openstack image set "CentOS-Stream-9" --private
openstack image add project "CentOS-Stream-9" devops-prod
openstack image list --project devops-prod

▶️ Mô phỏng bằng Azure Compute Gallery (tùy chọn):

# Tạo Azure Compute Gallery (tương đương Glance catalog)
az sig create --resource-group rg-devops-prod \
  --gallery-name HoaTranLabImageGallery \
  --location southeastasia

# Tạo Image Definition
az sig image-definition create \
  --resource-group rg-devops-prod \
  --gallery-name HoaTranLabImageGallery \
  --gallery-image-definition ubuntu-2204-server \
  --publisher HoaTranLab \
  --offer UbuntuServer \
  --sku 22_04-lts \
  --os-type Linux \
  --os-state Generalized \
  --hyper-v-generation V2

# Xem catalog
az sig image-definition list \
  --resource-group rg-devops-prod \
  --gallery-name HoaTranLabImageGallery \
  --output table

✅ Kết quả mong đợi: openstack image list hiển thị ≥2 image với status active; tenant devops-user1 có thể openstack image list và thấy image public + image được share cho project của mình; không thấy image private của project khác.

🧹 Cleanup: openstack image delete "CentOS-Stream-9"rm /tmp/*.img /tmp/*.qcow2 để giải phóng disk. Azure: az sig delete --gallery-name HoaTranLabImageGallery --resource-group rg-devops-prod.

LAB-033

Mô phỏng Self-Service VM Request

OpenStack CLI · Azure CLI · Azure Portal

🎯 Mục tiêu: Thực hiện toàn bộ luồng self-service — từ góc nhìn tenant user (không phải admin) — tạo network riêng, request VM từ catalog image, gán floating IP và SSH vào VM mà không cần admin can thiệp.

🧰 Công cụ / nền tảng: OpenStack CLI với user devops-user1 (từ LAB-031); hoặc Azure CLI + Azure Portal với service principal.

📦 Chuẩn bị: Image "Ubuntu-22.04-LTS" đã có trong Glance (LAB-032); flavor m1.small đã tồn tại (DevStack tạo mặc định); key pair SSH đã tạo.

▶️ Các bước — OpenStack (luồng self-service đầy đủ):

# Switch sang tenant user (devops-user1 trong project devops-prod)
source ~/devstack/openrc devops-user1 devops-prod
# Hoặc:
export OS_USERNAME=devops-user1
export OS_PASSWORD="DevOps@2026!"
export OS_PROJECT_NAME=devops-prod
export OS_USER_DOMAIN_NAME=hoatranlab-corp
export OS_PROJECT_DOMAIN_NAME=hoatranlab-corp

# ---- BƯỚC 1: Tạo network riêng cho tenant ----
openstack network create devops-net
openstack subnet create devops-subnet \
  --network devops-net \
  --subnet-range 10.10.0.0/24 \
  --dns-nameserver 8.8.8.8

# ---- BƯỚC 2: Tạo router nối ra external network ----
openstack router create devops-router
openstack router set devops-router --external-gateway public
openstack router add subnet devops-router devops-subnet

# ---- BƯỚC 3: Tạo Security Group ----
openstack security group create sg-devops-web \
  --description "Web server security group"
openstack security group rule create sg-devops-web \
  --protocol tcp --dst-port 22 --remote-ip 0.0.0.0/0
openstack security group rule create sg-devops-web \
  --protocol tcp --dst-port 80 --remote-ip 0.0.0.0/0
openstack security group rule create sg-devops-web \
  --protocol icmp --remote-ip 0.0.0.0/0

# ---- BƯỚC 4: Tạo Key Pair ----
openstack keypair create devops-key > ~/.ssh/devops-key.pem
chmod 600 ~/.ssh/devops-key.pem

# ---- BƯỚC 5: Tạo VM (self-service request) ----
IMAGE_ID=$(openstack image show "Ubuntu-22.04-LTS" -f value -c id)
FLAVOR_ID=$(openstack flavor show m1.small -f value -c id)
NET_ID=$(openstack network show devops-net -f value -c id)

openstack server create vm-web-01 \
  --image $IMAGE_ID \
  --flavor $FLAVOR_ID \
  --network $NET_ID \
  --security-group sg-devops-web \
  --key-name devops-key \
  --wait

# Kiểm tra trạng thái
openstack server show vm-web-01 -f value -c status
# Output: ACTIVE

# ---- BƯỚC 6: Gán Floating IP ----
FLOAT_IP=$(openstack floating ip create public -f value -c floating_ip_address)
openstack server add floating ip vm-web-01 $FLOAT_IP
echo "VM accessible at: $FLOAT_IP"

# ---- BƯỚC 7: SSH vào VM ----
ssh -i ~/.ssh/devops-key.pem ubuntu@$FLOAT_IP \
  -o StrictHostKeyChecking=no \
  "hostname && uptime && cat /etc/os-release | grep PRETTY_NAME"
# Output mong đợi:
# vm-web-01
#  12:34:56 up 0 min,  1 user,  load average: 0.08, 0.02, 0.01
# PRETTY_NAME="Ubuntu 22.04.4 LTS"

▶️ Mô phỏng bằng Azure CLI:

# Login bằng service principal (tenant user)
az login --service-principal \
  --username $APP_ID --password $PASSWORD --tenant $TENANT_ID

# Tạo VM từ image marketplace (tương đương self-service)
az vm create \
  --resource-group rg-devops-prod \
  --name vm-web-01 \
  --image Ubuntu2204 \
  --size Standard_B1s \
  --admin-username ubuntu \
  --generate-ssh-keys \
  --public-ip-sku Standard \
  --output table

# Mở port 80
az vm open-port --port 80 --resource-group rg-devops-prod --name vm-web-01

# SSH
PUBLIC_IP=$(az vm show -d -g rg-devops-prod -n vm-web-01 --query publicIps -o tsv)
ssh ubuntu@$PUBLIC_IP "hostname && uptime"

✅ Kết quả mong đợi: VM trạng thái ACTIVE/Running; SSH thành công từ laptop qua floating IP/public IP; tenant user hoàn thành toàn bộ workflow mà không cần hỏi admin một lần nào; openstack server list của tenant chỉ thấy VM trong project của mình.

🧹 Cleanup: openstack server delete vm-web-01 && openstack floating ip delete $FLOAT_IP && openstack router remove subnet devops-router devops-subnet && openstack router delete devops-router && openstack network delete devops-net. Azure: az vm delete -g rg-devops-prod -n vm-web-01 --yes.

LAB-034

Thiết kế Quota cho Team

OpenStack CLI · Azure CLI · Azure Portal

🎯 Mục tiêu: Đặt quota tài nguyên (CPU, RAM, Volume, Floating IP) cho project devops-prod và finance-prod, sau đó xác nhận hệ thống từ chối yêu cầu vượt quota.

🧰 Công cụ / nền tảng: OpenStack CLI với admin credentials; Azure CLI + Azure Policy (mô phỏng quota bằng spending limit).

📦 Chuẩn bị: Project devops-prod và finance-prod đã tạo (LAB-031); admin credentials DevStack.

▶️ Các bước — OpenStack (admin đặt quota):

source ~/devstack/openrc admin admin

# 1. Xem quota hiện tại của project devops-prod
openstack quota show devops-prod
# Hiển thị tất cả limits: instances, cores, ram, volumes, gigabytes...

# 2. Đặt quota cho devops-prod (team DevOps — nhiều tài nguyên hơn)
openstack quota set devops-prod \
  --instances 10 \
  --cores 20 \
  --ram 51200 \
  --volumes 20 \
  --gigabytes 500 \
  --floating-ips 5 \
  --security-groups 10

# 3. Đặt quota cho finance-prod (team Finance — giới hạn thấp hơn)
openstack quota set finance-prod \
  --instances 3 \
  --cores 6 \
  --ram 12288 \
  --volumes 5 \
  --gigabytes 100 \
  --floating-ips 2 \
  --security-groups 5

# 4. Xác nhận quota đã áp dụng
openstack quota show devops-prod --detail
# Xem cột: In Use / Limit

# 5. Kiểm tra vượt quota: Login bằng finance-user, tạo VM vượt limit
source ~/devstack/openrc finance-user finance-prod
# Tạo 4 VM (vượt limit 3 instances)
for i in 1 2 3 4; do
  openstack server create test-vm-$i \
    --image "Ubuntu-22.04-LTS" \
    --flavor m1.tiny \
    --network finance-net \
    --wait 2>&1 | tail -5
done
# VM thứ 4: Error 403: Quota exceeded for instances: Requested 1, but already used 3/3

# 6. Xem usage hiện tại
openstack limits show --absolute
# quotaInstances: 3/3 — maxTotalInstances: 3

▶️ Mô phỏng bằng Azure Policy (Budget Alert):

# Tạo Budget cho resource group (tương đương quota cost)
az consumption budget create \
  --account-name rg-devops-prod \
  --budget-name budget-devops-monthly \
  --amount 500 \
  --time-grain Monthly \
  --start-date 2026-05-01 \
  --end-date 2027-05-01 \
  --category Cost \
  --resource-group rg-devops-prod

# Xem usage hiện tại
az consumption usage list \
  --resource-group rg-devops-prod \
  --top 10 \
  --output table

# Đặt Azure Policy để giới hạn VM size (chỉ cho phép B-series và D2s)
az policy definition create \
  --name allowed-vm-skus-devops \
  --display-name "Allowed VM SKUs for DevOps" \
  --description "Restrict VM sizes to cost-effective SKUs" \
  --rules '{
    "if": {
      "allOf": [
        {"field": "type", "equals": "Microsoft.Compute/virtualMachines"},
        {"not": {"field": "Microsoft.Compute/virtualMachines/sku.name",
                 "in": ["Standard_B1s","Standard_B2s","Standard_D2s_v3","Standard_D4s_v3"]}}
      ]
    },
    "then": {"effect": "deny"}
  }' \
  --mode All \
  --output table

✅ Kết quả mong đợi: openstack quota show devops-prod hiển thị đúng các limit đã đặt; VM thứ 4 trong finance-prod bị từ chối với message "Quota exceeded"; openstack limits show --absolute hiển thị used/max rõ ràng.

🧹 Cleanup: Xóa VM test: openstack server list | grep test-vm | awk '{print $2}' | xargs openstack server delete. Reset quota về default: openstack quota delete devops-prod.

LAB-035

Viết Runbook Provisioning Private Cloud

VS Code · Git · CLI · Azure Portal

🎯 Mục tiêu: Viết runbook vận hành chuẩn SRE cho quy trình provisioning VM mới trên private cloud (OpenStack hoặc vSphere), bao gồm đủ 6 mục: tổng quan, kiến trúc, deploy/rollback, health check, xử lý sự cố, on-call.

🧰 Công cụ / nền tảng: VS Code (Markdown), Git, CLI tools đã cài ở các lab trước.

📦 Chuẩn bị: Git repo từ Module 01 LAB-001 (hoặc tạo mới); VS Code với Markdown Preview.

▶️ Các bước:

# 1. Tạo thư mục runbooks trong repo
mkdir -p ~/devops-docs/runbooks
cd ~/devops-docs/runbooks
code runbook-private-cloud-provisioning.md

Nội dung runbook (cấu trúc bắt buộc):

# Runbook: VM Provisioning — Private Cloud (OpenStack)
**Version:** 1.0 | **Owner:** DevOps Team | **Last Updated:** 2026-05-23
**Severity:** P3 (provisioning), P1 nếu ảnh hưởng production

---

## 1. Tổng quan Service & Owner
- **Service:** Self-service VM Provisioning via OpenStack Nova
- **Affected Teams:** DevOps, Finance, QA
- **Owner:** [email protected]
- **On-call rotation:** PagerDuty schedule "private-cloud-ops"

---

## 2. Kiến trúc & Dependencies
- Control Plane: OpenStack (Nova + Neutron + Glance + Keystone + Cinder)
- Hypervisor: KVM trên 3 compute nodes (cn01, cn02, cn03)
- Storage: Ceph cluster (3 nodes, replicas=2)
- Network: Neutron ML2 + Open vSwitch, uplink trunked VLAN 10/20/30
- **Critical paths:** Keystone down → tất cả API request fail; Ceph degraded → slow provisioning

---

## 3. Cách Deploy VM (Normal Provisioning)

### Pre-conditions:
- [ ] Quota còn đủ (kiểm tra: `openstack quota show <project> --detail`)
- [ ] Image trong catalog là active (`openstack image show <name> -c status`)
- [ ] Compute node health OK (`openstack hypervisor list --long`)

### Các bước:
```bash
# Bước 1: Xác nhận quotas
openstack quota show $PROJECT --detail | grep -E "instances|cores|ram"

# Bước 2: Tạo VM
openstack server create $VM_NAME \
  --image $IMAGE --flavor $FLAVOR \
  --network $NETWORK --security-group $SG \
  --key-name $KEYPAIR --wait

# Bước 3: Gán floating IP (nếu cần external access)
FREEIP=$(openstack floating ip list --status DOWN -f value -c "Floating IP Address" | head -1)
[ -z "$FREEIP" ] && FREEIP=$(openstack floating ip create public -f value -c floating_ip_address)
openstack server add floating ip $VM_NAME $FREEIP

# Bước 4: Verify
openstack server show $VM_NAME -c status -c addresses
```

### Rollback (nếu VM lỗi):
```bash
openstack server show $VM_NAME -c fault   # đọc error message
openstack server delete $VM_NAME          # xóa VM lỗi
# Kiểm tra compute node: openstack hypervisor show <cn-name>
```

---

## 4. Health Check & Dashboard

| Lệnh | Mong đợi |
|------|----------|
| `openstack service list` | tất cả services status = enabled |
| `openstack compute service list` | nova-compute trên mọi node Up |
| `openstack hypervisor stats show` | free_ram_mb > 4096 |
| `openstack network agent list` | tất cả agents Alive |
| `ceph -s` | HEALTH_OK, no degraded PGs |

**Dashboard:** Horizon → http://<controller>/dashboard (admin login)

---

## 5. Xử lý 3 Sự cố Thường gặp

### 5.1 VM stuck ở status BUILD >5 phút
```bash
# Symptom: openstack server show $VM_NAME → status: BUILD
# Check: xem log Nova
openstack server show $VM_NAME -c fault
ssh cn01 "sudo journalctl -u devstack@n-cpu -n 50 --no-pager | grep ERROR"
# Fix thường gặp: compute node hết RAM
openstack hypervisor list --long | grep -E "free_ram|Name"
# Fix: migrate sang node khác
openstack server migrate $VM_NAME --live cn02
```

### 5.2 VM ACTIVE nhưng không ping được
```bash
# Check floating IP đã gán chưa
openstack server show $VM_NAME -c addresses
# Check security group
openstack security group rule list $SG | grep icmp
# Nếu thiếu rule ICMP:
openstack security group rule create $SG \
  --protocol icmp --remote-ip 0.0.0.0/0
# Check neutron router
openstack router list
openstack router show $ROUTER | grep external_gateway
```

### 5.3 Quota exceeded khi tenant cần khẩn
```bash
# Symptom: Error 403 Quota exceeded
# Check usage thực tế
openstack quota show $PROJECT --detail
# Tăng tạm thời quota (cần approval P2)
openstack quota set $PROJECT --instances +5 --cores +10 --ram +20480
# Ghi log: ai approve, lý do, thời gian hết hiệu lực
echo "$(date) quota-increase $PROJECT by infra@hoatranlab approved-by manager@hoatranlab" >> /var/log/quota-changes.log
```

---

## 6. On-call & Escalation
- **L1 (0-15 phút):** Tự xử lý theo mục 5
- **L2 (15-60 phút):** Escalate tới #private-cloud-ops Slack
- **L3 (>60 phút / dữ liệu mất):** Gọi trực tiếp Lead Infra: 0917-516-878
- **PagerDuty policy:** `ack` trong 15 phút, `resolve` trong 4 giờ
# Commit runbook vào Git
cd ~/devops-docs
git add runbooks/runbook-private-cloud-provisioning.md
git commit -m "docs: add private cloud provisioning runbook v1.0"
git log --oneline -3

✅ Kết quả mong đợi: File runbook-private-cloud-provisioning.md đủ 6 mục; mỗi sự cố có lệnh kiểm tra + lệnh sửa cụ thể; git log hiển thị commit runbook; preview Markdown render đẹp trong VS Code.

🧹 Cleanup: Push lên GitHub làm portfolio: git push origin main. Không xóa — runbook này dùng lại trong Module 08+.

3. Tình huống doanh nghiệp thực tế

Bối cảnh

Một tập đoàn bán lẻ (5 công ty con) đang chạy VMware vSphere 7 thuần túy, mỗi VM request phải đi qua ticket hệ thống, xử lý 3–5 ngày. Sau khi Broadcom mua VMware và tăng phí license 4× năm 2024–2025, CTO muốn đánh giá migration sang OpenStack hoặc Nutanix để giảm chi phí và enable self-service.

Phân tích & Khuyến nghị

  • Vấn đề gốc: Không phải vSphere quá kém — mà thiếu self-service layer. Công ty chưa dùng vRA/Aria Automation nên mọi request đi qua con người.
  • Option A — OpenStack: Chi phí license = 0, nhưng đòi hỏi đội ops 3–5 người chuyên OpenStack, thời gian migration 12–18 tháng, risk cao nếu team yếu. Phù hợp nếu có ngân sách nhân sự.
  • Option B — Nutanix AOS + Prism Self-Service: License thấp hơn VMware mới, HCI đơn giản hóa storage, Prism Portal tích hợp self-service ngay. Migration từ vSphere sang AHV có tool hỗ trợ (Nutanix Move). 6–9 tháng.
  • Option C — Hybrid giữ vSphere + thêm vRA: Nhanh nhất (3 tháng), nhưng vẫn phụ thuộc VMware/Broadcom.
  • Kết luận: Jeroen Mulder (Multi-Cloud Strategy) khuyến nghị: ưu tiên capability (tự phục vụ, API-driven) hơn platform. Công ty này nên chọn B — Nutanix, vì đội IT nhỏ không đủ lực vận hành OpenStack; tự phục vụ sẽ giảm VM request lead time từ 5 ngày xuống dưới 10 phút.

📚 Nguồn tham khảo

Module 06: Virtualization VMware, Hyper-V, Proxmox Module 08: On-Prem Kubernetes
Zalo