建立nginx的Deployment:
- 這時候大概有幾個選項
- 1.自己寫...
- 2.從K8s doc複製範例(建議選項)
下面逐步詳解:
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
- 之後任何對pod的修改(比如image調整或更改版本之類)
- 只要透過修改上述deployment檔案即可
此時狀態是:
(這邊暫停關掉worker*2)
確認master狀態:
早上一看更奇怪了,多了兩個deployment
(下班回家後將兩台worker啟動後過五分鐘狀態確認如下)
建立nginx的Service:
- 複習一下Service,透過service name固定持久的IP位置
- (不隨Pod掛掉,Service替Pod的服務固定著IP位置)
- loadbalances分派請求給Pod
一樣方式找到Kubernetes官網的doc範例 — Service的
在VScode工具上瀏覽,可以跟deployment對照,可以看到spec長的完全不同:
為了能正常運作,需要調整如下:
調整後:
Labels & Selectors:
有了上述的service的yaml檔,接下來還有個問題是
在service內定義了targetPort要去跟Pod的服務PORT對應
但是service怎麼知道該對應哪一個Pod?
其實就要依靠Labels與Selectors,首先看到如下兩張圖:
- 在metadata內的labels是可以有多個key-value(如上app:nginx)
- 這個app key也可以更換
- 並且這個label就只是黏在該元件上的記號
- 亦即selector透過匹配比對app:nginx的labels來連接到Pod
- (因為Pod有這個labels)
- 並且service的selector也要對應,所以還要改下為以下:
- 雖然上述都是deployment或service使用selector來匹配到Pod的Labels
- 但是deployment如上也可以有Labels,service也可以建立自己的Labels
- 並且注意上述的labels都是list,可以很多個!!
總結上述:
- Labels:是附加在Component上的key-value
- 而Label selector則是為了找尋對應的Label的Components
接著要執行上述的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
kube-Proxy:
- 接著要詳細了解到service如何將請求推給endpoints的IP位置?
- 又或著說誰管理著service endpoints
我這邊趁機刪一個Pod(因為不知道為啥我兩個都長到worker1去了)
真實的Request打進來流程則如下圖所示:
- kube-proxy是維護一個含有Service的IPs的清單,及其對應的Pod IPs
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指令觀察到status的yaml檔案內容,執行:
kubectl get {元件種類} {元件名稱} -o yaml