2019年11月19日 星期二

使用Rancher 安裝及驗證k8s的記錄(一):透過rancher的來納管mimikub

話說最近k8s越來越紅,而自己對於此新的服務應用方法也越來越有感,因此想要進行一下測試,以下是我自己想要測試的方向:

  1. 透過rancher來管理一般cent 7上的docker服務(看起來從rancher變為2.x版本後就不行單獨納管非k8s環境下的容器囉)
  2. 透過rancher的來納管mimikub
  3. 透過rancher來在cent 7上透過RKE來安裝k8s模組
  4. 測試rancher os
前置作業:
  • 因為我在iMAC上測試,整體環境需要進行以下軟體安裝
    • virtual box。並進行host only設定,作法請參考這裏
    • docker desktop。可以到docker官方網站下載即可
  • 依據Rancher官方網站的建議,測試驗證的時候相關主機都要有固定的IP,因此不建議使用DHCP模式。--Each node used should have a static IP configured, regardless of whether you are installing Rancher on a single node or on an HA cluster. In case of DHCP, each node should have a DHCP reservation to make sure the node gets the same IP allocated.--

目標:安裝RancherOS+Rancher  + K8s minikub
使用RancherOS安裝Rancher、k8s minikub,並管理一個非k8s的docker(這個功能在Rancher 2.x版本好像不見囉,不能單獨管理container,而都必須變成k8s的模式來納管)

架構簡圖



安裝RancherOS
  • 透過docker machine指定安裝RancherOS,執行以下的指令後就會在virtual box上出現一個名為Rancher-machine的vm。安裝後可以透過ip addr show來確認guest os所得到的IP。並自Host OS上確認能否ping 到此guest os。指令如下:
docker-machine create -d virtualbox \--virtualbox-boot2docker-url https://releases.rancher.com/os/latest/rancheros.iso \--virtualbox-memory 3072 \rancher-machine 
Virtual Box會自動新增加這個vm,並且自動啟動
  • 修改Ranchor OS的網路設定指令(哈,我沒有設定成功),請參考這裡
    • sudo ros config set rancher.network.interfaces.eth1.address 192.168.10.21/24
    • sudo ros config set rancher.network.interfaces.eth1.gateway 192.168.10.1
  • 還有一種直接到/Users/{UserAccount}/Library/VirtualBox目錄裡,修改VirtualBox.xml檔案,直接將DHCP Server分配的IP網段作修改,但請記得修改的時候VM是要在關機的狀態喔。
  • 關於Ranchor OS這個專門為Docker 特製的作業系統很有意思,可以讓整個系統的負擔是最輕的,再red hat的open shift 4.0也是走向這意的模式,系統只有提供最精簡的功能,其他所有功能的附加都是透過docker來載入。但,相對的就不像你所熟悉的cent os,如果遇到需要修正 或 更版的作業需求時,就必須要等待Rancher os的更新,有好有壞。自己覺得可能還是使用cent OS,這樣雖然耗損一些資源,但是卻可以讓整個系統的管理及運作更一致性。 另外,如果要讓系統可以透過ansible進行供裝的話,這個也是一個很重要的考量點,感覺如果使用Ranchor OS的話,還要花費許多時間來學習。
安裝Rancher
  • ssh到docker machine。指行docker-machine ssh rancher-machine指令,透過SSH登入到vm內。
  • 進行Racher的docker image安裝及運作sudo docker run -d --restart=unless-stopped -p 80:80 -p 443:443 -v /var/lib/rancher/:/var/lib/rancher/ rancher/rancher
  • 執行完成後,你就可透過瀏覽器登入,並設定admin的密碼。另外還有一個重點,就是系統需要你確認http://192.168.99.xx的網址是可以讓所有Rancher agent可以連接到的,所以在初始的環境建制上,建議大家先有所安排。
Hello to Rancher ^_^
安裝k8s minikub
  • 使用Mac的環境,所以可以直接透過brew來安裝minikube,指令:brew install minikube官方網址。然後再透過virtual box來運行minikube,指令:minikube start --vm-driver=virtualbox,minikube config set vm-driver virtualbox
  • 指令執性後會進行VM的產生,接著minikube會開始下載kubelet、kubeadm等工具,並將整個k8s環境開啟。
指令執行後會顯示的進度畫面,看到這個就代表成功完成minikube安裝囉
  • 開始的時候我一直搞不請楚環境上的安裝是如何運作的,明明就是要透過virtual box來安裝minikube,為何需要在mac上安裝minikue的軟體呢?我自己是認為minikube可以直接在mac上進行些指令及操作,雖然實際的vm是在virtualbox上。
  • 簡單的執行指令kubectl get po -A,確認有抓到相關POD的執行情況

透過Rancher納管minikube
當完成以上測試驗證的環境安裝後,可以再mac環境下直接使用kubectl指令,其實這些指令是橋接到內部的vm來執行運作的,而非直接再mac上運作,是minikube方便大家操作之情況下,所提供的指令操作。如果要知道目前vm的IP的話,可以使用:minikube ip指令。可以再{UserAccount}/.kube/config內容可以看到相關的設定。
kubectl指令的設定內容


  • 透過Rancher右上方的add cluster,設定名稱後,就可以產生執行指令,讓你透過這些指令將k8s cluster自動回報到Rancher中,,指令舉例如下:curl --insecure -sfL
     https://192.168.99.102/v3/import/wwstx9fdfsvnqqkqmngczxtkbzkj7fgr8snr4pcrdvtrxnz8wb845k.yaml| kubectl apply -f -
  • 指令背後的動作其實是從Rancher下載了一個yaml檔案,並產生了Rancher專用的POD,當作是agent來進行cluster納管動作。你可以透過kubectl get pods -A,可以看到有兩個cattle命名開頭的pods。當兩個pods的狀態都Running時,就可以回到Rancher UI上確認情況。
  • Rancher 畫面確實有納管了minikube,可以進去看到細部內容
    Cluster已經納管之狀態
    Cluster資源情況
透過Rancher新增加第一個服務:nginx
  • 再選當的左方選擇default project,進入後選擇右上方的"Deploy"按鈕,從這邊就可以開始透過docker hub下載image並且啟用到服務中。
這個選單真是不直覺,我找了好多次
  • 你想要的這邊的設定畫面都可以給你,要什麼有什麼,真的非常的強大及好用。最基本又用的就是Name、Workload Type、Docker  Image、Namespace、Port Mapping這幾項。 進階的還有環境參數、Pods如何部署的Node Scheduling、Health Check、Volumes、Scaling/Upgrade Policy、執行指令command、網路、Labels、執行權限及資源設定@__@,真的太強大了,光是畫面截圖就超多選項,不用實在說不過去。這些設定就必須要對k8s的基本運作方式有所了解,這樣才能能夠更清楚知道如何使用,呼。
  • Name:Pods的名稱,隨便填入nginxtest
  • Workload Type:K8s定義的Pods有五種類型,本範例請選擇scalable 設定為2,代表服務會啟動二個pods。其他的選項分別有
    • scalable deployment:服務是stateless型態,適合動態擴建之Pods
    • demand set:每一個Node上都會有一個Pod的服務,例如Log處理等 
    • stateful:有Stateful特性的Pods,通常像是DB都會是這類型態,主要是k8s系統發現資源不足,或 pods異常時,並不會主動重啟,而是停在當時的狀態,需要有人介入主動處理
    • cron schedule:排程功能的Pods,你就當作是系統crontab來看待就對了
    • Job:還不清楚;

  • Docker Images:服務的images名稱,預設是到Docker Hub去進行search動作,因此如範例要安裝nginx,就只要輸入nginx:latest就可以(其實latest也可以省略,預設就是會去抓latest的images)
  • Namespace:可以視為專案,未來每個namespace都可以細部設定網路policy等設定,是非常重要的設定值喔
  • Port Mapping:如果你的Pods需要被存取,就一定要設定,本範例請在port name隨意輸入,在publish container port上輸入80,並選擇tcp node port。整體有下列選項(這個主題太重要了,我改天再專門額外研究說明):
    • node port:內部測試最常使用之方式,會在每個work node上開啟相同的內部port,讓你可以直接使用k8s 對外的某個IP加上一個random port來進行存取
    • host port:在一個work node的主機上開啟額外的port 進行服務存取對應,我想這樣就無法使用cluster ip來進行存取囉(實在想不到為何有這種需求)
    • cluster ip:多個POD直接綁一個對外的服務IP,此IP 是k8s Cluster服務內部使用,建議對外服務都需要使用這個設定
    • layer 4 load balance:Pod對外提供服務的主要方法,將一個k8s Cluster前方的L4 load blance IP登記掛載到 k8s pod 服務上,如此當流量從外部進入到k8s時就會依據此load blance IP來進行內部NAT轉換作業,藉此導入到正確的Pod上
超級多設定功能,本範例可以大多使用預設。
  • 觀察nginx pod服務啟動情況,回到Rancher的管理畫面,可以看到下列pods的狀態

  • 驗證nginx pod服務:在上圖可以看到下方有一個30098/tcp的連結,點選後既可以透過minikube的服務IP(192.168.99.103),並加上30098來進行服務連結,可以看到以下的結果,代表服務有正常運作起來。

服務Pods scalable驗證
上面的範例中我們建立了一個namespace(test-zone)及一個nginx服務(兩個pods),因此我們可以驗證透過手動刪除某個pods後,k8s是否會自動幫我們重新開啟一個pods的功能

  • 確認pods狀態如果單存使用kuberctl get po指令,並無法取得任何在運作的pods,主要是因為namespace關係,因此你可以加上-A參數,代表取得所有namespace下的pods資訊,或者使用--namespace XXXX,來取得某個namespace下的pods狀態
  • 確認pods狀態:透過kubectl get po -A -o wide指令可以得知我們有兩個名為nginxtest開頭的服務在namespace test-zone下正常running著。
最下方有兩個名為nginxtest開頭的pods運作著
  • 要刪除nginxtest運作的pod,指令為kubectl delete po ngnixtest-78bff4fd57-6ttql --namespace test-zone,就可以看到k8s在我們刪除pods的同時,又立刻重新建立一個名為nginxtest的pod(名稱為ngnixtest-78bff4fd57-r5mtt)
記得刪除pods的時候要透過--namespace來指定namespace喔
驗證health check功能
k8s可以依據你指定的條件來監控pod上的服務,目前rancher提供的方式有下列幾種:
  • TCP Port是否通
  • 測試某個HTTP網址
  • 測試某個HTTPS網址
  • 在container中執行某個腳本,來確認服務是否正常
Rancher提供多種自動檢查服務運作之方式

  • 上個步驟k8s可以檢查pod的狀態,如果不正常時會自動重新啟動,因此我們本次測試將進入到底層的docker container中,手動將nginx關閉。先查詢docker有哪些container再跑,輸入docker ps -a,其中可以看到37cd68007e1d的nginx container,因此透過指令docker exec -it 37cd68007e1d bash,進入docker內部,然後再輸入nginx -s stop後,過一陣子可以看到nginx的container又被自動啟動了(container id會變更),但外層的pod卻沒有變更。
可以看到37cd68007e1d的status時間比較短,代表有被重新啟動
k8s上的兩個pod執行時間都一樣是21分鐘,代表pod的服務沒有因為內部nginx服務重啟而影響


  • 設定rancher上的health check功能
    • 指定HTTP request returns a successful status (2xx or 3xx)
    • 設定Request Path為"/"
    • 設定Target Container Port為80
透過Rancher設定k8s的Health check

  • 再進入Docker內部,再次執行nginx -s stop指令,並回到minikube環境下,輸入kubectl get po -A -o wide後,可以發現其中一個nginxtest pod的狀態變更為CrashLoopBackOff,並且自動進行restart作業,因此restart的數值增高為2。
因為container內部的nginx被停止,因此healthcheck判定此pod有問題
經過重啟作業後,重啟的計數器也有增加囉
再重啟過程中Rancher UI也有正常顯示出Pod正在進行更新作業

插曲
我透過Rancher設定nginx pod的時候在container第一次設定的port為8080,因為我以為服務預設會開8080 port,讓我一開始嘗試從外部透過node port連接nginx服務都無法正確拿到網頁,測試驗證老半天將container port修改為80才能通。這個情況應該是拉下來的images中使用預設的設定,因此只會開啟80 Port,你可以進入到docker內部,然後透過指令nginx -t來了解設定檔的位置,然後再到/etc/nginx/conf.d/default.conf就可以看到只有開啟listen  80。
nginx預設的開啟port為80


沒有留言:

張貼留言