【发布时间】:2018-02-02 04:59:08
【问题描述】:
我们正在使用 RC 来运行我们的工作负载并希望迁移到 Deployment。有没有办法做到这一点而不会对正在运行的工作负载造成任何影响。我的意思是,我们可以在 Deployment 下移动这些正在运行的 Pod 吗?
【问题讨论】:
标签: deployment kubernetes replicaset
我们正在使用 RC 来运行我们的工作负载并希望迁移到 Deployment。有没有办法做到这一点而不会对正在运行的工作负载造成任何影响。我的意思是,我们可以在 Deployment 下移动这些正在运行的 Pod 吗?
【问题讨论】:
标签: deployment kubernetes replicaset
就像,@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 不匹配的附加标签的新副本
【讨论】:
我有 80% 的把握答案是肯定的,因为它们都使用 Pod 选择器来确定是否应该创建新实例。关键技巧是在kubectl delete 中使用--cascade=false(默认为true),它的帮助甚至可以回答您的问题:
--cascade=true:如果为true,则级联删除由该资源管理的资源(例如由ReplicationController创建的Pods)。默认为真。
通过删除 ReplicationController 但不是它的从属 Pod,它们将继续闲逛(但要小心,如果重新启动或其他危险导致其中一个或全部死亡,没有人会在那里营救他们)。使用相同的选择器标准和等于当前运行 Pod 数量的 replicas 计数创建部署应该会导致“无操作”的情况。
我很遗憾我面前没有我的集群来测试它,但我认为一个带有 replicas=3 的小型 nginx RC 应该是一个足够简单的测试来证明它的行为如你所愿。
【讨论】: