kubernetes未应用来自docker的新服务更新

时间:2018-09-05 09:19:55

标签: docker kubernetes

我有一个要部署到kubernetes的Node JS应用程序。

我对节点JS应用进行了更改,并将该应用重新部署到K8s。

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

我检查了Docker集线器,是的,正在部署最新映像。这是我下面的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

我做错了什么吗?

3 个答案:

答案 0 :(得分:2)

如果我理解此问题,则应该更新部署服务只是一种在您的Pod之间分配流量的LB。

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

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

kubectl apply -f deploy.yml

或执行Rolling Update

答案 1 :(得分:0)

如果您没有给映像的每个版本都指定不同的名称,则很难在基础映像更改时强制Kubernetes重新启动Deployment:它无法知道Docker Hub上的“ latest”标记现在意味着其他的东西。 (imagePullPolicy: Always至少会强制重新获得一个新映像,如果它恰好正在重新启动。)运行kubectl apply时,它会查看您正在上传的部署,并发现它与已经存在的部署相匹配。运行,什么也不做。

最佳做法是不使用“最新”标签,而是提供某种唯一标识符(时间戳,源代码控制提交ID等)。然后,您可以在pod规范中更新映像ID,kubectl apply会发现有所不同,Kubernetes会为您对正在运行的pod进行滚动更新。这还具有以下优点:如果构建不好,则可以通过将image标签更改回以前的构建来轻松地向后移动。

答案 2 :(得分:0)

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

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

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