白話K8s-kubernetes應用重啓功能的實現(理解 Kubernetes 對象與狀態)

一、場景

我們在做K8s應用部署平臺的時候,遇到的一個場景? 用戶想讓【k8s應用重啓】或【重新部署】,我們應該如何實現呢?
K8S場景

當然,還有其他需要重啓的場景,比如說:

有時候我們會需要重啓Deployment,原因可能是:

docker image使用的是latest tag,這個latest在docker image registry已經更新了,我們需要重啓deployment來使用新的latest

Pod運行緩慢但是還活着,我們就是想重啓一下

ConfigMap/Secret變更了,想重啓一下應用新配置

二、場景分析

首先,我們應該瞭解到 K8s(kubernetes)對象,是" 目標性記錄", 一旦創建 Kubernetes系統就會維持這個 k8s 對象的 “期望狀態” (對象規約 Spec)。 也就是說,只要實際狀態(狀態Status) 一致, 這個對象是不會發生變更的。

也就是說, kubernetes系統內,是沒有應用【重啓】或【重新部署】功能的。 那我們如何實現kubernetes應用重啓(Pod重啓)? 我想你應該想到了, 改變它的"期望狀態",也是在yaml描述文件中,改變他的規約 (spec)

參考文檔: 理解 Kubernetes對象 與狀態

三、功能實現

在 deployment spec template 裏添加 annotations,比如添加一個 deploytime: timestamp

以下簡化Yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: jdsf-defult-app-deployment
  namespace: jdsf-default-namespace
  labels:
    app: jdsf-defult-app
spec:
  replicas: 1
  selector:
    matchLabels:
      app: jdsf-defult-app
  template:
    creationTimestamp: null # 當然也可以更改這個字段
    labels:
      app: jdsf-defult-app
    annotations:
      jdsf.deploy.event.id: deploy-event-xxx  # 注意此處我每次部署的時候加了一個自定義字段,每次都不一樣
    spec:
      containers:
        - name: jdsf-defult-app-deployment
          image: 'nginx:1.7.9'

四、參考文檔

https://chanjarster.github.io/post/k8s-restart-deployment/

https://stackoverflow.com/questions/40500377/how-to-deploy-in-kubernetes-without-any-changes-just-to-get-pods-to-cycle#new-answer

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章