J'ai configuré un cluster Kubernetes 1.5 avec les trois nœuds maîtres contaminés dédié = maître: NoSchedule . Maintenant, je souhaite déployer le contrôleur Nginx Ingress Controller sur les nœuds principaux uniquement. J'ai donc ajouté des tolérances:
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: nginx-ingress-controller
namespace: kube-system
labels:
kubernetes.io/cluster-service: "true"
spec:
replicas: 3
template:
metadata:
labels:
k8s-app: nginx-ingress-lb
name: nginx-ingress-lb
annotations:
scheduler.alpha.kubernetes.io/tolerations: |
[
{
"key": "dedicated",
"operator": "Equal",
"value": "master",
"effect": "NoSchedule"
}
]
spec:
[…]
Malheureusement, cela n'a pas l'effet souhaité: Kubernetes programme tous les pods sur les travailleurs. Lorsque vous réduisez le nombre de répliques à un nombre plus important, les pods sont également déployés sur les travailleurs.
Comment puis-je obtenir une planification sur les nœuds maîtres uniquement?
Merci de votre aide.
Une tolérance signifie non que le pod doit être planifié sur un nœud présentant de telles altérations. Cela signifie que le pod tolère une telle souillure. Si vous voulez que votre pod soit "attiré" par des nœuds spécifiques, vous devez associer un label à vos nœuds dédiés = maître et altéré, puis définir nodeSelector dans le pod pour rechercher ce libellé.
Attachez l'étiquette à chacun de vos nœuds d'utilisation spéciale:
kubectl label nodes name_of_your_node dedicated=master
Ajoutez le nodeSelector à votre pod:
apiVersion: apps/v1beta1
kind: Deployment
metadata:
name: nginx-ingress-controller
namespace: kube-system
labels:
kubernetes.io/cluster-service: "true"
spec:
replicas: 3
template:
metadata:
labels:
k8s-app: nginx-ingress-lb
name: nginx-ingress-lb
annotations:
spec:
nodeSelector:
dedicated: master
tolerations:
- key: dedicated
operator: Equal
value: master
effect: NoSchedule
[…]
Si vous n'aimez pas nodeSelector
, vous pouvez ajouter affinity:
sous spec:
à la place:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
matchExpressions:
- key: dedicated
operator: Equal
values: ["master"]
Ajoutez le nodeSelector à votre pod:
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: nginx-ingress-controller
namespace: kube-system
labels:
kubernetes.io/cluster-service: "true"
spec:
replicas: 3
template:
metadata:
labels:
k8s-app: nginx-ingress-lb
name: nginx-ingress-lb
annotations:
scheduler.alpha.kubernetes.io/tolerations: |
[
{
"key": "dedicated",
"operator": "Equal",
"value": "master",
"effect": "NoSchedule"
}
]
spec:
nodeSelector:
dedicated: master
[…]
Si vous n'aimez pas nodeSelector
, vous pouvez également ajouter une annotation comme celle-ci:
scheduler.alpha.kubernetes.io/affinity: >
{
"nodeAffinity": {
"requiredDuringSchedulingIgnoredDuringExecution": {
"nodeSelectorTerms": [
{
"matchExpressions": [
{
"key": "dedicated",
"operator": "Equal",
"values": ["master"]
}
]
}
]
}
}
}
Gardez à l'esprit que NoSchedule n'expulsera pas les pods déjà programmés.
Les informations ci-dessus proviennent de https://kubernetes.io/docs/user-guide/node-selection/ et vous trouverez plus de détails à ce sujet.
vous voudrez peut-être plonger dans la documentation Assigning Pods to Nodes . En gros, vous devriez ajouter des étiquettes à vos nœuds avec sth comme ceci:
kubectl label nodes <node-name> <label-key>=<label-value>
et puis référencez cela dans votre spécification Pod
comme ceci:
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
- name: nginx
image: nginx
nodeSelector:
label: value
Mais je ne suis pas sûr que cela fonctionne pour les addons non critiques lorsque le nœud spécifique est corrompu. Plus de détails pourraient être trouvés ici