白话K8s-kubernetes应用重启功能的实现(理解 Kubernetes 对象与状态)
k8s应用重启或重新部署功能应该如何实现? Deployment如何重新部署? 如何理解 Kubernetes对象与状态。
·
一、场景
我们在做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
更多推荐
已为社区贡献4条内容
所有评论(0)