一、場景
我們在做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