kubernetes没有从docker应用新的服务更新

问题描述 投票:0回答:3

我有一个节点JS应用程序,我正在部署到kubernetes。

我已对节点JS应用程序进行了更改,并将应用程序重新部署到K8。

但是,我注意到部署没有完成。

我检查了我的docker hub,是的,正在部署最新的图像。这是我下面的service.yaml文件

apiVersion: v1
kind: Service
metadata:
  name: fourthapp
spec:
  type: LoadBalancer #Exposes the service as a node port
  ports:
  - port: 3000
    protocol: TCP
    targetPort: 3000
  selector:
    app: webapp

这是我的deploy.yaml文件

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: fourthapp
spec:
  replicas: 2
  template:
    metadata:
      labels:
        app: webapp
    spec:
      containers:
      - name: webapp
        image: index.docker.io/leexha/nodejsapp:latest
        ports:
        - containerPort: 3000
        resources:
          requests: 
            memory: 500Mi
            cpu: 0.5
          limits:
            memory: 500Mi
            cpu: 0.5
        imagePullPolicy: Always

当我运行service.yaml它读取

C:\Users\adrlee\Desktop\oracle\Web_projects>kubectl apply -f service.yml
service "fourthapp" unchanged

我做错了什么?

docker kubernetes
3个回答
2
投票

如果我理解了这个问题,你应该更新部署。该服务只是一种LB,可以在您的pod之间分配流量。

首先,您应该将imagePullPolicy: Always添加到部署中以强制k8s下载最新的图像。

如果要更新部署,可以运行

kubectl apply -f deploy.yml

或者表演Rolling Update


0
投票

如果你没有给你的图像的每个构建一个不同的名称,当底层图像发生变化时,很难强迫Kubernetes重新启动部署:它无法知道Docker Hub上的“最新”标记现在意味着其他东西。 (imagePullPolicy: Always至少会强制它获得一个新的图像,如果碰巧正在重新启动。)当你运行kubectl apply时,它会查看你正在上传的部署,看到它与已经运行的部分相匹配,什么都不做。

最佳做法是不使用“最新”标记并提供某种唯一标识符(时间戳,源代码控制提交ID,...)。然后你可以更新pod规范中的图像ID,kubectl apply会看到一些不同的东西,Kubernetes将为你执行滚动更新的运行pod。这样做的另一个好处是,如果构建不好,您可以通过将图像标记更改回以前的构建来轻松地向后移动。


0
投票

除非更改了pod规范,否则Kubernetes不会更新正在运行的pod。如果要强制部署,可以在apply命令之后运行:

kubectl patch deployment fourthapp -p "{\"spec\":{\"template\":{\"metadata\":{\"annotations\":{\"date\":\"`date +'%s'`\"}}}}}"

它将在pod模板上添加/更新特殊的date注释,Kubernetes将更新正在运行的pod。

© www.soinside.com 2019 - 2024. All rights reserved.