精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Kubernetes中的優(yōu)雅關(guān)閉和零停機時間部署

開發(fā) 前端
如果你的Pod運行長時間的任務(wù),例如視頻轉(zhuǎn)碼或使用WebSockets提供實時更新,請考慮使用Rainbow Deployments。在Rainbow Deployments中,你為每個發(fā)布創(chuàng)建一個新的部署,并在連接(或任務(wù))耗盡時刪除先前的部署。

在Kubernetes中,創(chuàng)建和刪除Pod是最常見的任務(wù)之一。

當(dāng)你執(zhí)行滾動更新、擴展部署、發(fā)布新版本、執(zhí)行作業(yè)和定時作業(yè)等操作時,都會創(chuàng)建Pod。

但是,在Pod被驅(qū)逐后,例如將節(jié)點標記為不可調(diào)度時,Pod也會被刪除并重新創(chuàng)建。

如果這些Pod的性質(zhì)是如此短暫,那么當(dāng)一個Pod正在響應(yīng)請求時,如果被告知關(guān)閉,會發(fā)生什么?在關(guān)閉之前,請求是否會完成?那么后續(xù)的請求呢?是否會被重定向到其他地方?

在討論Pod被刪除時會發(fā)生什么之前,有必要談?wù)劗?dāng)Pod被創(chuàng)建時會發(fā)生什么。

假設(shè)你想在集群中創(chuàng)建以下Pod:

pod.yaml

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
    - name: web
      image: nginx
      ports:
        - name: web
          containerPort: 80

你可以使用以下命令將YAML定義提交到集群中:

$ kubectl apply -f pod.yaml

一旦你輸入該命令,kubectl會將Pod定義提交給Kubernetes API。

在數(shù)據(jù)庫中保存集群的狀態(tài)

Pod的定義被API接收并進行檢查,隨后存儲在數(shù)據(jù)庫(etcd)中。

Pod也被添加到調(diào)度器的隊列中。

調(diào)度器執(zhí)行以下操作:

檢查Pod的定義。

收集關(guān)于工作負載的詳細信息,例如CPU和內(nèi)存請求。

通過篩選器和判定的過程決定最適合運行該Pod的節(jié)點。

在此過程結(jié)束時:

  • Pod在etcd中被標記為已調(diào)度。
  • Pod被分配給一個節(jié)點。
  • Pod的狀態(tài)被存儲在etcd中。

然而,此時Pod仍然不存在。

  1. 當(dāng)你使用kubectl apply -f命令提交一個Pod的YAML文件時,該YAML文件會被發(fā)送到Kubernetes API。

圖片圖片

  1. API將Pod保存在數(shù)據(jù)庫(etcd)中。

圖片圖片

3. 調(diào)度器為該Pod分配了最適合的節(jié)點,Pod的狀態(tài)變?yōu)镻ending。此時,Pod只存在于etcd中。

圖片圖片

在控制平面中發(fā)生了前述任務(wù),并且狀態(tài)存儲在數(shù)據(jù)庫中。

**那么是誰在你的節(jié)點上創(chuàng)建Pod呢?

Kubelet-Kubernetes代理

Kubelet 的任務(wù)是輪詢控制平面以獲取更新。

你可以想象kubelet不斷地向主節(jié)點發(fā)出請求:“我負責(zé)管理工作節(jié)點1,是否有新的Pod需要我處理?”

當(dāng)有一個Pod需要處理時,kubelet會創(chuàng)建它,在某種程度上是這樣的。

kubelet并不是直接創(chuàng)建Pod。相反,它將工作委托給其他三個組件:

  • 容器運行時接口(CRI):負責(zé)為Pod創(chuàng)建容器。
  • 容器網(wǎng)絡(luò)接口(CNI):負責(zé)將容器連接到集群網(wǎng)絡(luò)并分配IP地址。
  • 容器存儲接口(CSI):負責(zé)在容器中掛載卷。

在大多數(shù)情況下,容器運行時接口(CRI)的工作類似于:

$ docker run -d <my-container-image>

容器網(wǎng)絡(luò)接口(CNI)更有趣,因為它負責(zé)以下任務(wù):

  1. 為Pod生成有效的IP地址。
  2. 將容器連接到網(wǎng)絡(luò)的其他部分。

正如你所想象的,連接容器到網(wǎng)絡(luò)并分配有效的IP地址有多種方式(可以選擇IPv4或IPv6,甚至可以分配多個IP地址)。

以Docker為例,它會創(chuàng)建虛擬以太網(wǎng)對并將其附加到一個橋接器上;而AWS-CNI會直接將Pod連接到虛擬私有云(VPC)的其余部分。

當(dāng)容器網(wǎng)絡(luò)接口完成其工作時,Pod將連接到網(wǎng)絡(luò)的其余部分,并被分配一個有效的IP地址。

但是存在一個問題。

kubelet知道IP地址(因為它調(diào)用了容器網(wǎng)絡(luò)接口),但控制平面不知道。

沒有人告訴主節(jié)點Pod已被分配了IP地址,并且準備好接收流量。在控制平面的視角中,Pod仍在創(chuàng)建中。

kubelet的工作是收集Pod的所有細節(jié),例如IP地址,并將其報告給控制平面。

你可以想象,檢查etcd將不僅揭示Pod的運行位置,還會顯示其IP地址。

1. Kubelet定期向控制平面輪詢更新。

圖片

2. 當(dāng)一個新的Pod被分配給它所在的節(jié)點時,kubelet會獲取該Pod的詳細信息。

圖片

3. kubelet本身不會創(chuàng)建Pod,它依賴于三個組件:容器運行時接口(Container Runtime Interface)、容器網(wǎng)絡(luò)接口(Container Network Interface)和容器存儲接口(Container Storage Interface)。

圖片

4. 一旦這三個組件都成功完成,Pod就會在你的節(jié)點上運行,并分配了一個IP地址。

圖片

5. kubelet將IP地址報告給控制平面。

圖片

如果Pod不是任何服務(wù)的一部分,這就是任務(wù)的結(jié)束。Pod已創(chuàng)建并準備好使用。

當(dāng)Pod是服務(wù)的一部分時,還需要進行一些額外的步驟。

Pods和服務(wù)

創(chuàng)建服務(wù)時,通常需要注意兩個關(guān)鍵信息:

  1. 選擇器(selector):用于指定接收流量的Pod。
  2. 目標端口(targetPort):Pod用于接收流量的端口。

一個典型的服務(wù)的YAML定義如下:

service.yaml

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  ports:
  - port: 80
    targetPort: 3000
  selector:
    name: app

當(dāng)你使用kubectl apply將服務(wù)提交到集群時,Kubernetes會查找所有具有與選擇器(name: app)相同標簽的Pod,并收集它們的IP地址,但前提是它們通過了就緒探針(Readiness probe)。

然后,對于每個IP地址,Kubernetes會將IP地址和端口連接起來。

如果IP地址是10.0.0.3,目標端口是3000,Kubernetes會將這兩個值連接起來,并稱其為一個端點(endpoint)。

IP address + port = endpoint
---------------------------------
10.0.0.3   + 3000 = 10.0.0.3:3000

這些端點將以另一個名為Endpoint的對象形式存儲在etcd中。

有點困惑嗎?

在Kubernetes中,以下術(shù)語適用:

endpoint(本文和Learnk8s材料中以小寫字母e表示)是IP地址和端口對的組合(10.0.0.3:3000)。 Endpoint(本文和Learnk8s材料中以大寫字母E表示)是一組端點的集合。 Endpoint對象是Kubernetes中的一個真實對象,對于每個服務(wù),Kubernetes會自動創(chuàng)建一個Endpoint對象。

你可以使用以下命令進行驗證:

$ kubectl get services,endpoints
NAME                   TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)
service/my-service-1   ClusterIP   10.105.17.65   <none>        80/TCP
service/my-service-2   ClusterIP   10.96.0.1      <none>        443/TCP


NAME                     ENDPOINTS
endpoints/my-service-1   172.17.0.6:80,172.17.0.7:80
endpoints/my-service-2   192.168.99.100:8443

Endpoint會收集來自Pod的所有IP地址和端口。

但不僅如此。當(dāng)發(fā)生以下情況時,Endpoint對象會使用新的端點列表進行刷新:

  1. 創(chuàng)建一個Pod。
  2. 刪除一個Pod。
  3. 在Pod上修改標簽。

因此,你可以想象,每當(dāng)你創(chuàng)建一個Pod,并且kubelet將其IP地址提交給主節(jié)點后,Kubernetes會更新所有的端點以反映這種變化:

$ kubectl get services,endpoints
NAME                   TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)
service/my-service-1   ClusterIP   10.105.17.65   <none>        80/TCP
service/my-service-2   ClusterIP   10.96.0.1      <none>        443/TCP


NAME                     ENDPOINTS
endpoints/my-service-1   172.17.0.6:80,172.17.0.7:80
endpoints/my-service-2   192.168.99.100:8443

很好,端點被存儲在控制平面中,并且Endpoint對象已被更新。

1. 在這張圖片中,你的集群中部署了一個單獨的Pod。該Pod屬于一個服務(wù)。如果你要檢查etcd,你會發(fā)現(xiàn)Pod的詳細信息以及服務(wù)的信息。

圖片

2. 當(dāng)部署新的Pod時會發(fā)生什么?

圖片

3. Kubernetes需要跟蹤Pod及其IP地址。服務(wù)應(yīng)該將流量路由到新的端點,因此IP地址和端口應(yīng)該被傳播。

圖片

4. 當(dāng)另一個Pod被部署時會發(fā)生什么?

圖片

5. 是的,完全相同的過程。在數(shù)據(jù)庫中創(chuàng)建了新的“行”來表示新的Pod,并將端點進行傳播。

圖片

6. 當(dāng)刪除一個Pod時會發(fā)生什么?

圖片

7. 服務(wù)立即移除該端點,最終該Pod也會從數(shù)據(jù)庫中刪除。

圖片

8. Kubernetes對你的集群中的每一個小變化都做出反應(yīng)。

圖片

在Kubernetes中使用端點

端點在Kubernetes中被多個組件使用。

Kube-proxy使用端點來在節(jié)點上設(shè)置iptables規(guī)則。

因此,每當(dāng)端點(Endpoint對象)發(fā)生變化時,kube-proxy會獲取新的IP地址和端口列表,并編寫新的iptables規(guī)則。

  1. 讓我們考慮一個由三個節(jié)點組成的集群,其中有兩個Pod,并且沒有服務(wù)。Pod的狀態(tài)被存儲在etcd中。

圖片

2. 當(dāng)你創(chuàng)建一個服務(wù)(Service)時會發(fā)生什么?

圖片

3. Kubernetes創(chuàng)建了一個Endpoint對象,并收集了來自Pod的所有端點(IP地址和端口對)。

圖片

4. kube-proxy守護程序訂閱對Endpoint的更改。

圖片

5. 當(dāng)Endpoint被添加、刪除或更新時,kube-proxy會獲取新的端點列表。

圖片

6. kube-proxy使用端點來在集群的每個節(jié)點上創(chuàng)建iptables規(guī)則。

圖片

Ingress控制器也使用相同的端點列表。

Ingress控制器是集群中將外部流量路由到集群內(nèi)的組件。

當(dāng)你設(shè)置一個Ingress配置文件時,通常會指定Service作為目標:

入口.yaml

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-ingress
spec:
  rules:
  - http:
      paths:
      - backend:
          service:
            name: my-service
            port:
              number: 80
        path: /
        pathType: Prefix

實際上,流量并不會直接路由到Service。

相反,Ingress控制器建立了一個訂閱,以便在Service的端點發(fā)生變化時收到通知。

Ingress直接將流量路由到Pods,跳過了Service。

正如你所想象的那樣,每當(dāng)Endpoint(對象)發(fā)生變化時,Ingress會獲取新的IP地址和端口列表,并重新配置控制器以包括新的Pods。

  1. 在這張圖片中,有一個帶有兩個副本的Ingress控制器和一個Service的部署(Deployment)。

圖片

2. 如果你想通過Ingress將外部流量路由到Pods,你應(yīng)該創(chuàng)建一個Ingress配置文件(一個YAML文件)。

圖片

3. 一旦你運行kubectl apply -f ingress.yaml命令,Ingress控制器就會從控制平面中獲取配置文件。

圖片

4. Ingress的YAML文件中有一個serviceName屬性,用于描述應(yīng)該使用哪個Service。

圖片

5. Ingress控制器從Service中檢索端點列表,并跳過該Service。流量直接流向端點(Pods)。

圖片

6. 當(dāng)創(chuàng)建一個新的Pod時會發(fā)生什么?

圖片

7. 你已經(jīng)知道Kubernetes如何創(chuàng)建Pod并傳播端點信息了。

圖片

8. Ingress控制器訂閱對端點的更改。由于有一個新的變化,它會獲取新的端點列表。

圖片

9. Ingress控制器將流量路由到新的Pod上。

圖片

還有其他訂閱端點更改的Kubernetes組件的示例。

集群中的DNS組件CoreDNS就是其中之一。

如果你使用Headless類型的Service,CoreDNS將需要訂閱端點的更改,并在每次添加或刪除端點時重新配置自身。

同樣,服務(wù)網(wǎng)格(如Istio或Linkerd)、云服務(wù)提供商用于創(chuàng)建類型為LoadBalancer的服務(wù),以及無數(shù)的操作員都會使用這些端點。

你必須記住,有多個組件訂閱端點的更改,它們可能在不同的時間接收到關(guān)于端點更新的通知。

這就足夠了,或者還有在創(chuàng)建Pod后發(fā)生的事情嗎?

創(chuàng)建Pod時發(fā)生的主要步驟的簡要回顧:

  1. Pod被存儲在etcd中。
  2. 調(diào)度器分配一個節(jié)點,并將該節(jié)點寫入etcd。
  3. kubelet收到新的已調(diào)度Pod的通知。
  4. kubelet將創(chuàng)建容器的任務(wù)委托給容器運行時接口(CRI)。
  5. kubelet將容器連接到容器網(wǎng)絡(luò)接口(CNI)的任務(wù)委托給它。
  6. kubelet將容器中的掛載卷的任務(wù)委托給容器存儲接口(CSI)。
  7. 容器網(wǎng)絡(luò)接口分配一個IP地址。
  8. kubelet將IP地址報告給控制平面。
  9. IP地址被存儲在etcd中。

如果你的Pod屬于一個Service:

  1. kubelet等待成功的就緒探針(Readiness probe)。
  2. 所有相關(guān)的端點(對象)都會收到變更的通知。
  3. 端點將新的端點(IP地址+端口對)添加到它們的列表中。
  4. Kube-proxy收到端點變更的通知。Kube-proxy在每個節(jié)點上更新iptables規(guī)則。
  5. Ingress控制器收到端點變更的通知。控制器將流量路由到新的IP地址上。
  6. CoreDNS收到端點變更的通知。如果Service的類型是Headless,DNS條目將被更新。
  7. 云服務(wù)提供商收到端點變更的通知。如果Service的類型是LoadBalancer,新的端點將作為負載均衡池的一部分進行配置。
  8. 集群中安裝的任何服務(wù)網(wǎng)格都會收到端點變更的通知。
  9. 任何訂閱端點變更的其他操作員也會收到通知。

對于一個看似普通的任務(wù)——創(chuàng)建一個Pod來說,這個列表確實很長。

Pod已經(jīng)運行起來了。現(xiàn)在是時候討論一下當(dāng)你刪除Pod時會發(fā)生什么了。

刪除Pod

你可能已經(jīng)猜到了,但是當(dāng)刪除Pod時,你需要按照相同的步驟但是逆序進行操作。

首先,應(yīng)該從Endpoint(對象)中移除端點。

這次Readiness probe會被忽略,并且端點會立即從控制平面中刪除。

這反過來會觸發(fā)kube-proxy、Ingress控制器、DNS、服務(wù)網(wǎng)格等所有事件。

這些組件將更新其內(nèi)部狀態(tài),并停止將流量路由到該IP地址。

由于這些組件可能正在執(zhí)行其他操作,無法保證從其內(nèi)部狀態(tài)中刪除IP地址需要多長時間。對于某些組件來說,可能只需要不到一秒的時間;而對于其他組件來說,可能需要更長的時間。

對一些來說,這可能只需要不到一秒鐘;對其他來說,這可能需要更多。

1. 如果你使用kubectl delete pod刪除一個Pod,該命令首先會發(fā)送到Kubernetes API。

圖片

2. 該消息會被控制平面中的特定控制器——Endpoint控制器所攔截。

圖片

3. Endpoint控制器向API發(fā)送命令,將IP地址和端口從Endpoint對象中移除。

圖片

4. 誰會監(jiān)聽Endpoint的更改?kube-proxy、Ingress控制器、CoreDNS等組件會收到關(guān)于這一變更的通知。

圖片

5. 一些組件,如kube-proxy,可能需要額外的時間來進一步傳播這些更改。

圖片

與此同時,etcd中的Pod狀態(tài)被更改為Terminating(終止中)。

kubelet收到此變更的通知,并進行以下操作:

  1. 將容器中的任何掛載卷從容器存儲接口(CSI)卸載。
  2. 將容器從網(wǎng)絡(luò)中分離,并釋放IP地址給容器網(wǎng)絡(luò)接口(CNI)。
  3. 將容器銷毀給容器運行時接口(CRI)。

換句話說,Kubernetes按照與創(chuàng)建Pod完全相同的步驟來進行反向操作。

1. 如果你使用kubectl delete pod刪除一個Pod,該命令首先會發(fā)送到Kubernetes API。

圖片

2. 當(dāng)kubelet輪詢控制平面以獲取更新時,它會注意到Pod已被刪除。

圖片

3. kubelet將銷毀Pod的任務(wù)委托給容器運行時接口(Container Runtime Interface)、容器網(wǎng)絡(luò)接口(Container Network Interface)和容器存儲接口(Container Storage Interface)。

圖片

然而,這里存在一個微妙但關(guān)鍵的區(qū)別。

當(dāng)你終止一個Pod時,移除端點和向kubelet發(fā)送的信號同時發(fā)出。

當(dāng)你首次創(chuàng)建一個Pod時,Kubernetes會等待kubelet報告IP地址,然后開始端點傳播。

然而,當(dāng)你刪除一個Pod時,事件會并行發(fā)生。

這可能導(dǎo)致多種競爭條件的出現(xiàn)。

如果在端點傳播之前刪除了Pod會怎樣呢?

1. 刪除端點和刪除Pod同時進行。

圖片

2. 因此,在kube-proxy更新iptables規(guī)則之前,你可能會先刪除端點。

圖片

3. 或者你可能更幸運,只有在端點完全傳播之后才刪除Pod。

圖片

優(yōu)雅關(guān)閉

當(dāng)一個Pod在從kube-proxy或Ingress控制器中移除端點之前被終止時,你可能會遇到停機時間。

如果仔細思考一下,這是有道理的。

Kubernetes仍然將流量路由到該IP地址,但Pod已經(jīng)不存在了。

Ingress控制器、kube-proxy、CoreDNS等組件沒有足夠的時間將IP地址從其內(nèi)部狀態(tài)中移除。

理想情況下,Kubernetes應(yīng)該在刪除Pod之前等待集群中的所有組件都具有更新的端點列表。

但是Kubernetes并不是這樣工作的。

Kubernetes提供了強大的原始組件來分發(fā)端點(例如Endpoint對象和更高級的抽象,如Endpoint Slices)。

然而,Kubernetes并不驗證訂閱端點變更的組件是否與集群狀態(tài)保持同步。

那么,為了避免這種競爭條件并確保在端點傳播后刪除Pod,你可以做些什么呢?

你應(yīng)該等待。當(dāng)Pod即將被刪除時,它會收到一個SIGTERM信號。

你的應(yīng)用程序可以捕獲該信號并開始關(guān)閉。

由于在Kubernetes中不太可能立即從所有組件中刪除端點,你可以:

  1. 在退出之前等待更長的時間。
  2. 盡管收到SIGTERM信號,仍然處理傳入的流量。
  3. 最后,關(guān)閉現(xiàn)有的長連接(例如數(shù)據(jù)庫連接或WebSockets)。
  4. 關(guān)閉進程。

你應(yīng)該等待多長時間呢?默認情況下,Kubernetes會發(fā)送SIGTERM信號,并在強制終止進程之前等待30秒鐘。

因此,你可以在最初的15秒內(nèi)繼續(xù)正常運行。

希望這個時間間隔足夠?qū)⒍它c移除的更改傳播到kube-proxy、Ingress控制器、CoreDNS等組件。

隨著時間的推移,越來越少的流量會到達你的Pod,直到最終停止。

在15秒之后,可以安全地關(guān)閉與數(shù)據(jù)庫(或任何持久連接)的連接并終止進程。

如果你認為需要更多時間,可以在20或25秒時停止進程。

但是,請記住,Kubernetes將在30秒后強制終止進程(除非你在Pod定義中更改了terminationGracePeriodSeconds)。

如果無法更改代碼以等待更長時間怎么辦?你可以調(diào)用一個腳本等待固定的時間,然后讓應(yīng)用程序退出。

在調(diào)用SIGTERM之前,Kubernetes在Pod中提供了一個preStop鉤子。你可以將preStop鉤子設(shè)置為等待15秒鐘。

讓我們看一個示例:

pod.yaml

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
    - name: web
      image: nginx
      ports:
        - name: web
          containerPort: 80
      lifecycle:
        preStop:
          exec:
            command: ["sleep", "15"]

preStop鉤子是Pod生命周期鉤子之一。

15秒的延遲是推薦的時間嗎?這取決于情況,但這可能是開始測試的合理方式。

以下是你可以選擇的選項的總結(jié):

1. 你已經(jīng)知道,當(dāng)一個Pod被刪除時,kubelet會收到這一變更的通知。

圖片圖片

2. 如果Pod具有preStop鉤子,它會首先被調(diào)用。

圖片

3. 當(dāng)preStop鉤子完成后,kubelet會向容器發(fā)送SIGTERM信號。從那時起,容器應(yīng)該關(guān)閉所有長連接并準備終止。

圖片

4. 默認情況下,進程有30秒的時間退出,其中包括preStop鉤子的執(zhí)行時間。如果進程在此期間未退出,kubelet將發(fā)送SIGKILL信號并強制終止進程。

圖片

5. kubelet通知控制平面成功刪除了該Pod。

圖片

優(yōu)雅期限和滾動更新

優(yōu)雅關(guān)閉適用于被刪除的Pod。

但如果你不刪除Pod呢?即使你不刪除Pod,Kubernetes也會定期刪除Pod。

特別是,每當(dāng)你部署應(yīng)用程序的新版本時,Kubernetes會創(chuàng)建和刪除Pod。

當(dāng)你在部署中更改鏡像時,Kubernetes會逐步推出變更。

pod.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: app
spec:
  replicas: 3
  selector:
    matchLabels:
      name: app
  template:
    metadata:
      labels:
        name: app
    spec:
      containers:
      - name: app
        # image: nginx:1.18 OLD
        image: nginx:1.19
        ports:
          - containerPort: 3000

如果你有三個副本,并且在提交新的YAML資源給Kubernetes后,Kubernetes會:

  • 創(chuàng)建一個包含新容器鏡像的Pod。
  • 銷毀一個現(xiàn)有的Pod。
  • 等待Pod就緒。

然后它會重復(fù)上述步驟,直到所有的Pod都遷移到新版本。

Kubernetes只有在新的Pod準備好接收流量(也就是通過了就緒性檢查)后才會重復(fù)每個周期。

Kubernetes在繼續(xù)處理下一個Pod之前是否等待Pod被刪除?

不會。

如果你有10個Pod,并且每個Pod需要2秒鐘準備就緒和20秒鐘關(guān)閉,情況如下:

  1. 首先創(chuàng)建一個新的Pod,并終止一個之前的Pod。
  2. 新的Pod需要2秒鐘準備就緒,然后Kubernetes創(chuàng)建一個新的Pod。
  3. 與此同時,正在終止的Pod保持終止狀態(tài)20秒鐘。

在20秒鐘之后,所有新的Pod都處于活動狀態(tài)(10個Pod,在2秒鐘后準備就緒),而之前的10個Pod都處于終止狀態(tài)(第一個終止的Pod即將退出)。

總體而言,在短時間內(nèi)你將擁有兩倍數(shù)量的Pod(10個運行中,10個終止中)。

圖片

與就緒探針相比,寬限期限越長,你將同時擁有更多的運行中(以及終止中)的Pod。

這是一件壞事嗎?不一定,因為你要小心地確保不丟失連接。

終止長時間運行的任務(wù)

那對于長時間運行的作業(yè)呢?

如果你正在轉(zhuǎn)碼一個大型視頻,有沒有辦法延遲停止Pod的操作?

想象一下,你有一個包含三個副本的部署。

每個副本被分配了一個視頻進行轉(zhuǎn)碼,并且這個任務(wù)可能需要幾個小時才能完成。

當(dāng)你觸發(fā)滾動更新時,Pod在被終止之前有30秒的時間來完成任務(wù)。

你如何避免延遲關(guān)閉Pod的操作?你可以將terminationGracePeriodSeconds增加到幾個小時。

然而,在那個時間點上,Pod的端點是無法訪問的。

圖片

如果你將指標暴露用以監(jiān)控Pod,你的監(jiān)控工具將無法訪問你的Pod。

為什么會這樣?

像Prometheus這樣的工具依賴于端點來抓取集群中的Pod。

然而,一旦你刪除Pod,端點刪除的信息會在集群中傳播,甚至傳遞給Prometheus!

與其增加寬限期限,你應(yīng)該考慮為每個新版本創(chuàng)建一個全新的部署。

當(dāng)你創(chuàng)建一個全新的部署時,現(xiàn)有的部署將保持不變。

長時間運行的作業(yè)可以繼續(xù)正常處理視頻。一旦它們完成,你可以手動刪除它們。

如果你希望自動刪除它們,你可以設(shè)置一個自動縮放器,當(dāng)任務(wù)用盡時,它可以將部署的副本數(shù)縮減為零。

這種 Pod 自動縮放器的一個例子是 Osiris——一個 Kubernetes 的通用、縮放到零的組件。

這種技術(shù)有時被稱為Rainbow Deployments,在需要保持先前的Pod運行時間長于寬限期限的情況下非常有用。

另一個很好的例子是WebSockets。如果你正在向用戶實時傳輸更新,你可能不希望每次發(fā)布時都終止WebSockets。

如果你在一天內(nèi)頻繁發(fā)布,這可能會導(dǎo)致實時數(shù)據(jù)流中斷多次。

為每個發(fā)布創(chuàng)建一個新的部署是一個不太直觀但更好的選擇。

現(xiàn)有用戶可以繼續(xù)傳輸更新,而最新的部署為新用戶提供服務(wù)。

隨著用戶從舊的Pod斷開連接,你可以逐漸減少副本并淘汰過去的部署。

總結(jié)

你應(yīng)該注意從集群中刪除的Pod,因為它們的IP地址可能仍然被用于路由流量。

與立即關(guān)閉Pod不同,你應(yīng)該考慮在應(yīng)用程序中等待更長時間,或設(shè)置一個preStop鉤子。

只有在集群中的所有端點都被傳播并從kube-proxy、Ingress控制器、CoreDNS等中刪除后,才應(yīng)該刪除Pod。

如果你的Pod運行長時間的任務(wù),例如視頻轉(zhuǎn)碼或使用WebSockets提供實時更新,請考慮使用Rainbow Deployments。在Rainbow Deployments中,你為每個發(fā)布創(chuàng)建一個新的部署,并在連接(或任務(wù))耗盡時刪除先前的部署。

你可以在長時間運行的任務(wù)完成后手動刪除舊的部署。或者,你可以自動將部署的副本數(shù)縮減為零,以自動化該過程。


責(zé)任編輯:武曉燕 來源: 新鈦云服
相關(guān)推薦

2013-05-09 10:38:36

停機時間云計算RTO

2017-02-08 15:13:57

2009-04-16 15:38:56

SQL Server 停機時間

2022-04-24 13:33:21

物聯(lián)網(wǎng)安全預(yù)測性維護

2021-05-08 08:33:00

Rocketmq日志數(shù)據(jù)源

2011-05-18 11:19:37

Oracle優(yōu)化停機時間

2023-01-30 07:41:43

2022-12-13 14:10:14

2025-07-29 08:25:57

2022-08-08 15:03:21

數(shù)據(jù)中心COVID數(shù)字化轉(zhuǎn)型

2022-06-17 11:35:10

物聯(lián)網(wǎng)

2025-03-11 00:55:00

Spring停機安全

2022-08-04 15:09:17

物聯(lián)網(wǎng)安全網(wǎng)絡(luò)攻擊

2021-10-26 10:28:41

開發(fā)架構(gòu)Kubernetes

2025-03-17 00:00:00

2024-03-18 14:06:00

停機Spring服務(wù)器

2010-08-04 10:00:02

BMC大型機方案

2010-07-07 16:05:36

BMCBSM

2021-01-19 10:35:49

JVM場景函數(shù)

2025-06-30 07:10:00

JavaJVM線程
點贊
收藏

51CTO技術(shù)棧公眾號

欧美亚洲国产日韩2020| 欧美精品九九99久久| 国产综合精品一区二区三区| 久久久午夜影院| 欧美日韩伦理| 日韩午夜激情视频| 国语对白做受xxxxx在线中国| www.在线视频.com| 国产成人午夜高潮毛片| 欧美在线免费视频| 欧美一区二区三区爽爽爽| 久久99国产精品久久99大师 | 国模大尺度一区二区三区| 久久99热精品| 无码人妻丰满熟妇啪啪欧美| 一区二区三区国产好| 亚洲av成人无码一二三在线观看| 亚洲男人天堂久久| 三级久久三级久久久| 九九九久久国产免费| 国产aⅴ激情无码久久久无码| 成人乱码手机视频| 精品久久中文字幕| 国产一区二区三区在线免费| 国产裸舞福利在线视频合集| 成人的网站免费观看| 成人国产在线视频| aaa人片在线| 91精品国偷自产在线电影| 日韩成人中文字幕| 青娱乐精品在线| 丁香久久综合| 欧美午夜精品久久久久久久| 中国女人做爰视频| 日本不卡视频| 中文字幕av资源一区| 免费久久久一本精品久久区| 动漫av一区二区三区| 国产美女精品在线| 成人免费网站在线看| 欧美人一级淫片a免费播放| 国产精品尤物| 97久久精品人搡人人玩| 精品少妇一二三区| 国产综合激情| 欧美激情极品视频| 激情五月婷婷在线| 欧美日韩国产欧| 免费99精品国产自在在线| 激情五月深爱五月| 精品日韩免费| 在线精品国产成人综合| 欧美黄色激情视频| 禁果av一区二区三区| 亚洲午夜久久久影院| 手机免费看av| 首页国产精品| 精品国模在线视频| 91插插插插插插| 欧美久久影院| 久久久久久高潮国产精品视| 国产亚洲欧美久久久久| 日韩视频精品在线观看| 91精品国产91久久久久| 中文字幕在线观看视频网站| 性色一区二区| 国产精品久久电影观看| 91禁在线观看| 国产成人亚洲精品青草天美| 国产精品久久久久免费| 天堂在线观看视频| 久久久亚洲精品石原莉奈| 日韩在线第一区| 麻豆网在线观看| 一区二区激情小说| 色综合久久久久无码专区| 综合久久2023| 欧美乱妇一区二区三区不卡视频| 涩多多在线观看| 国内精品麻豆美女在线播放视频| 日韩成人在线播放| 色屁屁草草影院ccyy.com| 久久看人人摘| 韩国精品美女www爽爽爽视频| 天堂中文字幕在线观看| 香蕉成人久久| 91亚洲人电影| 日本中文字幕电影在线观看| 国产精品天天摸av网| 黄色一级片国产| 蜜桃精品在线| 日韩一区二区三区观看| 无遮挡aaaaa大片免费看| 国产免费av一区二区三区| 久久久91精品国产| 99久热在线精品996热是什么| 欧美aⅴ一区二区三区视频| 97av自拍| av在线天堂| 亚洲第一福利视频在线| 91人人澡人人爽人人精品| 一区二区日韩| 在线视频欧美日韩精品| 国产无套内射又大又猛又粗又爽| 日本亚洲天堂网| 高清不卡日本v二区在线| 成人亚洲性情网站www在线观看| 亚洲久本草在线中文字幕| 蜜臀av午夜一区二区三区| 久久久久久久久成人| 亚洲欧美成人精品| 久久婷婷一区二区| 精品一二线国产| 免费毛片一区二区三区久久久| 大片免费在线观看| 91久久精品一区二区| 中国免费黄色片| 亚洲精品久久久| 国产精品久久久久久五月尺| 特黄视频在线观看| 一区二区三区免费看视频| 蜜桃免费在线视频| 蜜臀av免费一区二区三区| 欧美激情2020午夜免费观看| 一区二区小视频| 国产午夜精品在线观看| 日韩欧美亚洲天堂| 精品视频自拍| 欧美激情亚洲精品| 国产黄色高清视频| 亚洲精品网站在线观看| 看看黄色一级片| 日韩精品首页| 国产成人小视频在线观看| 无码精品在线观看| 亚洲va欧美va国产va天堂影院| 欧美激情第四页| 亚洲第一偷拍| 亚洲iv一区二区三区| 在线观看h片| 在线观看日韩毛片| 国产熟女一区二区| 日本大胆欧美人术艺术动态 | **爰片久久毛片| 久久亚洲国产精品成人av秋霞| 性高潮视频在线观看| 久久久精品免费观看| 欧美日韩在线中文| 婷婷精品在线观看| 欧美在线国产精品| 欧美孕妇孕交| 91激情五月电影| 亚洲高潮女人毛茸茸| 免费在线观看成人| 一区二区不卡视频| 国产精品2区| 欧美大片免费观看在线观看网站推荐| 国产熟女一区二区三区五月婷| 亚洲人成网站色在线观看| 一区二区三区国产好的精华液| 欧美丰满日韩| 亚洲iv一区二区三区| 黄色小说在线播放| 日韩精品中文字| av手机天堂网| 一区在线观看免费| 国产乱淫av麻豆国产免费| 精品99视频| 久精品国产欧美| 美女100%一区| 日韩最新在线视频| 性欧美8khd高清极品| 亚洲福利视频导航| 伊人网在线视频观看| 蜜臀va亚洲va欧美va天堂| 中文一区一区三区免费| 日韩成人久久| 26uuu日韩精品一区二区| 国产精品免费播放| 3751色影院一区二区三区| 免费视频网站www| 91丨porny丨最新| 中文字幕 91| 欧美久久视频| 日韩色妇久久av| 欧州一区二区三区| 奇米成人av国产一区二区三区| yiren22亚洲综合伊人22| 日韩欧美在线影院| 狠狠人妻久久久久久| 中文字幕一区av| 国产a√精品区二区三区四区| 免费日韩av片| 日韩最新中文字幕| 久久久久久毛片免费看 | 国产精品久久久久久久久久辛辛| 欧美丰满少妇xxxxx| 黄色大片在线看| 日韩精品中文字幕一区| 国产熟妇一区二区三区四区| 亚洲欧美另类图片小说| 亚洲黄色在线网站| 国产a视频精品免费观看| av网站在线观看不卡| 亚洲免费二区| 日本在线视频一区| 精品三级在线观看视频| 亚洲一区二区免费在线| 69久成人做爰电影| 久久的精品视频| 神马午夜在线观看| 91精品国产综合久久精品app | 午夜一区不卡| 免费看日b视频| 欧美影院三区| 久久国产精品久久精品国产| 91亚洲精品在看在线观看高清| 欧美最猛性xxxxx免费| av在线免费观看网址| 亚洲视频欧洲视频| 精品人妻伦一二三区久久| 在线视频你懂得一区二区三区| 久久视频免费看| 亚洲女人的天堂| 国产性猛交xx乱| 2020国产精品| 精品影片一区二区入口| 极品尤物av久久免费看| 91极品视频在线观看| 亚洲一区二区免费看| 欧美狂野激情性xxxx在线观| 88国产精品视频一区二区三区| 日本电影一区二区三区| 综合伊思人在钱三区| 国产伦精品一区二区三| 网站一区二区| 91精品国产综合久久久久久丝袜| 精品美女一区| 国产精品一二区| 欧洲成人一区| 国产精品老牛影院在线观看| 三级在线观看视频| 午夜精品久久久99热福利| 国产探花视频在线观看| 欧美高清视频在线| 亚洲精品一线| 欧美高跟鞋交xxxxxhd| 日韩精品亚洲人成在线观看| 超在线视频97| 肉体视频在线| 高清一区二区三区日本久| 特级毛片在线| 久久久人成影片一区二区三区观看| 婷婷丁香在线| 久久久久久91香蕉国产| 爱搞国产精品| 欧美一级成年大片在线观看| 欧美大片免费观看网址| 国产精品久久久久久久久久久久久久| 国产成人精品一区二三区在线观看 | 亚洲精品视频网址| 中文字幕中文在线不卡住| 欧美视频一区二区在线| 亚洲免费成人av| 国产一级中文字幕| 色综合久久综合中文综合网| 亚洲天堂五月天| 在线不卡a资源高清| www.日韩在线观看| 亚洲国产精品久久久久| 欧洲一级在线观看| 中文字幕一区电影| av网址在线看| 午夜剧场成人观在线视频免费观看| 黑人巨大精品| 91久久久精品| 盗摄系列偷拍视频精品tp| 久久精品二区| 国产中文一区二区| 日韩精品首页| www污在线观看| 免费日韩视频| 性生活一级大片| 久久一二三国产| 美国一级片在线观看| 亚洲综合久久久久| 一级黄色在线视频| 欧美一区二区久久久| 欧美一级在线免费观看| 在线播放日韩专区| 国产盗摄在线视频网站| 国产精品美腿一区在线看| 秋霞午夜一区二区三区视频| 久久精品人人做人人爽电影| 日韩大片在线| 老子影院午夜伦不卡大全| 日韩极品在线观看| 韩国av中国字幕| 中文字幕高清一区| 一级aaa毛片| 欧美日韩你懂得| 四虎影视精品成人| 欧美精品性视频| a∨色狠狠一区二区三区| 国产欧美日韩综合一区在线观看| 国产剧情在线观看一区| 分分操这里只有精品| 久久99日本精品| 久久久久久亚洲中文字幕无码| 亚洲激情在线激情| 中文字幕a级片| 精品在线欧美视频| 国产欧美一区二| 欧美sm一区| 国产日韩欧美在线播放| а√中文在线天堂精品| 亚洲精品第一区二区三区| 在线日韩av| 亚洲高清av一区二区三区| 国产清纯美女被跳蛋高潮一区二区久久w| www欧美com| 欧美日韩视频在线一区二区| 日韩专区第一页| 欧美日韩国产va另类| 国产一区二区三区四区五区3d| 久久久水蜜桃| 国产在线日韩| 国偷自产av一区二区三区麻豆| 国产精品理论片| 男人天堂2024| 亚洲国产精品成人va在线观看| 色呦呦在线播放| 亚洲伊人一本大道中文字幕| 成人vr资源| 欧美日韩在线成人| 久久人人爽爽爽人久久久| 国产无遮挡又黄又爽| 日韩亚洲电影在线| av在线播放国产| 99国产视频在线| 亚洲乱码电影| 久久久精品视频国产| 中文字幕一区二区日韩精品绯色| 在线播放精品视频| 最新的欧美黄色| 国产成人精品一区二区三区视频 | 熟女少妇精品一区二区| 97久久精品人人做人人爽| 日韩精品久久久久久久酒店| 精品久久久网站| 国产区美女在线| 国产精品三区四区| 国产美女一区| 90岁老太婆乱淫| 色88888久久久久久影院野外| 久久99久久| 国产精品久久久久久超碰| 精品久久久久久久久久久aⅴ| 无码日韩人妻精品久久蜜桃| 中文字幕乱码久久午夜不卡 | 精品久久久一区| 在线观看毛片av| 精品国产一区二区三区四区在线观看| 成人免费一区| 国产日本欧美在线| 国产盗摄女厕一区二区三区| www.色小姐com| 亚洲精品一区二区三区香蕉| 超碰99在线| 品久久久久久久久久96高清| 免费在线观看日韩欧美| 成人自拍小视频| 亚洲精品一区二区精华| 亚洲深夜视频| 亚洲精品一区二区三区樱花| 国精产品一区一区三区mba视频 | 伊人精品成人久久综合软件| 国产麻豆天美果冻无码视频| 在线免费观看视频一区| 国产美女福利在线| 国产免费一区二区三区| 日韩av一区二区三区四区| 国产精品嫩草影院俄罗斯| 欧美草草影院在线视频| 一本大道色婷婷在线| 中文字幕人成一区| 99久久久精品免费观看国产蜜| 波多野结衣在线观看视频| 欧美成人精品激情在线观看 | 欧美free嫩15| av动漫在线播放| 久久久久亚洲蜜桃| 国内精品久久久久久久久久久 | av色综合久久天堂av综合| 中文字幕免费高清在线观看| 欧美丰满少妇xxxx| 日产午夜精品一线二线三线| 久久久久久久久久影视| 欧美伊人久久久久久久久影院| 中中文字幕av在线|