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

Flo*_*ish 3 docker kubernetes

我正在kubectl apply更新我的Kubernetes容器:

kubectl apply -f /my-app/service.yaml
kubectl apply -f /my-app/deployment.yaml
Run Code Online (Sandbox Code Playgroud)

以下是我的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
Run Code Online (Sandbox Code Playgroud)

以下是我的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%
Run Code Online (Sandbox Code Playgroud)

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

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

kubectl patch deployment my-app -p "{\"spec\":{\"template\":{\"metadata\":{\"labels\":{\"date\":\"`date +'%s'`\"}}}}}"
Run Code Online (Sandbox Code Playgroud)

我能够运行上面的命令,但是它没有为我解决问题。

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

任何帮助将不胜感激。

rat*_*ath 10

imagePullPolicy的部署中缺少一个。尝试这个:

containers:
- name: my-app
  image: dockerhubaccount/my-app-img:latest
  imagePullPolicy: Always
Run Code Online (Sandbox Code Playgroud)

默认策略ifNotPresent就是您的策略不更新的原因。

我将结合链接中的两个注释:

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

注意:底层图像提供者的缓存语义使imagePullPolicy: Always效率更高。以 Docker 为例,如果镜像已经存在,拉取尝试很快,因为所有镜像层都被缓存,不需要下载镜像

  • @rath谢谢,我尝试将“imagePullPolicy:Always”添加到我的deployment.yaml中,但它不起作用。我似乎误解了我提供的链接中的解决方法命令。这不是使未来 kubectl apply 命令更新 pod 的一次性命令,而是更新 pod 的实际命令。因此,我所要做的就是每当我想要更新我的 pod 时运行该命令。稍后将添加此作为答案。谢谢! (2认同)

Flo*_*ish 6

原来我误解了我从链接中给出的解决方法命令。

我认为这是一个一次性命令,它将我的部署配置为将所有未来的kubectl apply命令视为更新我的 pod 的触发器。

实际上,每次我想更新我的 Pod 时,我只需要运行命令:

kubectl patch deployment my-app -p "{\"spec\":{\"template\":{\"metadata\":{\"labels\":{\"date\":\"`date +'%s'`\"}}}}}"
Run Code Online (Sandbox Code Playgroud)

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


cod*_*ger 5

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