是否可以将 运行 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
不匹配
我们正在使用 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
不匹配