為了能夠更全面的去理解k8s的原理
今天主要從k8s 幾個基礎的元件開始介紹
Pod: 在k8s中,代表的是最小的一個運行單位,是對於Container群集的一種抽象,
裏面可以跑多個Container,但通常是一個Pod內只有一個 container
Node: 在k8s中,代表的是一台伺服器,不論是虛擬機器或是一台實體的伺服器
裏面可以跑多個Pod
特別要注意的是每個Pod產生時都自動被賦予一個虛擬IP
而每個Pod可以透過這個虛擬IP來做溝通
以上圖為例:my-app pod 就可以透過 DB pod的虛擬IP 來存取到 DB 這個container
雖然每個Pod可以透過虛擬IP來做溝通
然而當每個Pod重新被建立時所屬的虛擬IP就重新被分配
加上Pod本身並非是穩定
所以透過虛擬IP來做Pod之間的溝通並非好方法
Service就是可以處理這個問題的元件
Service: 在k8s中, Service提供了一永久的IP讓Pod可以掛載在上面,
並且生命周期跟Pod不相依
所以不擔心Pod重建立之後存取點會變動
另外, Service會分位可以被外部存取與否分為, 外部Service還有內部Service兩種
Service提供了一個永久IP 然而對實際上的應用來說
可是透過IP的方式仍然不夠方便
Ingress元件提供了域名服務,讓外部使用者可以透過域名來存取對外的Service
Ingress:在k8s, Ingress 提供了域名服務,讓外部使用者可以透過域名來存取對外的Service,
並且能夠提供平衡負載跟路由的能力來有效分配封包給對應的Service
如果需要更新Pod內部的container內容時,就會需要重新建立container的映像檔
然而有時只是需要更新一些設定而已, 這樣的代價會有點高
ConfigMap元件讓Pod放置應用程式設定值,並且在整個pod可以共享設定值
因此當應用程式值做了修改,不需要經過整個重建container的過程
ConfigMap元件存儲設定檔的方式是明文,對一些敏感資料比如資料庫連線使用者帳密
不建議存放於此
Secret元件提供了Pod存放機敏資料的功能,以base64編碼存放資料
ConfigMap:在k8s中,ConfigMap提供存放Pod應用程式設定值的功能,
但是明碼存放,不適合存放機敏資料
Secret:提供了Pod存放機敏資料的功能,以base64編碼存放資料
在前面的架構中, DB Pod或是 APP Pod如果重新啟動之時
如果沒有另外掛載在container之外的存儲系統
存在container內的資料會在重新啟動後消失
所以如果希望container資料能夠在重啟後被保存
就需要用Volumes元件掛載資料到存儲系統
這個存儲系統可以在遠端也可以是雲端或是本地機器上
Volumes: 在k8s,提供Pod掛載存儲系統的元件,
這個存儲系統可以在遠端也可以是雲端或是本地機器上
要注意的是,k8s只維護狀態,並不會維護Pod所掛載的存儲系統狀態
概念如下:
k8s為了達到高可用性,因此每個對於每個Pod都是採用Replica的方式
直接複製一份Pod到另一個Node
複製的時候並非重新建制一個,而是使用Deployment元件來建制
Deployment是Pod的藍圖
可是對於有狀態的Pod,比如說Database,通常會掛載Volumes
在複製時需要考慮到寫入Volumes資料的一致性
這時就需要使用StatefulSet這個元件來做複製
Deployment: 在k8s中,用來建構無狀態Pod的藍圖
StatefulSet: 在k8s中,用來建構有狀態Pod的藍圖
特別的是,建構有狀態的Pod往往比無狀態的Pod複雜許多
因此k8s傾向建制無狀態的Pod
請問大大的流程圖是用什麼做的? 好厲害!
我是用這個 draw.io , 有問題都歡迎提出唷XD
好哦好哦,感謝大大XD