无法在K8S中更新ReplicationController的Pod映像

时间:2018-09-28 05:18:21

标签: kubernetes kubectl

我使用以下命令创建了一个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中更新映像?

2 个答案:

答案 0 :(得分:1)

文档中介绍了如何在复制控制器https://kubernetes.io/docs/concepts/workloads/controllers/replicationcontroller/#rolling-updates上进行滚动升级

您需要知道实际上您的映像是在复制控制器中更新的,但是复制控制器不会杀死现有的Pod并使用新映像生成新映像。为此,您需要执行以下两个选项之一:

  1. 手动杀死豆荚
  2. 使用以下命令kubectl scale --replicas=3 rc/nginx将RC缩放为0以杀死Pod,然后达到所需的副本数

答案 1 :(得分:1)

复制控制器只能缩放给定Pod的副本数量,而不能进行任何更新。

有一种方法可以使用kubectl rolling-update“更新”您的ReplicationController,但是它并不从字面上进行更新。 那就是您运行kubectl rolling-updatelink1)时发生的事情:

  
      
  1. 使用更新后的配置创建新的复制控制器。
  2.   
  3. 增加/减少新旧控制器上的副本数,直到达到正确的副本数。
  4.   
  5. 删除原始复制控制器。
  6.   
     

滚动更新是使用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