我们正在使用RC来运行我们的工作负载并希望迁移到部署。有没有办法做到这一点,不会对正在运行的工作负载造成任何影响。我的意思是,我们可以在部署下移动这些运行的pod吗?
答案 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应该是一个足够简单的测试来证明它的行为和你一样愿望。