簡單說一下k8s集群內外網絡如何互通的
????????要在 Kubernetes(k8s)集群內外建立網絡互通,可以采取以下措施:
-
使用service:?使用Service類型為NodePort或LoadBalancer的Kubernetes服務。這可以使服務具有一個公共IP地址或端口,以便在集群內或外部訪問該服務。
-
使用Ingress:?配置Kubernetes Ingress資源。Ingress是一種路由機制,它將外部流量路由到Kubernetes集群中的特定服務。可以使用Ingress控制器來實現負載均衡和SSL終止。
-
創建網絡策略 :?Kubernetes網絡策略允許您定義哪些Pod可以與哪些其他Pod通信,以及在什么端口上進行通信。
-
使用DNS:?將集群內的服務和Pod綁定到一個公共IP地址或域名。可以使用DNS記錄來實現這一點,例如在Kubernetes中使用外部DNS插件。
-
配置網絡代理 :?網絡代理是一種可選的解決方案,它可以幫助在Kubernetes集群內外之間建立網絡互通。可以使用Ingress控制器或使用第三方代理解決方案,如NGINX或HAProxy。
描述下Pod的創建過程
????????描述一:
-
定義Pod:首先,需要定義一個Pod的配置文件,它描述了要創建的Pod的特征,例如Pod名稱、容器映像、容器端口等。
-
發送Pod配置文件:將Pod配置文件發送到Kubernetes集群中的API服務器。可以使用kubectl命令行工具或API客戶端向API服務器發送配置文件。
-
調度器分配節點:Kubernetes調度器將Pod分配給一個節點。調度器考慮節點資源的可用性、Pod的資源需求以及其他調度策略來做出決策。
-
容器創建:一旦Pod被調度到節點上,kubelet代理將創建Pod中定義的每個容器,并使用相應的容器映像來填充它們。
-
分配IP地址:Kubernetes分配一個IP地址給Pod,并將其添加到集群的網絡中,以便其他Pod可以與其通信。
-
啟動容器:一旦Pod中的所有容器都已創建并分配IP地址,kubelet將啟動每個容器,并開始在其內部運行應用程序。
-
容器監控:Kubernetes會持續監控Pod中的每個容器,并在出現故障或崩潰時重新啟動它們。
????????描述二:
-
Pod 的創建流程 kubectl向API Server發送創建請求ReplicaSet,API Server請求存儲在etcd Controller Manager接受到通知
-
Controller Manager通知到
-
Scheduler Scheduler通知Worker節點
-
API Server通知到Worker節點的kubelet
-
kubelet指示當前節點上的Container Runtime運行對應的容器
-
Container Runtime下載鏡像并啟動容器
k8s中Pod的終止過程
????????在 Kubernetes 中,一個 Pod 由一個或多個容器組成,因此 Pod 的終止過程實際上涉及到容器的終止以及 Pod 對應的資源的釋放等多個方面。
????????當 Kubernetes 接收到一個 Pod 的終止請求時,它將執行以下步驟:
-
從 Service 中刪除 Pod:如果 Pod 正在 Service 中被使用,Kubernetes 會將其從 Service 中刪除,以確保不再將流量發送到該 Pod。
-
關閉容器:Kubernetes 向 Pod 中的每個容器發送一個終止請求,容器將開始執行關閉的預定義步驟。這些步驟包括停止正在運行的進程、關閉網絡連接、清理文件系統等等。
-
發送 SIGTERM 信號:當 Kubernetes 接收到終止 Pod 的請求時,它將首先向容器發送 SIGTERM 信號,讓容器開始優雅地終止。這個信號的作用是告訴容器它需要開始終止了,但是需要等待一定的時間來完成正在運行的任務和釋放資源。
-
等待容器終止:Kubernetes 將等待容器在接收到 SIGTERM 信號后完成優雅終止。在這個等待期間,Kubernetes 將不再向 Pod 中發送新的請求,但它仍會監控 Pod 的狀態。
-
發送 SIGKILL 信號:如果容器沒有在一定的時間內完成優雅終止,Kubernetes 將發送 SIGKILL 信號給容器,強制終止容器并釋放其資源。
-
清理資源:Kubernetes 將釋放 Pod 使用的所有資源,包括節點上的網絡、存儲、內存等。同時,Kubernetes 還將更新其狀態,以便管理員和其他應用程序可以獲取到最新的 Pod 信息。
????????總的來說,Kubernetes Pod 的終止過程包括了多個步驟,以確保容器能夠安全、快速地釋放資源,同時不會丟失任何數據或產生其他的副作用。
k8s中的自動伸縮有哪些方式
????????kubernetes中的自動伸縮主要有以下幾種方式:
-
水平自動伸縮(Horizontal Pod Autoscaler,HPA):根據 CPU 利用率、內存利用率等指標,動態地增加或減少 Pod 的數量,以滿足應用的負載需求。HPA 是 Kubernetes 中最常用的自動伸縮方式之一。
-
垂直自動伸縮(Vertical Pod Autoscaler,VPA):根據容器內部資源使用情況,動態地調整容器的 CPU 和內存資源請求量。VPA 可以優化容器的資源利用率,提高應用的性能和可靠性。
-
集群自動伸縮(Cluster Autoscaler):根據集群節點的資源利用率,動態地增加或減少節點的數量,以適應不同的負載需求。集群自動伸縮可以自動擴容或縮容集群,確保應用的高可用性和可靠性。
-
自定義指標自動伸縮(Custom Metrics Autoscaler,CA):根據自定義指標,動態地增加或減少 Pod 的數量。CA 可以根據應用的特殊需求,靈活地定制自動伸縮策略,提高應用的性能和可靠性。
????????總的來說,Kubernetes 提供了多種自動伸縮方式,可以根據應用的特點和需求選擇合適的自動伸縮方式,以提高應用的性能、可靠性和可擴展性。
????????無論使用哪種自動伸縮方法,Kubernetes 都會根據應用程序的需求自動調整 Pod 的數量和資源限制,以確保應用程序始終具有足夠的資源,并且可以根據需要擴展或縮減。
k8s中的故障檢測有哪些方式
????????Kubernetes 中的探針是一種用于檢查應用程序狀態的機制。
????????探針可以檢查應用程序的運行狀況、存活性和就緒狀態,并在需要時自動修復任何問題。
????????探針可以使用三種類型:readiness(就緒狀態)、liveness(存活性)、startup(啟動時)
????????Kubernetes 中的故障檢測方式包括以下幾種:
-
Liveness Probe(存活探針):用于檢測容器是否處于正常運行狀態。如果存活探針檢測到容器內部的應用程序出現故障,Kubernetes 將會自動重啟該容器。存活探針設置方式,可以使用 HTTP 請求、TCP 連接或命令執行來設置。
-
Readiness Probe(就緒探針):用于檢測容器是否準備好接收流量。如果就緒探針檢測到容器沒有準備好,Kubernetes 將不會將流量路由到該容器。可以使用 HTTP 請求、TCP 連接或命令執行來設置就緒探針。
-
Startup Probe(啟動探針):用于檢測容器是否已經成功啟動。如果啟動探針檢測到容器啟動失敗,Kubernetes 將會嘗試重新啟動該容器。與存活探針和就緒探針不同,啟動探針只在容器啟動時運行一次,然后就不再運行了。
-
Node Health Check(節點健康檢查):用于檢測節點的狀態。如果節點出現故障,Kubernetes 將會將該節點上的所有容器轉移到其他節點上。可以使用 kubeadm 自帶的 kubeadm node 命令或 kubelet 的 --healthz 選項來設置節點健康檢查。
-
Cluster Health Check(集群健康檢查):用于檢測整個集群的狀態。可以使用 kubeadm 自帶的 kubeadm check 命令或 kubelet 的 --healthz 選項來設置集群健康檢查。此外,還可以使用 Kubernetes 官方提供的 kubeadm-diagnostics 工具來進行集群診斷。
k8s中的資源調度有哪些方式
????????Kubernetes 中的資源調度主要有以下幾種方式:
-
基于 CPU 和內存資源的靜態調度:在 Kubernetes 中,可以為每個 Pod 指定需要使用的 CPU 和內存資源。基于這些資源的需求,Kubernetes 會自動將 Pod 調度到具有足夠資源的節點上。這種方式稱為靜態調度,因為資源需求是在 Pod 創建時指定的,而不會隨著時間的推移而變化。
-
基于 CPU 和內存資源的動態調度:除了靜態調度外,Kubernetes 還支持基于 CPU 和內存資源的動態調度。在這種方式下,Kubernetes 會根據當前節點的資源使用情況,將 Pod 動態地調度到具有可用資源的節點上,從而實現資源的最優分配。
-
基于節點標簽的調度:Kubernetes 還支持基于節點標簽的調度。通過為節點打上不同的標簽,可以讓 Kubernetes 將特定類型的 Pod 調度到具有相應標簽的節點上。這種方式非常適合需要將不同類型的應用程序隔離開的場景。
-
基于節點親和性和反親和性的調度:在 Kubernetes 中,可以通過指定節點親和性和反親和性規則,來控制 Pod 被調度到哪些節點上。比如,可以指定一個 Pod 只能被調度到與指定節點具有相同標簽的節點上,或者指定一個 Pod 不能被調度到與指定節點具有相同標簽的節點上。
-
基于調度器插件的調度:Kubernetes 允許用戶編寫自己的調度器插件,并將其添加到 Kubernetes 集群中。通過使用這種方式,用戶可以實現定制化的調度策略,以滿足特定的需求。
k8s中的控制器(Controller)如何工作的
????????Kubernetes的控制器(Controller)是一種用于管理Kubernetes資源的控制器模式。
????????它確保系統處于期望的狀態,通過周期性地監視系統狀態,然后采取必要的操作使其達到期望狀態。
????????控制器負責監控Kubernetes資源對象的狀態,并確保資源對象的實際狀態與期望狀態匹配。
????????控制器的工作原理如下:
-
定義期望狀態:控制器定義資源對象的期望狀態,例如Pod應該運行在哪個節點上,有哪些容器以及運行的命令。
-
監控實際狀態:控制器周期性地監視系統狀態,通過 API Server 獲取資源對象的實際狀態,并與期望狀態進行比較。
-
執行調諧操作:如果實際狀態與期望狀態不匹配,則控制器執行必要的操作來將系統狀態調整為期望狀態。例如,如果Pod未在期望節點上運行,則控制器會調度Pod到正確的節點上。
-
重復以上步驟:控制器持續監視系統狀態,并根據需要執行調諧操作,直到實際狀態與期望狀態匹配為止。
????????Kubernetes提供了許多內置的控制器,如Deployment、ReplicaSet和StatefulSet,它們分別用于管理不同類型的應用程序和資源對象。
????????此外,用戶還可以編寫自定義控制器來管理自定義資源對象。