不寫點什麼就感覺自己沒學過一樣。
回憶一下Kubernetes中對應的學習過程
是什麼?
k8s是一個編排容器的工具,其實也是管理應用的全生命週期的一個工具,從建立應用,應用的部署,應用提供服務,擴容縮容應用,應用更新,都非常的方便,而且可以做到故障自愈,例如一個伺服器掛了,可以自動將這個伺服器上的服務排程到另外一個主機上進行執行,無需進行人工干涉。
幹什麼?
在Docker技術的基礎上,為容器化的應用提供部署執行、資源排程、服務發現和動態伸縮等一系列完整功能,提高了大規模容器叢集管理的便捷性。可以將Docker看成Kubernetes內部使用的低階別元件。Kubernetes不僅僅支援Docker,還支援Rocket,這是另一種容器技術。 使用Kubernetes可以:
- 自動化容器的部署和複製
- 隨時擴充套件或收縮容器規模
- 將容器組織成組,並且提供容器間的負載均衡
- 很容易地升級應用程式容器的新版本
- 提供容器彈性,如果容器失效就替換它,等等...
怎麼用?
使用階段常用命令(持續更新---)
根據檔案建立相應的resource
kubectl create -f 檔名
複製程式碼
replace更新替換資源
kubectl replace -f 檔名
複製程式碼
Delete刪除資源
kubectl delete -f 檔名
複製程式碼
檢視pod資訊(包括IP和node資訊)
kubectl get pods -o wide
複製程式碼
獲取service資訊
kubectl get svc -o wide
複製程式碼
檢視具體pod詳情,在排錯時尤為實用
kubectl describe pod POD-NAME -n NAMESPACE
複製程式碼
檢視service詳情
kubectl describe svc SERVICE-NAME -n NAMESPACE
複製程式碼
刪除資源的方式不生效,使用強制刪除
kubectl delete pods POD-NAME --grace-period=0 --force
複製程式碼
指定pod在指定的node上啟動(場景大概是,系統對外提供的訪問地址不能變,要固定住)
使node歸屬在一個zone上
kubectl label nodes NODE-NAME zone=north
複製程式碼
然後在啟動服務yml中增加nodeSelector
nodeSelector:
zone: north
複製程式碼
樣例
指定啟動的專案記憶體大小(優化JVM)
這裡是有個坑的,正式用K8s部署伺服器的時候,最開始一切正常但是,等幾個微服務都部署上去後,第二天早上發現所有的服務都重啟了好幾十次,每個服務都啟動了雙份或者多份,後來請運維人員查,才知道是伺服器記憶體不足導致的,然後就增加了專案啟動的記憶體優化,設定啟動記憶體。後續還出現過一次伺服器崩了的情況,是上傳大檔案把磁碟佔滿了,然後K8s直接掛掉了。(吸取教訓,以後長點心)
內部構造?
我簡單說一些基本概念,想深入瞭解移步 十分鐘帶你理解Kubernetes核心概念(形象的解釋各個元件之間關係的圖和更深入理解互動過程) 有幾張圖能很好看清互動關係
Pod
在k8s裡面,叢集排程的最小單元就是一個pod,一個pod可以是一個容器,也可以是多個容器,例如你執行一個程式,其中使用了nginx,使用mysql了,使用了jetty,那麼可以將這三個使用在同一個pod中,對他們提供統一的調配能力,一個pod只能執行在一個主機上,而一個主機上可以有多個pod。
Replication Controller
Recplication Controller用來管理pod的副本,保證叢集中存在置頂數量的pod副本,叢集中副本的數量大於置頂數量,則會殺掉置頂數量之外的多餘容器數量,反之則會啟動少於置頂數量個數的容器,保證數量不變,replication controller是實現彈性伸縮、動態擴容和滾動升級的核心。
Service
Service是定義一系列Pod以及訪問這些Pod的策略的一層抽象。Service通過Label找到Pod組。因為Service是抽象的,所以在圖表裡通常看不到它們的存在,這也就讓這一概念更難以理解。
Label
k8s中的容器api物件都是通過Label進行 ,label的實質是一系列的k/v鍵值對,label是replication controllerh和service執行的基礎,二者通過label進行判別node上執行的pod。
Node
物理或者虛擬機器器,作為Kubernetes worker,通常稱為Minion。每個節點都執行如下Kubernetes關鍵元件
- kubelet:是主節點代理
- kube-proxy:service使用其將連線路由到Pod
- docker或者rocket:k8s使用的容器技術來建立容器
Scheduler
排程器把未排程的pod通過binding api繫結到節點上。排程器是可插拔的,並且我們期待支援多叢集的排程,未來甚至希望可以支援使用者自定義的排程器。
下面三個涉及網路部分
kube-proxy
每一個節點也執行一個簡單的網路代理和負載均衡
etcd
所有master的持續狀態都存在etcd的一個例項中。這可以很好地儲存配置資料。因為有watch(觀察者)的支援,各部件協調中的改變可以很快被察覺。
flannel
flannel作為coreos提供給k8s的元件,在執行過程中通過與etcd進行通訊獲取整個叢集網段資訊並進行子網的二次分配,使得每個minion節點都能擁有一個唯一的子網網段,進而確保在整個k8s叢集中執行的docker容器都能獲得唯一的ip地址。
推薦一個全盤搜尋的軟體everything超級輕便好用,媽媽再也不用擔心我找不到檔案在哪裡了(七天有效)
連結:pan.baidu.com/s/1w3GolQSh… 提取碼:2080