【问题标题】:Is it possible to move the running pods from ReplicationController to a Deployment?是否可以将正在运行的 Pod 从 ReplicationController 移动到 Deployment?
【发布时间】:2018-02-02 04:59:08
【问题描述】:

我们正在使用 RC 来运行我们的工作负载并希望迁移到 Deployment。有没有办法做到这一点而不会对正在运行的工作负载造成任何影响。我的意思是,我们可以在 Deployment 下移动这些正在运行的 Pod 吗?

【问题讨论】:

    标签: deployment kubernetes replicaset


    【解决方案1】:

    就像,@matthew-l-daniel 回答说,答案是肯定的。但我对此有 80% 以上的把握。因为我已经测试过了

    现在我们需要遵循的流程是什么

    假设我有一个 ReplicationController。

    apiVersion: v1
    kind: ReplicationController
    metadata:
      name: nginx
    spec:
      replicas: 3
      selector:
        app: nginx
      template:
        metadata:
          name: nginx
          labels:
            app: nginx
        spec:
          containers:
          - name: nginx
            image: nginx
            ports:
            - containerPort: 80
    

    问题:我们可以将这些正在运行的 Pod 移动到 Deployment 下吗?

    让我们按照这些步骤来看看我们是否可以。

    第 1 步: 使用--cascade=false 删除此 RC。这将离开 Pod。

    第 2 步: 先创建ReplicaSet,标签与ReplicationController相同

    apiVersion: apps/v1beta2
    kind: ReplicaSet
    metadata:
      name: nginx
      labels:
        app: nginx
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          ---
    

    所以,现在这些 Pod 都在 ReplicaSet 下。

    第 3 步: 立即创建具有相同标签的部署。

    apiVersion: apps/v1beta2
    kind: Deployment
    metadata:
      name: nginx
      labels:
        app: nginx
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          ----
    

    Deployment 会发现一个 ReplicaSet 已经存在,我们的工作就完成了。

    现在我们可以检查增加的replicas 看看它是否有效。

    而且它有效。

    哪种方式不行

    删除 ReplicationController 后,不要直接创建 Deployment。这将不起作用。因为,Deployment 将找不到 ReplicaSet,并且会创建一个带有与您现有 Pod 不匹配的附加标签的新副本

    【讨论】:

    • 没错,我在删除 RC 后尝试创建部署,但失败了。现在我了解了创建 ReplicaSet 的中间步骤的要求
    【解决方案2】:

    我有 80% 的把握答案是肯定的,因为它们都使用 Pod 选择器来确定是否应该创建新实例。关键技巧是在kubectl delete 中使用--cascade=false(默认为true),它的帮助甚至可以回答您的问题:

    --cascade=true:如果为true,则级联删除由该资源管理的资源(例如由ReplicationController创建的Pods)。默认为真。

    通过删除 ReplicationController不是它的从属 Pod,它们将继续闲逛(但要小心,如果重新启动或其他危险导致其中一个或全部死亡,没有人会在那里营救他们)。使用相同的选择器标准和等于当前运行 Pod 数量的 replicas 计数创建部署应该会导致“无操作”的情况。

    我很遗憾我面前没有我的集群来测试它,但我认为一个带有 replicas=3 的小型 nginx RC 应该是一个足够简单的测试来证明它的行为如你所愿。

    【讨论】:

      猜你喜欢
      • 2019-07-24
      • 1970-01-01
      • 1970-01-01
      • 2020-09-29
      • 1970-01-01
      • 1970-01-01
      • 2022-01-03
      • 2020-11-02
      相关资源
      最近更新 更多