【问题标题】:Kubernetes automatically remove resources no longer requiredKubernetes 自动移除不再需要的资源
【发布时间】:2020-01-07 01:28:18
【问题描述】:

使用 AWS CloudFormation,我可以基于包含所有必需资源的模板创建堆栈。然后我可以创建一个新模板,添加一些资源,删除一些资源,并更改对其他资源的描述。然后,我可以使用新模板更新 CloudFormation 堆栈。 CloudFormation 将自动删除模板中不再存在的所有资源、添加新资源并更新修改后的资源。此外,如果任何操作失败,更新将回滚。

在 Kubernetes 中是否有与此等效的功能,我可以只提供更新的配置文件,让 Kubernetes 自动将其与之前的版本进行比较并删除任何不应该存在的资源?

【问题讨论】:

    标签: kubernetes


    【解决方案1】:

    对于单个资源(例如单个 Pod 或 Deployment),Kubernetes 将自动协调状态。因此,在这个意义上,它的工作方式与 CloudFormation 类似。如果您更改部署并从中删除 pod,Kubernetes 将自动删除资源。

    如果您想将多个资源视为单个对象,可以查看Helm 之类的内容,它简化了将多个 Kubernetes 资源打包在一起的过程。

    【讨论】:

      【解决方案2】:

      使用部署模板就可以满足您的需求,部署可以随时回滚。

      Rollout 命令与“status/history/undo”等正确标志一起使用时,应该可以帮助您控制堆栈资源的推出或回滚..

      kubectl rollout status deployment nginx
      

      检查推出历史

      kubectl rollout history deployment nginx
      

      回滚到以前的版本

      kubectl rollout undo deployment nginx
      

      在下面的示例中,我使用 deployment_v1.yaml 文件创建了一个包含两个 pod 的部署,该文件在一个 pod (nginx/redis) 中有 2 个容器

      kubectl create -f deployment_v1.yaml --record=true

      deployment_v1.yaml

      apiVersion: apps/v1
      kind: Deployment
      metadata:
        creationTimestamp: null
        labels:
          run: multi-container-deploy
        name: multi-container-deploy
      spec:
        replicas: 1
        selector:
          matchLabels:
            app: multi-container
        template:
          metadata:
            labels:
              app: multi-container
          spec:
            containers:
            - image: nginx
              name: nginx-1
            - image: redis
              name: redis-2
      

      在推出期间检查状态

      $ kubectl rollout status deployment multi-container-deploy
      Waiting for deployment "multi-container-deploy" rollout to finish: 0 of 1 updated replicas are available...
      deployment "multi-container-deploy" successfully rolled out
      

      推出历史

      $ kubectl rollout history deployment multi-container-deploy
      deployment.apps/multi-container-deploy
      REVISION  CHANGE-CAUSE
      1         kubectl create --filename=deployment_v1.yaml --record=true
      
      $ kubectl get all
      NAME                                          READY   STATUS    RESTARTS   AGE
      pod/multi-container-deploy-5fc8944c58-r4dt4   2/2     Running   0          60s
      
      NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
      service/kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   32d
      
      NAME                                     READY   UP-TO-DATE   AVAILABLE   AGE
      deployment.apps/multi-container-deploy   1/1     1            1           60s
      
      NAME                                                DESIRED   CURRENT   READY   AGE
      replicaset.apps/multi-container-deploy-5fc8944c58   1         1         1       60s
      

      现在说我们通过说 kubectl edit 命令从原始部署中删除 redis pod

      kubectl edit deployments multi-container-deploy
      

      编辑后检查新的推出状态,如下所示

      $ kubectl rollout status deployment multi-container-deploy
      Waiting for deployment "multi-container-deploy" rollout to finish: 1 old replicas are pending termination...
      Waiting for deployment "multi-container-deploy" rollout to finish: 1 old replicas are pending termination...
      deployment "multi-container-deploy" successfully rolled out
      

      检查新的推出历史,我们将看到更新的列表如下(直接编辑的缺点是我们没有太多关于第 2 步完成的信息)

      $ kubectl rollout history deployment multi-container-deploy
      deployment.apps/multi-container-deploy
      REVISION  CHANGE-CAUSE
      1         kubectl apply --filename=deployment_v1.yaml --record=true
      2         kubectl apply --filename=deployment_v1.yaml --record=true
      

      我们还可以检查资源是否已成功删除,并且我们只有一个容器运行 pod。

      $ kubectl get all
      NAME                                         READY   STATUS    RESTARTS   AGE
      pod/multi-container-deploy-7cdb9cbf4-jr9nc   1/1     Running   0          4m36s
      
      NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
      service/kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   32d
      
      NAME                                     READY   UP-TO-DATE   AVAILABLE   AGE
      deployment.apps/multi-container-deploy   1/1     1            1           13m
      
      NAME                                                DESIRED   CURRENT   READY   AGE
      replicaset.apps/multi-container-deploy-5fc8944c58   0         0         0       13m
      replicaset.apps/multi-container-deploy-7cdb9cbf4    1         1         1       4m36s
      

      我们可以通过运行以下命令来撤消上面的部署编辑

      $ kubectl rollout undo deployment multi-container-deploy
      deployment.apps/multi-container-deploy rolled back
      

      如果我们检查一下,我们的 pod 又会带着两个容器跑回来。

      $ kubectl get all
      NAME                                          READY   STATUS    RESTARTS   AGE
      pod/multi-container-deploy-5fc8944c58-xn4mz   2/2     Running   0          40s
      
      NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
      service/kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   32d
      
      NAME                                     READY   UP-TO-DATE   AVAILABLE   AGE
      deployment.apps/multi-container-deploy   1/1     1            1           15m
      
      NAME                                                DESIRED   CURRENT   READY   AGE
      replicaset.apps/multi-container-deploy-5fc8944c58   1         1         1       15m
      replicaset.apps/multi-container-deploy-7cdb9cbf4    0         0         0       6m59s
      

      并且推出历史将更新如下

      $ kubectl rollout history deployment multi-container-deploy
      deployment.apps/multi-container-deploy
      REVISION  CHANGE-CAUSE
      2         kubectl apply --filename=deployment_v2.yaml --record=true
      3         kubectl apply --filename=deployment_v2.yaml --record=true
      

      【讨论】:

      • 根据我在创建部署时看到的情况,仅管理该部署配置中描述的资源,我希望删除以前在我的配置文件中但不再存在的资源。例如“kubectl apply -f my-app.yaml” 其中 my-app.yaml 描述了 3 个资源(服务、入口、卷等)。然后“kubectl apply -f my-app.yaml”,其中 my-app.yaml 现在只描述 2 个资源,并自动删除第 3 个资源。
      • 我相信,正如在这篇文章的其他答案之一中已经回答的那样,您将需要创建 Helm 图表来管理所有对象。使用部署我们将只能控制 pod(容器)和复制集对象。
      猜你喜欢
      • 1970-01-01
      • 2021-01-26
      • 1970-01-01
      • 1970-01-01
      • 2012-09-27
      • 1970-01-01
      • 2021-08-29
      • 1970-01-01
      • 2016-11-24
      相关资源
      最近更新 更多