我正在使用kubectl apply
更新我的Kubernetes吊舱:
kubectl apply -f /my-app/service.yaml
kubectl apply -f /my-app/deployment.yaml
以下是我的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
下面是我的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%
第一次运行良好,但是在随后的运行中,我的广告连播没有得到更新。
我已在https://github.com/kubernetes/kubernetes/issues/33664上阅读了建议的解决方法:
kubectl patch deployment my-app -p "{\"spec\":{\"template\":{\"metadata\":{\"labels\":{\"date\":\"`date +'%s'`\"}}}}}"
我能够运行以上命令,但无法为我解决问题。
我知道我可以通过手动将image标签从“ latest”更改为另一个标签来触发pod更新,但是我想确保无需检查Docker Hub就能获得最新的image。
任何帮助将不胜感激。
答案 0 :(得分:4)
如果部署规范中没有任何变化,则不会为您更新Pod。这是不建议使用:latest
的许多原因之一,因为另一个答案更加详细。 Deployment
控制器非常简单,几乎与DeepEquals(old.Spec.Template, new.Spec.Template)
一样,因此您需要进行一些实际的更改,例如通过使用当前日期时间设置标签来进行PATCH调用。
答案 1 :(得分:2)
您在部署中缺少imagePullPolicy
。试试这个:
containers:
- name: my-app
image: dockerhubaccount/my-app-img:latest
imagePullPolicy: Always
默认策略为ifNotPresent
,这就是为什么您不更新的原因。
我将在链接中加入两个注释:
注意::在生产环境中部署容器时,应避免使用
:latest
标签,因为更难跟踪正在运行哪个版本的映像难以正确回滚
注意:基础图像提供程序的缓存语义甚至可以使
imagePullPolicy: Always
高效。例如,对于Docker,如果映像已经存在,则拉取尝试的速度很快,因为所有映像层均已缓存,无需下载映像
答案 2 :(得分:1)
这里有两件事与此问题相关,
建议在创建资源时第一次使用kubectl apply
,后来建议使用随后调用的kubectl replace
或kubectl edit
或kubectl patch
命令kubectl apply
。
使用kubectl apply
或kubetcl create
创建服务后,就无法用yaml文件替换该服务。换句话说,服务会生成一个随机IP ,该不能进行修补或替换。重新创建服务的唯一选择是删除服务,然后使用相同的名称重新创建它。
注意::当我尝试创建备份和还原解决方案时尝试使用
kubectl apply
命令替换服务时 导致出现以下错误。
kubectl apply -f replace-service.yaml -n restore-proj
The Service "test-q12" is invalid: spec.clusterIP: Invalid value: "10.102.x.x": provided IP is already allocated.
答案 3 :(得分:0)
结果是我误解了我从链接中给出的解决方法命令。
我认为这是一次配置我的部署的命令,它将以后的所有kubectl apply
命令都视为更新我的Pod的触发器。
实际上,每次我要更新Pod时,我都只需要运行命令即可。
kubectl patch deployment my-app -p "{\"spec\":{\"template\":{\"metadata\":{\"labels\":{\"date\":\"`date +'%s'`\"}}}}}"
非常感谢所有帮助过的人!