什麼是kubernetes?
服務部署模式的變遷
- 將服務直接部署在物理機上;
- 將服務部署在虛擬機上(虛擬機分隔物理資源,使服務器得到充分利用)openstack;
- 將服務部署到容器中(容器化),使用k8s管理容器;
帶來的問題
- 前提條件:SOA架構,微服務架構模式下,服務拆分越來越多,部署維護的服務越來越多,如此多的服務如何去管理?
- 面臨問題:
- 如何對服務進行橫向擴展?
- 如何應對容器宕機?數據應該如何恢復?
- 如何在不影響業務的前提下發布新版本?
- 如何對容器進行監控?
- 如何調度創建容器?
- 如何保證數據安全性?
- 以上問題使用k8s進行管理容器可以完美解決
雲架構 & 雲原生
- 雲 和 k8s 的關係
- 雲就是使用容器構建的一套服務集羣網絡,雲由很多的大量容器構成。
- k8s 就是用來管理雲中的容器。
- 雲架構
- iaas 基礎設施即服務
- paas 平臺即服務
- saas 軟件即服務
- serverless:站在用戶的角度考慮問題,用戶只需要使用雲服務器即可,在雲服務器所有的基礎環境,軟件環境都不需要用戶自己考慮。(趨勢)
- 雲原生:讓應用程序(項目,服務軟件)運行在雲上的解決方案叫做雲原生。具有以下特點:
- 容器化 --- 所有的服務都必須部署在容器中
- 微服務 --- web服務架構師微服務架構
- CI/CD
- DevOps
k8s 在企業中應用場景
- 可以構建自動化運維平臺
- 可以充分利用服務器資源
- 可以使服務進行無縫遷移
kubernetes 架構原理
- kubernetes 是google公司使用go語言開發,是根據borg系統開發出來的。
- kubernetes 架構
- master節點:不存儲容器,只負責調度、控制器、網關、資源對象存儲。
- api server:k8s網關,所有的指令請求都必須要經過api server;
- scheduler:調度器,使用調度算法,把請求資源調度某一個node節點;
- controller:控制器,維護k8s資源對象;
- etcd:存儲資源對象;
- node節點(物理機):內部存pod,pod中存容器。
- docker:運營容器的基礎環境,容器引擎;
- kubelet:在每一個node節點都存在一份,在node節點上的資源操作指令由kubelet來執行,負責本地pod的維護。
- kube-proxy:代理服務,負責負載均衡,在多個pod之間來做負載均衡;
- fluentd:日誌收集服務;
- pod:是k8s管理的基本單元(最小單元),pod內部存放容器。k8s不直接管理容器,而是管理pod;
- 關係: 一個master 對應一羣 node節點。
Pod 核心原理
- pod也是一個容器,用來封裝容器,相當於一個獨立主機(虛擬化分組)有自己的ip、主機名,一個沙箱環境;
- 在部署服務時,用來管理一組相關的服務(一般爲一個服務);
- 一組相關服務:在鏈式調用上的一組服務;
- 實現服務集羣:只需要複製多個pod副本即可,k8s的擴容、縮容就是在控制pod的數量;
- 無法直接對外提供服務:pod是虛擬化的,沒有物理機或網卡與之對應,只能綁定物理機的端口,讓其與pod的端口進行映射,這樣可以通過物理機進行數據包的轉發;
- 生命週期:每一個生命週期內的ip、hostname都是不同的,即pod宕機後新建的pod的ip、hostname與之前的不相同;
- Pod底層:
1.Pod內部容器創建之前,必須先創建pause容器。
2.服務容器之間訪問使用localhost,相當於訪問本地服務一樣。
ReplicaSet 副本控制器
- 功能:控制pod副本(服務集羣)的數量,使得永遠與設定的數量保持一致,當有pod宕機的時候,副本控制器會立馬重新創建一個新的pod;
- 原理:通過標籤選擇器來選擇維護一組相關的服務;
- 兩種副本控制器:
- ReplicationController:使用標籤選擇器時只能單選;
- ReplicaSet:使用標籤選擇器時既能單選也能複選;(建議使用)
Deployment 部署對象
- 服務部署結構模型,一般用來部署無狀態服務,不能部署有狀態的服務,如MySql;
- 支持滾動更新;
StatefulSet 部署對象
- 服務部署結構模型
- 解決有狀態服務的容器化部署問題
- 有狀態服務:
- 有實時的數據進行存儲;
- 有狀態服務集羣中,把一個服務抽離出去,一段時間後再加入集羣網絡,集羣網絡無法使用;
- 無狀態服務:
- 無實時的數據進行存儲;
- 無狀態服務集羣中,把一個服務抽離出去,一段時間後再加入集羣網絡,對集羣網絡沒有影響;
- 有狀態服務:
Service 資源對象
- pod IP:pod的 IP 地址;
- node IP:物理機的 IP 地址;
- cluster IP:虛擬 IP,是由k8s抽象出的service對象,這個service對象就是一個VIP的資源對象;
- 通信:service同樣不能直接對外提供服務,與pod間的通信是局域網通信;
- 請求流程:外部請求→物理機IP:Port→將請求交給service→service使用iptable、ipvs分發到pod;
- 實現負載均衡:service的負載均衡實際上是iptable、ipvs實現的;