Skip to content

antony@notes:~/misc$ cat "炬識-面試實作.md"

炬識 - 面試實作

2023-02-22· misc

炬識 - 面試實作

題目1.

如何建構私有雲環境,達成自動化部署的成果:

  1. 使用者透過Web表單申請虛擬機器用於測試環境:Web表單內容提供虛擬機器範本可供選擇, 其中的範本包括軟體和硬體規格,如WindowsServer版本、SQL Server版本、Windows電腦名稱、 CPU、Memory等。
  2. 為了避免資源浪費,必須考慮每位使用者可使用資源的配額限制,包括CPU核心數、記憶體大小、磁碟空間等。
  3. 使用者申請的虛擬機器會自動加入Active Directory網域。

由於上述項目實作需要硬體資源與時間,因此僅需要提出解決方案的所使用的技術或平台即可。

解答1.

假設現在私有雲的環境是建立在 VMWare Player 之上, 我會先在一台主控機上,建立 12 台 Windows Server 的模板機,分別是

  • Windows Server 2012 (無 SQL Server)
  • Windows Server 2012 (SQL Server 2017)
  • Windows Server 2012 (SQL Server 2019)
  • Windows Server 2012 (SQL Server 2022)
  • Windows Server 2012 (無 SQL Server)
  • Windows Server 2016 (SQL Server 2017)
  • Windows Server 2016 (SQL Server 2019)
  • Windows Server 2016 (SQL Server 2022)
  • Windows Server 2019 (無 SQL Server)
  • Windows Server 2019 (SQL Server 2017)
  • Windows Server 2019 (SQL Server 2019)
  • Windows Server 2019 (SQL Server 2022)

並且會在每一台模板機中 C 磁碟機下,埋一支修改 Windows 電腦名稱,並且在修改電腦名稱後 和自動加入 AD 的程式 ,名字叫 automatic.bat

再來,我會在主控機上,先用 go 語言建立一個簡單的網站,主要功能是可以填表單,這個表單的內容會分為 5 個部分 :

  • 第一部分
    • 用下拉式選單,讓使用者選擇 Windows Server 的版本 (2012, 2016, 2019)
  • 第二部分
    • 建立 4 個選項按鈕,選擇 SQL Server 的版本
  • 第三部分
    • 建立一個文字輸入欄位,填入 Windows 電腦名稱
  • 第四部份
    • 建立一個文字輸入欄位,填入 CPU 要使用幾 Core
  • 第五部分
    • 建立一個文字輸入欄位,填入記憶體要使用幾 G

當使用者提交表單後,會結合 CGI 程式,這支 CGI 程式會將

  • 表單的內容,用 csv 的格式匯入一個檔案,並將檔案送到主控機上
  • 根據檔案內容,在主控機上自動部屬使用者透過 Web 表單申請虛擬機器
  • cpu , 記憶體的部分,可藉由 修改 *.vmx 的檔案進行調整
  • Windows 電腦名稱,藉由 vmtools 的工具,先得到 VM 的 IP 位置,在藉由 ssh 遠端執行 預先埋好在 C 磁碟機下的 automatic.bat 這支程式,在修改電腦名稱後會自動加入 AD

題目2.

請說明如何使用 K8s 生態系的工具與解決方案,解決以下的情境

  1. 搭建一個給開發團隊使用的「測試環境」之申請平台。
  2. 開發團隊只需要簡單的提供自己所需的「測試環境規格」、該環境需要預安裝哪些「服務」、該服務的使用期限,即可送出申請。
  3. 該平台接收到申請後,就會自動佈建該環境,並且將環境的各種必要的連線資訊,通知申請人。
  4. 當環境超過使用期限,便會自動刪除。

注意事項:

  • 該平台會依據資源使用量,自動分配要將「測試環境」架設在 K8s 的那些 Cluster 或 Node。

請描述你會如何規劃這個平台,選用哪些 K8s 生態系的工具或解決方案,可以的話請說明這其中涉及了哪些人為及自動化的流程, 而你所選用的 K8s 生態系的工具或解決方案,分別在其中擔任哪些角色、解決了哪些需求。

解答2.

首先,假設 測試環境是在自建的原生 K8s 之上,系統架構是

  • 3 台 Master Node 、 6 台 Worker Node 和 3 台獨立存放 Etcd 的 Node
  • CRI 用的是 CRI-O 並且結合 Podman ( CRI-O 並沒有 還原 image、 備份 image 、build、 export 和 import 的命令,只有下載 image 的能力,所以需要 podman 來支援 image 的管理 )
  • CSI 用的是 NFS
  • CNI 用的是 Flannel 網路套件

以上高可用的 K8s 系統架構,可以解決 開發團隊在開發時,遇到單一台 Node 毀損時,K8s 系統可以持續提供服務環境。另外選擇 CRI-O 專案的原因是因為,這個專案,特別為 K8s 量身訂做,直接翻譯 kubelet 的話,K8s 會直接透過 CRI-O 來跟 runc 或是 crun 溝通產生 Container ,所以開發效率最優。

在這之上,自建 Project QUAY ,企業自己的 Image 光片中心,當 開發團隊將 Application 包成 Container 後,可以在不用上網的情況下,將 image 傳到光片中心,以此解決資安上的問題。

再建立 Jenkins ,並透過它的 CD 功能,可以將 github 上要測試的服務環境自動部屬出來

假設現在提供服務的是 Web Server ,在 K8s 的環境中,它應該會有對應的 Service ,可以事先在 Jenkins 裡面的 pipeline ,將服務的對外 IP 顯示出來

會先寫好一支程式,當使用者要進到 K8s 中,必須使用預先設定好的憑證登入到 K8s ,再設定檔中還會先規範好 Default 的 Namespace ,並對這個 Namespace 做硬體資源上的限制