Kubernetes pod在节点间的分布
有没有什么办法可以让kubernetes尽可能多地分配豆荚? 我对所有部署和全局请求以及HPA都有“请求”。 所有节点都是一样的。
刚刚有一种情况,我的ASG缩小了一个节点,一个服务变得完全不可用,因为所有4个pod都位于缩小的同一个节点上。
我想保持每个部署必须在至少2个节点上分布容器的情况。
听起来像你想要的是Pod-Pod Affinity和Pod Anti-affinity。
在Kubernetes 1.4中引入了荚间亲和力和抗亲和力。 根据已在节点上运行的Pod上的标签,而不是根据节点上的标签,可以根据Pod上的标签限制pod亲和性和反亲和性来限制您的pod有资格进行调度的节点。 规则的形式是“如果X已经在运行符合规则Y的一个或多个容器,则此容器应该(或者在反亲和的情况下不应该)在X中运行。”Y被表示为LabelSelector与命名空间(或“所有”命名空间)的关联列表; 与节点不同,因为pod是命名空间的(因此pod上的标签隐式命名空间),pod标签上的标签选择器必须指定选择器应适用的命名空间。 从概念上讲,X是一个拓扑结构域,如节点,机架,云提供商区域,云提供商区域等。您可以使用topologyKey表示它,该拓扑结构是系统用于表示此拓扑结构域的节点标签的关键字,例如,请参阅标签上面在“Interlude:内置节点标签”部分列出的键。
可以使用反亲和力来确保您将问题分布在故障域中。 您可以将这些规则陈述为偏好,或者作为硬性规则。 在后一种情况下,如果无法满足约束条件,则吊舱将无法安排。
我在这里利用Anirudh的答案添加示例代码。
我最初的kubernetes yaml看起来像这样:
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: say-deployment
spec:
replicas: 6
template:
metadata:
labels:
app: say
spec:
containers:
- name: say
image: gcr.io/hazel-champion-200108/say
ports:
- containerPort: 8080
---
kind: Service
apiVersion: v1
metadata:
name: say-service
spec:
selector:
app: say
ports:
- protocol: TCP
port: 8080
type: LoadBalancer
externalIPs:
- 192.168.0.112
此时,kubernetes调度器以某种方式决定所有6个副本都应该部署在同一个节点上。
然后我添加了requiredDuringSchedulingIgnoredDuringExecution
的DuringSchedulingIgnoredDuringExecution,以强制将豆荚部署在不同的节点上:
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: say-deployment
spec:
replicas: 3
template:
metadata:
labels:
app: say
spec:
containers:
- name: say
image: gcr.io/hazel-champion-200108/say
ports:
- containerPort: 8080
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: "app"
operator: In
values:
- say
topologyKey: "kubernetes.io/hostname"
---
kind: Service
apiVersion: v1
metadata:
name: say-service
spec:
selector:
app: say
ports:
- protocol: TCP
port: 8080
type: LoadBalancer
externalIPs:
- 192.168.0.112
现在所有的豆荚都在不同的节点上运行。 由于我有3个节点和6个豆荚,其他3个豆荚(6减3)不能运行(挂起)。 这是因为我需要它: requiredDuringSchedulingIgnoredDuringExecution
。
kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE
say-deployment-8b46845d8-4zdw2 1/1 Running 0 24s 10.244.2.80 night
say-deployment-8b46845d8-699wg 0/1 Pending 0 24s <none> <none>
say-deployment-8b46845d8-7nvqp 1/1 Running 0 24s 10.244.1.72 gray
say-deployment-8b46845d8-bzw48 1/1 Running 0 24s 10.244.0.25 np3
say-deployment-8b46845d8-vwn8g 0/1 Pending 0 24s <none> <none>
say-deployment-8b46845d8-ws8lr 0/1 Pending 0 24s <none> <none>
现在,如果我放松了这个要求,并且preferredDuringSchedulingIgnoredDuringExecution
:
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: say-deployment
spec:
replicas: 6
template:
metadata:
labels:
app: say
spec:
containers:
- name: say
image: gcr.io/hazel-champion-200108/say
ports:
- containerPort: 8080
affinity:
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
podAffinityTerm:
labelSelector:
matchExpressions:
- key: "app"
operator: In
values:
- say
topologyKey: "kubernetes.io/hostname"
---
kind: Service
apiVersion: v1
metadata:
name: say-service
spec:
selector:
app: say
ports:
- protocol: TCP
port: 8080
type: LoadBalancer
externalIPs:
- 192.168.0.112
与前面的情况一样,前3个吊舱部署在3个不同的节点上。 根据kubernetes内部的考虑,其余3个(6个pod减3个节点)部署在各个节点上。
NAME READY STATUS RESTARTS AGE IP NODE
say-deployment-57cf5fb49b-26nvl 1/1 Running 0 59s 10.244.2.81 night
say-deployment-57cf5fb49b-2wnsc 1/1 Running 0 59s 10.244.0.27 np3
say-deployment-57cf5fb49b-6v24l 1/1 Running 0 59s 10.244.1.73 gray
say-deployment-57cf5fb49b-cxkbz 1/1 Running 0 59s 10.244.0.26 np3
say-deployment-57cf5fb49b-dxpcf 1/1 Running 0 59s 10.244.1.75 gray
say-deployment-57cf5fb49b-vv98p 1/1 Running 0 59s 10.244.1.74 gray
链接地址: http://www.djcxy.com/p/94273.html