最新資訊

科技趨勢

Day 0 到底該如何規劃 Openshift Container Platform

原本以為可以一篇文章就搞定, 後來想想, 這麼龐大的內容,細節也不少,幾經考量後, 打算分成Day 0, Day 1, 以及 Day 2 and beyond 的方式來記錄這個OCP的學習過程, 我們知道條條大路通羅馬, 建置OCP的方法很多種, 這次筆者選用的方式是比較適合筆者工作環境及生意需求折衷下的解決方案, 期許這樣的文章, 可以幫到所有對OCP有興趣想研究的朋友們

下面的文章不是普通的長, 超過30公分不含頭, 大家慎入!

事前準備與基本認識

本篇僅會介紹什麼是OCP以及筆者準備OCP所需的環境, 如何安裝Openshift Container Platform會放在Day 1的文章之中.

因為筆者本身也是OCP新手也很久沒有碰地端設備, 基於這樣的理由想要好好紀錄一下, 人老記憶力差, 下次遇到地端部署OCP也有比較清楚的思路跟筆記.

這裡筆者會根據目前地端有的設備跟環境進行規劃, 順帶一提, 這個Openshift 環境主要是拿來學習跟展示用的, 所以規格上會比較以經濟實惠為最大考量. 開始動手前, 我們需要知道何謂Openshift Container Plaform (以下簡稱OCP), OCP的使用場景為何? 那它到底與Kubernetes 的差異是什麼, 若已經具備Kubernetes知識的人, 會不會很容易上手呢? 各位看官準備好了嗎?我們的Openshift 即將啟程!

從K8s跟CI/CD面向來探索Openshift

從業雲端多年, 好久好久沒有碰過實體的伺服器, 對於硬體規格, 安裝軟體, 搭建相關設施都變得好陌生, 如果沒有這次的客戶需求, 著實很難有機會可以再碰地端的伺服器.

那到底什麼是 openshift呀?

講到openshift, 就不能不提Kubernetes這個超受歡迎的開源容器編排平台, 透過Kubernetes(以下簡稱k8s)的平台, 可以更輕鬆的架構起多容器服務, 擁有自己的網路規劃, 認證授權, 自動拓展等等的功能. 所有的設定都可以透過宣告式的方式來進行, 然後把設定都寫在YAML檔案裡面, 透過kubectl 的命令進行部署. 不過事情其實沒有想象中那麼地簡單, 部署多個服務到不同的環境上, 例如:測試環境, Staging, 正式環境等等. 我們需要有完整的DevOps的流程來管理, 才能順利完成任務, 也就是CI/CD的規劃及設計.

首先, 工程師將寫好的code提交到版控管理(SCM), 現在大家應該都用Git吧?透過不同的Branch 來管理CI/CD的動作流程, CI是持續整合,CD是持續部署, 好的CI/CD流程規劃可以大大降低軟體開發與運維的困難並且透過自動化減少手動操作的錯誤.

搭配CI的工具來整合運行服務的程式封裝, 用白話來說,就是將工程師寫好的code封裝(package)後在打包成 docker image存放在容器映像檔儲存槽, 接著再使用CD的工具進行部署, 將映像檔部署在對應的K8s叢集裡面

講了那麼多東西, 一下K8s一下CI/CD的, 真的是讓人霧煞煞, RedHat在企業等級服務上看到了K8S使用者, 可能會面臨的使用困境, 所以就把剛剛提到K8S跟CI/CD整合再一起, 就是我們稍早提到的openshift囉~~

我們接著來看看下面的架構圖, 更能一目瞭然甚麼是openshift, 圖畫得醜請多多包涵!

當然 openshift遠遠不止這些功能, 我們以後一步步慢慢探索囉! 第一步當然是要把它給順利安裝起來, 筆者分享自己學著如何安裝Openshift Container Platform (以下簡稱OCP),也想方便大家未來安裝時可以輕鬆駕馭, 因為真的不是憨人想的那麼簡單~~

想像一下Redhat OCP能夠提供企業級水平的容器編排平台, 所需要使用到的軟硬體資源, 真的是家底不夠厚也玩不起來…

筆者建立的環境主要是提供測試跟客戶演示目的, 所以有下面幾項需求:

  • 省錢省資源
  • 選擇使用Redhat產品最新的版本
  • 能夠共用絕不另外搭建

插話一下, 如果你真的很想在筆電跟桌機小玩一下OCP的功能, 可以試試看下面這兩種, 連結在這邊,

  • CodeReady Container: CodeReady Container 比較像是開發者需要有一個local的開發環境來進行使用的, 也很容易安裝, 不過建議電腦的效能不能太差, 筆者喜歡放一堆東西在筆電上面, CodeReady需要的效能著實讓我的筆電有點吃不消, 尤其是硬碟資源.

  • Redhat Sandbox: 如果是以學習角度來說, 筆者比較推薦Sandbox, 重點是免費!免費!(很重要所以講兩次),初學的時候很方便也不用擔心搭建問題, 這點Redhat做得實在很貼心, 還不讚爆他!!

想當然爾,使用 Redhat Sandbox需要註冊一個Redhat的帳號, 註冊成功後, 當你要啟用(activate)你的Sandbox, 會要求透過電話取得驗證碼.

成功創建Sandbox後, 你就會看到下面的畫面囉, Redhat上面也有一些教學, 手把手的教你怎麼用, 其實相當的受用, 可能有些內容會在 Day2 and Beyong系列文章作介紹.

廢話真的是說太多, 我們趕緊進到下一個環節, 找資源也順便找支援!

資源

硬體

跟使用雲服務大不相同, 地端的資源不是說有就有, 筆者千辛萬苦在露天拍賣找到了一台二手的HPE ML350, 除了把memory加滿外, 還買了兩塊intel的SSD(NVMe)來滿足安裝OCP的需求.

筆者主要是關注這三項:

硬體 規格
CPU Intel Xeon 2 Processors
RAM 256GB
Storage 2.61 TB

稍稍微詳細的規格可以看這邊.

Server Spec

硬碟空間


這邊筆者主要是使用H:/, 大家應該都有注意到這個"H:", 會在稍後的內容介紹一下, 筆者的架構, 方便大家理解為何筆者會選擇使用Windows.

作業系統及虛擬機器

實體機一台要怎麼建立叢集系統呢? 當然要透過虛擬技術來達成囉!(筆者小時候也是用過VmWare的…咳咳), 其實選項還不少, 可以在實體機上安裝VmWare Esxi加上, 另外搞一台 VCenter, 對!符合能省則省的標準, 就把這台Vcenter也省了…

最後選擇直接在實體機上安裝Windows Server 2019 Datacenter版本.

然後在另外安裝VmWare Workstation Pro 16, 這邊就不特別贅述如何安裝Windows跟VmWare了.

Operating System Description
Windows 2019 Data Center 底層的作業系統搭配VMware虛擬技術來建立 OCP 叢集
VMware Workstation 16 Pro 使用 VMware workstation 來建立 control plane 及 worker
RHEL 9 主要是作為操作ocp 叢集跟DNS server 之用

網路

在規劃該如何搭建一個適合筆者環境使用的OCP時, 這個問題其實也困擾了好一會兒, 因為我們公司其實都把服務搭建在雲端, 辦公室的OA網路其實還蠻陽春的, 能上網是最大訴求, 剩下的工作基本上都是透過雲端服務或是SaaS完成.

建立OCP需要我們自行準備,下面兩個服務:

  • DHCP server
  • DNS server

DHCP server 我選擇直接使用公司AP (access point)的DHCP server, 然後Workstation上的虛擬機(後簡稱VM)網路選擇bridge mode, 這裡為了能夠讓所有的VM IP位址固定, 有特別把IP綁起來, 筆者實體網路的拓樸大概是長這樣, 可以參考一下.

DNS server因為AP沒有支援,我自己用Bind搭建一台DNS server. 其實也可以選擇Windows 的DNS server, 不過筆者的Windows天賦不夠, 就選擇曾經用過的bind囉~
這意味著, 筆者必須要搭建一台Linux Server, 既然用了Redhat的OCP, 不免俗的也來搭建一台 RHEL 9.1囉~

架構圖

  • DHCP 打算沿用公司原本的Wifi
  • DNS Server 會搭建在 RHEL 9.1之上
  • 所有的VM 將使用VwWare Workstation 16 Pro
  • 實體機安裝Windows Server 2019 Datacenter

安裝RedHat Enterprise 9.1

VM的準備作業

RedHat VM的 hardware spec 是

  • CPU: 4 processors
  • Memory: 4 G
  • Storage: 100 G

首先你需要具備Redhat Account 才能下載試用, 在哪裡下載呢?

  1. 登入這個連結, 這是redhat 的customer portal

  2. 紅框處的Downloads給它大力的點下去

  3. 一樣選擇紅框處的RedHat Enterprise Linux

  4. 頁面會直接跳轉到下載頁面, 按下下載ISO

  5. 然後等待下載, 檔案大小約8.8G,完成後就可以準備設定VM, 逮住時間就去泡杯咖啡 :P

  1. 啟用一台新的VM,選下"New Virtual Machine", VmWare Workstation的引導視窗就跳出來拉, 請毫不猶豫地按"next",下一頁也一樣, 再按一次"next",放心筆者試過了不會爆炸!

  1. 這裡會詢問作業系統的安裝方式,筆者選用的做法是直接用這個iso來開機, 就像小時候用光碟安裝作業系統一樣,VmWare一開機會跳到RHEL的安裝畫面. (沒跳的,自己進VmWare的黑畫面裡,隨便按一下鍵盤, 筆者是按Return/Enter, 大家隨意心領神會呀!)

按下瀏覽,找到剛剛下載的ISO檔案, 按下open

回到原來畫面後再按下"next", 到下一個步驟

  1. 這個步驟是VmWare對你等等要創建VM的preference, 因為筆者安裝RHEL 9.1, 目前選項還找不到,就乾脆不囉唆的給它按下"next"

  2. 幫你的RHEL9.1取個名字, 這邊的location是preference 的儲存位置, 不是你創建的VM 的使用空間,你可以選擇非C槽的地方存放或者就阿莎力地按下"next"

  1. 接下來的步驟是選擇CPU, 你可以processor 2 然後cores 也是2, 筆者的設定是這樣, 不用太過擔心, VmWare 可以調整關閉中的VM的CPU.

Memory的大小為4096 MB,按下"next"

網路的部分, 因為想要直接使用既有的DHCP server, 選擇Bridge 模式,按下"next"

  1. 這邊都是選擇"推薦"(recommend)選項, 然後按下"next"

  1. 然後創建一顆新的Harddrive, 選擇"create a new virtual disk" 按下 “next”

雖然筆者不是硬碟大富翁, 不過也是不囉唆給它個100GB, 按下"next"

  1. 這裡是要選擇disk file的存放位置, 筆者放在我們的額外空間
  2. 按下Finish, 我們的RHEL 9.1 vm 的初始化就完成囉

安裝RHEL 9.1

其實RHEL9.1的安裝, 不僅畫面漂亮, 也還蠻簡單的, 我們一步步來

  1. 啟動VM

  1. 這裡需要透過VM的終端, 鍵盤按一下"enter"或是"return", 不然就安靜地等待60秒, 讓他自動boot

等待一到兩分鐘, 下面跑到100%後,就會進入安裝畫面了

  1. 進到安裝畫面, 選擇"英文", 按下"continue"

  2. 我們需要設定好 root password, 就可以按下"begin installation", 請用滑鼠中鍵滾動就會看到要設定root password

設定完成後, 按下"Done"

  1. 現在我們要指定要安裝位址, 就選剛剛創建的100GB囉, 按一下紅匡處.

選100GB那顆後, 筆者偷懶選"Automatic", 然後按下"Done".

  1. 按下begin installation後,就是看戲時間

就等它好, 按下reboot system, 期間就再泡杯咖啡吧

  1. 重新開機後, 就會跳到下面的頁面, 這邊筆者有特別建立一個自己的帳號(非root), 按下"start setup"

創一個自己的帳號, 然後設定一下密碼.

好拉, 設定完成!!

啟用RHEL 9.1

  1. 測試一下SSH遠端登入, 先看看IP是多少

還不錯喔,SSH server 正常運行, root 跟自己的帳號也可以正常登入

  1. 如果你有subscription的話, 記得去註冊一下
    按一下"RedHat Subscription Manager"

    按下register, 登入一下Redhat帳號就完成囉,非常簡單


  2. 先關機一下,備份做個snapshot, 保留一個乾淨的image, 按一下那個有"+"號又長得特別像碼表的按鈕

按下"take snapshot", 這樣就會take 一個snapshot

接下來, export 一個ovf, 筆者的剪圖因為當時正在跑VOF所有暫時反灰, 看官別嚇到喔

選擇VOF的存放位置, 當硬碟還很充裕的時候, 就是要備份, 哈哈~ 不過, 備份確實是一件該被徹底執行的任務.
人生就是不怕一萬只怕萬一

安靜地等等它完成

到這裡, 我們已經完成了RHEL 9.1的安裝, 等等我們會在這台機器上安裝DNS

安裝DNS

筆者打算安裝DNS server 在剛剛安裝完成的RHEL 9.1上, 使用bind 當作DNS server.

  1. 安裝bind需要的相關套件, 筆者是直接使用root, 應該不是最佳演練的作法
 yum install bind bind-utils -y
  1. 透過vi來編輯 /etc/named.conf, 不過編輯前記得備份一下原始檔

 
 
# cp /etc/named.conf /etc/named.bak # vi /etc/named.conf
  1. 筆者的named.conf 供大家參考, 筆者的環境有用到原本公司wifi 提供的DHCP server, 打算是要把DHCP server 派送給連線者的DNS 直接改掉, 所以有"forwarder"的設定

 
 
// // named.conf // // Provided by Red Hat bind package to configure the ISC BIND named(8) DNS // server as a caching only nameserver (as a localhost DNS resolver only). // // See /usr/share/doc/bind*/sample/ for example named configuration files. // options { listen-on port 53 { 127.0.0.1;192.168.0.132; }; listen-on-v6 port 53 { ::1; }; directory "/var/named"; dump-file "/var/named/data/cache_dump.db"; statistics-file "/var/named/data/named_stats.txt"; memstatistics-file "/var/named/data/named_mem_stats.txt"; secroots-file "/var/named/data/named.secroots"; recursing-file "/var/named/data/named.recursing"; allow-query { localhost;192.168.0.0/24; }; /* - If you are building an AUTHORITATIVE DNS server, do NOT enable recursion. - If you are building a RECURSIVE (caching) DNS server, you need to enable recursion. - If your recursive DNS server has a public IP address, you MUST enable access control to limit queries to your legitimate users. Failing to do so will cause your server to become part of large scale DNS amplification attacks. Implementing BCP38 within your network would greatly reduce such attack surface */ recursion yes; allow-recursion {localhost; 192.168.0.0/24; }; /* this is added by Webber 2022/11/21*/ dnssec-enable no; dnssec-validation no; forwarders { 8.8.8.8; 1.1.1.1; }; /* end here */ managed-keys-directory "/var/named/dynamic"; geoip-directory "/usr/share/GeoIP"; pid-file "/run/named/named.pid"; session-keyfile "/run/named/session.key"; /* https://fedoraproject.org/wiki/Changes/CryptoPolicy */ /* this is commented by Webber 2022/11/21 */ #include "/etc/crypto-policies/back-ends/bind.config"; /* end here */ }; logging { channel default_debug { file "data/named.run"; severity dynamic; }; }; zone "." IN { type hint; file "named.ca"; }; zone "colo-demo.gaiatechs.info" IN { type master; file "named.colo-demo.gaiatechs.info"; }; zone "0.168.192.in-addr.arpa" IN { type master; file "rev.0.168.192"; }; include "/etc/named.rfc1912.zones"; include "/etc/named.root.key";
  1. 編輯剛剛創建的Zone需要的DNS record, 所以需要有這兩個檔案, 這兩個檔案簡單來說,一個是正向(domain name 到 IP), 另一個是反向(IP 到 domain name)

命名規則是 named.[你要使用的域名] 跟 rev.[你的IP range]

  1. 筆者的named.colo-demo.gaiatechs.info, 記得這個檔案的group 等等要改成"named", 還有這個是筆者使用的域名, 你可以自由命名對應你使用的域名.

 
 
$TTL 1D @ IN SOA @ bastion.colo-demo.gaiatechs.info. ( 2020040819 ; serial 3H ; refresh 15M ; retry 1W ; expire 1D ) ; minimum @ IN NS bastion.colo-demo.gaiatechs.info. @ IN A 192.168.0.132 bastion IN A 192.168.0.132 cp1 IN A 192.168.0.208 cp2 IN A 192.168.0.246 cp3 IN A 192.168.0.40 worker1 IN A 192.168.0.11 worker2 IN A 192.168.0.192 worker3 IN A 192.168.0.111
  1. 筆者的rev.0.168.192, 其實你看這個名稱應該可以感覺到反向, 因為192.168.0.X 就是筆者的IP range, 希望這樣可以幫助大家理解, 另外, "*.apps"這筆紀錄並未放在記錄之中喔! 因為筆者也不知道等等OCP會生出什麼樣的名稱, 等安裝完成在進行DNS更新

如果你的IP range是172.17.0.0/24, 那你可以命名此檔案為rev.0.17.172


 
 
$TTL 1D @ IN SOA @ bastion.colo-demo.gaiatechs.info. ( 2020040819 ; serial 1D ; refresh 1H ; retry 1W ; expire 3H ) ; minimum @ IN NS bastion.colo-demo.gaiatechs.info. 0.168.192.in-addr.arpa IN PTR bastion.colo-demo.gaiatechs.info 132 IN PTR bastion.colo-demo.gaiatechs.info. 208 IN PTR cp1.colo-demo.gaiatechs.info. 246 IN PTR cp2.colo-demo.gaiatechs.info. 40 IN PTR cp3.colo-demo.gaiatechs.info. 11 IN PTR worker1.colo-demo.gaiatechs.info. 192 IN PTR worker2.colo-demo.gaiatechs.info. 111 IN PTR worker3.colo-demo.gaiatechs.info.
  1. 到這裡我們也差不多快完成了, 不過因為named的檔案需要被放在named的group也需要修改一下權限, 你所用到的域名(domain name)會跟筆者的不同, 你的檔案命名也會不同. 不要直接複製貼上

筆者設定


 
 
chgrp named /var/named/named.colo-demo.gaiatechs.info && \ chmod 640 /var/named/named.colo-demo.gaiatechs.info && \ chgrp named /var/named/rev.0.168.192 && \ chmod 640 /var/named/rev.0.168.192

你的設定


 
 
chgrp named /var/named/named.[你的域名] && \ chmod 640 /var/named/named.c[你的域名] && \ chgrp named /var/named/rev.[你的IPrange] && \ chmod 640 /var/named/rev.[你的IPrange]
  1. 調整一下Firewall的設定, 讓DNS的服務可以被訪問

 
 
firewall-cmd --add-service=dns --permanent firewall-cmd --reload
  1. 接著我們透過systemctl的方式來啟動bind, 也順便看看跑起來的狀況
systemctl enable named
systemctl start named
systemctl status named

  1. 稍早的步驟中有提到, 我們需要更新DHCP server搭配的DNS 設定, 所以筆者順便改一下DHCP的設定, 大家的設定可能不盡相同, 筆者是為了讓其他同仁不需要特別設定的情況下可以access 到ocp的機器.

當然也可以自己手動在本機上加上DNS server, 這邊以Mac為例:

  • 點一下網路
  • 選擇進階(advanced…)
  • 頁籤上選擇DNS, 然後按下"+“, 把DNS server的IP address 加進去就按一下"ok”, 按一下"apply"就大功告成了

  1. 當然我們需要測試一下囉! 我們用nslookup看一下, 這是我的筆電本機可以透過domain name找到相對應的IP

Summary

認識Openshift

到這裡為止, Day 0 的準備工作也算差不多告了一個段落, 首先我們透過K8S跟CI/CD來認識何謂OCP, 也知道了OCP可以建立在各種不同的架構之上, 例如: 雲端跟地端. 本機上也有像CodeReady或 Sandbox的選項可以幫助開發者開發或學習用途.

跳板機的重要性

然後, 筆者選用了RHEL 9.1 當作bastion 跟DNS server之用, 在IP派送上, 筆者並沒有另外架設DHCP server, 而是直接選用公司的Wifi, 這個部分其實相當不建議, 另外做一個"隔間"可能會是更好的選項, 日後有空檔, 筆者也可能會再次進行調整, 還有建立好的VM, 建議做一下備份, 日後玩髒了, 還可以回復.

選擇自建DNS server 並且整合到DHCP server

DNS server 自從用了雲端後, 真的是好久沒用, 這次使用Bind 建一個Local 的 DNS server, 讓OCP後續安裝時創建的domain name使用, 用nslookup 的方式查詢domain name 是否有對應上伺服器的IP address, 這裡筆者有踩了一個Wifi的坑, 或許該說是"產品特色", 筆者公司的Wifi 並不能正確地讓用戶使用筆者的DNS server IP, 直到修改了WAN 上的DNS server設定. 調整完成後, 就能正確地運行, 這坑讓筆者花了大把時間檢查Bind, 以為Bind 是否哪裡設定不正確還是防火牆擋住了. 其中看了不少的文件也算是意外的收穫. 雖然安裝了有GUI的Linux, 不過在筆者多年與Linux打交道的經驗上, 還真的沒有用過幾次GUI, 發現Redhat的GUI其實還蠻漂亮的, 不過,能夠透過命令列的方式處理, 還是比較推薦囉!畢竟Linux的世界就是要黑白才夠味呀~~

完成了什麼?

紅框的部分是在實體伺服器上安裝Windows Sever 2019 Datacenter 版本, 然後在其上安裝了vmware workstation, 這部分的內容筆者只有輕描淡寫了一下選用的理由, 並沒有演示如何進行安裝, 如果大家有任何問題也歡迎讓我知道.

橘框的部分是我們在本篇完成的部分包括:

  • RHEL 9.1 的安裝
  • DNS server 的安裝與設定
  • DNS server 與 DHCP 的綁定

剩下的部分, 中間那塊灰色區域會在Day 1的文章中演示給大家看喔! 敬請期待蓄勢待發的Day 1 ;P

坑不踩不行

下一篇Day 1, 筆者會專注在如何安裝OCP上, 裡面也會聊到一些vmware VM的spec調整, 這個部分其實讓筆者開開關關了VM好幾次, 從RedHat頁面上滿滿的紅色error, 到都是綠燈的ready, 其實這也是為何筆者想記錄下來的主因, 坑留給筆者, 裝機應該要跟使用雲端一樣很幸福無痛的!

最後, 筆者相信分享科技要有溫度, 技術文件不見得要硬梆梆, 希望藉著比較輕鬆趣味的方式, 來讓大家了解OCP, 至少看著筆者的踩坑經驗也是頗趣味的一件事, 是吧?

tags: ocp, openshift, vmware,linux, redhat