Kubernetes CKA課程筆記 25

佈署相關介紹,簡單佈署nginx,並解說及建立Service

ZONGRU Li
9 min readOct 19, 2021

接下來將講解基本的佈署概念

本篇第一個目標圖如下:

利用兩個元件,建立test-pod由內部連接到nginx(透過Service)

目標圖二(由外部連接到nginx):

後面還會介紹一些Labels & Selector,及Service networking

建立nginx的Deployment:

  • 這時候大概有幾個選項
  • 1.自己寫...
  • 2.從K8s doc複製範例(建議選項)
進去看到範例複製到VScode來編輯

下面逐步詳解:

template:有自己的”metadata””spec”

template裡面的”metadata””spec”就可以生成Pod

其中”spec”區塊就是Pod的藍圖(blueprint)

spec主要描述用甚麼image?port開哪個?裡面container名稱?

首先改寫兩個地方如下:

進到master node裡面vi同樣檔名貼進去

貼完儲存!

透過指令來吃上述檔案:

kubectl apply -f {檔名}

確認:

這邊如果沒有跟我一樣有對worker做關機的話

昨天建的test與test2兩個pod就會還在

可以執行刪除指令移除(可以直接刪兩個!):

kubectl delete pod {pod name1} {pod name2}

同時確認是否存在deployment元件,執行:

kubectl get deployment

有deployment物件,並且由此產生兩個pod物件READY狀態
  • 之後任何對pod的修改(比如image調整或更改版本之類)
  • 只要透過修改上述deployment檔案即可

此時狀態是:

(這邊暫停關掉worker*2)

確認master狀態:

上面建的nginx pod都不見了,deployment還在但是0/2 READY

早上一看更奇怪了,多了兩個deployment

上班前沒啟動worker

(下班回家後將兩台worker啟動後過五分鐘狀態確認如下)

Node正常,Pod也正常,看起來透過deployment起的Pod不會因為worker關機而消失
worker的CNI PLUGIN的weave也正常
master的weave也OK!

建立nginx的Service:

  • 複習一下Service,透過service name固定持久的IP位置
  • (不隨Pod掛掉,Service替Pod的服務固定著IP位置)
  • loadbalances分派請求給Pod

一樣方式找到Kubernetes官網的doc範例 — Service的

copy!

在VScode工具上瀏覽,可以跟deployment對照,可以看到spec長的完全不同:

為了能正常運作,需要調整如下:

調整後:

外部打到8080 PORT抵達service,service往前推到Pod服務的80 PORT

Labels & Selectors:

有了上述的service的yaml檔,接下來還有個問題是

在service內定義了targetPort要去跟Pod的服務PORT對應

但是service怎麼知道該對應哪一個Pod?

其實就要依靠LabelsSelectors,首先看到如下兩張圖:

  • metadata內的labels是可以有多個key-value(如上app:nginx)
  • 這個app key也可以更換
  • 並且這個label就只是黏在該元件上的記號
  • 亦即selector透過匹配比對app:nginxlabels來連接到Pod
  • (因為Pod有這個labels)
  • 並且serviceselector也要對應,所以還要改下為以下:
  • 雖然上述都是deploymentservice使用selector來匹配到PodLabels
  • 但是deployment如上也可以有Labels,service也可以建立自己的Labels
  • 並且注意上述的labels都是list,可以很多個!!

總結上述:

  • Labels:是附加在Component上的key-value
  • 而Label selector則是為了找尋對應的Label的Components
這情況Deployment就對應不到Pod

接著要執行上述的service的yaml檔

來到master機台上建立一樣名稱的yaml檔:

貼上內容儲存

然後執行:

kubectl apply -f nginx-service.yaml

並執行確認指令(指令內的svc可以用service替換):

kubectl get svc

檢視Pod-Service的連接:

以下將透過kubectl describe {元件種類} {元件名稱}指令

來更加detail看到其元件內容,例如:

kubectl describe svc {上面拿到的名稱:nginx-service}

並且當service做連接到Pod時,還會產生一個物件叫:endpoint component

endpoint component(ep):

  • 可以透過以下指令來看到:

kubectl get ep

左邊顯示service名稱,右邊直接顯示連接的endpoint的list

kube-Proxy:

  • 接著要詳細了解到service如何將請求推給endpoints的IP位置?
  • 又或著說誰管理著service endpoints

我這邊趁機刪一個Pod(因為不知道為啥我兩個都長到worker1去了)

如上我刪了後馬上又長,但是有跑到worker2,並且service ep也有變
首先知道Service不屬於任何Node(不是運作在Node上)

真實的Request打進來流程則如下圖所示:

實際Service是透過kube-proxy再將Request往前推給Pod的
  • kube-proxy是維護一個含有ServiceIPs的清單,及其對應的Pod IPs
kube-proxt會確認list,這個Request要給哪個Pod

Check Status:

  • 在非常前面筆記第4篇有提到過Configuration File有三部分
  • 1.metadata
  • 2.specification
  • 3.status
  • 其中第三個部分 — ststus是由kubernetes自動產生,並且持續地更新

至於如何確認到這一塊,等一下會提到

首先先用指令取得在default這個nameSpace內所有元件:

kubectl get all

比如我們要看到上述nginx-server的status的資訊則可執行:

kubectl edit {元件種類} {元件名稱}

然後會見到許多資訊:

用這個離開

同理可以看看deployment status如下:

很長

往下拉一點看到:

另外還可以直接透過kubectl指令觀察到statusyaml檔案內容,執行:

kubectl get {元件種類} {元件名稱} -o yaml

一樣會看到前面edit指令看到的元件status資訊

參考課程(reference)

--

--

ZONGRU Li
ZONGRU Li

Written by ZONGRU Li

2022/11/17 開源部分個人筆記給LINE "Java程式語言討論區"社群,希望能對社群的技術學習做一點點貢獻.(掩面....記得退訂閱!

No responses yet