一、k8s 的由來及其技術運用
1.1?k8s的簡介?
????????Kubernetes,詞根源于希臘語的 舵手、飛行員。在國內又稱k8s(因為k和s之間有8個字母,所以得名。“國內程序員的幽默”)。
作用:
????????用于自動部署、擴展和管理“容器化(containerized)應用程序”的開源系統。可以理解成 K8S 是負責自動化運維管理多個容器化程序(比如 Docker)的集群,是一個生態極其豐富的容器編排框架工具。
由來:
????????K8S由google的Borg系統(博格系統,google內部使用的大規模容器編排工具)作為原型,后經GO語言延用Borg的思路重寫并捐獻給CNCF基金會開源。
????????云原生基金會(CNCF)于2015年12月成立,隸屬于Linux基金會。CNCF孵化的第一個項目就是Kubernetes,隨著容器的廣泛使用,Kubernetes已經成為容器編排工具的事實標準
官網:Kubernetes
GitHub:
GitHub - kubernetes/kubernetes: Production-Grade Container Scheduling and Management
1.2?傳統后端部署與k8s 的對比
?傳統部署
?????????傳統的后端部署辦法:把程序包(包括可執行二進制文件、配置文件等)放到服務器上,接著運行啟動腳本把程序跑起來,同時啟動守護腳本定期檢查程序運行狀態、必要的話重新拉起程序。
????????此時一旦服務的請求量上來,已部署的服務響應不過來,傳統的做法往往是,如果請求量、內存、CPU超過閾值做了告警,運維人員馬上再加幾臺服務器,部署好服務之后,接入負載均衡來分擔已有服務的壓力。這樣問題就出現了:從監控告警到部署服務,中間需要人力介入! 沒有辦法自動完成服務的部署、更新、卸載和擴容、縮容
k8s的部署?
????????上述傳統后端部署的問題,就是k8s所要解決的問題。自動化運維管理容器化(Docker)程序。K8S是Google開源的容器集群管理系統,在Docker等容器技術的基礎上,為容器化的應用提供部署運行、資源調度、服務發現和動態伸縮等一系列完整功能,提高了大規模容器集群管理的便捷性。
K8S 的目標是讓部署容器化應用簡單高效。
K8S 解決了裸跑Docker 的若干痛點:
●單機使用,無法有效集群
●隨著容器數量的上升,管理成本攀升
●沒有有效的容災、自愈機制
●沒有預設編排模板,無法實現快速、大規模容器調度
●沒有統一的配置管理中心工具
●沒有容器生命周期的管理工具
●沒有圖形化運維管理工具
????????K8S是Google開源的容器集群管理系統,在Docker等容器技術的基礎上,為容器化的應用提供部署運行、資源調度、服務發現和動態伸縮等一系列完整功能,提高了大規模容器集群管理的便捷性。 其主要功能如下:
●使用 Docker 等容器技術對應用程序包裝(package)、實例化(instantiate)、運行(run)。
●以集群的方式運行、管理跨機器的容器。
●解決 Docker 跨機器容器之間的通訊問題。
●K8S 的自我修復機制使得容器集群總是運行在用戶期望的狀態。
1.3?K8S 的特性
●彈性伸縮
????????使用命令、UI或者基于CPU使用情況自動快速擴容和縮容應用程序實例,保證應用業務高峰并發時的高可用性;業務低峰時回收資源,以最小成本運行服務。
●自我修復
????????在節點故障時重新啟動失敗的容器,替換和重新部署,保證預期的副本數量;殺死健康檢査失敗的容器,并且在未準備好之前不會處理客戶端請求,確保線上服務不中斷。
●服務發現和負載均衡
????????K8S為多個容器提供一個統一訪問入口(內部IP地址和一個DNS名稱),并且負載均衡關聯的所有容器,使得用戶無需考慮容器IP問題。
●自動發布(默認滾動發布模式)和回滾
????????K8S采用滾動更新策略更新應用,一次更新一個或者部分Pod,而不是同時刪除所有Pod,如果更新過程中出現問題,將回滾更改,確保升級不影響業務。
●集中化配置管理和密鑰管理
????????管理機密數據和應用程序配置,而不需要把敏感數據暴露在鏡像里,提高敏感數據安全性。并可以將一些常用的配置存儲在K8S中,方便應用程序使用。
●存儲編排,支持外掛存儲并對外掛存儲資源進行編排
????????掛載外部存儲系統,無論是來自本地存儲,公有云(如AWS),還是網絡存儲(如NFS、Glusterfs、Ceph)都作為集群資源的一部分使用,極大提高存儲使用靈活性。
●任務批處理運行
????????提供一次性任務,定時任務;滿足批量數據處理和分析的場景。
1.4?k8s的主要功能
● 跨主機編排容器。
● 更充分地利用硬件資源來最大化地滿足企業應用的需求。
● 控制與自動化應用的部署與升級。
● 為有狀態的應用程序掛載和添加存儲器。
● 線上擴展或縮減容器化應用程序與它們的資源。
● 聲明式的容器管理,保證所部署的應用按照我們部署的方式運作。
● 通過自動布局、自動重啟、自動復制、自動伸縮實現應用的狀態檢查與自我修復。
● 為多個容器提供服務發現和負載均衡,使得用戶無需考慮容器IP問題。
二、Kubernetes 集群架構與組件
2.1?k8s的集群機構的簡單介紹
????????K8S 是屬于主從設備模型(Master-Slave 架構),即有 Master 節點負責集群的調度、管理和運維,Slave 節點是集群中的運算工作負載節點。
????????在 K8S 中,主節點一般被稱為 Master 節點,而從節點則被稱為 Worker Node 節點,每個 Node 都會被 Master 分配一些工作負載。
????????Master 組件可以在群集中的任何計算機上運行,但建議 Master 節點占據一個獨立的服務器。因為 Master 是整個集群的大腦,如果 Master 所在節點宕機或不可用,那么所有的控制命令都將失效。除了 Master,在 K8S 集群中的其他機器被稱為 Worker Node 節點,當某個 Node 宕機時,其上的工作負載會被 Master 自動轉移到其他節點上去。
2.2?k8s的 master核心組件
### Master 組件 ###
(1)Kube-apiserver
????????用于暴露 Kubernetes API,任何資源請求或調用操作都是通過 kube-apiserver 提供的接口進行。以 HTTP Restful API 提供接口服務,所有對象資源的增刪改查和監聽操作都交給 API Server 處理后再提交給 Etcd 存儲。
????????可以理解成 API Server 是 K8S 的請求入口服務。API Server 負責接收 K8S 所有請求(來自 UI 界面或者 CLI 命令行工具), 然后根據用戶的具體請求,去通知其他組件干活。可以說 API Server 是 K8S 集群架構的大腦。
(2)Kube-controller-manager
????????運行管理控制器,是 K8S 集群中處理常規任務的后臺線程,是 K8S 集群里所有資源對象的自動化控制中心。
????????在 K8S 集群中,一個資源對應一個控制器,而 Controller manager 就是負責管理這些控制器的。
????????由一系列控制器組成,通過 API Server 監控整個集群的狀態,并確保集群處于預期的工作狀態,比如當某個 Node 意外宕機時,Controller Manager 會及時發現并執行自動化修復流程,確保集群始終處于預期的工作狀態。
這些控制器主要包括:
- Node Controller(節點控制器):負責在節點出現故障時發現和響應。
- Replication Controller(副本控制器):負責保證集群中一個 RC(資源對象 Replication Controller)所關聯的 Pod 副本數始終保持預設值。可以理解成確保集群中有且僅有 N 個 Pod 實例,N 是 RC 中定義的 Pod 副本數量。
- Endpoints Controller(端點控制器):填充端點對象(即連接 Services 和 Pods),負責監聽 Service 和對應的 Pod 副本的變化。 可以理解端點是一個服務暴露出來的訪問點,如果需要訪問一個服務,則必須知道它的 endpoint。
- Service Account & Token Controllers(服務帳戶和令牌控制器):為新的命名空間創建默認帳戶和 API 訪問令牌。
- ResourceQuota Controller(資源配額控制器):確保指定的資源對象在任何時候都不會超量占用系統物理資源。
- Namespace Controller(命名空間控制器):管理 namespace 的生命周期。
- Service Controller(服務控制器):屬于 K8S 集群與外部的云平臺之間的一個接口控制器。
(3)Kube-scheduler
是負責資源調度的進程,根據調度算法為新創建的 Pod 選擇一個合適的 Node 節點。 ?62種
可以理解成 K8S 所有 Node 節點的調度器。當用戶要部署服務時,Scheduler 會根據調度算法選擇最合適的 Node 節點來部署 Pod。
?預選策略(predicate)
?優選策略(priorities)
API Server 接收到請求創建一批 Pod ,API Server 會讓 Controller-manager 按照所預設的模板去創建 Pod,Controller-manager 會通過 API Server 去找 Scheduler 為新創建的 Pod 選擇最適合的 Node 節點。比如運行這個 Pod 需要 2C4G 的資源,Scheduler 會通過預選策略過濾掉不滿足策略的 Node 節點。Node 節點中還剩多少資源是通過匯報給 API Server 存儲在 etcd 里,API Server 會調用一個方法找到 etcd 里所有 Node 節點的剩余資源,再對比 Pod 所需要的資源,如果某個 Node 節點的資源不足或者不滿足 預選策略的條件則無法通過預選。預選階段篩選出的節點,在優選階段會根據優先策略為通過預選的 Node 節點進行打分排名, 選擇得分最高的 Node。例如,資源越富裕、負載越小的 Node 可能具有越高的排名。
2.3?配置存儲中心
etcd 是 k8s 的存儲服務中心,但是它不屬于組件但是還是要說。
●etcd
????????K8S 的存儲服務。etcd 是分布式鍵值存儲系統,存儲了 K8S 的關鍵配置和用戶配置,K8S 中僅 API Server 才具備讀寫權限,其他組件必須通過 API Server 的接口才能讀寫數據。
2.4?k8s的Node 組件
(1)Kubelet
Node 節點的監視器,以及與 Master 節點的通訊器。Kubelet 是 Master 節點安插在 Node 節點上的“眼線”,它會定時向 API Server 匯報自己 Node 節點上運行的服務的狀態,并接受來自 Master 節點的指示采取調整措施。
從 Master 節點獲取自己節點上 Pod 的期望狀態(比如運行什么容器、運行的副本數量、網絡或者存儲如何配置等), 直接跟容器引擎交互實現容器的生命周期管理,如果自己節點上 Pod 的狀態與期望狀態不一致,則調用對應的容器平臺接口(即 docker 的接口)達到這個狀態。
管理鏡像和容器的清理工作,保證節點上鏡像不會占滿磁盤空間,退出的容器不會占用太多資源。
?
總結:
在 Kubernetes 集群中,在每個 Node(又稱 Worker Node)上都會啟動一個 kubelet 服務進程。該進程用于處理 Master 下發到本節點的任務,管理 Pod 及 Pod 中的容器。每個 kubelet 進程都會在 API Server 上注冊節點自身的信息,定期向 Master 匯報節點資源的使用情況,并通過 cAdvisor 監控容器和節點資源。
(2)Kube-Proxy
????????在每個 Node 節點上實現 Pod 網絡代理,是 Kubernetes Service 資源的載體,負責維護網絡規則和四層負載均衡工作。 負責寫入規則至iptables、ipvs實現服務映射訪問的。
????????Kube-Proxy 本身不是直接給 Pod 提供網絡,Pod 的網絡是由 Kubelet 提供的,Kube-Proxy 實際上維護的是虛擬的 Pod 集群網絡。
????????Kube-apiserver 通過監控 Kube-Proxy 進行對 Kubernetes Service 的更新和端點的維護。
????????在 K8S 集群中微服務的負載均衡是由 Kube-proxy 實現的。Kube-proxy 是 K8S 集群內部的負載均衡器。它是一個分布式代理服務器,在 K8S 的每個節點上都會運行一個 Kube-proxy 組件。
三種模式 網絡模型
node ip?
pod ip
cluster ip
(3)容器引擎 docker 或 rocket
????????容器引擎,運行容器,負責本機的容器創建和管理工作。
????????當 kubernetes 把 pod 調度到節點上,節點上的 kubelet會指示 docker 啟動特定的容器。接著,kubelet 會通過 docker 持續地收集容器的信息, 然后提交到主節點上。docker 會如往常一樣拉取容器鏡像、啟動或停止容器。不同點僅僅在于這是由自動化系統控制而非管理員在每個節點上手動操作的。?
三、Kubernetes 核心概念
Kubernetes 包含多種類型的資源對象:Pod、Label、Service、Replication Controller 等。
所有的資源對象都可以通過 Kubernetes 提供的 kubectl 工具進行增、刪、改、查等操作,并將其保存在 etcd 中持久化存儲。
Kubernets其實是一個高度自動化的資源控制系統,通過跟蹤對比etcd存儲里保存的資源期望狀態與當前環境中的實際資源狀態的差異,來實現自動控制和自動糾錯等高級功能。
3.1?pod的理解運用 與創建過程
Pod
????????Pod是 Kubernetes 創建或部署的最小/最簡單的基本單位,一個 Pod 代表集群上正在運行的一個進程。
????????可以而同一 Pod 內把 Pod 理解成豌豆莢,的每個容器是一顆顆豌豆。
????????一個 Pod 由一個或多個容器組成,Pod 中容器共享網絡、存儲和計算資源,在同一臺 Docker 主機上運行。
????????一個 Pod 里可以運行多個容器,又叫邊車模式(SideCar)。而在生產環境中一般都是單個容器或者具有強關聯互補的多個容器組成一個 Pod。
????????同一個 Pod 之間的容器可以通過 localhost 互相訪問,并且可以掛載 Pod 內所有的數據卷;但是不同的 Pod 之間的容器不能用 localhost 訪問,也不能掛載其他 Pod 的數據卷。
K8S創建Pod的工作流程
-
請求發起:用戶通過kubectl命令行工具或其他API客戶端向集群的主節點(Master)上的API Server提交創建Pod的請求。
-
信息持久化:API Server接收到請求后,首先將Pod的定義信息持久化存儲到分布式鍵值存儲系統Etcd中,確保數據的高可用性和一致性。
-
Pod配置處理:接著,Controller Manager識別到Etcd中新增的Pod定義,依據Pod的配置信息(如鏡像、資源需求等),準備Pod的初始化配置。
-
節點調度:Controller Manager委托Scheduler進行Pod的調度決策。Scheduler運用一系列算法評估集群中各Worker Node的資源狀況和約束條件,選擇最合適的節點來運行Pod。
-
節點通知:選定節點后,Scheduler通過API Server通知目標Node的Kubelet組件。Kubelet是每個節點上的代理服務,負責Pod及其容器的真正生命周期管理。
-
容器創建:Kubelet接收到指令后,與該節點上的容器運行時環境(如Docker或Containerd)交互,下載Pod所指定的鏡像,并啟動容器。
-
服務暴露:為了實現Pod的服務發現和負載均衡,用戶可以進一步創建Service資源。Service定義了如何訪問Pod的策略,包括負載均衡規則和網絡路由。Kube-Proxy組件監控Service的變化,根據Service配置在各節點上設置網絡規則,確保流量能夠被正確導向到Pod。
Pod 控制器
????????Pod 控制器是 Pod 啟動的一種模版,用來保證在K8S里啟動的 Pod 應始終按照用戶的預期運行(副本數、生命周期、健康狀態檢查等)。
K8S 內提供了眾多的 Pod 控制器,常用的有以下幾種:
?Deployment:無狀態應用部署。Deployment 的作用是管理和控制 Pod 和 ReplicaSet,管控它們運行在用戶期望的狀態中。
?ReplicaSet:確保預期的 Pod 副本數量。ReplicaSet 的作用就是管理和控制 Pod,管控他們好好干活。但是,ReplicaSet 受控于 Deployment。
????????可以理解成 Deployment 就是總包工頭,主要負責監督底下的工人 Pod 干活,確保每時每刻有用戶要求數量的 Pod 在工作。如果一旦發現某個工人 Pod 不行了,就趕緊新拉一個 Pod 過來替換它。而ReplicaSet 就是總包工頭手下的小包工頭。
????????從 K8S 使用者角度來看,用戶會直接操作 Deployment 部署服務,而當 Deployment 被部署的時候,K8S 會自動生成要求的 ReplicaSet 和 Pod。用戶只需要關心 Deployment 而不操心 ReplicaSet。
????????資源對象 Replication Controller 是 ReplicaSet 的前身,官方推薦用 Deployment 取代 Replication Controller 來部署服務。
?Daemonset:確保所有節點運行同一類 Pod,保證每個節點上都有一個此類 Pod 運行,通常用于實現系統級后臺任務。
比如我要在20臺節點的Kubernetes集群中部署Filebeat,并且希望每臺機器上都運行一個Filebeat實例來收集日志,那么使用DaemonSet是最為合適的方式。
?Statefulset:有狀態應用部署
?Job:一次性任務。根據用戶的設置,Job 管理的 Pod 把任務成功完成就自動退出了。
-
無狀態應用:重點在于每個應用實例不需要記住任何會話信息或共享數據。任何時刻,無狀態應用的任意實例都可以被替換,新實例可以立即接手工作而不需要從之前實例那里繼承或同步狀態信息。這種設計使得無狀態應用易于橫向擴展和管理,因為實例之間是相互獨立的。
-
有狀態應用:這類應用需要維護狀態,即應用實例之間或者實例內部存在數據依賴或共享狀態。例如,一個數據庫集群中的每個節點都存儲著一部分數據,它們之間需要保持數據的一致性和協調訪問。有狀態應用的擴展和管理更為復雜,通常需要確保數據的持久化存儲和實例的有序操作。
無狀態應用不依賴于實例間的狀態共享,容易橫向擴展和替換;而有狀態應用由于涉及到狀態和數據的持久化,需要特別的管理機制來確保數據的一致性和應用實例的有序性。
3.2 Label 標簽
標簽,是 K8S 特色的管理方式,便于分類管理資源對象。
????????Label 可以附加到各種資源對象上,例如 Node、Pod、Service、RC 等,用于關聯對象、查詢和篩選。
????????一個 Label 是一個 key-value 的鍵值對,其中 key 與 value 由用戶自己指定。
????????一個資源對象可以定義任意數量的Label,同一個Label 也可以被添加到任意數量的資源對象中,也可以在對象創建后動態添加或者刪除。
????????可以通過給指定的資源對象捆綁一個或多個不同的 Label,來實現多維度的資源分組管理功能。
與 Label 類似的,還有 Annotation(注釋)。
????????區別在于有效的標簽值必須為63個字符或更少,并且必須為空或以字母數字字符([a-z0-9A-Z])開頭和結尾,中間可以包含橫杠(-)、下劃線(_)、點(.)和字母或數字。注釋值則沒有字符長度限制。
3.3 Label 選擇器(Label selector)
????????給某個資源對象定義一個 Label,就相當于給它打了一個標簽;隨后可以通過標簽選擇器(Label selector)查詢和篩選擁有某些 Label 的資源對象。
????????標簽選擇器目前有兩種:基于等值關系(等于、不等于)和基于集合關系(屬于、不屬于、存在)。
3.4?Service? "服務"
????????在K8S的集群里,雖然每個Pod會被分配一個單獨的IP地址,但由于Pod是有生命周期的(它們可以被創建,而且銷毀之后不會再啟動),隨時可能會因為業務的變更,導致這個 IP 地址也會隨著 Pod 的銷毀而消失。
Service 就是用來解決這個問題的核心概念。
????????K8S 中的 Service 并不是我們常說的“服務”的含義,而更像是網關層,可以看作一組提供相同服務的Pod的對外訪問接口、流量均衡器。
Service 作用于哪些 Pod 是通過標簽選擇器來定義的。
????????在 K8S 集群中,Service 可以看作一組提供相同服務的 Pod 的對外訪問接口。客戶端需要訪問的服務就是 Service 對象。每個 Service 都有一個固定的虛擬 ip(這個 ip 也被稱為 Cluster IP),自動并且動態地綁定后端的 Pod,所有的網絡請求直接訪問 Service 的虛擬 ip,Service 會自動向后端做轉發。
????????Service 除了提供穩定的對外訪問方式之外,還能起到負載均衡(Load Balance)的功能,自動把請求流量分布到后端所有的服務上,Service 可以做到對客戶透明地進行水平擴展(scale)。
????????而實現 service 這一功能的關鍵,就是 kube-proxy。kube-proxy 運行在每個節點上,監聽 API Server 中服務對象的變化, 可通過以下三種流量調度模式: userspace(廢棄)、iptables(瀕臨廢棄)、ipvs(推薦,性能最好)來實現網絡的轉發。
????????Service 是 K8S 服務的核心,屏蔽了服務細節,統一對外暴露服務接口,真正做到了“微服務”。比如我們的一個服務 A,部署了 3 個副本,也就是 3 個 Pod; 對于用戶來說,只需要關注一個 Service 的入口就可以,而不需要操心究竟應該請求哪一個 Pod。
????????優勢非常明顯:一方面外部用戶不需要感知因為 Pod 上服務的意外崩潰、K8S 重新拉起 Pod 而造成的 IP 變更, 外部用戶也不需要感知因升級、變更服務帶來的 Pod 替換而造成的 IP 變化。
3.5?Ingress
????????Service 主要負責 K8S 集群內部的網絡拓撲,那么集群外部怎么訪問集群內部呢?這個時候就需要 Ingress 了。Ingress 是整個 K8S 集群的接入層,負責集群內外通訊。
????????Ingress 是 K8S 集群里工作在 OSI 網絡參考模型下,第7層的應用,對外暴露的接囗,典型的訪問方式是 http/https。
????????Service 只能進行第四層的流量調度,表現形式是 ip+port。Ingress 則可以調度不同業務域、不同URL訪問路徑的業務流量。
比如:客戶端請求 http://www.benet.com:port ?---> Ingress ---> Service ---> Pod
1、service資源通過標簽選擇器關聯具有相同標簽的Pod
2、每個service都有一個固定的cluster ip(虛擬IP),可供 在k8s 集群內部訪問
3、當有網絡請求直接訪問 Service 的虛擬 ip時,service會對請求進行負載均衡并以4層代理轉發到它所關聯的后端pod上。
4、ingree可以作為k8s對外暴露的網關接口 接收k8s集群外部發來的請求流量。
5、ingree 支持7層代理轉發,它可以根據不同的域名或者URL訪問路徑把請求流量轉發到不同的service上。
3.6 Name
由于 K8S 內部,使用 “資源” 來定義每一種邏輯概念(功能),所以每種 “資源”,都應該有自己的 “名稱”。
“資源” 有 api 版本(apiversion)、類別(kind)、元數據(metadata)、定義清單(spec)、狀態(status)等配置信息。
“名稱” 通常定義在 “資源” 的 “元數據” 信息里。在同一個 namespace 空間中必須是唯一的。
3.7?Namespace
????????隨著項目增多、人員增加、集群規模的擴大,需要一種能夠邏輯上隔離 K8S 內各種 “資源” 的方法,這就是 Namespace。
Namespace 是為了把一個 K8S 集群劃分為若干個資源不可共享的虛擬集群組而誕生的。
????????不同 Namespace 內的 “資源” 名稱可以相同,相同 Namespace 內的同種 “資源”,“名稱” 不能相同。
????????合理的使用 K8S 的 Namespace,可以使得集群管理員能夠更好的對交付到 K8S 里的服務進行分類管理和瀏覽。
K8S 里默認存在的 Namespace 有:default、kube-system、kube-public 等。
查詢 K8S 里特定 “資源” 要帶上相應的 Namespace。
四、常見的K8S按照部署方式
●Minikube
Minikube是一個工具,可以在本地快速運行一個單節點微型K8S,僅用于學習、預覽K8S的一些特性使用。
部署地址:https://kubernetes.io/docs/setup/minikube
●Kubeadmin
Kubeadmin也是一個工具,提供kubeadm init和kubeadm join,用于快速部署K8S集群,相對簡單。
https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm/
●二進制安裝部署
生產首選,從官方下載發行版的二進制包,手動部署每個組件和自簽TLS證書,組成K8S集群,新手推薦。
https://github.com/kubernetes/kubernetes/releases
????????小結:Kubeadm降低部署門檻,但屏蔽了很多細節,遇到問題很難排查。如果想更容易可控,推薦使用二進制包部署Kubernetes集群,雖然手動部署麻煩點,期間可以學習很多工作原理,也利于后期維護。
k8s部署 二進制與高可用的區別
?●二進制部署
部署難,管理方便,集群伸展性能好
更穩定,集群規模到達一定的規模(幾百個節點、上萬個Pod),二進制穩定性是要高于kubeadm部署
遇到故障,宿主機起來了,進程也會起來
●kubeadm部署
部署簡單,管理難
是以一種容器管理容器的方式允許的組件及服務,故障恢復時間比二進制慢
遇到故障,啟動宿主機,再啟動進程,最后去啟動容器,集群才能恢復,速度比二進制慢