我有一个要部署到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
我做错了什么吗?
答案 0 :(得分:2)
如果我理解此问题,则应该更新部署。 服务只是一种在您的Pod之间分配流量的LB。
首先,您应将imagePullPolicy: Always
添加到部署中,以强制k8下载最新映像。
如果要更新部署,则可以运行
kubectl apply -f deploy.yml
答案 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。