我想知道在部署期间是否有办法强制Kubernetes使用群集中的每个节点。 问题是由于我做了一些尝试,我注意到这样的情况:
3个节点的集群
我使用如下命令更新部署:kubectl set image deployment/deployment_name my_repo:v2.1.2
Kubernetes更新群集
最后我执行kubectl get pod
,我注意到在同一节点中部署了2个pod。
因此,在更新之后,群集具有以下配置:
答案 0 :(得分:2)
调度程序将尝试在给定的时间点找出最合理的调度方式,这可以在以后更改并导致您描述的情况。以这种或那种方式管理这两种方式的两种简单方法是:
使用PodAntiAffinity:您可以确保同一版本中同一部署的两个pod永远不会部署在同一节点上。这是我个人更喜欢的许多应用程序(除非我想要每个节点安排多一个)。请注意,如果您决定将部署扩展到更多副本然后拥有节点,那将会遇到一些麻烦。 我使用的版本化PodAntiAffinity示例:
metadata:
labels:
app: {{ template "fullname" . }}
version: {{ .Values.image.tag }}
spec:
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values: ["{{ template "fullname" . }}"]
- key: version
operator: In
values: ["{{ .Values.image.tag }}"]
topologyKey: kubernetes.io/hostname
考虑摆弄Descheduler,这就像Kubes Scheduler组件的邪恶双胞胎一样,会导致删除pod,让他们以不同的方式重新安排
答案 1 :(得分:0)
我尝试了一些解决方案,目前正在进行的工作只是基于对我在 DaemonSet 控制器上的deployment.yaml 中的版本进行更改。
我的意思是:
1)我必须基于带有一些容器的pod来部署我的应用程序。这些pod应该部署在每个集群节点上(我有3个节点)。 我在yaml文件中设置了部署设置,选项 replicas
等于3:
apiVersion: apps/v1beta2 # for versions before 1.8.0 use apps/v1beta1
kind: Deployment
metadata:
name: my-deployment
labels:
app: webpod
spec:
replicas: 3
....
击> <击> 撞击>
我在yaml文件中设置了守护进程(或ds),其中 updateStrategy 选项等于 RollingUpdate :
apiVersion: extensions/v1beta1
kind: DaemonSet
metadata:
name: my-daemonset
spec:
updateStrategy:
type: RollingUpdate
...
我的一个容器使用的版本是2.1例如
2)我使用以下命令执行部署: kubectl apply -f my-deployment.yaml
我使用以下命令执行部署:kubectl apply -f my-daemonset.yaml
3)我为每个节点都没有问题
4)现在我想更新部署,更改我用于其中一个容器的映像版本。 所以我只需用2.2更改yaml文件编辑2.1。然后我重新启动命令: kubectl apply -f my-deployment.yaml
所以我可以使用以下命令更改图像的版本(2.1 - > 2.2):
kubectl set image ds/my-daemonset my-container=my-repository:v2.2
5)再次,我为每个节点获得一个pod而没有问题
如果我使用命令,行为会有很大差异:
kubectl set image deployment/my-deployment my-container=xxxx:v2.2
在这种情况下,我得到一个错误的结果,其中一个节点有2个pod,一个节点1 pod和最后一个没有任何pod的节点......
击>
要了解部署如何发展,我可以启动命令:
kubectl rollout status ds/my-daemonset
获得类似的东西
Waiting for rollout to finish: 0 out of 3 new pods have been updated...
Waiting for rollout to finish: 0 out of 3 new pods have been updated...
Waiting for rollout to finish: 1 out of 3 new pods have been updated...
Waiting for rollout to finish: 1 out of 3 new pods have been updated...
Waiting for rollout to finish: 1 out of 3 new pods have been updated...
Waiting for rollout to finish: 2 out of 3 new pods have been updated...
Waiting for rollout to finish: 2 out of 3 new pods have been updated...
Waiting for rollout to finish: 2 out of 3 new pods have been updated...
Waiting for rollout to finish: 2 of 3 updated pods are available...
daemon set "my-daemonset" successfully rolled out