一、场景

我们在做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

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐