Veuillez utiliser ce modèle lorsque vous signalez un bogue et fournissez autant d'informations que possible. Si vous ne le faites pas, votre bogue pourrait ne pas être résolu en temps opportun. Merci! Si le problème est lié à la sécurité, veuillez le divulguer en privé via https://kubernetes.io/security/
Ce qui s'est passé : J'ai modifié les paramètres pod-eviction-timeout
de kube-controller-manager sur le nœud maître (afin de réduire le temps avant que k8s ne recrée un pod en cas de défaillance du nœud). La valeur par défaut est de 5 minutes, j'ai configuré 30 secondes. En utilisant la commande sudo docker ps --no-trunc | grep "kube-controller-manager"
j'ai vérifié que la modification a été appliquée avec succès:
kubeadmin<strong i="10">@nodetest21</strong>:~$ sudo docker ps --no-trunc | grep "kube-controller-manager"
387261c61ee9cebce50de2540e90b89e2bc710b4126a0c066ef41f0a1fb7cf38 sha256:0482f640093306a4de7073fde478cf3ca877b6fcc2c4957624dddb2d304daef5 "kube-controller-manager --address=127.0.0.1 --authentication-kubeconfig=/etc/kubernetes/controller-manager.conf --authorization-kubeconfig=/etc/kubernetes/controller-manager.conf --client-ca-file=/etc/kubernetes/pki/ca.crt --cluster-signing-cert-file=/etc/kubernetes/pki/ca.crt --cluster-signing-key-file=/etc/kubernetes/pki/ca.key --controllers=*,bootstrapsigner,tokencleaner --kubeconfig=/etc/kubernetes/controller-manager.conf --leader-elect=true --requestheader-client-ca-file=/etc/kubernetes/pki/front-proxy-ca.crt --root-ca-file=/etc/kubernetes/pki/ca.crt --service-account-private-key-file=/etc/kubernetes/pki/sa.key --use-service-account-credentials=true --pod-eviction-timeout=30s"
J'ai appliqué un déploiement de base avec deux réplicas:
apiVersion: apps/v1
kind: Deployment
metadata:
name: busybox
namespace: default
spec:
replicas: 2
selector:
matchLabels:
app: busybox
template:
metadata:
labels:
app: busybox
spec:
containers:
- image: busybox
command:
- sleep
- "3600"
imagePullPolicy: IfNotPresent
name: busybox
restartPolicy: Always
Le premier pod créé sur le premier nœud de travail, le deuxième pod créé sur le deuxième nœud de travail:
NAME STATUS ROLES AGE VERSION
nodetest21 Ready master 34m v1.13.3
nodetest22 Ready <none> 31m v1.13.3
nodetest23 Ready <none> 30m v1.13.3
NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
default busybox-74b487c57b-5s6g7 1/1 Running 0 13s 10.44.0.2 nodetest22 <none> <none>
default busybox-74b487c57b-6zdvv 1/1 Running 0 13s 10.36.0.1 nodetest23 <none> <none>
kube-system coredns-86c58d9df4-gmcjd 1/1 Running 0 34m 10.32.0.2 nodetest21 <none> <none>
kube-system coredns-86c58d9df4-wpffr 1/1 Running 0 34m 10.32.0.3 nodetest21 <none> <none>
kube-system etcd-nodetest21 1/1 Running 0 33m 10.0.1.4 nodetest21 <none> <none>
kube-system kube-apiserver-nodetest21 1/1 Running 0 33m 10.0.1.4 nodetest21 <none> <none>
kube-system kube-controller-manager-nodetest21 1/1 Running 0 20m 10.0.1.4 nodetest21 <none> <none>
kube-system kube-proxy-6mcn8 1/1 Running 1 31m 10.0.1.5 nodetest22 <none> <none>
kube-system kube-proxy-dhdqj 1/1 Running 0 30m 10.0.1.6 nodetest23 <none> <none>
kube-system kube-proxy-vqjg8 1/1 Running 0 34m 10.0.1.4 nodetest21 <none> <none>
kube-system kube-scheduler-nodetest21 1/1 Running 1 33m 10.0.1.4 nodetest21 <none> <none>
kube-system weave-net-9qls7 2/2 Running 3 31m 10.0.1.5 nodetest22 <none> <none>
kube-system weave-net-h2cb6 2/2 Running 0 33m 10.0.1.4 nodetest21 <none> <none>
kube-system weave-net-vkb62 2/2 Running 0 30m 10.0.1.6 nodetest23 <none> <none>
Pour tester l'expulsion de pod correcte, j'ai arrêté le premier nœud de travail. Après ~ 1 min, l'état du premier nœud de travail est passé à "NotReady", puis
J'ai dû attendre +5 minutes (qui est le délai d'expiration par défaut du pod) pour que le pod sur le nœud désactivé soit recréé sur l'autre nœud.
Ce à quoi vous vous attendiez :
Après que l'état du nœud rapporte "NotReady", le pod doit être recréé sur l'autre nœud après 30 secondes à la place si la valeur par défaut est de 5 minutes!
Comment le reproduire (de la manière la plus minimale et la plus précise possible) :
Créez trois nœuds. Lancez Kubernetes sur le premier nœud ( sudo kubeadm init
), appliquez le plugin réseau ( kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"
), puis rejoignez les deux autres nœuds (comme: kubeadm join 10.0.1.4:6443 --token xdx9y1.z7jc0j7c8g8lpjog --discovery-token-ca-cert-hash sha256:04ae8388f607755c14eed702a23fd47802d5512e092b08add57040a2ae0736ac
).
Ajoutez le paramètre pod-eviction-timeout à Kube Controller Manager sur le nœud maître: sudo vi /etc/kubernetes/manifests/kube-controller-manager.yaml
:
apiVersion: v1
kind: Pod
metadata:
annotations:
scheduler.alpha.kubernetes.io/critical-pod: ""
creationTimestamp: null
labels:
component: kube-controller-manager
tier: control-plane
name: kube-controller-manager
namespace: kube-system
spec:
containers:
- command:
- kube-controller-manager
- --address=127.0.0.1
- --authentication-kubeconfig=/etc/kubernetes/controller-manager.conf
- --authorization-kubeconfig=/etc/kubernetes/controller-manager.conf
- --client-ca-file=/etc/kubernetes/pki/ca.crt
- --cluster-signing-cert-file=/etc/kubernetes/pki/ca.crt
- --cluster-signing-key-file=/etc/kubernetes/pki/ca.key
- --controllers=*,bootstrapsigner,tokencleaner
- --kubeconfig=/etc/kubernetes/controller-manager.conf
- --leader-elect=true
- --requestheader-client-ca-file=/etc/kubernetes/pki/front-proxy-ca.crt
- --root-ca-file=/etc/kubernetes/pki/ca.crt
- --service-account-private-key-file=/etc/kubernetes/pki/sa.key
- --use-service-account-credentials=true
- --pod-eviction-timeout=30s
(le yaml est tronqué, seule la première partie associée est affichée ici).
Vérifiez que les paramètres sont appliqués:
sudo docker ps --no-trunc | grep "kube-controller-manager"
Appliquez un déploiement avec deux réplicas, vérifiez qu'un pod est créé sur le premier nœud de travail, le second est créé sur le deuxième nœud de travail.
Arrêtez l'un des nœuds et vérifiez le temps écoulé entre l'événement, lorsque le nœud signale «NotReady» et le pod recréé.
Y a-t-il autre chose que nous devons savoir? :
Je rencontre également le même problème dans un environnement multi-maître.
Environnement :
kubectl version
): v1.13.3cat /etc/os-release
): NAME = "Ubuntu" VERSION = "16.04.5 LTS (Xenial Xerus)"uname -a
): Linux nodetest21 4.15.0-1037-azure # 39 ~ 16.04.1-Ubuntu SMP mar 15 janvier 17:20:47 UTC 2019 x86_64 x86_64 x86_64 GNU / Linux@ kubernetes / sig-node-bugs
@ kubernetes / sig-apps-bugs
@danielloczi :
@ kubernetes / sig-node-bugs, @ kubernetes / sig-apps-bugs
En réponse à cela :
@ kubernetes / sig-node-bugs
@ kubernetes / sig-apps-bugs
Les instructions pour interagir avec moi en utilisant les commentaires PR sont disponibles ici . Si vous avez des questions ou des suggestions concernant mon comportement, veuillez signaler un problème avec le
J'ai également rencontré ce problème en testant la réduction du délai d'expulsion. Après avoir fouillé là-dessus pendant un certain temps, j'ai compris que la cause était les nouvelles TaintBasedEvictions.
Dans la version 1.13, la fonctionnalité TaintBasedEvictions est promue en version bêta et activée par défaut, par conséquent, les teintes sont automatiquement ajoutées par le NodeController (ou kubelet) et la logique normale d'expulsion des pods des nœuds basée sur Ready NodeCondition est désactivée.
La définition de l'indicateur de fonctionnalité pour cela sur false entraîne l'expulsion des pods comme prévu. Je n'ai pas pris le temps de chercher dans le code d'expulsion basé sur la corruption, mais je suppose que nous n'utilisons pas cet indicateur de délai d'expiration.
En regardant cela plus. Avec TaintBasedEvictions défini sur true, vous pouvez définir le temps d'expulsion de vos pods dans ses spécifications sous les tolérances:
https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/#taint -based-evictions
Les valeurs par défaut de celles-ci sont définies par un contrôleur d'admission: https://github.com/kubernetes/kubernetes/blob/master/plugin/pkg/admission/defaulttolerationseconds/admission.go#L34
Ces deux drapeaux peuvent être définis via le kube-apiserver et devraient avoir le même effet.
// Controller will not proactively sync node health, but will monitor node
// health signal updated from kubelet. There are 2 kinds of node healthiness
// signals: NodeStatus and NodeLease. NodeLease signal is generated only when
// NodeLease feature is enabled. If it doesn't receive update for this amount
// of time, it will start posting "NodeReady==ConditionUnknown". The amount of
// time before which Controller start evicting pods is controlled via flag
// 'pod-eviction-timeout'.
// Note: be cautious when changing the constant, it must work with
// nodeStatusUpdateFrequency in kubelet and renewInterval in NodeLease
// controller. The node health signal update frequency is the minimal of the
// two.
// There are several constraints:
// 1. nodeMonitorGracePeriod must be N times more than the node health signal
// update frequency, where N means number of retries allowed for kubelet to
// post node status/lease. It is pointless to make nodeMonitorGracePeriod
// be less than the node health signal update frequency, since there will
// only be fresh values from Kubelet at an interval of node health signal
// update frequency. The constant must be less than podEvictionTimeout.
// 2. nodeMonitorGracePeriod can't be too large for user experience - larger
// value takes longer for user to see up-to-date node health.
Merci pour vos commentaires ChiefAlexander!
Telle est la situation, avez-vous écrit. J'ai vérifié les pods et je suis sûr que les valeurs par défaut sont attribuées au pod pour la tolérance:
kubectl describe pod busybox-74b487c57b-95b6n | grep -i toleration -A 2
Tolerations: node.kubernetes.io/not-ready:NoExecute for 300s
node.kubernetes.io/unreachable:NoExecute for 300s
J'ai donc simplement ajouté mes propres valeurs au déploiement:
apiVersion: apps/v1
kind: Deployment
metadata:
name: busybox
namespace: default
spec:
replicas: 2
selector:
matchLabels:
app: busybox
template:
metadata:
labels:
app: busybox
spec:
tolerations:
- key: "node.kubernetes.io/unreachable"
operator: "Exists"
effect: "NoExecute"
tolerationSeconds: 2
- key: "node.kubernetes.io/not-ready"
operator: "Exists"
effect: "NoExecute"
tolerationSeconds: 2
containers:
- image: busybox
command:
- sleep
- "3600"
imagePullPolicy: IfNotPresent
name: busybox
restartPolicy: Always
Après avoir appliqué le déploiement en cas de défaillance du nœud, l'état du nœud passe à "NotReady", puis les pods sont recréés après 2 secondes.
Nous n'avons donc plus à gérer le délai d'expiration du pod, le délai peut être défini sur la base du pod! Cool!
Merci encore pour votre aide!
@danielloczi Bonjour danielloczi, Comment résolvez-vous ce problème? Je rencontre aussi ce problème
@ 323929 Je pense que @danielloczi ne se soucie pas du paramètre pod-eviction-timeout
dans kube-controller-manager, mais le résout en utilisant Taint based Evictions
, J'ai testé avec Taint based Evictions
, ça a marché pour moi.
C'est vrai: j'ai simplement commencé à utiliser Taint based Eviction
.
Est-il possible de le rendre mondial? Je ne veux pas activer cela pour chaque configuration de pod, surtout que j'utilise beaucoup de choses préparées à partir de la barre
+1 pour avoir la possibilité de le configurer par cluster entier. le réglage par pod ou par déploiement est rarement utile: dans la plupart des cas, une valeur globale raisonnable est plus pratique et la valeur par défaut actuelle de 5 m est trop longue dans de nombreux cas.
veuillez rouvrir ce numéro.
Je suis confronté au même problème, existe-t-il un moyen de désactiver les expulsions basées sur Taint et que le délai d'expulsion de pod fonctionne en mode global?
Je suis confronté au même problème, existe-t-il un moyen de désactiver les expulsions basées sur Taint et que le délai d'expulsion de pod fonctionne en mode global?
Je pense que vous pouvez configurer l'expulsion globale des pod via apiserver: https://kubernetes.io/docs/reference/command-line-tools-reference/kube-apiserver/
Je n'ai pas essayé cela, mais comme je peux le voir, il existe des options: --default-not-ready-toleration-seconds et --default-uneachable-toleration-seconds.
Pourquoi ce bogue a-t-il été marqué comme fermé? Il semble que le problème d'origine ne soit pas résolu, mais seulement contourné.
Je ne vois pas pourquoi l'indicateur de délai d'expulsion de pod ne fonctionne pas
même problème
Commentaire le plus utile
Merci pour vos commentaires ChiefAlexander!
Telle est la situation, avez-vous écrit. J'ai vérifié les pods et je suis sûr que les valeurs par défaut sont attribuées au pod pour la tolérance:
J'ai donc simplement ajouté mes propres valeurs au déploiement:
Après avoir appliqué le déploiement en cas de défaillance du nœud, l'état du nœud passe à "NotReady", puis les pods sont recréés après 2 secondes.
Nous n'avons donc plus à gérer le délai d'expiration du pod, le délai peut être défini sur la base du pod! Cool!
Merci encore pour votre aide!