是否可以将正在运行的pod从ReplicationController移动到部署?

时间:2018-02-02 04:59:08

标签: deployment kubernetes replicaset

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

2 个答案:

答案 0 :(得分:4)

就像,@ 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吗?

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

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

所以,现在这些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:
      ----

部署会发现一个ReplicaSet已经存在,我们的工作已经完成。

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

它有效。

哪种方式不起作用

删除ReplicationController后,请勿直接创建部署。这将无法正常工作。因为,部署将找不到ReplicaSet,并将创建一个新的标签,该标签与您现有的Pod不匹配

答案 1 :(得分:2)

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

  

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

删除ReplicationController其下级Pod,他们将继续闲逛(但要小心,如果重新启动或其他危险导致其中一个或全部,则不会一个人在那里拯救他们)。使用相同的选择器条件创建部署并且replicas计数等于当前正在运行的Pod的数量应该会导致“无操作”情况。

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