---
# System prepended metadata

title: 安裝OpenStack並建置虛擬機
tags: [雲端技術實務]

---

# 安裝OpenStack並建置虛擬機
:::success
**參考資料**
https://hackmd.io/@whitefir473/B1lUqeszC
https://hackmd.io/@109213067/BkECVRMbn#%E5%AF%A6%E4%BD%9C
https://hackmd.io/@FrCgWmOfTYe5ewU0YFGFmQ/rJy9bDyr2
https://hackmd.io/@Ox4EUOoZSiO_gWIfo6pEAg/Hy93VDP4n#OpenStack
:::



## 1. 緣由
在實驗伺服器(IP為規定的第一組IP)安裝OpenStack並建置一個CirrOS虛擬機(綁對外IP為伺服器第二組IP)，並將報告寫至hackmd網站，且公開文章權限並將連結設定到作業截圖內。
## 2. 系統簡介
* **伺服器OS：** Ubuntu 22.04 LTS Server Vision
* **Cloud Image：** CirrOS (cirros-0.6.2-x86_64-disk.img)
* **伺服器IP：** 10.2.200.142
* **對外IP：** 10.2.200.144

## 3. 安裝過程(虛擬機建立hostname改為學號，IP設定正確並確認網路可通)
### 安裝Devstack
#### 1. 檢查更新
```cmd=
sudo apt-get update
sudo apt-get upgrade -y
```
#### 2. 建立特權使用者：stack
```cmd=
sudo useradd -s /bin/bash -d /opt/stack -m stack
sudo chmod +x /opt/stack
echo "stack ALL=(ALL) NOPASSWD: ALL" | sudo tee /etc/sudoers.d/stack
```
#### 3. 登入 stack 使用者
`sudo -u stack -i`
![image](https://hackmd.io/_uploads/S15ENgGXA.png)

#### 4. 安裝 git 套件 && 下載 github 上的 devstack
```cmd=
sudo apt-get install -y git
git clone https://opendev.org/openstack/devstack
```

#### 5. 切換到 devstack 文件夾中 && 建立 local.conf 文件
```cmd=
cd devstack
sudo nano local.conf
```
![image](https://hackmd.io/_uploads/BydrnbjGA.png)

:::success
local.conf 內容如下：
```cmd=
[[local|localrc]]
ADMIN_PASSWORD=secret
DATABASE_PASSWORD=$ADMIN_PASSWORD
RABBIT_PASSWORD=$ADMIN_PASSWORD
SERVICE_PASSWORD=$ADMIN_PASSWORD
HOST_IP=10.2.200.142
```
:::
![image](https://hackmd.io/_uploads/rJzv2ZofR.png)
#### 6. 開始安裝 openstack (因網路問題啟動會花較久的時間)
`./stack.sh`

![image](https://hackmd.io/_uploads/BJTR0-oMC.png)

### OpenStack
:::success
瀏覽器進入 http://10.2.200.142/dashboard 到登錄介面

* **用戶名稱：** admin or demo (老師建議用demo 但設定子網域要使用到admin)
* **密碼：** secret (上方local.conf設定的密碼)
:::
![image](https://hackmd.io/_uploads/BytKTgizC.png)
![image](https://hackmd.io/_uploads/Sk5XxGozA.png)

### 建立虛擬機
#### 1. 建立虛擬外網(須與實體內網網段一樣)
:::info
**在現有public上，直接新增一子網路**

Admin(管理員) -> Network(網路) -> Networks(網路) -> public -> 子網域 -> 新增子網域
:::
![image](https://hackmd.io/_uploads/Sykk0T-X0.png)

![image](https://hackmd.io/_uploads/HJJgRTWmA.png)

![image](https://hackmd.io/_uploads/rka-RpWQ0.png)

#### 2. 橋接虛擬網卡到實體網卡
:::info
//把虛擬網卡橋接到實體網卡
`sudo microstack.ovs-vsctl add-port br-ex "實體網卡名稱"`

//清掉實體網卡的 IP，避免跟虛擬網卡 IP 重複
`sudo ip addr flush dev "實體網卡名稱"`

//把原本實體網卡的 IP 位址加到虛擬網卡上
`sudo ip addr add "實體網卡IP/網段數字" dev br-ex`

//啟用虛擬網卡
`sudo ip link set br-ex up `
:::
```cmd=
sudo ovs-vsctl add-port br-ex eno1 #可能需安裝ovs-vsctl
sudo ip addr flush dev eno1  #會斷網
```
![image](https://hackmd.io/_uploads/BJT-FGiGC.png)

**到server修改00-installer-config.yaml**
![image](https://hackmd.io/_uploads/H13DmzjzA.png)
```
network:
  version: 2
  renderer: networked
  ethernets:
    br-ex:
      dhcp4: no
      addresses:[10.2.200.142/25]
      gateway4: 10.2.200.239
      nameservers:
        search: []
        addresses: [8.8.8.8,  8.8.4.4]
    eno1:
      dhcp4: no
    eno2:
      dhcp4: true
```
![image](https://hackmd.io/_uploads/BkInVezm0.png)


**更新網路配置：**
`sudo netplan try`

接著繼續
```cmd=
sudo ip addr add 10.2.200.142/25 dev br-ex
sudo ip link set br-ex up
ip route
```
![image](https://hackmd.io/_uploads/rkDX6zizC.png)

#### 3. 另外新建網路(虛擬內網)
:::info
Admin(管理員) -> Network(網路) -> Networks(網路) -> Create Network(新增網路)
:::
![image](https://hackmd.io/_uploads/HkTB8R-QR.png)


> 虛擬內網網段可以自訂，不要跟實體網路一樣就好

![image](https://hackmd.io/_uploads/rJSkwRZXA.png)

![image](https://hackmd.io/_uploads/B1wgv0Z70.png)


#### 4.建立虛擬 router 連接虛擬內網和外網
:::info
Admin(管理員) -> Network(網路) -> Routers(路由器) -> Create Router(新增路由器)
:::

![image](https://hackmd.io/_uploads/Hy3ukCZQ0.png)


**建立對外閘道**
:::info
Admin(管理員) -> Network(網路) -> Routers(路由器) -> router -> 網路卡
:::

![image](https://hackmd.io/_uploads/ryaITAbmR.png)

#### 5.調整安全性群組
:::info
Project(專案) -> Network(網路) -> 安全性群組 -> 管理規則 -> 加入規則
:::

![image](https://hackmd.io/_uploads/B18y4kMQR.png)

![image](https://hackmd.io/_uploads/B1kGNJGmC.png)


#### 6.新增可用的floating IP
:::info
Admin(管理員) -> Network(網路) -> Floating IPs(浮動 IP) -> Allocate IP To Project(分配IP到專案)
:::

> 選擇從虛擬外網產生一個 floating IP

![image](https://hackmd.io/_uploads/BJWn-0-Q0.png)

#### 7.在虛擬內網建立虛擬機
:::info
Project(專案) -> Compute(運算) -> Instances(雲實例) -> Launch Instance(發動雲實例)
:::

![image](https://hackmd.io/_uploads/Bk9x-B4XR.png)


![image](https://hackmd.io/_uploads/HJOr7lr7C.png)

![image](https://hackmd.io/_uploads/HkP94CW7C.png)

![image](https://hackmd.io/_uploads/Bk_lHyf7A.png)


#### 8. 檢查網路拓樸並配對 floating IP 到虛擬機的虛擬內網 IP
:::info
Project(專案) -> Network(網路) -> Network Topology(網路拓撲)
:::
![image](https://hackmd.io/_uploads/Skwi7eHXC.png)



:::info
Project(專案) -> Network(網路) -> Floating IPs(浮動 IP) -> 找到剛才產生的 floating IP -> Associate(連結)
:::

![image](https://hackmd.io/_uploads/S15AmgBXA.png)

![image](https://hackmd.io/_uploads/H1OlEgHmA.png)


#### 9.測試連線虛擬機
##### 1.從cirrOS連外網
:::info
Project(專案) -> Compute(運算) -> Instances(雲實例) -> s1094845(雲實例名稱) -> 主控台
:::

![image](https://hackmd.io/_uploads/BJCFf1GmA.png)

:::success
**預設使用者** ： cirros
**密碼** ： gocubsgo
:::

![image](https://hackmd.io/_uploads/HkYdlxfQR.png)

##### 2.使用教室電腦cmd連線cirrOS

![image](https://hackmd.io/_uploads/Byk5ExSQ0.png)

##### 3.使用ubuntu server h01連線cirrOS
![image](https://hackmd.io/_uploads/Byr1SlrX0.png)


## 4. 檢查
1. 在實驗伺服器(IP為規定的第一組IP)安裝OpenStack並建置一個CirrOS虛擬機(綁對外IP為伺服器第二組IP)
* ![image](https://hackmd.io/_uploads/HJs9wlMQ0.png)
3. 虛擬機建立hostname改為學號，IP設定正確並確認網路可通
* ![image](https://hackmd.io/_uploads/SJbLLlzXC.png)

## 5. 結論
在安裝過程中遇到很多問題，如建立外網時，我們一開始直接新增網路，最後才發現要在現有public上直接新增子網路，而後面還發現Demo沒有在public建立子網路的權限，所以後面都是使用admin來做修改。