是否可以将 运行 pods 从 ReplicationController 移动到 Deployment?

Is it possible to move the running pods from ReplicationController to a Deployment?

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

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

--cascade=true: If true, cascade the deletion of the resources managed by this resource (e.g. Pods created by a ReplicationController). Default true.

通过删除 ReplicationController 而不是 它的从属 Pods,他们将继续闲逛(尽管要小心,如果重启或其他危险杀死了他们中的一个或所有人,没有人在那里营救他们)。使用相同的选择器条件创建 Deployment 并且 replicas 计数等于当前 运行 Pods 的数量应该会导致 "no action" 情况。

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

就像@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

问题: 我们可以将这些 运行 pods 移动到 Deployment 下吗?

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

第 1 步: 使用 --cascade=false 删除此 RC。这将留下 Pods.

第 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:
      ---

所以,现在这些 Pods 在 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,并将创建一个带有附加标签的新副本集,该标签与您现有的 Pods

不匹配