我使用以下命令创建了一个ReplicationController。
kubectl运行nginx --image = nginx -r = 2 --generator = run / v1
现在,我尝试将映像升级到版本1.7.1。
kubectl设置图像rc / nginx nginx = nginx:1.7.1
但是,图像似乎没有更新。
watch -n1“ kubectl描述pods | grep” Image:“”
还尝试了kubectl edit ....
和kubectl apply -f ....
命令,但是图像没有得到更新。
如何在K8S ReplicationController中更新映像?
答案 0 :(得分:1)
文档中介绍了如何在复制控制器https://kubernetes.io/docs/concepts/workloads/controllers/replicationcontroller/#rolling-updates上进行滚动升级
您需要知道实际上您的映像是在复制控制器中更新的,但是复制控制器不会杀死现有的Pod并使用新映像生成新映像。为此,您需要执行以下两个选项之一:
kubectl scale --replicas=3 rc/nginx
将RC缩放为0以杀死Pod,然后达到所需的副本数答案 1 :(得分:1)
复制控制器只能缩放给定Pod的副本数量,而不能进行任何更新。
有一种方法可以使用kubectl rolling-update
“更新”您的ReplicationController,但是它并不从字面上进行更新。
那就是您运行kubectl rolling-update
(link1)时发生的事情:
- 使用更新后的配置创建新的复制控制器。
- 增加/减少新旧控制器上的副本数,直到达到正确的副本数。
- 删除原始复制控制器。
滚动更新是使用kubectl滚动更新命令启动的:
$ kubectl rolling-update NAME \ ([NEW_NAME] --image=IMAGE | -f FILE)
假设我们有一个名为foo的当前复制控制器,并且它正在运行映像image:v1(link2)
kubectl rolling-update foo [foo-v2] --image=myimage:v2
如果用户未为“下一个”复制指定名称 控制器,然后将“下一个”复制控制器重命名为 原始复制控制器的名称。
还有kubectl reference中的一些示例:
使用中的新复制控制器数据更新frontend-v1的Pod frontend-v2.json。
kubectl rolling-update frontend-v1 -f frontend-v2.json
使用传递到stdin的JSON数据更新frontend-v1的pod。
cat frontend-v2.json | kubectl rolling-update frontend-v1 -f -
只需更改以下内容,即可将frontend-v1的pod更新为frontend-v2: 图像,并切换复制控制器的#名称。
kubectl rolling-update frontend-v1 frontend-v2 --image=image:v2
只需更改图像并保持 旧名称。
kubectl rolling-update frontend --image=image:v2
中止并逆转正在进行的现有部署(从frontend-v1到 frontend-v2)。
kubectl rolling-update frontend-v1 frontend-v2 --rollback
ReplicationController(link3)有替代
ReplicaSet(仍然不支持更新Pod的图像)
ReplicaSet是支持的下一代ReplicationController 新的基于集合的标签选择器。它主要由Deployment用作 协调pod的创建,删除和更新的机制。注意 我们建议使用“部署”,而不是直接使用“副本集”, 除非您需要自定义更新编排或不需要 完全更新。
Deployment(推荐)(它作为副本集的协调器,因此它支持设计更新)
Deployment是一个高级API对象,可更新其基础 副本集及其荚的格式与
kubectl rolling-update
类似。 如果您希望此滚动,建议部署 更新功能,因为与kubectl rolling-update
不同,它们是 声明性的,服务器端的,并具有其他功能。
kubectl run nginx1 --image nginx --replicas=3
kubectl get deployment nginx1 --export -o yaml