Kubernetes:使用“最新”标签时,kubectl apply不会更新pod

时间:2018-12-03 10:05:24

标签: docker kubernetes

我正在使用kubectl apply更新我的Kubernetes吊舱:

kubectl apply -f /my-app/service.yaml
kubectl apply -f /my-app/deployment.yaml

以下是我的service.yaml:

apiVersion: v1
kind: Service
metadata:
  name: my-app
  labels:
    run: my-app
spec:
  type: NodePort
  selector:
    run: my-app 
  ports:
  - protocol: TCP
    port: 9000
    nodePort: 30769

下面是我的deployment.yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
spec:  
  selector:
    matchLabels:
      run: my-app
  replicas: 2
  template:
    metadata:
      labels:
        run: my-app
    spec:
      containers:
      - name: my-app
        image: dockerhubaccount/my-app-img:latest
        ports:
        - containerPort: 9000
          protocol: TCP
      imagePullSecrets:
      - name: my-app-img-credentials
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 25%
      maxSurge: 25%

第一次运行良好,但是在随后的运行中,我的广告连播没有得到更新。

我已在https://github.com/kubernetes/kubernetes/issues/33664上阅读了建议的解决方法:

kubectl patch deployment my-app -p "{\"spec\":{\"template\":{\"metadata\":{\"labels\":{\"date\":\"`date +'%s'`\"}}}}}"

我能够运行以上命令,但无法为我解决问题。

我知道我可以通过手动将image标签从“ latest”更改为另一个标签来触发pod更新,但是我想确保无需检查Docker Hub就能获得最新的image。

任何帮助将不胜感激。

4 个答案:

答案 0 :(得分:4)

如果部署规范中没有任何变化,则不会为您更新Pod。这是不建议使用:latest的许多原因之一,因为另一个答案更加详细。 Deployment控制器非常简单,几乎与DeepEquals(old.Spec.Template, new.Spec.Template)一样,因此您需要进行一些实际的更改,例如通过使用当前日期时间设置标签来进行PATCH调用。

答案 1 :(得分:2)

您在部署中缺少imagePullPolicy。试试这个:

containers:
- name: my-app
  image: dockerhubaccount/my-app-img:latest
  imagePullPolicy: Always

默认策略为ifNotPresent,这就是为什么您不更新的原因。

我将在链接中加入两个注释:

  

注意::在生产环境中部署容器时,应避免使用 :latest 标签,因为更难跟踪正在运行哪个版本的映像难以正确回滚

  

注意:基础图像提供程序的缓存语义甚至可以使imagePullPolicy: Always高效。例如,对于Docker,如果映像已经存在,则拉取尝试的速度很快,因为所有映像层均已缓存,无需下载映像

答案 2 :(得分:1)

这里有两件事与此问题相关,

  1. 建议在创建资源时第一次使用kubectl apply,后来建议使用随后调用的kubectl replacekubectl editkubectl patch命令kubectl apply

  2. 使用kubectl applykubetcl create创建服务后,就无法用yaml文件替换该服务。换句话说,服务会生成一个随机IP ,该不能进行修补或替换。重新创建服务的唯一选择是删除服务,然后使用相同的名称重新创建它。

  

注意::当我尝试创建备份和还原解决方案时尝试使用kubectl apply命令替换服务时   导致出现以下错误。

kubectl apply -f replace-service.yaml -n restore-proj
The Service "test-q12" is invalid: spec.clusterIP: Invalid value: "10.102.x.x": provided IP is already allocated.

答案 3 :(得分:0)

结果是我误解了我从链接中给出的解决方法命令。

我认为这是一次配置我的部署的命令,它将以后的所有kubectl apply命令都视为更新我的Pod的触发器。

实际上,每次我要更新Pod时,我都只需要运行命令即可。

kubectl patch deployment my-app -p "{\"spec\":{\"template\":{\"metadata\":{\"labels\":{\"date\":\"`date +'%s'`\"}}}}}"

非常感谢所有帮助过的人!