我有一个节点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
我做错了什么?
如果我理解了这个问题,你应该更新部署。该服务只是一种LB,可以在您的pod之间分配流量。
首先,您应该将imagePullPolicy: Always
添加到部署中以强制k8s下载最新的图像。
如果要更新部署,可以运行
kubectl apply -f deploy.yml
或者表演Rolling Update
如果你没有给你的图像的每个构建一个不同的名称,当底层图像发生变化时,很难强迫Kubernetes重新启动部署:它无法知道Docker Hub上的“最新”标记现在意味着其他东西。 (imagePullPolicy: Always
至少会强制它获得一个新的图像,如果碰巧正在重新启动。)当你运行kubectl apply
时,它会查看你正在上传的部署,看到它与已经运行的部分相匹配,什么都不做。
最佳做法是不使用“最新”标记并提供某种唯一标识符(时间戳,源代码控制提交ID,...)。然后你可以更新pod规范中的图像ID,kubectl apply
会看到一些不同的东西,Kubernetes将为你执行滚动更新的运行pod。这样做的另一个好处是,如果构建不好,您可以通过将图像标记更改回以前的构建来轻松地向后移动。
除非更改了pod规范,否则Kubernetes不会更新正在运行的pod。如果要强制部署,可以在apply命令之后运行:
kubectl patch deployment fourthapp -p "{\"spec\":{\"template\":{\"metadata\":{\"annotations\":{\"date\":\"`date +'%s'`\"}}}}}"
它将在pod模板上添加/更新特殊的date
注释,Kubernetes将更新正在运行的pod。