Reword topic Assigning Pods to Nodes
- Rewording - Tidying Co-authored-by: Abdullah Gharaibeh <40361897+ahg-g@users.noreply.github.com>
This commit is contained in:
@@ -11,20 +11,22 @@ weight: 20
|
|||||||
|
|
||||||
<!-- overview -->
|
<!-- overview -->
|
||||||
|
|
||||||
You can constrain a {{< glossary_tooltip text="Pod" term_id="pod" >}} so that it can only run on particular set of
|
You can constrain a {{< glossary_tooltip text="Pod" term_id="pod" >}} so that it is
|
||||||
{{< glossary_tooltip text="node(s)" term_id="node" >}}.
|
_restricted_ to run on particular {{< glossary_tooltip text="node(s)" term_id="node" >}},
|
||||||
|
or to _prefer_ to run on particular nodes.
|
||||||
There are several ways to do this and the recommended approaches all use
|
There are several ways to do this and the recommended approaches all use
|
||||||
[label selectors](/docs/concepts/overview/working-with-objects/labels/) to facilitate the selection.
|
[label selectors](/docs/concepts/overview/working-with-objects/labels/) to facilitate the selection.
|
||||||
Generally such constraints are unnecessary, as the scheduler will automatically do a reasonable placement
|
Often, you do not need to set any such constraints; the
|
||||||
|
{{< glossary_tooltip text="scheduler" term_id="kube-scheduler" >}} will automatically do a reasonable placement
|
||||||
(for example, spreading your Pods across nodes so as not place Pods on a node with insufficient free resources).
|
(for example, spreading your Pods across nodes so as not place Pods on a node with insufficient free resources).
|
||||||
However, there are some circumstances where you may want to control which node
|
However, there are some circumstances where you may want to control which node
|
||||||
the Pod deploys to, for example, to ensure that a Pod ends up on a node with an SSD attached to it, or to co-locate Pods from two different
|
the Pod deploys to, for example, to ensure that a Pod ends up on a node with an SSD attached to it,
|
||||||
services that communicate a lot into the same availability zone.
|
or to co-locate Pods from two different services that communicate a lot into the same availability zone.
|
||||||
|
|
||||||
<!-- body -->
|
<!-- body -->
|
||||||
|
|
||||||
You can use any of the following methods to choose where Kubernetes schedules
|
You can use any of the following methods to choose where Kubernetes schedules
|
||||||
specific Pods:
|
specific Pods:
|
||||||
|
|
||||||
* [nodeSelector](#nodeselector) field matching against [node labels](#built-in-node-labels)
|
* [nodeSelector](#nodeselector) field matching against [node labels](#built-in-node-labels)
|
||||||
* [Affinity and anti-affinity](#affinity-and-anti-affinity)
|
* [Affinity and anti-affinity](#affinity-and-anti-affinity)
|
||||||
@@ -338,13 +340,15 @@ null `namespaceSelector` matches the namespace of the Pod where the rule is defi
|
|||||||
Inter-pod affinity and anti-affinity can be even more useful when they are used with higher
|
Inter-pod affinity and anti-affinity can be even more useful when they are used with higher
|
||||||
level collections such as ReplicaSets, StatefulSets, Deployments, etc. These
|
level collections such as ReplicaSets, StatefulSets, Deployments, etc. These
|
||||||
rules allow you to configure that a set of workloads should
|
rules allow you to configure that a set of workloads should
|
||||||
be co-located in the same defined topology, eg., the same node.
|
be co-located in the same defined topology; for example, preferring to place two related
|
||||||
|
Pods onto the same node.
|
||||||
|
|
||||||
Take, for example, a three-node cluster running a web application with an
|
For example: imagine a three-node cluster. You use the cluster to run a web application
|
||||||
in-memory cache like redis. You could use inter-pod affinity and anti-affinity
|
and also an in-memory cache (such as Redis). For this example, also assume that latency between
|
||||||
to co-locate the web servers with the cache as much as possible.
|
the web application and the memory cache should be as low as is practical. You could use inter-pod
|
||||||
|
affinity and anti-affinity to co-locate the web servers with the cache as much as possible.
|
||||||
|
|
||||||
In the following example Deployment for the redis cache, the replicas get the label `app=store`. The
|
In the following example Deployment for the Redis cache, the replicas get the label `app=store`. The
|
||||||
`podAntiAffinity` rule tells the scheduler to avoid placing multiple replicas
|
`podAntiAffinity` rule tells the scheduler to avoid placing multiple replicas
|
||||||
with the `app=store` label on a single node. This creates each cache in a
|
with the `app=store` label on a single node. This creates each cache in a
|
||||||
separate node.
|
separate node.
|
||||||
@@ -379,10 +383,10 @@ spec:
|
|||||||
image: redis:3.2-alpine
|
image: redis:3.2-alpine
|
||||||
```
|
```
|
||||||
|
|
||||||
The following Deployment for the web servers creates replicas with the label `app=web-store`. The
|
The following example Deployment for the web servers creates replicas with the label `app=web-store`.
|
||||||
Pod affinity rule tells the scheduler to place each replica on a node that has a
|
The Pod affinity rule tells the scheduler to place each replica on a node that has a Pod
|
||||||
Pod with the label `app=store`. The Pod anti-affinity rule tells the scheduler
|
with the label `app=store`. The Pod anti-affinity rule tells the scheduler never to place
|
||||||
to avoid placing multiple `app=web-store` servers on a single node.
|
multiple `app=web-store` servers on a single node.
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
apiVersion: apps/v1
|
apiVersion: apps/v1
|
||||||
@@ -431,6 +435,10 @@ where each web server is co-located with a cache, on three separate nodes.
|
|||||||
| *webserver-1* | *webserver-2* | *webserver-3* |
|
| *webserver-1* | *webserver-2* | *webserver-3* |
|
||||||
| *cache-1* | *cache-2* | *cache-3* |
|
| *cache-1* | *cache-2* | *cache-3* |
|
||||||
|
|
||||||
|
The overall effect is that each cache instance is likely to be accessed by a single client, that
|
||||||
|
is running on the same node. This approach aims to minimize both skew (imbalanced load) and latency.
|
||||||
|
|
||||||
|
You might have other reasons to use Pod anti-affinity.
|
||||||
See the [ZooKeeper tutorial](/docs/tutorials/stateful-application/zookeeper/#tolerating-node-failure)
|
See the [ZooKeeper tutorial](/docs/tutorials/stateful-application/zookeeper/#tolerating-node-failure)
|
||||||
for an example of a StatefulSet configured with anti-affinity for high
|
for an example of a StatefulSet configured with anti-affinity for high
|
||||||
availability, using the same technique as this example.
|
availability, using the same technique as this example.
|
||||||
|
|||||||
Reference in New Issue
Block a user