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 -->
|
||||
|
||||
You can constrain a {{< glossary_tooltip text="Pod" term_id="pod" >}} so that it can only run on particular set of
|
||||
{{< glossary_tooltip text="node(s)" term_id="node" >}}.
|
||||
You can constrain a {{< glossary_tooltip text="Pod" term_id="pod" >}} so that it is
|
||||
_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
|
||||
[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).
|
||||
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
|
||||
services that communicate a lot into the same availability zone.
|
||||
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 services that communicate a lot into the same availability zone.
|
||||
|
||||
<!-- body -->
|
||||
|
||||
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)
|
||||
* [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
|
||||
level collections such as ReplicaSets, StatefulSets, Deployments, etc. These
|
||||
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
|
||||
in-memory cache like redis. You could use inter-pod affinity and anti-affinity
|
||||
to co-locate the web servers with the cache as much as possible.
|
||||
For example: imagine a three-node cluster. You use the cluster to run a web application
|
||||
and also an in-memory cache (such as Redis). For this example, also assume that latency between
|
||||
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
|
||||
with the `app=store` label on a single node. This creates each cache in a
|
||||
separate node.
|
||||
@@ -379,10 +383,10 @@ spec:
|
||||
image: redis:3.2-alpine
|
||||
```
|
||||
|
||||
The following Deployment for the web servers creates replicas with the label `app=web-store`. The
|
||||
Pod affinity rule tells the scheduler to place each replica on a node that has a
|
||||
Pod with the label `app=store`. The Pod anti-affinity rule tells the scheduler
|
||||
to avoid placing multiple `app=web-store` servers on a single node.
|
||||
The following example Deployment for the web servers creates replicas with the label `app=web-store`.
|
||||
The Pod affinity rule tells the scheduler to place each replica on a node that has a Pod
|
||||
with the label `app=store`. The Pod anti-affinity rule tells the scheduler never to place
|
||||
multiple `app=web-store` servers on a single node.
|
||||
|
||||
```yaml
|
||||
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* |
|
||||
| *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)
|
||||
for an example of a StatefulSet configured with anti-affinity for high
|
||||
availability, using the same technique as this example.
|
||||
|
||||
Reference in New Issue
Block a user