---
# System prepended metadata

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

---

#  雲端技術實務 HW04 安裝OpenStack並建置虛擬機

👨‍🎓 學生: 1084837 廖經翰

## 🌟緣由

這次的紀錄是要來介紹openstack，openstack是一個開源的雲端運算平台，選擇撰寫這份報告是因為我認識到了openstack在建置和管理虛擬機環境方面的重要性，我希望透過這篇紀錄，來向讀者介紹openstack的優勢和功能，以及如何使用DevStack來安裝openstack環境與在openstack上建置虛擬機，以滿足企業和組織的彈性資源需求

## 💻系統簡介

* 主機編號: H11
* 主機IP: 10.2.200.211
* 主機OS: Ubuntu 22.04 LTS (server)
* 要建置的OS: Cirros 0.5.2
* Gateway: 10.2.200.239
* DNS-1: 140.130.81.11 
* DNS-2: 8.8.8.8 ( 或 8.8.4.4 )

## 🚀安裝過程

---

**<h3 style="text-align:center;">💡安裝openstack環境</h3>**

---

### Step-1 更新系統

用來確保在安裝openstack的時候讓主機保持最新的系統

```shell
$  sudo apt-get update
```

```shell
$  sudo apt-get -y dist-upgrade
```

### Step-2 增加 stack 使用者

新增一個 stack 使用者，之後的openstack環境部署與安裝都會在 stack 使用者的路徑底下操作 

```shell
$  sudo useradd -s /bin/bash -d /opt/stack -m stack
```

<center><img style="margin-top:auto;border:1px #eee;width:100%;" src="https://hackmd.io/_uploads/BJoh48JHh.png" /></center>

<br>

### Step-3 提高 stack 使用者的路徑與使用者權限

提高 stack 使用者底下的路徑 /opt/stack 之權限，避免之後下載openstack發生權限不足的問題

```shell
$  sudo chmod +x /opt/stack
```

<center><img style="margin-top:auto;border:1px #eee;width:100%;" src="https://hackmd.io/_uploads/B1GorUyBh.png" /></center>

<br>

讓 stack 使用者以root的權限使用，並且在執行各種指令的時候不用輸入密碼，這也是為了避免之後下載openstack發生權限不足的問題

```shell
$  echo "stack ALL=(ALL) NOPASSWD: ALL" | sudo tee /etc/sudoers.d/stack
```

<center><img style="margin-top:auto;border:1px #eee;width:100%;" src="https://hackmd.io/_uploads/SkmWULyr3.png" /></center>

<br>

### Step-4 進入 stack 使用者路徑並下載DevStack

進入 stack 使用者路徑，以便之後的操作

```shell
$  sudo -u stack -i
```

<center><img style="margin-top:auto;border:1px #eee;width:100%;" src="https://hackmd.io/_uploads/BJPsPUJr2.png" /></center>

<br>

因為這次我們主要用DevStack來安裝openstack，所以要先去下載DevStack的repository

```shell
$  git clone https://opendev.org/openstack/devstack
```

<center><img style="margin-top:auto;border:1px #eee;width:100%;" src="https://hackmd.io/_uploads/Ske2dLkB2.png" /></center>

<br>

### Step-5 新增與修改local.conf檔案

當下載好DevStack的repository之後，因為等等要安裝openstack是在devstack的路徑底下，所以要先進入devstack的路徑

```shell
$  cd devstack
```

<center><img style="margin-top:auto;border:1px #eee;width:100%;" src="https://hackmd.io/_uploads/HJl2vY8krn.png" /></center>

<br>

要安裝openstack必須要有local.conf檔案，這個檔案主要是用來設定openstack的一些選項與功能和參數的設定文件

可以使用文字編輯器來新增local.conf，這邊我用vim來編輯

```shell
$  vim local.conf
```

local.conf的內容我們必須設定openstack的密碼與自己的電腦IP，secret為之後要登入openstack dashboard的密碼

```txt=
[[local|localrc]]
ADMIN_PASSWORD=secret
DATABASE_PASSWORD=$ADMIN_PASSWORD
RABBIT_PASSWORD=$ADMIN_PASSWORD
SERVICE_PASSWORD=$ADMIN_PASSWORD
HOST_IP=10.2.200.211
```

<center><img style="margin-top:auto;border:1px #eee;width:70%;" src="https://hackmd.io/_uploads/r1iPTLySn.png" /></center>

<center>local.conf</center>

<br>

### Step-6 安裝openstack

當修改好 local.conf 文件檔案之後，接下來就可以安裝openstack，在安裝openstack的過程中可能需要等待一些時間，並且確保電腦有連上網路，這樣才不會導致安裝openstack失敗

```shell
$  ./stack.sh
```

<center><img style="margin-top:auto;border:1px #eee;width:70%;" src="https://hackmd.io/_uploads/SyZNywJH3.png" /></center>

<br>

### Step-7 開啟 openstack dashboard 

當安裝完openstack之後，如果沒有出現什麼錯誤，電腦會顯示 IP 與 openstack dashboard 的網址

<center><img style="margin-top:auto;border:1px #eee;width:100%;" src="https://hackmd.io/_uploads/ryLx-P1Sh.png" /></center>

<br>

只要在瀏覽器輸入 openstack dashboard 的網址，就可以順利進入 openstack dashboard 的登入畫面，只要可以正常看到 openstack dashboard 的登入畫面，那就表示openstack安裝成功 ! 接下來，我們就要在openstack上建置虛擬機

<center><img style="margin-top:auto;border:1px #eee;width:100%;outline: 2px solid;" src="https://hackmd.io/_uploads/H1wR-vyH3.png" /></center>

<br>

---

**<h3 style="text-align:center;">🌈在openstack上建置虛擬機</h3>**

---

### Step-1 登入openstack dashboard

openstack dashboard 預設的帳號為 admin ，然後 admin 的密碼為 secret ，這是在local.conf中設定的密碼

<center><img style="margin-top:auto;border:1px #eee;width:100%;outline: 2px solid;" src="https://hackmd.io/_uploads/H1wR-vyH3.png" /></center>

<br>

### Step-2 新增與設定Router(路由器)

一開始openstack有幫我們建立了一個 External Network(外網) 叫做 public ，所以要新增一個 Router來讓我們自己的網路可以順利的連接到 External Network(外網)，這樣之後才可以連上外面的網路，Router Name 可以自己取名，我這邊取 student-router ，然後 External Network 的部分要選取openstack幫我們建立的 public 網路

<center><img style="margin-top:auto;border:1px #eee;width:100%;outline: 2px solid;" src="https://hackmd.io/_uploads/H1HquDySh.png" /></center>

<br>

當建立好 Router(路由器) 之後，可以去查看 Network/Network Topology 中的圖片，可以發現我們剛剛建立好的 Router(路由器) 已經連接到外網了

<center><img style="margin-top:auto;border:1px #eee;width:50%;outline: 2px solid;" src="https://hackmd.io/_uploads/ryKU9D1Sn.png" /></center>

<br>

### Step-3 新增與設定我們自己的網路

接下來要新增我們自己的網路，點擊 Network/Networks 裡面的 Create Network ，Network Name 可以自己取名，我這邊取 student-net ，然後進行下一步 Subnet 的設定

<center><img style="margin-top:auto;border:1px #eee;width:100%;outline: 2px solid;" src="https://hackmd.io/_uploads/S1OAjwkHh.png" /></center>

<br>

進入 Subnet 的設定， Subnet Name 可以自己取名，我這邊取 student-subnet， Network Address 我寫學校的電腦IP位址， Gateway IP 也是寫學校的 Gateway ，然後進行下一步 Subnet Details 的設定

<center><img style="margin-top:auto;border:1px #eee;width:100%;outline: 2px solid;" src="https://hackmd.io/_uploads/S1jv2w1H3.png" /></center>

<br>


在 Subnet Details 之中，Allocation Pools是寫學校電腦可用的IP範圍， DNS Name Servers 也是寫學校的 DNS-1 和 DNS-2 ，當設定好之後就可以按下 Create

<center><img style="margin-top:auto;border:1px #eee;width:100%;outline: 2px solid;" src="https://hackmd.io/_uploads/HJYIADkrh.png" /></center>

<br>

當設定好並且新增一個我們自己的網路之後，可以再去 Network/Network Topology 中查看目前網路架構的圖片，可以發現剛剛新增了一個我們自己的網路，也就是綠色那一條 student-net

<center><img style="margin-top:auto;border:1px #eee;width:90%;outline: 2px solid;" src="https://hackmd.io/_uploads/H1aXgdkHn.png" /></center>

<br>

### Step-4 設定 Router(路由器) 的 Interfaces

現在已經有我們自己的網路，所以接下來需要把我們自己的網路連接上 External Network(外網) 也就是 藍色那一條 public ，這樣之後才可以順利的連上外面的網路，要把我們自己的網路連接到 public 我們需要使用 Router(路由器) 才可以成功連接到 public，所以要對 Router(路由器) 的 Interfaces 做設定，首先進入 Network/Routers ，可以看到我們之前建立的 student-router ， 點擊這個 student-router 就可以去設定該 router 的 Interfaces ， 然後點擊 Add Interface ， 進入 Interface 設定之後， Subnet的部分就選取剛剛建立的我們自己的網路，這樣就可以按下 Submit

<center><img style="margin-top:auto;border:1px #eee;width:100%;outline: 2px solid;" src="https://hackmd.io/_uploads/SJlM4OJB3.png" /></center>

<br>

當設定好 Router(路由器) 的 Interfaces 之後，可以再回到 Network/Network Topology 中查看目前網路架構的圖片，可以發現我們自己的網路(綠色)已經成功利用路由器來連接到 External Network(外網) 也就是 public(藍色)，這樣就表示我們可以順利的連上外面的網路

<center><img style="margin-top:auto;border:1px #eee;width:90%;outline: 2px solid;" src="https://hackmd.io/_uploads/HJ08HOySn.png" /></center>

<br>

### Step-5 新增SSH連線與ICMP的功能

因為之後創建的虛擬機要使用SSH來連線還有使用ICMP的功能讓虛擬機可以ping出去到外網，所以要去 Network/Security Groups 裡面設定這些功能，我們可以把想要開通的功能直接加入在openstack已經幫我們預設一個 Security Group 裡面的 Group ，也就是那個 default ，所以只要按下 Manage Rules 來設定要開通的功能就可以了

<center><img style="margin-top:auto;border:1px #eee;width:100%;outline: 2px solid;" src="https://hackmd.io/_uploads/Hkw_scJSh.png" /></center>

<br>

首先要讓虛擬機新增使用ICMP的功能，所以按下 Add Rule 來把需要的功能加入即可， Rule 的欄位我們就選擇 All ICMP ，並且按下 Add 之後就可以讓虛擬機有ICMP的功能

<center><img style="margin-top:auto;border:1px #eee;width:100%;outline: 2px solid;" src="https://hackmd.io/_uploads/BJDjRc1H3.png" /></center>

<br>

再來是要讓虛擬機新增使用SSH連線的功能，所以再按一次 Add Rule 來把SSH的功能加入即可， Rule 的欄位就選擇 SSH ，並且按下 Add 之後就可以讓虛擬機有SSH連線的功能

<center><img style="margin-top:auto;border:1px #eee;width:100%;outline: 2px solid;" src="https://hackmd.io/_uploads/rJiWJjJS3.png" /></center>

<br>

### Step-6 建置虛擬機設定

當以上前置作業都完成之後，我們就可以來建置虛擬機的一些設定，進入 Compute/Instances 並且按下 Launch Instance 來建置虛擬機的設定， Details 的部分只需要填寫 Instance Name 就好， Instance Name 可以自己取名，我這邊取我的學號，接下來進入到 Source

<center><img style="margin-top:auto;border:1px #eee;width:100%;outline: 2px solid;" src="https://hackmd.io/_uploads/BkiCxjJH3.png" /></center>

<br>

在 Source 這邊，主要是來選擇虛擬機建立的作業系統，我們就直接選擇openstack已經幫我們下載好的 cirros 來當作業系統，選擇好之後就可以進入 Flavor

<center><img style="margin-top:auto;border:1px #eee;width:100%;outline: 2px solid;" src="https://hackmd.io/_uploads/B1ZbMsyrn.png" /></center>

<br>

在 Flavor 這邊，主要是選擇虛擬機的設備資源，例如: RAM、CPU...等，我們就選擇一個最低的配置來當測試就可以了，當選擇完畢之後就可以進入 Networks

<center><img style="margin-top:auto;border:1px #eee;width:100%;outline: 2px solid;" src="https://hackmd.io/_uploads/ByDJXi1S2.png" /></center>

<br>

在 Networks 這邊，就選擇之前創建好的我們自己的網路，接下來就可以進入到 Security Groups 的設定

<center><img style="margin-top:auto;border:1px #eee;width:100%;outline: 2px solid;" src="https://hackmd.io/_uploads/H1ai7s1S3.png" /></center>

<br>

在 Security Groups 這邊，我們就選擇剛剛把SSH連線與ICMP的功能開通並且加入到openstack已經幫我們預設一個 Security Group 裡面的 Group ，也就是那個 default ，當選擇好之後就可以直接按下 Launch Instance 來建置虛擬機

<center><img style="margin-top:auto;border:1px #eee;width:100%;outline: 2px solid;" src="https://hackmd.io/_uploads/BJjdEj1Bh.png" /></center>

<br>

當建置好虛擬機之後，我們就可以在 Compute/Instances 裡面看到一個新的虛擬機，當 Power State 顯示 Running 的時候，就代表剛剛建置好的虛擬機已經成功建置並且開啟

<center><img style="margin-top:auto;border:1px #eee;width:100%;outline: 2px solid;" src="https://hackmd.io/_uploads/ryIYUikrh.png" /></center>

<br>

### Step-7 新增Floating IP給虛擬機

當虛擬機建置好之後，我們為了要讓虛擬機可以順利的上網，我們還需要配置一個 Floating(浮動) IP 給虛擬機使用，這個 Floating(浮動) IP 就是對外的 IP ，所以之後要SSH連線或是ping虛擬機的話，就要使用這個 Floating(浮動) IP ，所以點選剛剛建置好虛擬機的 Actions ，往下拉有一個 Associate floating IP 來設定 Floating IP ，在 IP Address 的欄位中， 如果顯示 No floating IP addresses allocated 的話，就表示還沒有建立 Floating IP ，所以只要按下旁邊的+號按鈕就可以建立一個 Floating IP

<center><img style="margin-top:auto;border:1px #eee;width:100%;outline: 2px solid;" src="https://hackmd.io/_uploads/BJjGqiyB2.png" /></center>

<br>

當按下+號按鈕的時候，就可以設定 Floating IP ，我們只要在 Pool 的地方選取 public 就好了，接著按下 Allocate IP 之後，就可以讓openstack幫我們利用演算法來生成一個 Floating IP

<center><img style="margin-top:auto;border:1px #eee;width:100%;outline: 2px solid;" src="https://hackmd.io/_uploads/Hyf9y2kB2.png" /></center>

<br>

當建立好一個 Floating IP 之後，在 IP Address 的欄位中就可以選擇剛剛建立好的 Floating IP ，然後 Port to be associated 的欄位就可以選取剛剛我們建置的虛擬機，如果完成之後就可以按下 Associate 來把這個 Floating IP 給我們建置好的虛擬機

<center><img style="margin-top:auto;border:1px #eee;width:100%;outline: 2px solid;" src="https://hackmd.io/_uploads/Bycte3kH3.png" /></center>

<br>

接著回到 Compute/Instances 的地方，就可以發現剛剛我們建置好的虛擬機的 IP Address 有一組新的 IP ，這組 IP 就是對外的 IP ，也就是剛剛所新增的 Floating IP

<center><img style="margin-top:auto;border:1px #eee;width:100%;outline: 2px solid;" src="https://hackmd.io/_uploads/ryMK-nkSh.png" /></center>

<br>

### Step-8 查看最終的Network Topology

當全部都設定與建置好之後，可以去 Network/Network Topology 查看完整的網路架構圖，可以發現在我們自己的網路(綠色)中有連到一個 Instance ，這個 Instance 就是我們剛剛所建置的虛擬機，表示這個虛擬機已經在我們自己的網路(綠色)中，而我們自己的網路(綠色)連線到路由器，透過路由器的幫助來讓我們自己的網路(綠色)連接到 External Network(外網) 也就是藍色那一條 public ，這樣子我們用的虛擬機就可以順利的連線到外面的網路

( 下面有兩台 Instance 是其他同學的可以不用管沒關係 )

<center><img style="margin-top:auto;border:1px #eee;width:100%;outline: 2px solid;" src="https://hackmd.io/_uploads/SJRmH3kH2.png" /></center>

<br>

可以用圖表的方式來查看網路架構圖，這樣可能會更了解一些，電腦的圖案表示我們剛剛建置的虛擬機，橘色區域表示我們自己的網路，很多箭頭符號的圓形表示路由器，而一個地球圖案的圓形表示 External Network(外網)

<center><img style="margin-top:auto;border:1px #eee;width:100%;outline: 2px solid;" src="https://hackmd.io/_uploads/r1zfUhJSh.png" /></center>

<br>

### Step-9 開啟並使用虛擬機

當我們做好一切的設定與建置之後，就可以在網頁上面開啟虛擬機，並且進入到作業系統裡面，所以只要點網路架構圖中我們所建置的虛擬機圖案，並且按下 Open Console ，這樣就會看到 cirros 的登入畫面，只要打上帳號密碼就可以順利進入到 cirros 裡面

<center><img style="margin-top:auto;border:1px #eee;width:100%;outline: 2px solid;" src="https://hackmd.io/_uploads/ry5bv3kH3.png" /></center>

<br>

進入到 cirros 裡面之後，就可以去查看有關於 cirros 的網路資訊，可以發現網路的 ip 與我們在openstack設定的一樣

```shell
$  ip addr
```

<center><img style="margin-top:auto;border:1px #eee;width:100%;outline: 2px solid;" src="https://hackmd.io/_uploads/B1gPuhkrh.png" /></center>

<br>

如果要查看 cirros 的 hostname 或是一些作業系統資訊也是可以的

```shell
$  hostname
```

<center><img style="margin-top:auto;border:1px #eee;width:100%;outline: 2px solid;" src="https://hackmd.io/_uploads/ryDij2Jrn.png" /></center>

<br>

### Step-10 測試虛擬機的網路

接下來，我們可以去測試虛擬機是否順利的連到外面的網路，所以可以讓虛擬機連線到google的網頁來試試看，最後發現虛擬機可以順利的連上google的網頁，也可以去測試讓虛擬機連線到google的公共 DNS 伺服器的 IP ，最後的結果也是可以的，所以這樣表示我們虛擬機的網路正常並且可以連線到外面的網路

```shell
$  ping www.google.com
```

```shell
$  ping 8.8.8.8
```

<center><img style="margin-top:auto;border:1px #eee;width:100%;outline: 2px solid;" src="https://hackmd.io/_uploads/SJhHF2Jrn.png" /></center>

<br>

### Step-11 測試虛擬機的SSH連線功能

最後我們可以去測試虛擬機的SSH連線功能是否可以正常連線過來，所以先進入學校的 H11 主機路徑底下，然後利用SSH連線從學校的 H11 主機連線到我們建置好的 cirros 虛擬機，最後結果也是可以正常使用SSH連線過來

```shell
$  ssh cirros@172.24.4.61
```

<center><img style="margin-top:auto;border:1px #eee;width:100%;outline: 2px solid;" src="https://hackmd.io/_uploads/HkGU3nkr3.png" /></center>

<br>

最後可以測試在學校的 H11 主機路徑底下，利用ping來連到我們建置好的 cirros 虛擬機，最後結果也是可以順利ping到我們的 cirros 虛擬機

```shell
$  ping 172.24.4.61
```

<center><img style="margin-top:auto;border:1px #eee;width:100%;outline: 2px solid;" src="https://hackmd.io/_uploads/rywAp3Jrn.png" /></center>

<br>

## 🎉結論

本文紀錄了openstack安裝與建置虛擬機的過程，透過openstack，我們可以建立彈性且高度可擴展的私有雲環境，輕鬆地創建、管理和監控虛擬機，openstack提供了豐富的功能和工具，使組織和企業能夠根據需求靈活配置和管理資源，提高應用程式的運行效率和靈活性。這份紀錄希望能對想要安裝openstack環境並且在openstack上建置虛擬機的人們提供有價值的指導和啟示

### ✒️作者: 1084837 廖經翰 😄👍✨