Ce qui s'est passé : Nous avons mis à jour 15 clusters kubernetes de la 1.17.5 à la 1.18.2 / 1.18.3 et avons commencé à voir que les daemonsets ne fonctionnaient plus correctement.
Le problème est que tous les pods de daemonset ne sont pas provisionnés. Il renverra le message d'erreur suivant aux événements:
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Warning FailedScheduling 9s (x5 over 71s) default-scheduler 0/13 nodes are available: 12 node(s) didn't match node selector.
Cependant, tous les nœuds sont disponibles et il n'a pas de sélecteur de nœud. Nodes n'a pas non plus de teintes.
ensemble de démons https://gist.github.com/zetaab/4a605cb3e15e349934cb7db29ec72bd8
% kubectl get nodes
NAME STATUS ROLES AGE VERSION
e2etest-1-kaasprod-k8s-local Ready node 46h v1.18.3
e2etest-2-kaasprod-k8s-local Ready node 46h v1.18.3
e2etest-3-kaasprod-k8s-local Ready node 44h v1.18.3
e2etest-4-kaasprod-k8s-local Ready node 44h v1.18.3
master-zone-1-1-1-kaasprod-k8s-local Ready master 47h v1.18.3
master-zone-2-1-1-kaasprod-k8s-local Ready master 47h v1.18.3
master-zone-3-1-1-kaasprod-k8s-local Ready master 47h v1.18.3
nodes-z1-1-kaasprod-k8s-local Ready node 47h v1.18.3
nodes-z1-2-kaasprod-k8s-local Ready node 47h v1.18.3
nodes-z2-1-kaasprod-k8s-local Ready node 46h v1.18.3
nodes-z2-2-kaasprod-k8s-local Ready node 46h v1.18.3
nodes-z3-1-kaasprod-k8s-local Ready node 47h v1.18.3
nodes-z3-2-kaasprod-k8s-local Ready node 46h v1.18.3
% kubectl get pods -n weave -l weave-scope-component=agent -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
weave-scope-agent-2drzw 1/1 Running 0 26h 10.1.32.23 e2etest-1-kaasprod-k8s-local <none> <none>
weave-scope-agent-4kpxc 1/1 Running 3 26h 10.1.32.12 nodes-z1-2-kaasprod-k8s-local <none> <none>
weave-scope-agent-78n7r 1/1 Running 0 26h 10.1.32.7 e2etest-4-kaasprod-k8s-local <none> <none>
weave-scope-agent-9m4n8 1/1 Running 0 26h 10.1.96.4 master-zone-1-1-1-kaasprod-k8s-local <none> <none>
weave-scope-agent-b2gnk 1/1 Running 1 26h 10.1.96.12 master-zone-3-1-1-kaasprod-k8s-local <none> <none>
weave-scope-agent-blwtx 1/1 Running 2 26h 10.1.32.20 nodes-z1-1-kaasprod-k8s-local <none> <none>
weave-scope-agent-cbhjg 1/1 Running 0 26h 10.1.64.15 e2etest-2-kaasprod-k8s-local <none> <none>
weave-scope-agent-csp49 1/1 Running 0 26h 10.1.96.14 e2etest-3-kaasprod-k8s-local <none> <none>
weave-scope-agent-g4k2x 1/1 Running 1 26h 10.1.64.10 nodes-z2-2-kaasprod-k8s-local <none> <none>
weave-scope-agent-kx85h 1/1 Running 2 26h 10.1.96.6 nodes-z3-1-kaasprod-k8s-local <none> <none>
weave-scope-agent-lllqc 0/1 Pending 0 5m56s <none> <none> <none> <none>
weave-scope-agent-nls2h 1/1 Running 0 26h 10.1.96.17 master-zone-2-1-1-kaasprod-k8s-local <none> <none>
weave-scope-agent-p8njs 1/1 Running 2 26h 10.1.96.19 nodes-z3-2-kaasprod-k8s-local <none> <none>
J'ai essayé de redémarrer apiserver / schedulers / controller-managers mais cela n'aide pas. J'ai également essayé de redémarrer ce nœud unique qui est bloqué (nœuds-z2-1-kaasprod-k8s-local) mais cela n'aide pas non plus. Seule la suppression de ce nœud et sa recréation sont utiles.
% kubectl describe node nodes-z2-1-kaasprod-k8s-local
Name: nodes-z2-1-kaasprod-k8s-local
Roles: node
Labels: beta.kubernetes.io/arch=amd64
beta.kubernetes.io/instance-type=59cf4871-de1b-4294-9e9f-2ea7ca4b771f
beta.kubernetes.io/os=linux
failure-domain.beta.kubernetes.io/region=regionOne
failure-domain.beta.kubernetes.io/zone=zone-2
kops.k8s.io/instancegroup=nodes-z2
kubernetes.io/arch=amd64
kubernetes.io/hostname=nodes-z2-1-kaasprod-k8s-local
kubernetes.io/os=linux
kubernetes.io/role=node
node-role.kubernetes.io/node=
node.kubernetes.io/instance-type=59cf4871-de1b-4294-9e9f-2ea7ca4b771f
topology.cinder.csi.openstack.org/zone=zone-2
topology.kubernetes.io/region=regionOne
topology.kubernetes.io/zone=zone-2
Annotations: csi.volume.kubernetes.io/nodeid: {"cinder.csi.openstack.org":"faf14d22-010f-494a-9b34-888bdad1d2df"}
node.alpha.kubernetes.io/ttl: 0
projectcalico.org/IPv4Address: 10.1.64.32/19
projectcalico.org/IPv4IPIPTunnelAddr: 100.98.136.0
volumes.kubernetes.io/controller-managed-attach-detach: true
CreationTimestamp: Thu, 28 May 2020 13:28:24 +0300
Taints: <none>
Unschedulable: false
Lease:
HolderIdentity: nodes-z2-1-kaasprod-k8s-local
AcquireTime: <unset>
RenewTime: Sat, 30 May 2020 12:02:13 +0300
Conditions:
Type Status LastHeartbeatTime LastTransitionTime Reason Message
---- ------ ----------------- ------------------ ------ -------
NetworkUnavailable False Fri, 29 May 2020 09:40:51 +0300 Fri, 29 May 2020 09:40:51 +0300 CalicoIsUp Calico is running on this node
MemoryPressure False Sat, 30 May 2020 11:59:53 +0300 Fri, 29 May 2020 09:40:45 +0300 KubeletHasSufficientMemory kubelet has sufficient memory available
DiskPressure False Sat, 30 May 2020 11:59:53 +0300 Fri, 29 May 2020 09:40:45 +0300 KubeletHasNoDiskPressure kubelet has no disk pressure
PIDPressure False Sat, 30 May 2020 11:59:53 +0300 Fri, 29 May 2020 09:40:45 +0300 KubeletHasSufficientPID kubelet has sufficient PID available
Ready True Sat, 30 May 2020 11:59:53 +0300 Fri, 29 May 2020 09:40:45 +0300 KubeletReady kubelet is posting ready status. AppArmor enabled
Addresses:
InternalIP: 10.1.64.32
Hostname: nodes-z2-1-kaasprod-k8s-local
Capacity:
cpu: 4
ephemeral-storage: 10287360Ki
hugepages-1Gi: 0
hugepages-2Mi: 0
memory: 8172420Ki
pods: 110
Allocatable:
cpu: 4
ephemeral-storage: 9480830961
hugepages-1Gi: 0
hugepages-2Mi: 0
memory: 8070020Ki
pods: 110
System Info:
Machine ID: c94284656ff04cf090852c1ddee7bcc2
System UUID: faf14d22-010f-494a-9b34-888bdad1d2df
Boot ID: 295dc3d9-0a90-49ee-92f3-9be45f2f8e3d
Kernel Version: 4.19.0-8-cloud-amd64
OS Image: Debian GNU/Linux 10 (buster)
Operating System: linux
Architecture: amd64
Container Runtime Version: docker://19.3.8
Kubelet Version: v1.18.3
Kube-Proxy Version: v1.18.3
PodCIDR: 100.96.12.0/24
PodCIDRs: 100.96.12.0/24
ProviderID: openstack:///faf14d22-010f-494a-9b34-888bdad1d2df
Non-terminated Pods: (3 in total)
Namespace Name CPU Requests CPU Limits Memory Requests Memory Limits AGE
--------- ---- ------------ ---------- --------------- ------------- ---
kube-system calico-node-77pqs 100m (2%) 200m (5%) 100Mi (1%) 100Mi (1%) 46h
kube-system kube-proxy-nodes-z2-1-kaasprod-k8s-local 100m (2%) 200m (5%) 100Mi (1%) 100Mi (1%) 46h
volume csi-cinder-nodeplugin-5jbvl 100m (2%) 400m (10%) 200Mi (2%) 200Mi (2%) 46h
Allocated resources:
(Total limits may be over 100 percent, i.e., overcommitted.)
Resource Requests Limits
-------- -------- ------
cpu 300m (7%) 800m (20%)
memory 400Mi (5%) 400Mi (5%)
ephemeral-storage 0 (0%) 0 (0%)
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Starting 7m27s kubelet, nodes-z2-1-kaasprod-k8s-local Starting kubelet.
Normal NodeHasSufficientMemory 7m26s kubelet, nodes-z2-1-kaasprod-k8s-local Node nodes-z2-1-kaasprod-k8s-local status is now: NodeHasSufficientMemory
Normal NodeHasNoDiskPressure 7m26s kubelet, nodes-z2-1-kaasprod-k8s-local Node nodes-z2-1-kaasprod-k8s-local status is now: NodeHasNoDiskPressure
Normal NodeHasSufficientPID 7m26s kubelet, nodes-z2-1-kaasprod-k8s-local Node nodes-z2-1-kaasprod-k8s-local status is now: NodeHasSufficientPID
Normal NodeAllocatableEnforced 7m26s kubelet, nodes-z2-1-kaasprod-k8s-local Updated Node Allocatable limit across pods
Nous voyons cela au hasard dans tous nos clusters.
Ce à quoi vous vous attendiez: je m'attends à ce que l'ensemble de démons soit fourni à tous les nœuds.
Comment le reproduire (le moins et le plus précisément possible) : Aucune idée vraiment, installez 1.18.x kubernetes et déployez l'ensemble de démons et après cela, attendez des jours (?)
Y a-t-il autre chose que nous devons savoir? : Lorsque cela se produit, nous ne pouvons pas non plus fournir d'autres démonsets à ce nœud. Comme vous pouvez le voir, la journalisation fluent-bit est également manquante. Je ne vois aucune erreur dans les journaux de kubelet de ce nœud et comme dit, le redémarrage n'aide pas.
% kubectl get ds --all-namespaces
NAMESPACE NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
falco falco-daemonset 13 13 12 13 12 <none> 337d
kube-system audit-webhook-deployment 3 3 3 3 3 node-role.kubernetes.io/master= 174d
kube-system calico-node 13 13 13 13 13 kubernetes.io/os=linux 36d
kube-system kops-controller 3 3 3 3 3 node-role.kubernetes.io/master= 193d
kube-system metricbeat 6 6 5 6 5 <none> 35d
kube-system openstack-cloud-provider 3 3 3 3 3 node-role.kubernetes.io/master= 337d
logging fluent-bit 13 13 12 13 12 <none> 337d
monitoring node-exporter 13 13 12 13 12 kubernetes.io/os=linux 58d
volume csi-cinder-nodeplugin 6 6 6 6 6 <none> 239d
weave weave-scope-agent 13 13 12 13 12 <none> 193d
weave weavescope-iowait-plugin 6 6 5 6 5 <none> 193d
Comme vous pouvez le voir, la plupart des démonsets manquent un pod
Environnement :
kubectl version
): 1.18.3cat /etc/os-release
): debian busteruname -a
): nœuds Linux-z2-1-kaasprod-k8s-local 4.19.0-8-cloud-amd64 # 1 SMP Debian 4.19.98-1 + deb10u1 (2020-04-27) x86_64 GNU / Linux/ sig planification
Pouvez-vous fournir le yaml complet du nœud, de l'ensemble de démons, d'un exemple de pod et de l'espace de noms contenant comme récupéré à partir du serveur?
nœud:
https://gist.github.com/zetaab/2a7e8d3fe6cb42a617e17abc0fa375f7
démonset:
https://gist.github.com/zetaab/31bb406c8bd622b3017bf4f468d0154f
exemple de pod (en fonctionnement):
https://gist.github.com/zetaab/814871bec6f2879e371f5bbdc6f2e978
exemple de pod (pas de planification):
https://gist.github.com/zetaab/f3488d65486c745af78dbe2e6173fd42
espace de noms:
https://gist.github.com/zetaab/4625b759f4e21b50757c79e5072cd7d9
Les pods DaemonSet planifient avec un sélecteur nodeAffinity qui ne correspond qu'à un seul nœud, donc le message «12 sur 13 ne correspond pas» est attendu.
Je ne vois pas de raison pour laquelle le planificateur ne serait pas satisfait du combo pod / nœud ... il n'y a pas de ports qui pourraient entrer en conflit dans le podspec, le nœud n'est pas imprévisible ou corrompu, et dispose de ressources suffisantes
D'accord, j'ai redémarré les 3 planificateurs (changé le niveau de journalisation à 4 si nous pouvons y voir quelque chose d'intéressant). Cependant, cela a résolu le problème
% kubectl get ds --all-namespaces
NAMESPACE NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
falco falco-daemonset 13 13 13 13 13 <none> 338d
kube-system audit-webhook-deployment 3 3 3 3 3 node-role.kubernetes.io/master= 175d
kube-system calico-node 13 13 13 13 13 kubernetes.io/os=linux 36d
kube-system kops-controller 3 3 3 3 3 node-role.kubernetes.io/master= 194d
kube-system metricbeat 6 6 6 6 6 <none> 36d
kube-system openstack-cloud-provider 3 3 3 3 3 node-role.kubernetes.io/master= 338d
logging fluent-bit 13 13 13 13 13 <none> 338d
monitoring node-exporter 13 13 13 13 13 kubernetes.io/os=linux 59d
volume csi-cinder-nodeplugin 6 6 6 6 6 <none> 239d
weave weave-scope-agent 13 13 13 13 13 <none> 194d
weave weavescope-iowait-plugin 6 6 6 6 6 <none> 194d
maintenant, tous les démonsets sont correctement provisionnés. Bizarre, de toute façon quelque chose ne va pas avec le planificateur
cc @ kubernetes / sig-scheduling-bugs @ ahg-g
Nous voyons le même problème similaire sur v1.18.3, un nœud ne peut pas être planifié pour les pods de daemonset.
le planificateur de redémarrage aide.
[root@tesla-cb0434-csfp1-csfp1-control-03 ~]# kubectl get pod -A|grep Pending
kube-system coredns-vc5ws 0/1 Pending 0 2d16h
kube-system local-volume-provisioner-mwk88 0/1 Pending 0 2d16h
kube-system svcwatcher-ltqb6 0/1 Pending 0 2d16h
ncms bcmt-api-hfzl6 0/1 Pending 0 2d16h
ncms bcmt-yum-repo-589d8bb756-5zbvh 0/1 Pending 0 2d16h
[root@tesla-cb0434-csfp1-csfp1-control-03 ~]# kubectl get ds -A
NAMESPACE NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
kube-system coredns 3 3 2 3 2 is_control=true 2d16h
kube-system danmep-cleaner 0 0 0 0 0 cbcs.nokia.com/danm_node=true 2d16h
kube-system kube-proxy 8 8 8 8 8 <none> 2d16h
kube-system local-volume-provisioner 8 8 7 8 7 <none> 2d16h
kube-system netwatcher 0 0 0 0 0 cbcs.nokia.com/danm_node=true 2d16h
kube-system sriov-device-plugin 0 0 0 0 0 sriov=enabled 2d16h
kube-system svcwatcher 3 3 2 3 2 is_control=true 2d16h
ncms bcmt-api 3 3 0 3 0 is_control=true 2d16h
[root@tesla-cb0434-csfp1-csfp1-control-03 ~]# kubectl get node
NAME STATUS ROLES AGE VERSION
tesla-cb0434-csfp1-csfp1-control-01 Ready <none> 2d16h v1.18.3
tesla-cb0434-csfp1-csfp1-control-02 Ready <none> 2d16h v1.18.3
tesla-cb0434-csfp1-csfp1-control-03 Ready <none> 2d16h v1.18.3
tesla-cb0434-csfp1-csfp1-edge-01 Ready <none> 2d16h v1.18.3
tesla-cb0434-csfp1-csfp1-edge-02 Ready <none> 2d16h v1.18.3
tesla-cb0434-csfp1-csfp1-worker-01 Ready <none> 2d16h v1.18.3
tesla-cb0434-csfp1-csfp1-worker-02 Ready <none> 2d16h v1.18.3
tesla-cb0434-csfp1-csfp1-worker-03 Ready <none> 2d16h v1.18.3
Difficile à déboguer sans savoir reproduire. Avez-vous les journaux du planificateur par hasard pour le pod qui n'a pas pu planifier?
D'accord, j'ai redémarré les 3 planificateurs
Je suppose qu'un seul d'entre eux est nommé default-scheduler
, n'est-ce pas?
changé le niveau de log à 4 si nous pouvons y voir quelque chose d'intéressant
Pouvez-vous partager ce que vous avez remarqué?
réglez loglevel à 9, mais il semble qu'il n'y ait rien de plus intéressant, les journaux ci-dessous sont en boucle.
I0601 01:45:05.039373 1 generic_scheduler.go:290] Preemption will not help schedule pod kube-system/coredns-vc5ws on any node.
I0601 01:45:05.039437 1 factory.go:462] Unable to schedule kube-system/coredns-vc5ws: no fit: 0/8 nodes are available: 7 node(s) didn't match node selector.; waiting
I0601 01:45:05.039494 1 scheduler.go:776] Updating pod condition for kube-system/coredns-vc5ws to (PodScheduled==False, Reason=Unschedulable)
ouais je ne pouvais rien voir de plus que la même ligne
no fit: 0/8 nodes are available: 7 node(s) didn't match node selector.; waiting
la chose étrange est que le message du journal affiche le résultat pour 7 nœuds uniquement, comme le problème signalé dans https://github.com/kubernetes/kubernetes/issues/91340
/ cc @damemi
@ ahg-g cela ressemble au même problème que j'ai signalé ici, il semble que nous ayons soit un plugin de filtre qui ne signale pas toujours son erreur, soit une autre condition qui échoue silencieusement si je devais deviner
Notez que dans mon problème, le redémarrage du planificateur l'a également corrigé (comme mentionné dans ce fil de discussion également https://github.com/kubernetes/kubernetes/issues/91601#issuecomment-636360092)
Le mien concernait également un ensemble de démons, donc je pense que c'est un doublon. Si tel est le cas, nous pouvons fermer cela et poursuivre la discussion sur https://github.com/kubernetes/kubernetes/issues/91340
Quoi qu'il en soit, le planificateur a besoin d'une option de journalisation plus détaillée, il est impossible de déboguer ces problèmes s'il n'y a pas de journaux sur ce qu'il fait
@zetaab +1, le planificateur pourrait utiliser des améliorations significatives de ses capacités de journalisation actuelles. C'est une mise à jour que je voulais aborder depuis un moment et j'ai enfin ouvert un problème ici: https://github.com/kubernetes/kubernetes/issues/91633
/attribuer
Je regarde ça. Quelques questions pour m'aider à préciser le cas. Je n'ai pas encore pu me reproduire.
les nœuds ont été créés avant l'ensemble de démons.
supposons que nous ayons utilisé le profil par défaut, de quel profil parlez-vous et comment le vérifier?
pas de prolongateurs.
command:
- /usr/local/bin/kube-scheduler
- --address=127.0.0.1
- --kubeconfig=/etc/kubernetes/kube-scheduler.kubeconfig
- --profiling=false
- --v=1
Une autre chose qui peut avoir un impact est que les performances du disque ne sont pas très bonnes pour etcd, etcd se plaint de la lenteur des opérations.
Oui, ces indicateurs feraient fonctionner le planificateur avec le profil par défaut. Je vais continuer à chercher. Je ne pouvais toujours pas me reproduire.
Toujours rien ... Y a-t-il autre chose que vous utilisez et qui, selon vous, pourrait avoir un impact? souillures, ports, autres ressources?
J'ai fait quelques essais à ce sujet. Lorsque le problème est activé, les pods peuvent toujours être planifiés sur le nœud (sans définition ou avec le sélecteur "nodeName").
Si vous essayez d'utiliser Affinity / Antiaffinity, les pods ne sont pas programmés sur le nœud.
Travailler lorsque le problème est sur:
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
labels:
run: nginx
name: nginx
spec:
nodeName: master-zone-3-1-1-test-cluster-k8s-local
containers:
- image: nginx
name: nginx
resources: {}
dnsPolicy: ClusterFirst
restartPolicy: Always
Ne fonctionne pas en même temps:
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
labels:
run: nginx
name: nginx
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- master-zone-3-1-1-test-cluster-k8s-local
containers:
- image: nginx
name: nginx
resources: {}
dnsPolicy: ClusterFirst
restartPolicy: Always
De plus, une fois vérifiés, ceux-ci étaient même assez intéressants:
Warning FailedScheduling 4m37s (x17 over 26m) default-scheduler 0/9 nodes are available: 8 node(s) didn't match node selector.
Warning FailedScheduling 97s (x6 over 3m39s) default-scheduler 0/8 nodes are available: 8 node(s) didn't match node selector.
Warning FailedScheduling 53s default-scheduler 0/8 nodes are available: 8 node(s) didn't match node selector.
Warning FailedScheduling 7s (x5 over 32s) default-scheduler 0/9 nodes are available: 1 node(s) had taint {node-role.kubernetes.io/master: }, that the pod didn't tolerate, 7 node(s) didn't match node selector.
"nodeName" n'est pas un sélecteur. L'utilisation de nodeName contournerait la planification.
Le quatrième est venu lorsque le nœud est remonté. Le nœud qui avait un problème était maître, donc le nœud n'y allait pas (mais cela montre que le nœud n'a pas été trouvé lors de 3 événements précédents). Ce qui est intéressant avec le quatrième événement, c'est qu'il manque encore des informations d'un nœud. L'événement indique qu'il y a 0/9 nœuds disponibles, mais la description n'est donnée qu'à partir de 8.
Vous dites que la raison pour laquelle le pod n'aurait pas dû être planifié dans le nœud manquant est qu'il s'agissait d'un maître?
Nous voyons 8 node(s) didn't match node selector
aller à 7. Je suppose qu'aucun nœud n'a été supprimé à ce stade, n'est-ce pas?
"nodeName" n'est pas un sélecteur. L'utilisation de nodeName contournerait la planification.
"NodeName" essayez de mettre en évidence, ce nœud est utilisable et le pod y arrive si vous le souhaitez. Ce n'est donc pas l'incapacité du nœud à démarrer des pods.
Le quatrième est venu lorsque le nœud est remonté. Le nœud qui avait un problème était maître, donc le nœud n'y allait pas (mais cela montre que le nœud n'a pas été trouvé lors de 3 événements précédents). Ce qui est intéressant avec le quatrième événement, c'est qu'il manque encore des informations d'un nœud. L'événement indique qu'il y a 0/9 nœuds disponibles, mais la description n'est donnée qu'à partir de 8.
Vous dites que la raison pour laquelle le pod n'aurait pas dû être planifié dans le nœud manquant est qu'il s'agissait d'un maître?
Nous voyons
8 node(s) didn't match node selector
aller à 7. Je suppose qu'aucun nœud n'a été supprimé à ce stade, n'est-ce pas?
Le cluster de test a 9 nœuds; 3 maîtres et 6 ouvriers. Avant le démarrage réussi du nœud non fonctionnel, les événements ont fourni des informations sur tous les nœuds disponibles: 0/8 nodes are available: 8 node(s) didn't match node selector.
. Mais quand ce nœud qui correspondrait au sélecteur de nœud est apparu, l'événement a dit à 0/9 nodes are available: 1 node(s) had taint {node-role.kubernetes.io/master: }, that the pod didn't tolerate, 7 node(s) didn't match node selector.
explication indique qu'il y en a 8 qui ne correspondent pas, mais ne dit rien sur le neuvième (qui a été reconnu lors de l'événement précédent).
Donc, l'état de l'événement:
À la fin, le pod de test n'a pas été démarré sur le nœud correspondant à cause de taches, mais c'est une autre histoire (et aurait dû être le cas déjà au 1er événement).
"NodeName" essayez de mettre en évidence, ce nœud est utilisable et le pod y arrive si vous le souhaitez. Ce n'est donc pas l'incapacité du nœud à démarrer des pods.
Notez que rien ne protège contre la sur-validation d'un nœud, mais le planificateur. Donc, cela ne montre pas vraiment grand-chose.
À la fin, le pod de test n'a pas été démarré sur le nœud correspondant à cause de taches, mais c'est une autre histoire (et aurait dû être le cas déjà au 1er événement).
Ma question est la suivante: le 9e nœud a-t-il été contaminé depuis le début? J'essaie de rechercher (1) des étapes reproductibles pour atteindre l'état ou (2) où le bogue pourrait être.
Ma question est la suivante: le 9e nœud a-t-il été contaminé depuis le début? J'essaie de rechercher (1) des étapes reproductibles pour atteindre l'état ou (2) où le bogue pourrait être.
Oui, la souillure était là tout le temps dans ce cas, car le nœud non récepteur était maître. Mais nous avons vu le même problème sur les maîtres et les ouvriers.
Toujours aucune idée d'où vient le problème, juste qu'au moins la recréation du nœud et le redémarrage du nœud semblent résoudre le problème. Mais ce sont des moyens un peu «difficiles» de résoudre les problèmes.
Plan long, mais si vous le rencontrez à nouveau ... pourriez-vous vérifier s'il y a des pods nommés pour le nœud qui n'apparaissent pas?
Je poste des questions en pensant à des scénarios possibles:
* Do you have other master nodes in your cluster?
Tous les clusers ont 3 maîtres (donc le redémarrage de ceux-ci est facile)
* Do you have extenders?
Non.
Une chose intéressante a été remarquée aujourd'hui: j'avais un cluster où un maître ne recevait pas de pod de DaemonSet. Nous avons ChaosMonkey en cours d'utilisation, qui a terminé l'un des nœuds de travail. C'est intéressant, cela a amené le pod à aller chez le maître qui ne le recevait pas plus tôt. Ainsi, la suppression d'un autre nœud que le nœud problématique semblait résoudre le problème à ce stade.
À cause de ce «correctif», je dois attendre que le problème se reproduise pour pouvoir répondre à propos des pods nominés.
Je suis confus maintenant ... Votre daemonset tolère-t-il la corruption des nœuds maîtres? En d'autres termes ... le bogue pour vous est-il juste l'événement de planification ou aussi le fait que les pods auraient dû être planifiés?
Le problème est que ce nœud n'est pas trouvé par le planificateur, même s'il y a au moins un paramètre d'affinité (ou d'antiaffinité) correspondant.
C'est pourquoi j'ai dit que l'erreur de contamination était attendue, et qu'elle aurait dû être déjà présente lors du premier événement (car la contamination ne fait pas partie des critères d'affinité)
Compris. J'essayais de confirmer votre configuration pour m'assurer de ne rien manquer.
Je ne pense pas que le nœud soit "invisible" par le planificateur. Étant donné que nous voyons 0/9 nodes are available
, nous pouvons conclure que le nœud est bien dans le cache. C'est plutôt comme si la raison imprévisible est perdue quelque part, nous ne l'incluons donc pas dans l'événement.
Il est vrai que le nombre total correspond toujours au nombre réel de nœuds. Un texte d'événement plus descriptif n'est pas donné sur tous les nœuds, mais cela peut être un problème distinct comme vous l'avez mentionné.
Êtes-vous capable de consulter les journaux de votre planificateur kube? Quelque chose qui semble pertinent?
Je pense que @zetaab a essayé de chercher cela sans succès. Je peux essayer lorsque le problème se reproduit (ainsi que le pod nommé demandé plus tôt)
Si possible, exécutez également 1.18.5, au cas où nous aurions résolu le problème par inadvertance.
Je suis en mesure de reproduire cela de manière fiable sur mon cluster de test si vous avez besoin de plus de journaux
@dilyevsky Veuillez partager les étapes de la repro. Pouvez-vous identifier d'une manière ou d'une autre quel est le filtre qui échoue?
Il semble que ce ne soit que les métadonnées.nom du nœud pour le pod ds ... bizarre. Voici le pod yaml:
Pod yaml:
apiVersion: v1
kind: Pod
metadata:
annotations:
scheduler.alpha.kubernetes.io/critical-pod: ""
creationTimestamp: "2020-07-09T23:17:53Z"
generateName: cilium-
labels:
controller-revision-hash: 6c94db8bb8
k8s-app: cilium
pod-template-generation: "1"
managedFields:
# managed fields crap
name: cilium-d5n4f
namespace: kube-system
ownerReferences:
- apiVersion: apps/v1
blockOwnerDeletion: true
controller: true
kind: DaemonSet
name: cilium
uid: 0f00e8af-eb19-4985-a940-a02fa84fcbc5
resourceVersion: "2840"
selfLink: /api/v1/namespaces/kube-system/pods/cilium-d5n4f
uid: e3f7d566-ee5b-4557-8d1b-f0964cde2f22
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchFields:
- key: metadata.name
operator: In
values:
- us-central1-dilyevsky-master-qmwnl
containers:
- args:
- --config-dir=/tmp/cilium/config-map
command:
- cilium-agent
env:
- name: K8S_NODE_NAME
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: spec.nodeName
- name: CILIUM_K8S_NAMESPACE
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: metadata.namespace
- name: CILIUM_FLANNEL_MASTER_DEVICE
valueFrom:
configMapKeyRef:
key: flannel-master-device
name: cilium-config
optional: true
- name: CILIUM_FLANNEL_UNINSTALL_ON_EXIT
valueFrom:
configMapKeyRef:
key: flannel-uninstall-on-exit
name: cilium-config
optional: true
- name: CILIUM_CLUSTERMESH_CONFIG
value: /var/lib/cilium/clustermesh/
- name: CILIUM_CNI_CHAINING_MODE
valueFrom:
configMapKeyRef:
key: cni-chaining-mode
name: cilium-config
optional: true
- name: CILIUM_CUSTOM_CNI_CONF
valueFrom:
configMapKeyRef:
key: custom-cni-conf
name: cilium-config
optional: true
image: docker.io/cilium/cilium:v1.7.6
imagePullPolicy: IfNotPresent
lifecycle:
postStart:
exec:
command:
- /cni-install.sh
- --enable-debug=false
preStop:
exec:
command:
- /cni-uninstall.sh
livenessProbe:
exec:
command:
- cilium
- status
- --brief
failureThreshold: 10
initialDelaySeconds: 120
periodSeconds: 30
successThreshold: 1
timeoutSeconds: 5
name: cilium-agent
readinessProbe:
exec:
command:
- cilium
- status
- --brief
failureThreshold: 3
initialDelaySeconds: 5
periodSeconds: 30
successThreshold: 1
timeoutSeconds: 5
resources: {}
securityContext:
capabilities:
add:
- NET_ADMIN
- SYS_MODULE
privileged: true
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
volumeMounts:
- mountPath: /var/run/cilium
name: cilium-run
- mountPath: /host/opt/cni/bin
name: cni-path
- mountPath: /host/etc/cni/net.d
name: etc-cni-netd
- mountPath: /var/lib/cilium/clustermesh
name: clustermesh-secrets
readOnly: true
- mountPath: /tmp/cilium/config-map
name: cilium-config-path
readOnly: true
- mountPath: /lib/modules
name: lib-modules
readOnly: true
- mountPath: /run/xtables.lock
name: xtables-lock
- mountPath: /var/run/secrets/kubernetes.io/serviceaccount
name: cilium-token-j74lr
readOnly: true
dnsPolicy: ClusterFirst
enableServiceLinks: true
hostNetwork: true
initContainers:
- command:
- /init-container.sh
env:
- name: CILIUM_ALL_STATE
valueFrom:
configMapKeyRef:
key: clean-cilium-state
name: cilium-config
optional: true
- name: CILIUM_BPF_STATE
valueFrom:
configMapKeyRef:
key: clean-cilium-bpf-state
name: cilium-config
optional: true
- name: CILIUM_WAIT_BPF_MOUNT
valueFrom:
configMapKeyRef:
key: wait-bpf-mount
name: cilium-config
optional: true
image: docker.io/cilium/cilium:v1.7.6
imagePullPolicy: IfNotPresent
name: clean-cilium-state
resources: {}
securityContext:
capabilities:
add:
- NET_ADMIN
privileged: true
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
volumeMounts:
- mountPath: /var/run/cilium
name: cilium-run
- mountPath: /var/run/secrets/kubernetes.io/serviceaccount
name: cilium-token-j74lr
readOnly: true
priority: 2000001000
priorityClassName: system-node-critical
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
serviceAccount: cilium
serviceAccountName: cilium
terminationGracePeriodSeconds: 1
tolerations:
- operator: Exists
- effect: NoExecute
key: node.kubernetes.io/not-ready
operator: Exists
- effect: NoExecute
key: node.kubernetes.io/unreachable
operator: Exists
- effect: NoSchedule
key: node.kubernetes.io/disk-pressure
operator: Exists
- effect: NoSchedule
key: node.kubernetes.io/memory-pressure
operator: Exists
- effect: NoSchedule
key: node.kubernetes.io/pid-pressure
operator: Exists
- effect: NoSchedule
key: node.kubernetes.io/unschedulable
operator: Exists
- effect: NoSchedule
key: node.kubernetes.io/network-unavailable
operator: Exists
volumes:
- hostPath:
path: /var/run/cilium
type: DirectoryOrCreate
name: cilium-run
- hostPath:
path: /opt/cni/bin
type: DirectoryOrCreate
name: cni-path
- hostPath:
path: /etc/cni/net.d
type: DirectoryOrCreate
name: etc-cni-netd
- hostPath:
path: /lib/modules
type: ""
name: lib-modules
- hostPath:
path: /run/xtables.lock
type: FileOrCreate
name: xtables-lock
- name: clustermesh-secrets
secret:
defaultMode: 420
optional: true
secretName: cilium-clustermesh
- configMap:
defaultMode: 420
name: cilium-config
name: cilium-config-path
- name: cilium-token-j74lr
secret:
defaultMode: 420
secretName: cilium-token-j74lr
status:
conditions:
- lastProbeTime: null
lastTransitionTime: "2020-07-09T23:17:53Z"
message: '0/6 nodes are available: 5 node(s) didn''t match node selector.'
reason: Unschedulable
status: "False"
type: PodScheduled
phase: Pending
qosClass: BestEffort
La façon dont je reproduis cela est de créer un nouveau cluster avec 3 maîtres et 3 nœuds de travail (à l'aide de l'API de cluster) et d'appliquer Cilium 1.7.6:
Yaml de cil:
---
# Source: cilium/charts/agent/templates/serviceaccount.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: cilium
namespace: kube-system
---
# Source: cilium/charts/operator/templates/serviceaccount.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: cilium-operator
namespace: kube-system
---
# Source: cilium/charts/config/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: cilium-config
namespace: kube-system
data:
# Identity allocation mode selects how identities are shared between cilium
# nodes by setting how they are stored. The options are "crd" or "kvstore".
# - "crd" stores identities in kubernetes as CRDs (custom resource definition).
# These can be queried with:
# kubectl get ciliumid
# - "kvstore" stores identities in a kvstore, etcd or consul, that is
# configured below. Cilium versions before 1.6 supported only the kvstore
# backend. Upgrades from these older cilium versions should continue using
# the kvstore by commenting out the identity-allocation-mode below, or
# setting it to "kvstore".
identity-allocation-mode: crd
# If you want to run cilium in debug mode change this value to true
debug: "false"
# Enable IPv4 addressing. If enabled, all endpoints are allocated an IPv4
# address.
enable-ipv4: "true"
# Enable IPv6 addressing. If enabled, all endpoints are allocated an IPv6
# address.
enable-ipv6: "false"
# If you want cilium monitor to aggregate tracing for packets, set this level
# to "low", "medium", or "maximum". The higher the level, the less packets
# that will be seen in monitor output.
monitor-aggregation: medium
# The monitor aggregation interval governs the typical time between monitor
# notification events for each allowed connection.
#
# Only effective when monitor aggregation is set to "medium" or higher.
monitor-aggregation-interval: 5s
# The monitor aggregation flags determine which TCP flags which, upon the
# first observation, cause monitor notifications to be generated.
#
# Only effective when monitor aggregation is set to "medium" or higher.
monitor-aggregation-flags: all
# ct-global-max-entries-* specifies the maximum number of connections
# supported across all endpoints, split by protocol: tcp or other. One pair
# of maps uses these values for IPv4 connections, and another pair of maps
# use these values for IPv6 connections.
#
# If these values are modified, then during the next Cilium startup the
# tracking of ongoing connections may be disrupted. This may lead to brief
# policy drops or a change in loadbalancing decisions for a connection.
#
# For users upgrading from Cilium 1.2 or earlier, to minimize disruption
# during the upgrade process, comment out these options.
bpf-ct-global-tcp-max: "524288"
bpf-ct-global-any-max: "262144"
# bpf-policy-map-max specified the maximum number of entries in endpoint
# policy map (per endpoint)
bpf-policy-map-max: "16384"
# Pre-allocation of map entries allows per-packet latency to be reduced, at
# the expense of up-front memory allocation for the entries in the maps. The
# default value below will minimize memory usage in the default installation;
# users who are sensitive to latency may consider setting this to "true".
#
# This option was introduced in Cilium 1.4. Cilium 1.3 and earlier ignore
# this option and behave as though it is set to "true".
#
# If this value is modified, then during the next Cilium startup the restore
# of existing endpoints and tracking of ongoing connections may be disrupted.
# This may lead to policy drops or a change in loadbalancing decisions for a
# connection for some time. Endpoints may need to be recreated to restore
# connectivity.
#
# If this option is set to "false" during an upgrade from 1.3 or earlier to
# 1.4 or later, then it may cause one-time disruptions during the upgrade.
preallocate-bpf-maps: "false"
# Regular expression matching compatible Istio sidecar istio-proxy
# container image names
sidecar-istio-proxy-image: "cilium/istio_proxy"
# Encapsulation mode for communication between nodes
# Possible values:
# - disabled
# - vxlan (default)
# - geneve
tunnel: vxlan
# Name of the cluster. Only relevant when building a mesh of clusters.
cluster-name: default
# DNS Polling periodically issues a DNS lookup for each `matchName` from
# cilium-agent. The result is used to regenerate endpoint policy.
# DNS lookups are repeated with an interval of 5 seconds, and are made for
# A(IPv4) and AAAA(IPv6) addresses. Should a lookup fail, the most recent IP
# data is used instead. An IP change will trigger a regeneration of the Cilium
# policy for each endpoint and increment the per cilium-agent policy
# repository revision.
#
# This option is disabled by default starting from version 1.4.x in favor
# of a more powerful DNS proxy-based implementation, see [0] for details.
# Enable this option if you want to use FQDN policies but do not want to use
# the DNS proxy.
#
# To ease upgrade, users may opt to set this option to "true".
# Otherwise please refer to the Upgrade Guide [1] which explains how to
# prepare policy rules for upgrade.
#
# [0] http://docs.cilium.io/en/stable/policy/language/#dns-based
# [1] http://docs.cilium.io/en/stable/install/upgrade/#changes-that-may-require-action
tofqdns-enable-poller: "false"
# wait-bpf-mount makes init container wait until bpf filesystem is mounted
wait-bpf-mount: "false"
masquerade: "true"
enable-xt-socket-fallback: "true"
install-iptables-rules: "true"
auto-direct-node-routes: "false"
kube-proxy-replacement: "probe"
enable-host-reachable-services: "false"
enable-external-ips: "false"
enable-node-port: "false"
node-port-bind-protection: "true"
enable-auto-protect-node-port-range: "true"
enable-endpoint-health-checking: "true"
enable-well-known-identities: "false"
enable-remote-node-identity: "true"
---
# Source: cilium/charts/agent/templates/clusterrole.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: cilium
rules:
- apiGroups:
- networking.k8s.io
resources:
- networkpolicies
verbs:
- get
- list
- watch
- apiGroups:
- discovery.k8s.io
resources:
- endpointslices
verbs:
- get
- list
- watch
- apiGroups:
- ""
resources:
- namespaces
- services
- nodes
- endpoints
verbs:
- get
- list
- watch
- apiGroups:
- ""
resources:
- pods
- nodes
verbs:
- get
- list
- watch
- update
- apiGroups:
- ""
resources:
- nodes
- nodes/status
verbs:
- patch
- apiGroups:
- apiextensions.k8s.io
resources:
- customresourcedefinitions
verbs:
- create
- get
- list
- watch
- update
- apiGroups:
- cilium.io
resources:
- ciliumnetworkpolicies
- ciliumnetworkpolicies/status
- ciliumclusterwidenetworkpolicies
- ciliumclusterwidenetworkpolicies/status
- ciliumendpoints
- ciliumendpoints/status
- ciliumnodes
- ciliumnodes/status
- ciliumidentities
- ciliumidentities/status
verbs:
- '*'
---
# Source: cilium/charts/operator/templates/clusterrole.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: cilium-operator
rules:
- apiGroups:
- ""
resources:
# to automatically delete [core|kube]dns pods so that are starting to being
# managed by Cilium
- pods
verbs:
- get
- list
- watch
- delete
- apiGroups:
- discovery.k8s.io
resources:
- endpointslices
verbs:
- get
- list
- watch
- apiGroups:
- ""
resources:
# to automatically read from k8s and import the node's pod CIDR to cilium's
# etcd so all nodes know how to reach another pod running in in a different
# node.
- nodes
# to perform the translation of a CNP that contains `ToGroup` to its endpoints
- services
- endpoints
# to check apiserver connectivity
- namespaces
verbs:
- get
- list
- watch
- apiGroups:
- cilium.io
resources:
- ciliumnetworkpolicies
- ciliumnetworkpolicies/status
- ciliumclusterwidenetworkpolicies
- ciliumclusterwidenetworkpolicies/status
- ciliumendpoints
- ciliumendpoints/status
- ciliumnodes
- ciliumnodes/status
- ciliumidentities
- ciliumidentities/status
verbs:
- '*'
---
# Source: cilium/charts/agent/templates/clusterrolebinding.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: cilium
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cilium
subjects:
- kind: ServiceAccount
name: cilium
namespace: kube-system
---
# Source: cilium/charts/operator/templates/clusterrolebinding.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: cilium-operator
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cilium-operator
subjects:
- kind: ServiceAccount
name: cilium-operator
namespace: kube-system
---
# Source: cilium/charts/agent/templates/daemonset.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
labels:
k8s-app: cilium
name: cilium
namespace: kube-system
spec:
selector:
matchLabels:
k8s-app: cilium
template:
metadata:
annotations:
# This annotation plus the CriticalAddonsOnly toleration makes
# cilium to be a critical pod in the cluster, which ensures cilium
# gets priority scheduling.
# https://kubernetes.io/docs/tasks/administer-cluster/guaranteed-scheduling-critical-addon-pods/
scheduler.alpha.kubernetes.io/critical-pod: ""
labels:
k8s-app: cilium
spec:
containers:
- args:
- --config-dir=/tmp/cilium/config-map
command:
- cilium-agent
livenessProbe:
exec:
command:
- cilium
- status
- --brief
failureThreshold: 10
# The initial delay for the liveness probe is intentionally large to
# avoid an endless kill & restart cycle if in the event that the initial
# bootstrapping takes longer than expected.
initialDelaySeconds: 120
periodSeconds: 30
successThreshold: 1
timeoutSeconds: 5
readinessProbe:
exec:
command:
- cilium
- status
- --brief
failureThreshold: 3
initialDelaySeconds: 5
periodSeconds: 30
successThreshold: 1
timeoutSeconds: 5
env:
- name: K8S_NODE_NAME
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: spec.nodeName
- name: CILIUM_K8S_NAMESPACE
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: metadata.namespace
- name: CILIUM_FLANNEL_MASTER_DEVICE
valueFrom:
configMapKeyRef:
key: flannel-master-device
name: cilium-config
optional: true
- name: CILIUM_FLANNEL_UNINSTALL_ON_EXIT
valueFrom:
configMapKeyRef:
key: flannel-uninstall-on-exit
name: cilium-config
optional: true
- name: CILIUM_CLUSTERMESH_CONFIG
value: /var/lib/cilium/clustermesh/
- name: CILIUM_CNI_CHAINING_MODE
valueFrom:
configMapKeyRef:
key: cni-chaining-mode
name: cilium-config
optional: true
- name: CILIUM_CUSTOM_CNI_CONF
valueFrom:
configMapKeyRef:
key: custom-cni-conf
name: cilium-config
optional: true
image: "docker.io/cilium/cilium:v1.7.6"
imagePullPolicy: IfNotPresent
lifecycle:
postStart:
exec:
command:
- "/cni-install.sh"
- "--enable-debug=false"
preStop:
exec:
command:
- /cni-uninstall.sh
name: cilium-agent
securityContext:
capabilities:
add:
- NET_ADMIN
- SYS_MODULE
privileged: true
volumeMounts:
- mountPath: /var/run/cilium
name: cilium-run
- mountPath: /host/opt/cni/bin
name: cni-path
- mountPath: /host/etc/cni/net.d
name: etc-cni-netd
- mountPath: /var/lib/cilium/clustermesh
name: clustermesh-secrets
readOnly: true
- mountPath: /tmp/cilium/config-map
name: cilium-config-path
readOnly: true
# Needed to be able to load kernel modules
- mountPath: /lib/modules
name: lib-modules
readOnly: true
- mountPath: /run/xtables.lock
name: xtables-lock
hostNetwork: true
initContainers:
- command:
- /init-container.sh
env:
- name: CILIUM_ALL_STATE
valueFrom:
configMapKeyRef:
key: clean-cilium-state
name: cilium-config
optional: true
- name: CILIUM_BPF_STATE
valueFrom:
configMapKeyRef:
key: clean-cilium-bpf-state
name: cilium-config
optional: true
- name: CILIUM_WAIT_BPF_MOUNT
valueFrom:
configMapKeyRef:
key: wait-bpf-mount
name: cilium-config
optional: true
image: "docker.io/cilium/cilium:v1.7.6"
imagePullPolicy: IfNotPresent
name: clean-cilium-state
securityContext:
capabilities:
add:
- NET_ADMIN
privileged: true
volumeMounts:
- mountPath: /var/run/cilium
name: cilium-run
restartPolicy: Always
priorityClassName: system-node-critical
serviceAccount: cilium
serviceAccountName: cilium
terminationGracePeriodSeconds: 1
tolerations:
- operator: Exists
volumes:
# To keep state between restarts / upgrades
- hostPath:
path: /var/run/cilium
type: DirectoryOrCreate
name: cilium-run
# To install cilium cni plugin in the host
- hostPath:
path: /opt/cni/bin
type: DirectoryOrCreate
name: cni-path
# To install cilium cni configuration in the host
- hostPath:
path: /etc/cni/net.d
type: DirectoryOrCreate
name: etc-cni-netd
# To be able to load kernel modules
- hostPath:
path: /lib/modules
name: lib-modules
# To access iptables concurrently with other processes (e.g. kube-proxy)
- hostPath:
path: /run/xtables.lock
type: FileOrCreate
name: xtables-lock
# To read the clustermesh configuration
- name: clustermesh-secrets
secret:
defaultMode: 420
optional: true
secretName: cilium-clustermesh
# To read the configuration from the config map
- configMap:
name: cilium-config
name: cilium-config-path
updateStrategy:
rollingUpdate:
maxUnavailable: 2
type: RollingUpdate
---
# Source: cilium/charts/operator/templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
io.cilium/app: operator
name: cilium-operator
name: cilium-operator
namespace: kube-system
spec:
replicas: 1
selector:
matchLabels:
io.cilium/app: operator
name: cilium-operator
strategy:
rollingUpdate:
maxSurge: 1
maxUnavailable: 1
type: RollingUpdate
template:
metadata:
annotations:
labels:
io.cilium/app: operator
name: cilium-operator
spec:
containers:
- args:
- --debug=$(CILIUM_DEBUG)
- --identity-allocation-mode=$(CILIUM_IDENTITY_ALLOCATION_MODE)
- --synchronize-k8s-nodes=true
command:
- cilium-operator
env:
- name: CILIUM_K8S_NAMESPACE
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: metadata.namespace
- name: K8S_NODE_NAME
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: spec.nodeName
- name: CILIUM_DEBUG
valueFrom:
configMapKeyRef:
key: debug
name: cilium-config
optional: true
- name: CILIUM_CLUSTER_NAME
valueFrom:
configMapKeyRef:
key: cluster-name
name: cilium-config
optional: true
- name: CILIUM_CLUSTER_ID
valueFrom:
configMapKeyRef:
key: cluster-id
name: cilium-config
optional: true
- name: CILIUM_IPAM
valueFrom:
configMapKeyRef:
key: ipam
name: cilium-config
optional: true
- name: CILIUM_DISABLE_ENDPOINT_CRD
valueFrom:
configMapKeyRef:
key: disable-endpoint-crd
name: cilium-config
optional: true
- name: CILIUM_KVSTORE
valueFrom:
configMapKeyRef:
key: kvstore
name: cilium-config
optional: true
- name: CILIUM_KVSTORE_OPT
valueFrom:
configMapKeyRef:
key: kvstore-opt
name: cilium-config
optional: true
- name: AWS_ACCESS_KEY_ID
valueFrom:
secretKeyRef:
key: AWS_ACCESS_KEY_ID
name: cilium-aws
optional: true
- name: AWS_SECRET_ACCESS_KEY
valueFrom:
secretKeyRef:
key: AWS_SECRET_ACCESS_KEY
name: cilium-aws
optional: true
- name: AWS_DEFAULT_REGION
valueFrom:
secretKeyRef:
key: AWS_DEFAULT_REGION
name: cilium-aws
optional: true
- name: CILIUM_IDENTITY_ALLOCATION_MODE
valueFrom:
configMapKeyRef:
key: identity-allocation-mode
name: cilium-config
optional: true
image: "docker.io/cilium/operator:v1.7.6"
imagePullPolicy: IfNotPresent
name: cilium-operator
livenessProbe:
httpGet:
host: '127.0.0.1'
path: /healthz
port: 9234
scheme: HTTP
initialDelaySeconds: 60
periodSeconds: 10
timeoutSeconds: 3
hostNetwork: true
restartPolicy: Always
serviceAccount: cilium-operator
serviceAccountName: cilium-operator
Voici le journal du planificateur:
I0709 23:08:22.055830 1 registry.go:150] Registering EvenPodsSpread predicate and priority function
I0709 23:08:22.056081 1 registry.go:150] Registering EvenPodsSpread predicate and priority function
I0709 23:08:23.137451 1 serving.go:313] Generated self-signed cert in-memory
W0709 23:08:33.843509 1 authentication.go:297] Error looking up in-cluster authentication configuration: etcdserver: request timed out
W0709 23:08:33.843671 1 authentication.go:298] Continuing without authentication configuration. This may treat all requests as anonymous.
W0709 23:08:33.843710 1 authentication.go:299] To require authentication configuration lookup to succeed, set --authentication-tolerate-lookup-failure=false
I0709 23:08:33.911805 1 registry.go:150] Registering EvenPodsSpread predicate and priority function
I0709 23:08:33.911989 1 registry.go:150] Registering EvenPodsSpread predicate and priority function
W0709 23:08:33.917999 1 authorization.go:47] Authorization is disabled
W0709 23:08:33.918162 1 authentication.go:40] Authentication is disabled
I0709 23:08:33.918238 1 deprecated_insecure_serving.go:51] Serving healthz insecurely on [::]:10251
I0709 23:08:33.925860 1 configmap_cafile_content.go:202] Starting client-ca::kube-system::extension-apiserver-authentication::client-ca-file
I0709 23:08:33.926013 1 shared_informer.go:223] Waiting for caches to sync for client-ca::kube-system::extension-apiserver-authentication::client-ca-file
I0709 23:08:33.930685 1 secure_serving.go:178] Serving securely on 127.0.0.1:10259
I0709 23:08:33.936198 1 tlsconfig.go:240] Starting DynamicServingCertificateController
I0709 23:08:34.026382 1 shared_informer.go:230] Caches are synced for client-ca::kube-system::extension-apiserver-authentication::client-ca-file
I0709 23:08:34.036998 1 leaderelection.go:242] attempting to acquire leader lease kube-system/kube-scheduler...
I0709 23:08:50.597201 1 leaderelection.go:252] successfully acquired lease kube-system/kube-scheduler
E0709 23:08:50.658551 1 factory.go:503] pod: kube-system/coredns-66bff467f8-9rjvd is already present in the active queue
E0709 23:12:27.673854 1 factory.go:503] pod kube-system/cilium-vv466 is already present in the backoff queue
E0709 23:12:58.099432 1 leaderelection.go:320] error retrieving resource lock kube-system/kube-scheduler: etcdserver: leader changed
Après avoir redémarré les pods du planificateur, le pod en attente est immédiatement planifié.
Quels événements de pod obtenez-vous? Savez-vous s'il y a des taches dans le nœud
où il n'est pas programmé? Cela échoue-t-il uniquement pour les nœuds maîtres ou
nœuds? Y a-t-il suffisamment d'espace dans le nœud?
Le jeu.9 juillet 2020, 19h49, dilyevsky, [email protected]
a écrit:
Il semble que ce ne soit que les métadonnées.nom du nœud du pod ds ...
bizarre. Voici le pod yaml:apiVersion: v1kind: Podmetadata:
annotations:
scheduler.alpha.kubernetes.io/critical-pod: ""
creationTimestamp: "2020-07-09T23: 17: 53Z"
generateName: cilium-
Étiquettes:
contrôleur-révision-hachage: 6c94db8bb8
k8s-app: cilium
pod-template-generation: "1"
managedFields:
# champs gérés merde
nom: cilium-d5n4f
espace de noms: kube-system
propriétaireRéférences:
- apiVersion: apps / v1
blockOwnerDeletion: vrai
contrôleur: vrai
genre: DaemonSet
nom: cilium
uid: 0f00e8af-eb19-4985-a940-a02fa84fcbc5
resourceVersion: "2840"
selfLink: / api / v1 / namespaces / kube-system / pods / cilium-d5n4f
uid: e3f7d566-ee5b-4557-8d1b-f0964cde2f22spec:
affinité:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchFields:
- clé: metadata.name
opérateur: In
valeurs:
- us-central1-dilyevsky-master-qmwnl
conteneurs:- args:
- --config-dir = / tmp / cilium / config-map
commander:- agent au cil
env:- nom: K8S_NODE_NAME
valeurDe:
fieldRef:
apiVersion: v1
fieldPath: spec.nodeName- nom: CILIUM_K8S_NAMESPACE
valeurDe:
fieldRef:
apiVersion: v1
fieldPath: metadata.namespace- nom: CILIUM_FLANNEL_MASTER_DEVICE
valeurDe:
configMapKeyRef:
clé: flannel-master-device
nom: cilium-config
facultatif: vrai- nom: CILIUM_FLANNEL_UNINSTALL_ON_EXIT
valeurDe:
configMapKeyRef:
clé: flanelle-désinstallation-en-sortie
nom: cilium-config
facultatif: vrai- nom: CILIUM_CLUSTERMESH_CONFIG
valeur: / var / lib / cilium / clustermesh /- nom: CILIUM_CNI_CHAINING_MODE
valeurDe:
configMapKeyRef:
clé: cni-chaining-mode
nom: cilium-config
facultatif: vrai- nom: CILIUM_CUSTOM_CNI_CONF
valeurDe:
configMapKeyRef:
clé: custom-cni-conf
nom: cilium-config
facultatif: vrai
image: docker.io/cilium/ cilium: v1.7.6
imagePullPolicy: IfNotPresent
cycle de la vie:
postStart:
exec:
commander:
- /cni-install.sh
- --enable-debug = false
preStop:
exec:
commander:- /cni-uninstall.sh
la vivacité
exec:
commander:
- cil
- statut
- --bref
échec Seuil: 10
initialDelaySeconds: 120
periodSecondes: 30
succès Seuil: 1
timeoutSecondes: 5
nom: cilium-agent
préparation
exec:
commander:- cil
- statut
- --bref
échec Seuil: 3
initialDelaySeconds: 5
periodSecondes: 30
succès Seuil: 1
timeoutSecondes: 5
Ressources: {}
securityContext:
capacités:
ajouter:- NET_ADMIN
- SYS_MODULE
privilégié: vrai
terminaisonMessagePath: / dev / terminaison-log
terminaisonMessagePolicy: Fichier
volumeMounts:- mountPath: / var / run / cilium
nom: cilium-run- mountPath: / hôte / opt / cni / bin
nom: cni-path- mountPath: /host/etc/cni/net.d
nom: etc-cni-netd- mountPath: / var / lib / cilium / clustermesh
nom: clustermesh-secrets
readOnly: vrai- mountPath: / tmp / cilium / config-map
nom: chemin-de-configuration-cilium
readOnly: vrai- mountPath: / lib / modules
nom: lib-modules
readOnly: vrai- mountPath: /run/xtables.lock
nom: xtables-lock- mountPath: /var/run/secrets/kubernetes.io/serviceaccount
nom: cilium-token-j74lr
readOnly: vrai
dnsPolicy: ClusterFirst
enableServiceLinks: true
hostNetwork: vrai
initContainers:- commander:
- /init-container.sh
env:- nom: CILIUM_ALL_STATE
valeurDe:
configMapKeyRef:
clé: clean-cilium-state
nom: cilium-config
facultatif: vrai- nom: CILIUM_BPF_STATE
valeurDe:
configMapKeyRef:
clé: clean-cilium-bpf-state
nom: cilium-config
facultatif: vrai- nom: CILIUM_WAIT_BPF_MOUNT
valeurDe:
configMapKeyRef:
clé: wait-bpf-mount
nom: cilium-config
facultatif: vrai
image: docker.io/cilium/ cilium: v1.7.6
imagePullPolicy: IfNotPresent
nom: clean-cilium-state
Ressources: {}
securityContext:
capacités:
ajouter:
- NET_ADMIN
privilégié: vrai
terminaisonMessagePath: / dev / terminaison-log
terminaisonMessagePolicy: Fichier
volumeMounts:- mountPath: / var / run / cilium
nom: cilium-run- mountPath: /var/run/secrets/kubernetes.io/serviceaccount
nom: cilium-token-j74lr
readOnly: vrai
priorité: 2000001000
priorityClassName: système critique pour le nœud
restartPolicy: toujours
schedulerName: programmateur par défaut
securityContext: {}
serviceAccount: cilium
serviceAccountName: cilium
terminaisonGracePeriodSecondes: 1
tolérances:- opérateur: existe
- effet: NoExecute
clé: node.kubernetes.io/not-ready
opérateur: existe- effet: NoExecute
clé: node.kubernetes.io/unreachable
opérateur: existe- effet: NoSchedule
clé: node.kubernetes.io/disk-pressure
opérateur: existe- effet: NoSchedule
clé: node.kubernetes.io/memory-pressure
opérateur: existe- effet: NoSchedule
clé: node.kubernetes.io/pid-pressure
opérateur: existe- effet: NoSchedule
clé: node.kubernetes.io/unschedulable
opérateur: existe- effet: NoSchedule
clé: node.kubernetes.io/network-unavailable
opérateur: existe
volumes:- hostPath:
chemin: / var / run / cilium
type: DirectoryOrCreate
nom: cilium-run- hostPath:
chemin: / opt / cni / bin
type: DirectoryOrCreate
nom: cni-path- hostPath:
chemin: /etc/cni/net.d
type: DirectoryOrCreate
nom: etc-cni-netd- hostPath:
chemin: / lib / modules
tapez: ""
nom: lib-modules- hostPath:
chemin: /run/xtables.lock
type: FileOrCreate
nom: xtables-lock- nom: clustermesh-secrets
secret:
defaultMode: 420
facultatif: vrai
secretName: cilium-clustermesh- configMap:
defaultMode: 420
nom: cilium-config
nom: chemin-de-configuration-cilium- nom: cilium-token-j74lr
secret:
defaultMode: 420
secretName: cilium-token-j74lrstatus:
conditions:- lastProbeTime: null
lastTransitionTime: "2020-07-09T23: 17: 53Z"
message: '0/6 nœuds sont disponibles: 5 nœuds ne correspondent pas au sélecteur de nœuds.'
raison: non planifiable
statut: "Faux"
type: PodScheduled
phase: en attente
qosClass: BestEffortLa façon dont je reproduis cela est de créer un nouveau cluster avec 2 maîtres et
3 nœuds de travail (utilisant l'API de cluster) et appliquant Cilium 1.7.6:--- # Source: cilium / charts / agent / templates / serviceaccount.yamlapiVersion: v1kind: ServiceAccountmetadata:
nom: cilium
espace de noms: kube-system
--- # Source: cilium / charts / operator / templates / serviceaccount.yamlapiVersion: v1kind: ServiceAccountmetadata:
nom: opérateur-cil
espace de noms: kube-system
--- # Source: cilium / charts / config / templates / configmap.yamlapiVersion: v1kind: ConfigMapmetadata:
nom: cilium-config
espace de noms: kube-systemdata:# Le mode d'allocation d'identité sélectionne la manière dont les identités sont partagées entre cilium
# nœuds en définissant leur mode de stockage. Les options sont "crd" ou "kvstore".
# - "crd" stocke les identités dans kubernetes en tant que CRD (définition de ressource personnalisée).
# Ceux-ci peuvent être interrogés avec:
# kubectl obtenir ciliumid
# - "kvstore" stocke les identités dans un kvstore, etcd ou consul, c'est-à-dire
# configuré ci-dessous. Les versions de Cilium antérieures à 1.6 ne supportaient que le kvstore
# backend. Les mises à niveau de ces anciennes versions de cilium devraient continuer à utiliser
# le kvstore en commentant le mode d'allocation d'identité ci-dessous, ou
# en le définissant sur "kvstore".
mode d'allocation d'identité: crd# Si vous souhaitez exécuter cilium en mode débogage, changez cette valeur en true
debug: "false"# Activez l'adressage IPv4. Si activé, tous les points de terminaison se voient attribuer un IPv4
# adresse.
enable-ipv4: "vrai"# Activez l'adressage IPv6. S'il est activé, tous les points de terminaison reçoivent un IPv6
# adresse.
enable-ipv6: "faux"# Si vous voulez que cilium monitor agrège le traçage des paquets, définissez ce niveau
# à "faible", "moyen" ou "maximum". Plus le niveau est élevé, moins il y a de paquets
# qui sera vu dans la sortie du moniteur.
moniteur-agrégation: moyen# L'intervalle d'agrégation du moniteur régit le temps typique entre le moniteur
# événements de notification pour chaque connexion autorisée.
#
# Efficace uniquement lorsque l'agrégation des moniteurs est définie sur "moyen" ou supérieur.
intervalle d'agrégation de surveillance: 5 s# Les indicateurs d'agrégation de moniteur déterminent les indicateurs TCP qui, lors de la
# première observation, provoque la génération de notifications de surveillance.
#
# Efficace uniquement lorsque l'agrégation des moniteurs est définie sur "moyen" ou supérieur.
indicateurs-d'agrégation de contrôle: tous# ct-global-max-entries- * spécifie le nombre maximum de connexions
# pris en charge sur tous les points de terminaison, répartis par protocole: tcp ou autre. Une paire
Le nombre de cartes utilise ces valeurs pour les connexions IPv4 et une autre paire de cartes
# utilisez ces valeurs pour les connexions IPv6.
#
# Si ces valeurs sont modifiées, lors du prochain démarrage de Cilium, le
# le suivi des connexions en cours peut être interrompu. Cela peut conduire à un bref
# abandon de politique ou modification des décisions d'équilibrage de charge pour une connexion.
#
# Pour les utilisateurs qui mettent à niveau depuis Cilium 1.2 ou version antérieure, afin de minimiser les perturbations
# pendant le processus de mise à niveau, commentez ces options.
bpf-ct-global-tcp-max: "524288"
bpf-ct-global-any-max: "262144"# bpf-policy-map-max a spécifié le nombre maximum d'entrées dans endpoint
# policy map (par point de terminaison)
bpf-policy-map-max: "16384"# La pré-allocation des entrées de carte permet de réduire la latence par paquet, à
# les frais d'allocation mémoire initiale pour les entrées dans les cartes. le
# la valeur par défaut ci-dessous minimisera l'utilisation de la mémoire dans l'installation par défaut;
# les utilisateurs sensibles à la latence peuvent envisager de définir ce paramètre sur "true".
#
# Cette option a été introduite dans Cilium 1.4. Cilium 1.3 et versions antérieures ignorent
# cette option et se comportent comme si elle était définie sur "true".
#
# Si cette valeur est modifiée, lors du prochain démarrage de Cilium, la restauration
Le nombre de points de terminaison existants et le suivi des connexions en cours peuvent être interrompus.
# Cela peut entraîner des baisses de politique ou un changement dans les décisions d'équilibrage de charge pour un
# connexion depuis un certain temps. Les points de terminaison doivent peut-être être recréés pour restaurer
# connectivité.
#
# Si cette option est définie sur "false" lors d'une mise à niveau de la version 1.3 ou antérieure vers
# 1.4 ou version ultérieure, cela peut provoquer des perturbations ponctuelles pendant la mise à niveau.
préallouer-bpf-maps: "false"# Expression régulière correspondant au sidecar Istio compatible istio-proxy
# noms d'image de conteneur
sidecar-istio-proxy-image: "cilium / istio_proxy"# Mode d'encapsulation pour la communication entre nœuds
# Valeurs possibles:
# - désactivée
# - vxlan (par défaut)
# - genève
tunnel: vxlan# Nom du cluster. Uniquement pertinent lors de la création d'un maillage de clusters.
nom-cluster: par défaut# DNS Polling émet périodiquement une recherche DNS pour chaque
matchName
de
# cilium-agent. Le résultat est utilisé pour régénérer la stratégie de point de terminaison.
# Les recherches DNS sont répétées avec un intervalle de 5 secondes et sont faites pour
# Adresses A (IPv4) et AAAA (IPv6). Si une recherche échoue, l'adresse IP la plus récente
# data est utilisé à la place. Un changement d'IP déclenchera une régénération du Cilium
# stratégie pour chaque endpoint et incrémenter la stratégie par agent cilium
# révision du référentiel.
#
# Cette option est désactivée par défaut à partir de la version 1.4.x en faveur
# d'une implémentation basée sur un proxy DNS plus puissante, voir [0] pour plus de détails.
# Activez cette option si vous souhaitez utiliser des stratégies FQDN mais ne souhaitez pas utiliser
# le proxy DNS.
#
# Pour faciliter la mise à niveau, les utilisateurs peuvent choisir de définir cette option sur "true".
# Sinon, veuillez vous référer au Guide de mise à niveau [1] qui explique comment
# préparer les règles de stratégie pour la mise à niveau.
#
# [0] http://docs.cilium.io/en/stable/policy/language/#dns -based
# [1] http://docs.cilium.io/en/stable/install/upgrade/#changes -that-may-require-action
tofqdns-enable-poller: "false"# wait-bpf-mount fait attendre le conteneur d'initialisation jusqu'à ce que le système de fichiers bpf soit monté
wait-bpf-mount: "faux"mascarade: "vrai"
enable-xt-socket-fallback: "vrai"
install-iptables-rules: "vrai"
auto-direct-node-routes: "false"
remplacement de kube-proxy: "sonde"
enable-host-reachable-services: "false"
enable-external-ips: "faux"
enable-node-port: "false"
protection de liaison de port de nœud: "vrai"
enable-auto-protect-node-port-range: "true"
enable-endpoint-health-checking: "vrai"
enable-well-known-identities: "false"
enable-remote-node-identity: "vrai"
--- # Source: cilium / charts / agent / templates / clusterrole.yamlapiVersion: rbac.authorization.k8s.io/v1kind: ClusterRolemetadata:
nom: ciliumrules:
- apiGroups:
- networking.k8s.io
Ressources:- politiques de réseau
verbes:- avoir
- liste
- regarder
- apiGroups:
- discovery.k8s.io
Ressources:- points de terminaison
verbes:- avoir
- liste
- regarder
- apiGroups:
- ""
Ressources:- espaces de noms
- prestations de service
- nœuds
- points de terminaison
verbes:- avoir
- liste
- regarder
- apiGroups:
- ""
Ressources:- gousses
- nœuds
verbes:- avoir
- liste
- regarder
- mettre à jour
- apiGroups:
- ""
Ressources:- nœuds
- nœuds / état
verbes:- pièce
- apiGroups:
- apiextensions.k8s.io
Ressources:- définitions personnalisées
verbes:- créer
- avoir
- liste
- regarder
- mettre à jour
- apiGroups:
- cilium.io
Ressources:- politiques de réseau cilium
- ciliumnetworkpolicies / status
- ciliumclusterwidenetworkpolitiques
- ciliumclusterwidenetworkpolitiques / statut
- ciliumendpoints
- ciliumendpoints / status
- noeuds cilium
- ciliumnodes / status
- ciliumidentités
- cilium identités / statut
verbes:- '*'
--- # Source: cilium / charts / operator / templates / clusterrole.yamlapiVersion: rbac.authorization.k8s.io/v1kind: ClusterRolemetadata:
nom: règles d'opérateur cil:- apiGroups:
- ""
Ressources:
# pour supprimer automatiquement les pods dns [core | kube] afin qu'ils commencent à être
# géré par Cilium- gousses
verbes:- avoir
- liste
- regarder
- effacer
- apiGroups:
- discovery.k8s.io
Ressources:- points de terminaison
verbes:- avoir
- liste
- regarder
- apiGroups:
- ""
Ressources:
# pour lire automatiquement à partir de k8 et importer le CIDR du pod du nœud dans celui de cilium
# etcd pour que tous les nœuds sachent comment atteindre un autre pod s'exécutant dans un autre
# nœud.- nœuds
# pour effectuer la traduction d'un CNP contenantToGroup
vers ses points de terminaison- prestations de service
- points de terminaison
# pour vérifier la connectivité Apiserver- espaces de noms
verbes:- avoir
- liste
- regarder
- apiGroups:
- cilium.io
Ressources:- politiques de réseau cilium
- ciliumnetworkpolicies / status
- ciliumclusterwidenetworkpolitiques
- ciliumclusterwidenetworkpolitiques / statut
- ciliumendpoints
- ciliumendpoints / status
- noeuds cilium
- ciliumnodes / status
- ciliumidentités
- cilium identités / statut
verbes:- '*'
--- # Source: cilium / charts / agent / templates / clusterrolebinding.yamlapiVersion: rbac.authorization.k8s.io/v1kind: ClusterRoleBindingmetadata:
nom: ciliumrole Réf:
apiGroup: rbac.authorization.k8s.io
genre: ClusterRole
nom: ciliumsubjects:- genre: ServiceAccount
nom: cilium
espace de noms: kube-system
--- # Source: cilium / charts / operator / templates / clusterrolebinding.yamlapiVersion: rbac.authorization.k8s.io/v1kind: ClusterRoleBindingmetadata:
nom: cilium-operatorroleRef:
apiGroup: rbac.authorization.k8s.io
genre: ClusterRole
nom: cilium-operatorsubjects:- genre: ServiceAccount
nom: opérateur-cil
espace de noms: kube-system
--- # Source: cilium / charts / agent / templates / daemonset.yamlapiVersion: apps / v1kind: DaemonSetmetadata:
Étiquettes:
k8s-app: cilium
nom: cilium
espace de noms: kube-systemspec:
sélecteur:
matchLabels:
k8s-app: cilium
modèle:
métadonnées:
annotations:
# Cette annotation et la tolérance CriticalAddonsOnly rendent
# cilium pour être un pod critique dans le cluster, ce qui garantit le cil
# obtient une planification prioritaire.
# https://kubernetes.io/docs/tasks/administer-cluster/guaranteed-scheduling-critical-addon-pods/
scheduler.alpha.kubernetes.io/critical-pod: ""
Étiquettes:
k8s-app: cilium
spec:
conteneurs:
- args:
- --config-dir = / tmp / cilium / config-map
commander:- agent au cil
la vivacité
exec:
commander:
- cil
- statut
- --bref
échec Seuil: 10
# Le délai initial de la sonde de vivacité est intentionnellement
# éviter un cycle d'arrêt et de redémarrage sans fin si dans le cas où
# l'amorçage prend plus de temps que prévu.
initialDelaySeconds: 120
periodSecondes: 30
succès Seuil: 1
timeoutSecondes: 5
préparation
exec:
commander:- cil
- statut
- --bref
échec Seuil: 3
initialDelaySeconds: 5
periodSecondes: 30
succès Seuil: 1
timeoutSecondes: 5
env:- nom: K8S_NODE_NAME
valeurDe:
fieldRef:
apiVersion: v1
fieldPath: spec.nodeName- nom: CILIUM_K8S_NAMESPACE
valeurDe:
fieldRef:
apiVersion: v1
fieldPath: metadata.namespace- nom: CILIUM_FLANNEL_MASTER_DEVICE
valeurDe:
configMapKeyRef:
clé: flannel-master-device
nom: cilium-config
facultatif: vrai- nom: CILIUM_FLANNEL_UNINSTALL_ON_EXIT
valeurDe:
configMapKeyRef:
clé: flanelle-désinstallation-en-sortie
nom: cilium-config
facultatif: vrai- nom: CILIUM_CLUSTERMESH_CONFIG
valeur: / var / lib / cilium / clustermesh /- nom: CILIUM_CNI_CHAINING_MODE
valeurDe:
configMapKeyRef:
clé: cni-chaining-mode
nom: cilium-config
facultatif: vrai- nom: CILIUM_CUSTOM_CNI_CONF
valeurDe:
configMapKeyRef:
clé: custom-cni-conf
nom: cilium-config
facultatif: vrai
image: "docker.io/cilium/ cilium: v1.7.6 "
imagePullPolicy: IfNotPresent
cycle de la vie:
postStart:
exec:
commander:
- "/cni-install.sh"
- "--enable-debug = false"
preStop:
exec:
commander:- /cni-uninstall.sh
nom: cilium-agent
securityContext:
capacités:
ajouter:
- NET_ADMIN
- SYS_MODULE
privilégié: vrai
volumeMounts:- mountPath: / var / run / cilium
nom: cilium-run- mountPath: / hôte / opt / cni / bin
nom: cni-path- mountPath: /host/etc/cni/net.d
nom: etc-cni-netd- mountPath: / var / lib / cilium / clustermesh
nom: clustermesh-secrets
readOnly: vrai- mountPath: / tmp / cilium / config-map
nom: chemin-de-configuration-cilium
readOnly: vrai
# Nécessaire pour pouvoir charger les modules du noyau- mountPath: / lib / modules
nom: lib-modules
readOnly: vrai- mountPath: /run/xtables.lock
nom: xtables-lock
hostNetwork: vrai
initContainers:- commander:
- /init-container.sh
env:- nom: CILIUM_ALL_STATE
valeurDe:
configMapKeyRef:
clé: clean-cilium-state
nom: cilium-config
facultatif: vrai- nom: CILIUM_BPF_STATE
valeurDe:
configMapKeyRef:
clé: clean-cilium-bpf-state
nom: cilium-config
facultatif: vrai- nom: CILIUM_WAIT_BPF_MOUNT
valeurDe:
configMapKeyRef:
clé: wait-bpf-mount
nom: cilium-config
facultatif: vrai
image: "docker.io/cilium/ cilium: v1.7.6 "
imagePullPolicy: IfNotPresent
nom: clean-cilium-state
securityContext:
capacités:
ajouter:
- NET_ADMIN
privilégié: vrai
volumeMounts:- mountPath: / var / run / cilium
nom: cilium-run
restartPolicy: toujours
priorityClassName: système critique pour le nœud
serviceAccount: cilium
serviceAccountName: cilium
terminaisonGracePeriodSecondes: 1
tolérances:- opérateur: existe
volumes:
# Pour conserver l'état entre les redémarrages / mises à niveau- hostPath:
chemin: / var / run / cilium
type: DirectoryOrCreate
nom: cilium-run
# Pour installer le plugin cilium cni dans l'hôte- hostPath:
chemin: / opt / cni / bin
type: DirectoryOrCreate
nom: cni-path
# Pour installer la configuration cilium cni dans l'hôte- hostPath:
chemin: /etc/cni/net.d
type: DirectoryOrCreate
nom: etc-cni-netd
# Pour pouvoir charger les modules du noyau- hostPath:
chemin: / lib / modules
nom: lib-modules
# Pour accéder à iptables simultanément avec d'autres processus (par exemple kube-proxy)- hostPath:
chemin: /run/xtables.lock
type: FileOrCreate
nom: xtables-lock
# Pour lire la configuration du clustermesh- nom: clustermesh-secrets
secret:
defaultMode: 420
facultatif: vrai
secretName: cilium-clustermesh
# Pour lire la configuration depuis la carte de configuration- configMap:
nom: cilium-config
nom: chemin-de-configuration-cilium
updateStrategy:
RollingUpdate:
max Non disponible: 2
type: RollingUpdate
--- # Source: cilium / charts / operator / templates / deployment.yamlapiVersion: apps / v1kind: Deploymentmetadata:
Étiquettes:
io.cilium / app: opérateur
nom: opérateur-cil
nom: opérateur-cil
espace de noms: kube-systemspec:
répliques: 1
sélecteur:
matchLabels:
io.cilium / app: opérateur
nom: opérateur-cil
stratégie:
RollingUpdate:
maxSurge: 1
max Non disponible: 1
type: RollingUpdate
modèle:
métadonnées:
annotations:
Étiquettes:
io.cilium / app: opérateur
nom: opérateur-cil
spec:
conteneurs:- args:
- --debug = $ (CILIUM_DEBUG)
- --identity-allocation-mode = $ (CILIUM_IDENTITY_ALLOCATION_MODE)
- --synchronize-k8s-nodes = vrai
commander:- opérateur cilium
env:- nom: CILIUM_K8S_NAMESPACE
valeurDe:
fieldRef:
apiVersion: v1
fieldPath: metadata.namespace- nom: K8S_NODE_NAME
valeurDe:
fieldRef:
apiVersion: v1
fieldPath: spec.nodeName- nom: CILIUM_DEBUG
valeurDe:
configMapKeyRef:
clé: déboguer
nom: cilium-config
facultatif: vrai- nom: CILIUM_CLUSTER_NAME
valeurDe:
configMapKeyRef:
clé: nom du cluster
nom: cilium-config
facultatif: vrai- nom: CILIUM_CLUSTER_ID
valeurDe:
configMapKeyRef:
clé: ID de cluster
nom: cilium-config
facultatif: vrai- nom: CILIUM_IPAM
valeurDe:
configMapKeyRef:
clé: ipam
nom: cilium-config
facultatif: vrai- nom: CILIUM_DISABLE_ENDPOINT_CRD
valeurDe:
configMapKeyRef:
clé: disable-endpoint-crd
nom: cilium-config
facultatif: vrai- nom: CILIUM_KVSTORE
valeurDe:
configMapKeyRef:
clé: kvstore
nom: cilium-config
facultatif: vrai- nom: CILIUM_KVSTORE_OPT
valeurDe:
configMapKeyRef:
clé: kvstore-opt
nom: cilium-config
facultatif: vrai- nom: AWS_ACCESS_KEY_ID
valeurDe:
secretKeyRef:
clé: AWS_ACCESS_KEY_ID
nom: cilium-aws
facultatif: vrai- nom: AWS_SECRET_ACCESS_KEY
valeurDe:
secretKeyRef:
clé: AWS_SECRET_ACCESS_KEY
nom: cilium-aws
facultatif: vrai- nom: AWS_DEFAULT_REGION
valeurDe:
secretKeyRef:
clé: AWS_DEFAULT_REGION
nom: cilium-aws
facultatif: vrai- nom: CILIUM_IDENTITY_ALLOCATION_MODE
valeurDe:
configMapKeyRef:
clé: mode d'allocation d'identité
nom: cilium-config
facultatif: vrai
image: "docker.io/cilium/ opérateur: v1.7.6 "
imagePullPolicy: IfNotPresent
nom: opérateur-cil
la vivacité
httpGet:
hôte: '127.0.0.1'
chemin: / healthz
port: 9234
schéma: HTTP
initialDelaySeconds: 60
periodSecondes: 10
timeoutSecondes: 3
hostNetwork: vrai
restartPolicy: toujours
serviceAccount: opérateur cilium
serviceAccountName: opérateur cilium-
Vous recevez cela parce que vous avez été affecté.
Répondez directement à cet e-mail, affichez-le sur GitHub
https://github.com/kubernetes/kubernetes/issues/91601#issuecomment-656404841 ,
ou se désinscrire
https://github.com/notifications/unsubscribe-auth/AAJ5E6BMTNCADT5K7D4PMF3R2ZJRVANCNFSM4NOTPEDA
.
Pourriez-vous essayer d'augmenter le niveau de journalisation et d'utiliser grep pour filtrer le nœud
ou le pod?
Le jeu.9 juillet 2020, 19h55 dilyevsky, [email protected]
a écrit:
Voici le journal du planificateur:
I0709 23: 08: 22.056081 1 registry.go: 150] Enregistrement de la fonction de prédicat et de priorité EvenPodsSpread
I0709 23: 08: 23.137451 1 portion.go: 313] Certificat auto-signé généré en mémoire
W0709 23: 08: 33.843509 1 authentication.go: 297] Erreur lors de la recherche de la configuration de l'authentification dans le cluster: etcdserver: la requête a expiré
W0709 23: 08: 33.843671 1 authentication.go: 298] Poursuite sans configuration d'authentification. Cela peut traiter toutes les demandes comme anonymes.
W0709 23: 08: 33.843710 1 authentication.go: 299] Pour exiger que la recherche de configuration d'authentification réussisse, définissez --authentication-tolerate-lookup-failure = false
I0709 23: 08: 33.911805 1 registry.go: 150] Enregistrement du prédicat et de la fonction de priorité EvenPodsSpread
I0709 23: 08: 33.911989 1 registry.go: 150] Enregistrement de la fonction de prédicat et de priorité EvenPodsSpread
W0709 23: 08: 33.917999 1 authorisation.go: 47] L'autorisation est désactivée
W0709 23: 08: 33.918162 1 authentication.go: 40] L'authentification est désactivée
I0709 23: 08: 33.918238 1 deprecated_insecure_serving.go: 51] Traitement non sécurisé de healthz sur [::]: 10251
I0709 23: 08: 33.925860 1 configmap_cafile_content.go: 202] Démarrage de client-ca :: kube-system :: extension-apiserver-authentication :: client-ca-file
I0709 23: 08: 33.926013 1 shared_informer.go: 223] En attente de synchronisation des caches pour client-ca :: kube-system :: extension-apiserver-authentication :: client-ca-file
I0709 23: 08: 33.930685 1 secure_serving.go: 178] Service en toute sécurité sur 127.0.0.1:10259
I0709 23: 08: 33.936198 1 tlsconfig.go: 240] Démarrage de DynamicServingCertificateController
I0709 23: 08: 34.026382 1 shared_informer.go: 230] Les caches sont synchronisés pour client-ca :: kube-system :: extension-apiserver-authentication :: client-ca-file
I0709 23: 08: 34.036998 1 leaderelection.go: 242] essayant d'acquérir le bail leader kube-system / kube-scheduler ...
I0709 23: 08: 50.597201 1 leaderelection.go: 252] a acquis avec succès le bail kube-system / kube-scheduler
E0709 23: 08: 50.658551 1 factory.go: 503] pod: kube-system / coredns-66bff467f8-9rjvd est déjà présent dans la file d'attente active
E0709 23: 12: 27.673854 1 factory.go: 503] pod kube-system / cilium-vv466 est déjà présent dans la file d'attente d'interruption
E0709 23: 12: 58.099432 1 leaderelection.go: 320] erreur lors de la récupération du verrou de ressource kube-system / kube-scheduler: etcdserver: leader changéAprès avoir redémarré les pods du planificateur, le pod en attente est immédiatement planifié.
-
Vous recevez cela parce que vous avez été affecté.
Répondez directement à cet e-mail, affichez-le sur GitHub
https://github.com/kubernetes/kubernetes/issues/91601#issuecomment-656406215 ,
ou se désinscrire
https://github.com/notifications/unsubscribe-auth/AAJ5E6E4QPGNNBFUYSZEJC3R2ZKHDANCNFSM4NOTPEDA
.
Ce sont des événements:
`` Événements:
Tapez la raison Âge du message
---- ------ ---- ---- -------
Échec de l'avertissement
Échec de l'avertissement
The node only has two taints but the pod tolerates all existing taints and yeah it seems to only happen on masters:
Taints: node-role.kubernetes.io/ master: NoSchedule
node.kubernetes.io/network-un disponible: NoSchedule
There is enough space and pod is best effort with no reservation anyway:
``` Resource Requests Limits
-------- -------- ------
cpu 650m (32%) 0 (0%)
memory 70Mi (0%) 170Mi (2%)
ephemeral-storage 0 (0%) 0 (0%)
hugepages-1Gi 0 (0%) 0 (0%)
hugepages-2Mi 0 (0%) 0 (0%)
attachable-volumes-gce-pd 0 0
Je vais essayer d'augmenter le niveau de journal du planificateur maintenant ...
Votre pod yaml n'a pas réellement node-role.kubernetes.io/master
tolérance
Salut! Nous rencontrons le même problème. Cependant, nous constatons le même problème avec les déploiements, où nous utilisons l'anti-affinité pour nous assurer qu'un pod est planifié sur chaque nœud ou un sélecteur de pod ciblant le nœud spécifique.
La simple création d'un pod avec un sélecteur de nœud défini pour correspondre au nom d'hôte du nœud défaillant était suffisante pour provoquer l'échec de la planification. Il disait que 5 nœuds ne correspondaient pas au sélecteur, mais rien sur le sixième. Le redémarrage du planificateur a résolu le problème. Cela ressemble à quelque chose qui est mis en cache sur ce nœud et empêche la planification sur le nœud.
Comme d'autres personnes l'ont déjà dit, nous n'avons rien dans le journal concernant l'échec.
Nous avons réduit le déploiement échoué au strict minimum (nous avons supprimé le tache sur le maître qui échoue):
apiVersion: apps/v1
kind: Deployment
metadata:
name: test-deployment
labels:
app: nginx
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
restartPolicy: Always
schedulerName: default-scheduler
nodeSelector:
kubernetes.io/hostname: master-2
Nous avions le même problème lorsque le maître avait une souillure et le déploiement une tolérance pour la souillure. Cela ne semble donc pas lié aux démonsets, aux tolérances ou à l'affinité / anti-affinité en particulier. Lorsque l'échec commence à se produire, rien qui cible le nœud spécifique ne peut être planifié. Nous voyons le problème de 1.18.2 à 1.18.5 (je n'ai pas essayé avec 1.18.0 ou .1)
La simple création d'un pod avec un sélecteur de nœud défini pour correspondre au nom d'hôte du nœud défaillant était suffisante pour provoquer l'échec de la planification
Pourriez-vous préciser s'il a commencé à échouer après la création d'un tel pod ou avant? Je suppose que ce nœud n'avait pas de souillure que le pod ne tolérait pas.
@nodo va aider à se reproduire. Pourriez-vous regarder le code de NodeSelector? Vous devrez peut-être ajouter des lignes de journal supplémentaires lors du test. Vous pouvez également imprimer le cache.
$ pidof kube-scheduler
$ sudo kill -SIGUSR2 <pid>
. Notez que cela ne tuera pas le processus du planificateur./ priorité critique-urgente
/ annuler l'attribution
Nous voyions déjà un ensemble de démons et un déploiement bloqués dans «En attente» avant d'essayer de déployer ce déploiement de test, il échouait donc déjà. et les souillures avaient été enlevées du nœud.
À l'heure actuelle, nous avons perdu l'environnement dans lequel cela se produisait car nous avons dû redémarrer les nœuds pour que le problème ne soit plus visible. Dès que nous nous reproduirons, nous essaierons de revenir avec plus d'infos
S'il-vous-plaît faites ainsi. J'ai essayé de reproduire cela dans le passé sans succès. Je suis plus intéressé par la première instance d'échec. Cela pourrait encore être lié aux souillures.
Nous avons reproduit le numéro. J'ai exécuté la commande que vous avez demandée, voici les informations:
I0716 14:47:52.768362 1 factory.go:462] Unable to schedule default/test-deployment-558f47bbbb-4rt5t: no fit: 0/6 nodes are available: 5 node(s) didn't match node selector.; waiting
I0716 14:47:52.768683 1 scheduler.go:776] Updating pod condition for default/test-deployment-558f47bbbb-4rt5t to (PodScheduled==False, Reason=Unschedulable)
I0716 14:47:53.018781 1 httplog.go:90] verb="GET" URI="/healthz" latency=299.172µs resp=200 UserAgent="kube-probe/1.18" srcIP="127.0.0.1:57258":
I0716 14:47:59.469828 1 comparer.go:42] cache comparer started
I0716 14:47:59.470936 1 comparer.go:67] cache comparer finished
I0716 14:47:59.471038 1 dumper.go:47] Dump of cached NodeInfo
I0716 14:47:59.471484 1 dumper.go:49]
Node name: master-0-bug
Requested Resources: {MilliCPU:1100 Memory:52428800 EphemeralStorage:0 AllowedPodNumber:0 ScalarResources:map[]}
Allocatable Resources:{MilliCPU:2000 Memory:3033427968 EphemeralStorage:19290208634 AllowedPodNumber:110 ScalarResources:map[hugepages-1Gi:0 hugepages-2Mi:0]}
Scheduled Pods(number: 9):
...
I0716 14:47:59.472623 1 dumper.go:60] Dump of scheduling queue:
name: coredns-cd64c8d7c-29zjq, namespace: kube-system, uid: 938e8827-5d17-4db9-ac04-d229baf4534a, phase: Pending, nominated node:
name: test-deployment-558f47bbbb-4rt5t, namespace: default, uid: fa19fda9-c8d6-4ffe-b248-8ddd24ed5310, phase: Pending, nominated node:
Malheureusement, cela ne semble pas aider
Le vidage du cache sert au débogage, cela ne changera rien. Pourriez-vous s'il vous plaît inclure la décharge?
De plus, en supposant qu'il s'agissait de la première erreur, pourriez-vous inclure le pod yaml et le nœud?
c'est à peu près tout ce qui a été vidé, je viens de supprimer les autres nœuds. Ce n'était pas la première erreur, mais vous pouvez voir le pod coredns dans la décharge, c'était la première. Je ne sais pas ce que vous demandez d'autre dans le dépotoir.
Je vais chercher les yamls
Merci, je ne savais pas que vous aviez coupé le nœud et le pod appropriés.
Pourriez-vous cependant inclure les pods planifiés pour ce nœud? Juste au cas où il y aurait un bogue dans les calculs d'utilisation des ressources.
Requested Resources: {MilliCPU:1100 Memory:52428800 EphemeralStorage:0 AllowedPodNumber:0 ScalarResources:map[]}
Ce AllowedPodNumber: 0
semble étrange.
Voici les autres pods sur ce nœud:
`
name: kube-controller-manager-master-0-bug, namespace: kube-system, uid: 095eebb0-4752-419b-aac7-245e5bc436b8, phase: Running, nominated node:
name: kube-proxy-xwf6h, namespace: kube-system, uid: 16552eaf-9eb8-4584-ba3c-7dff6ce92592, phase: Running, nominated node:
name: kube-apiserver-master-0-bug, namespace: kube-system, uid: 1d338e26-b0bc-4cef-9bad-86b7dd2b2385, phase: Running, nominated node:
name: kube-multus-ds-amd64-tpkm8, namespace: kube-system, uid: d50c0c7f-599c-41d5-a029-b43352a4f5b8, phase: Running, nominated node:
name: openstack-cloud-controller-manager-wrb8n, namespace: kube-system, uid: 17aeb589-84a1-4416-a701-db6d8ef60591, phase: Running, nominated node:
name: kube-scheduler-master-0-bug, namespace: kube-system, uid: 52469084-3122-4e99-92f6-453e512b640f, phase: Running, nominated node:
name: subport-controller-28j9v, namespace: kube-system, uid: a5a07ac8-763a-4ff2-bdae-91c6e9e95698, phase: Running, nominated node:
name: csi-cinder-controllerplugin-0, namespace: kube-system, uid: 8b16d6c8-a871-454e-98a3-0aa545f9c9d0, phase: Running, nominated node:
name: calico-node-d899t, namespace: kube-system, uid: e3672030-53b1-4356-a5df-0f4afd6b9237, phase: Running, nominated node:
Tous les nœuds ont permitPodNumber mis à 0 dans les ressources demandées dans le vidage, mais les autres nœuds sont planifiables
Le nœud yaml:
apiVersion: v1
kind: Node
metadata:
annotations:
kubeadm.alpha.kubernetes.io/cri-socket: /var/run/dockershim.sock
node.alpha.kubernetes.io/ttl: "0"
volumes.kubernetes.io/controller-managed-attach-detach: "true"
creationTimestamp: "2020-07-16T09:59:48Z"
labels:
beta.kubernetes.io/arch: amd64
beta.kubernetes.io/instance-type: 54019dbc-10d7-409c-8338-5556f61a9371
beta.kubernetes.io/os: linux
failure-domain.beta.kubernetes.io/region: regionOne
failure-domain.beta.kubernetes.io/zone: nova
kubernetes.io/arch: amd64
kubernetes.io/hostname: master-0-bug
kubernetes.io/os: linux
node-role.kubernetes.io/master: ""
node.kubernetes.io/instance-type: 54019dbc-10d7-409c-8338-5556f61a9371
node.uuid: 00324054-405e-4fae-a3bf-d8509d511ded
node.uuid_source: cloud-init
topology.kubernetes.io/region: regionOne
topology.kubernetes.io/zone: nova
name: master-0-bug
resourceVersion: "85697"
selfLink: /api/v1/nodes/master-0-bug
uid: 629b6ef3-3c76-455b-8b6b-196c4754fb0e
spec:
podCIDR: 192.168.0.0/24
podCIDRs:
- 192.168.0.0/24
providerID: openstack:///00324054-405e-4fae-a3bf-d8509d511ded
taints:
- effect: NoSchedule
key: node-role.kubernetes.io/master
status:
addresses:
- address: 10.0.10.14
type: InternalIP
- address: master-0-bug
type: Hostname
allocatable:
cpu: "2"
ephemeral-storage: "19290208634"
hugepages-1Gi: "0"
hugepages-2Mi: "0"
memory: 2962332Ki
pods: "110"
capacity:
cpu: "2"
ephemeral-storage: 20931216Ki
hugepages-1Gi: "0"
hugepages-2Mi: "0"
memory: 3064732Ki
pods: "110"
conditions:
- lastHeartbeatTime: "2020-07-16T10:02:20Z"
lastTransitionTime: "2020-07-16T10:02:20Z"
message: Calico is running on this node
reason: CalicoIsUp
status: "False"
type: NetworkUnavailable
- lastHeartbeatTime: "2020-07-16T15:46:11Z"
lastTransitionTime: "2020-07-16T09:59:43Z"
message: kubelet has sufficient memory available
reason: KubeletHasSufficientMemory
status: "False"
type: MemoryPressure
- lastHeartbeatTime: "2020-07-16T15:46:11Z"
lastTransitionTime: "2020-07-16T09:59:43Z"
message: kubelet has no disk pressure
reason: KubeletHasNoDiskPressure
status: "False"
type: DiskPressure
- lastHeartbeatTime: "2020-07-16T15:46:11Z"
lastTransitionTime: "2020-07-16T09:59:43Z"
message: kubelet has sufficient PID available
reason: KubeletHasSufficientPID
status: "False"
type: PIDPressure
- lastHeartbeatTime: "2020-07-16T15:46:11Z"
lastTransitionTime: "2020-07-16T10:19:44Z"
message: kubelet is posting ready status. AppArmor enabled
reason: KubeletReady
status: "True"
type: Ready
daemonEndpoints:
kubeletEndpoint:
Port: 10250
nodeInfo:
architecture: amd64
bootID: fe410ed3-2825-4f94-a9f9-08dc5e6a955e
containerRuntimeVersion: docker://19.3.11
kernelVersion: 4.12.14-197.45-default
kubeProxyVersion: v1.18.5
kubeletVersion: v1.18.5
machineID: 00324054405e4faea3bfd8509d511ded
operatingSystem: linux
systemUUID: 00324054-405e-4fae-a3bf-d8509d511ded
et le pod:
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: "2020-07-16T10:13:35Z"
generateName: pm-node-exporter-
labels:
controller-revision-hash: 6466d9c7b
pod-template-generation: "1"
name: pm-node-exporter-mn9vj
namespace: monitoring
ownerReferences:
- apiVersion: apps/v1
blockOwnerDeletion: true
controller: true
kind: DaemonSet
name: pm-node-exporter
uid: 5855a26f-a57e-4b0e-93f2-461c19c477e1
resourceVersion: "5239"
selfLink: /api/v1/namespaces/monitoring/pods/pm-node-exporter-mn9vj
uid: 0db09c9c-1618-4454-94fa-138e55e5ebd7
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchFields:
- key: metadata.name
operator: In
values:
- master-0-bug
containers:
- args:
- --path.procfs=/host/proc
- --path.sysfs=/host/sys
image: ***
imagePullPolicy: IfNotPresent
livenessProbe:
failureThreshold: 3
httpGet:
path: /
port: 9100
scheme: HTTP
initialDelaySeconds: 5
periodSeconds: 5
successThreshold: 1
timeoutSeconds: 1
name: pm-node-exporter
ports:
- containerPort: 9100
hostPort: 9100
name: metrics
protocol: TCP
resources:
limits:
cpu: 200m
memory: 150Mi
requests:
cpu: 100m
memory: 100Mi
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
volumeMounts:
- mountPath: /host/proc
name: proc
readOnly: true
- mountPath: /host/sys
name: sys
readOnly: true
- mountPath: /var/run/secrets/kubernetes.io/serviceaccount
name: pm-node-exporter-token-csllf
readOnly: true
dnsPolicy: ClusterFirst
enableServiceLinks: true
hostNetwork: true
hostPID: true
nodeSelector:
node-role.kubernetes.io/master: ""
priority: 0
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
serviceAccount: pm-node-exporter
serviceAccountName: pm-node-exporter
terminationGracePeriodSeconds: 30
tolerations:
- effect: NoSchedule
key: node-role.kubernetes.io/master
- effect: NoExecute
key: node.kubernetes.io/not-ready
operator: Exists
- effect: NoExecute
key: node.kubernetes.io/unreachable
operator: Exists
- effect: NoSchedule
key: node.kubernetes.io/disk-pressure
operator: Exists
- effect: NoSchedule
key: node.kubernetes.io/memory-pressure
operator: Exists
- effect: NoSchedule
key: node.kubernetes.io/pid-pressure
operator: Exists
- effect: NoSchedule
key: node.kubernetes.io/unschedulable
operator: Exists
- effect: NoSchedule
key: node.kubernetes.io/network-unavailable
operator: Exists
volumes:
- hostPath:
path: /proc
type: ""
name: proc
- hostPath:
path: /sys
type: ""
name: sys
- name: pm-node-exporter-token-csllf
secret:
defaultMode: 420
secretName: pm-node-exporter-token-csllf
status:
conditions:
- lastProbeTime: null
lastTransitionTime: "2020-07-16T10:13:35Z"
message: '0/6 nodes are available: 2 node(s) didn''t have free ports for the requested
pod ports, 3 node(s) didn''t match node selector.'
reason: Unschedulable
status: "False"
type: PodScheduled
phase: Pending
qosClass: Burstable
Merci beaucoup pour toutes les informations. @nodo pouvez-vous le prendre?
Nous essayons également avec https://github.com/Nordix/kubernetes/commit/5c00cdf195fa61316f963f59e73c6cafc2ad9bdc maintenant, pour obtenir plus d'informations
/Aidez-moi
@maelk, n'hésitez pas à le prendre et à soumettre un PR si vous trouvez le bogue. Les lignes de journal que vous avez ajoutées seront probablement utiles. Sinon, je m'ouvre aux contributeurs.
@alculquicondor :
Cette demande a été marquée comme nécessitant l'aide d'un contributeur.
Veuillez vous assurer que la demande répond aux exigences énumérées ici .
Si cette demande ne répond plus à ces exigences, l'étiquette peut être supprimée
en commentant avec la commande /remove-help
.
En réponse à cela :
/Aidez-moi
@maelk, n'hésitez pas à le prendre et à soumettre un PR si vous trouvez le bogue. Les lignes de journal que vous avez ajoutées seront probablement utiles. Sinon, je m'ouvre aux contributeurs.
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 sur le
/attribuer
@maelk Y a-t-il quelque chose de spécifique au moment où ce problème se produit pour la première fois? Par exemple, cela se produit-il juste après le démarrage du nœud?
Non, il y a pas mal de pods qui y sont programmés et qui fonctionnent bien. Mais une fois que le problème se produit, aucun de ne peut plus être programmé.
Réduire la priorité jusqu'à ce que nous ayons un cas reproductible.
Nous avons pu reproduire le bogue avec un planificateur contenant les entrées de journal supplémentaires. Ce que nous voyons, c'est que l'un des maîtres disparaît complètement de la liste des nœuds qui sont itérés. Nous pouvons voir que le processus commence avec les 6 nœuds (à partir de l'instantané):
I0720 13:58:28.246507 1 generic_scheduler.go:441] Looking for a node for kube-system/coredns-cd64c8d7c-tcxbq, going through []*nodeinfo.NodeInfo{(*nodeinfo.NodeInfo)(0xc000326a90), (*nodeinfo.NodeInfo)(0xc000952000), (*nodeinfo.NodeInfo)(0xc0007d08f0), (*nodeinfo.NodeInfo)(0xc0004f35f0), (*nodeinfo.NodeInfo)(0xc000607040), (*nodeinfo.NodeInfo)(0xc000952000)}
mais après, nous pouvons voir qu'il n'itère que sur 5 nœuds, puis nous obtenons:
I0720 13:58:28.247420 1 generic_scheduler.go:505] pod kube-system/coredns-cd64c8d7c-tcxbq : processed 5 nodes, 0 fit
Ainsi, l'un des nœuds est supprimé de la liste des nœuds potentiels. Malheureusement, nous n'avions pas assez de journalisation au début du processus, mais nous essaierons d'en obtenir plus.
Références de code par ligne de journal:
@maelk
Avez-vous vu des lignes pour %v/%v on node %v, too many nodes fit
?
Sinon, @pancernik pourriez-vous rechercher des bogues sur workqueue.ParallelizeUntil(ctx, 16, len(allNodes), checkNode)
?
Non, ce journal n'apparaît pas. Je pense également qu'il se pourrait que nous ayons un problème avec la parallélisation ou que ce nœud soit filtré plus tôt. S'il échouait avec une erreur ici: https://github.com/Nordix/kubernetes/commit/5c00cdf195fa61316f963f59e73c6cafc2ad9bdc#diff -c237cdd9e4cb201118ca380732d7f361R464 essayerait il serait plus visible dans les journaux afaik spécifiquement fonction et la parallélisation.
Je viens de réaliser qu'un nœud subit le filtrage deux fois!
Les journaux sont:
I0720 13:58:28.246507 1 generic_scheduler.go:441] Looking for a node for kube-system/coredns-cd64c8d7c-tcxbq, going through []*nodeinfo.NodeInfo{(*nodeinfo.NodeInfo)(0xc000326a90), (*nodeinfo.NodeInfo)(0xc000952000), (*nodeinfo.NodeInfo)(0xc0007d08f0), (*nodeinfo.NodeInfo)(0xc0004f35f0), (*nodeinfo.NodeInfo)(0xc000607040), (*nodeinfo.NodeInfo)(0xc000952000)}
I0720 13:58:28.246793 1 generic_scheduler.go:469] pod kube-system/coredns-cd64c8d7c-tcxbq on node worker-pool1-60846k0y-scheduler, fits: false, status: &v1alpha1.Status{code:3, reasons:[]string{"node(s) didn't match node selector"}}
I0720 13:58:28.246970 1 generic_scheduler.go:483] pod kube-system/coredns-cd64c8d7c-tcxbq on node worker-pool1-60846k0y-scheduler : status is not success
I0720 13:58:28.246819 1 taint_toleration.go:71] Checking taints for pod kube-system/coredns-cd64c8d7c-tcxbq for node master-0-scheduler : taints : []v1.Taint{v1.Taint{Key:"node-role.kubernetes.io/master", Value:"", Effect:"NoSchedule", TimeAdded:(*v1.Time)(nil)}} and tolerations: []v1.Toleration{v1.Toleration{Key:"node-role.kubernetes.io/master", Operator:"Exists", Value:"", Effect:"NoSchedule", TolerationSeconds:(*int64)(nil)}, v1.Toleration{Key:"CriticalAddonsOnly", Operator:"Exists", Value:"", Effect:"NoSchedule", TolerationSeconds:(*int64)(nil)}, v1.Toleration{Key:"node-role.kubernetes.io/master", Operator:"Exists", Value:"", Effect:"NoExecute", TolerationSeconds:(*int64)(nil)}, v1.Toleration{Key:"node-role.kubernetes.io/not-ready", Operator:"Exists", Value:"", Effect:"NoSchedule", TolerationSeconds:(*int64)(nil)}, v1.Toleration{Key:"node.kubernetes.io/not-ready", Operator:"Exists", Value:"", Effect:"NoExecute", TolerationSeconds:(*int64)(0xc000d40d90)}, v1.Toleration{Key:"node.kubernetes.io/unreachable", Operator:"Exists", Value:"", Effect:"NoExecute", TolerationSeconds:(*int64)(0xc000d40db0)}}
I0720 13:58:28.247019 1 taint_toleration.go:71] Checking taints for pod kube-system/coredns-cd64c8d7c-tcxbq for node master-2-scheduler : taints : []v1.Taint{v1.Taint{Key:"node-role.kubernetes.io/master", Value:"", Effect:"NoSchedule", TimeAdded:(*v1.Time)(nil)}} and tolerations: []v1.Toleration{v1.Toleration{Key:"node-role.kubernetes.io/master", Operator:"Exists", Value:"", Effect:"NoSchedule", TolerationSeconds:(*int64)(nil)}, v1.Toleration{Key:"CriticalAddonsOnly", Operator:"Exists", Value:"", Effect:"NoSchedule", TolerationSeconds:(*int64)(nil)}, v1.Toleration{Key:"node-role.kubernetes.io/master", Operator:"Exists", Value:"", Effect:"NoExecute", TolerationSeconds:(*int64)(nil)}, v1.Toleration{Key:"node-role.kubernetes.io/not-ready", Operator:"Exists", Value:"", Effect:"NoSchedule", TolerationSeconds:(*int64)(nil)}, v1.Toleration{Key:"node.kubernetes.io/not-ready", Operator:"Exists", Value:"", Effect:"NoExecute", TolerationSeconds:(*int64)(0xc000d40d90)}, v1.Toleration{Key:"node.kubernetes.io/unreachable", Operator:"Exists", Value:"", Effect:"NoExecute", TolerationSeconds:(*int64)(0xc000d40db0)}}
I0720 13:58:28.247144 1 generic_scheduler.go:469] pod kube-system/coredns-cd64c8d7c-tcxbq on node master-2-scheduler, fits: false, status: &v1alpha1.Status{code:2, reasons:[]string{"node(s) didn't match pod affinity/anti-affinity", "node(s) didn't satisfy existing pods anti-affinity rules"}}
I0720 13:58:28.247172 1 generic_scheduler.go:483] pod kube-system/coredns-cd64c8d7c-tcxbq on node master-2-scheduler : status is not success
I0720 13:58:28.247210 1 generic_scheduler.go:469] pod kube-system/coredns-cd64c8d7c-tcxbq on node worker-pool1-7dt1xd4k-scheduler, fits: false, status: &v1alpha1.Status{code:3, reasons:[]string{"node(s) didn't match node selector"}}
I0720 13:58:28.247231 1 generic_scheduler.go:483] pod kube-system/coredns-cd64c8d7c-tcxbq on node worker-pool1-7dt1xd4k-scheduler : status is not success
I0720 13:58:28.247206 1 generic_scheduler.go:469] pod kube-system/coredns-cd64c8d7c-tcxbq on node worker-pool1-60846k0y-scheduler, fits: false, status: &v1alpha1.Status{code:3, reasons:[]string{"node(s) didn't match node selector"}}
I0720 13:58:28.247297 1 generic_scheduler.go:483] pod kube-system/coredns-cd64c8d7c-tcxbq on node worker-pool1-60846k0y-scheduler : status is not success
I0720 13:58:28.247246 1 generic_scheduler.go:469] pod kube-system/coredns-cd64c8d7c-tcxbq on node worker-pool1-hyk0hg7r-scheduler, fits: false, status: &v1alpha1.Status{code:3, reasons:[]string{"node(s) didn't match node selector"}}
I0720 13:58:28.247340 1 generic_scheduler.go:483] pod kube-system/coredns-cd64c8d7c-tcxbq on node worker-pool1-hyk0hg7r-scheduler : status is not success
I0720 13:58:28.247147 1 generic_scheduler.go:469] pod kube-system/coredns-cd64c8d7c-tcxbq on node master-0-scheduler, fits: false, status: &v1alpha1.Status{code:2, reasons:[]string{"node(s) didn't match pod affinity/anti-affinity", "node(s) didn't satisfy existing pods anti-affinity rules"}}
I0720 13:58:28.247375 1 generic_scheduler.go:483] pod kube-system/coredns-cd64c8d7c-tcxbq on node master-0-scheduler : status is not success
I0720 13:58:28.247420 1 generic_scheduler.go:505] pod kube-system/coredns-cd64c8d7c-tcxbq : processed 5 nodes, 0 fit
I0720 13:58:28.247461 1 generic_scheduler.go:430] pod kube-system/coredns-cd64c8d7c-tcxbq After scheduling, filtered: []*v1.Node{}, filtered nodes: v1alpha1.NodeToStatusMap{"master-0-scheduler":(*v1alpha1.Status)(0xc000d824a0), "master-2-scheduler":(*v1alpha1.Status)(0xc000b736c0), "worker-pool1-60846k0y-scheduler":(*v1alpha1.Status)(0xc000d825a0), "worker-pool1-7dt1xd4k-scheduler":(*v1alpha1.Status)(0xc000b737e0), "worker-pool1-hyk0hg7r-scheduler":(*v1alpha1.Status)(0xc000b738c0)}
I0720 13:58:28.247527 1 generic_scheduler.go:185] Pod kube-system/coredns-cd64c8d7c-tcxbq failed scheduling:
nodes snapshot: &cache.Snapshot{nodeInfoMap:map[string]*nodeinfo.NodeInfo{"master-0-scheduler":(*nodeinfo.NodeInfo)(0xc000607040), "master-1-scheduler":(*nodeinfo.NodeInfo)(0xc0001071e0), "master-2-scheduler":(*nodeinfo.NodeInfo)(0xc000326a90), "worker-pool1-60846k0y-scheduler":(*nodeinfo.NodeInfo)(0xc000952000), "worker-pool1-7dt1xd4k-scheduler":(*nodeinfo.NodeInfo)(0xc0007d08f0), "worker-pool1-hyk0hg7r-scheduler":(*nodeinfo.NodeInfo)(0xc0004f35f0)}, nodeInfoList:[]*nodeinfo.NodeInfo{(*nodeinfo.NodeInfo)(0xc000326a90), (*nodeinfo.NodeInfo)(0xc000952000), (*nodeinfo.NodeInfo)(0xc0007d08f0), (*nodeinfo.NodeInfo)(0xc0004f35f0), (*nodeinfo.NodeInfo)(0xc000607040), (*nodeinfo.NodeInfo)(0xc000952000)}, havePodsWithAffinityNodeInfoList:[]*nodeinfo.NodeInfo{(*nodeinfo.NodeInfo)(0xc000326a90), (*nodeinfo.NodeInfo)(0xc000607040)}, generation:857}
statuses: v1alpha1.NodeToStatusMap{"master-0-scheduler":(*v1alpha1.Status)(0xc000d824a0), "master-2-scheduler":(*v1alpha1.Status)(0xc000b736c0), "worker-pool1-60846k0y-scheduler":(*v1alpha1.Status)(0xc000d825a0), "worker-pool1-7dt1xd4k-scheduler":(*v1alpha1.Status)(0xc000b737e0), "worker-pool1-hyk0hg7r-scheduler":(*v1alpha1.Status)(0xc000b738c0)}
Comme vous pouvez le voir, le nœud worker-pool1-60846k0y-scheduler passe deux fois par filtrage
Non, ce journal n'apparaît pas. Je pense également qu'il se pourrait que nous ayons un problème avec la parallélisation ou que ce nœud soit filtré plus tôt. S'il échouait avec une erreur ici: Nordix @ 5c00cdf # diff -c237cdd9e4cb201118ca380732d7f361R464, il serait visible dans les journaux afaik, je vais donc essayer d'ajouter plus d'entrées de débogage autour spécifiquement de la fonction et de la parallélisation.
Ouais, une erreur se manifesterait par une erreur de planification dans les événements du pod.
Je viens de réaliser qu'un nœud subit le filtrage deux fois!
Honnêtement, je ne pense pas que la parallélisation comporte des bogues (qui valent toujours la peine d'être vérifiés), mais cela pourrait être le signe que nous n'avons pas réussi à créer l'instantané à partir du cache (comme nous l'avons vu dans le vidage du cache, le cache est correct), en ajoutant un nœud deux fois. Puisque les statuts sont une carte, il est logique que nous ne "voyions" que 5 nœuds à la dernière ligne du journal.
C'est le code (astuce de 1.18) https://github.com/kubernetes/kubernetes/blob/ec73e191f47b7992c2f40fadf1389446d6661d6d/pkg/scheduler/internal/cache/cache.go#L203
cc @ ahg-g
J'essaierai d'ajouter beaucoup de journaux sur la partie cache du planificateur, en particulier autour de l'ajout et de la mise à jour de nœuds, et autour de l'instantané. Cependant, à partir de la dernière ligne des journaux, vous pouvez voir que l'instantané est en fait correct et contient tous les nœuds, donc tout ce qui se passe semble se produire plus tard, lorsque vous travaillez sur cet instantané
cache! = instantané
Le cache est la chose vivante qui est mise à jour à partir des événements. L'instantané est mis à jour (à partir du cache) avant chaque cycle de planification pour "verrouiller" l'état. Nous avons ajouté des optimisations pour rendre ce dernier processus aussi rapide que possible. Il est possible que le bogue soit là.
Merci @maelk! Ceci est très utile. Vos journaux indiquent que (*nodeinfo.NodeInfo)(0xc000952000)
est déjà dupliqué dans la liste à l' adresse https://github.com/Nordix/kubernetes/commit/5c00cdf195fa61316f963f59e73c6cafc2ad9bdc#diff -c237cdd9e4cb201118ca380732d7f361R avant l'exécution de tout code parallèle441. Cela signifierait en effet qu'il est dupliqué avant la mise à jour de l'instantané.
En fait, cela vient de l'instantané, qui se produit avant ce message de journal: https://github.com/Nordix/kubernetes/commit/5c00cdf195fa61316f963f59e73c6cafc2ad9bdc#diff -c237cdd9e4cb201118ca380732d7f361R161. Il semble donc que le contenu de l'instantané ait la duplication, car il provient de https://github.com/Nordix/kubernetes/commit/5c00cdf195fa61316f963f59e73c6cafc2ad9bdc#diff -c237cdd9e4cb201118ca380732d7f361R436
C'est vrai. Je voulais dire qu'il était déjà dupliqué avant la fin de la mise à jour de l'instantané.
C'est vrai. Je voulais dire qu'il était déjà dupliqué avant la fin de la mise à jour de l'instantané.
Non, l'instantané est mis à jour au début du cycle de planification. Le bogue est soit pendant la mise à jour de l'instantané, soit avant cela. Mais le cache est correct, selon le dump dans https://github.com/kubernetes/kubernetes/issues/91601#issuecomment -659465008
EDIT: je l'ai mal lu, je n'ai pas vu le mot "finit" :)
L'instantané de mise à jour d'optimisation des relations publiques a été effectué dans la version 1.18: https://github.com/kubernetes/kubernetes/pull/85738 et https://github.com/kubernetes/kubernetes/pull/86919
Je me demande si l'arborescence des nœuds a également des enregistrements en double
Je me demande si l'arborescence des nœuds a également des enregistrements en double
@maelk pourriez-vous afficher un vidage de la liste complète des nœuds dans le cache?
nous n'ajoutons / supprimons pas d'éléments de NodeInfoList, nous créons la liste complète à partir de l'arbre ou non, donc s'il y a des doublons, ceux-ci proviennent probablement de l'arbre, je pense.
Juste pour clarifier:
1) le cluster a 6 nœuds (y compris les maîtres)
2) le nœud qui est censé héberger le pod n'a pas du tout été examiné (aucune ligne de journal ne l'indique), ce qui peut signifier qu'il n'est pas du tout dans NodeInfoList
3) NodeInfoList a 6 nœuds, mais l'un d'eux est en double
Je me demande si l'arborescence des nœuds a également des enregistrements en double
@maelk pourriez-vous afficher un vidage de la liste complète des nœuds dans le cache?
un vidage de chaque arbre de nœuds, liste et carte serait génial.
Je vais travailler pour les obtenir. En attendant, une petite mise à jour. Nous pouvons voir dans les journaux:
I0720 13:37:30.530980 1 node_tree.go:100] Removed node "worker-pool1-60846k0y-scheduler" in group "" from NodeTree
I0720 13:37:30.531136 1 node_tree.go:86] Added node "worker-pool1-60846k0y-scheduler" in group "regionOne:\x00:nova" to NodeTree
Et c'est le moment exact où le nœud manquant disparaît. La dernière occurrence dans les journaux est à 13:37:24. Dans la planification suivante, le nœud manquant a disparu. il semble donc que le bogue se trouve dans / suit la mise à jour de node_tree. Tous les nœuds passent par cette mise à jour, c'est juste que ce worker 608 est le dernier à y passer.
Lors du vidage du cache (avec SIGUSR2), les six nœuds y sont répertoriés, les pods s'exécutant sur les nœuds, sans duplication ni nœuds manquants.
Nous allons lui donner un nouvel essai avec un débogage supplémentaire autour de la fonctionnalité d'instantané: https://github.com/Nordix/kubernetes/commit/53279fb06536558f9a91836c771b182791153791
Suppression du nœud "worker-pool1-60846k0y-scheduler" dans le groupe "" de NodeTree
Intéressant, je pense que les suppressions / ajouts sont déclenchés par un appel updateNode. La clé de zone est manquante sur la suppression, mais existe sur l'ajout, donc la mise à jour ajoutait essentiellement les étiquettes de zone et de région?
Avez-vous d'autres journaux de planificateur liés à ce nœud?
Nous essayons de reproduire le bogue avec la journalisation ajoutée. Je reviendrai quand j'aurai plus d'infos
Je vais travailler pour les obtenir. En attendant, une petite mise à jour. Nous pouvons voir dans les journaux:
I0720 13:37:30.530980 1 node_tree.go:100] Removed node "worker-pool1-60846k0y-scheduler" in group "" from NodeTree I0720 13:37:30.531136 1 node_tree.go:86] Added node "worker-pool1-60846k0y-scheduler" in group "regionOne:\x00:nova" to NodeTree
Je ferai remarquer qu'un tel nœud est le nœud qui se répète. @maelk , avez-vous vu des messages similaires pour d'autres nœuds ou pas du tout? Comme @ ahg-g, cela devrait être prévu lorsqu'un nœud reçoit ses étiquettes de topologie pour la première fois.
oui, c'est arrivé pour tous les nœuds, et c'est attendu. la coïncidence étant que ce nœud est spécifiquement le dernier mis à jour, et c'est à ce moment précis que l'autre nœud disparaît
Avez-vous obtenu des journaux de mise à jour pour le nœud manquant?
Avez-vous obtenu des journaux de mise à jour pour le nœud manquant?
lol, tapait juste cette question.
peut-être que le bogue est que toute la zone est supprimée de l'arborescence avant que tous les nœuds ne soient supprimés.
Juste pour clarifier, je ne regarde pas personnellement le code, j'essaie simplement de m'assurer que nous avons toutes les informations. Et je pense qu'avec ce que nous avons maintenant, nous devrions être capables de repérer le bogue. N'hésitez pas à soumettre des PR et bien mieux si vous pouvez fournir un test unitaire qui échoue.
Avez-vous obtenu des journaux de mise à jour pour le nœud manquant?
oui, cela montre que la zone est mise à jour pour ce nœud manquant. Il existe une entrée de journal pour tous les nœuds
Pour être honnête, je n'ai toujours aucune idée de la raison du bogue, mais si nous pouvons arriver à le découvrir, je soumettrai un PR ou des tests unitaires.
oui, cela montre que la zone est mise à jour pour ce nœud manquant. Il existe une entrée de journal pour tous les nœuds
Si c'est le cas, alors je pense en supposant que c'est "le moment exact où le nœud manquant disparaît". peut ne pas être corrélé. Attendons les nouveaux journaux. Ce serait formidable si vous pouviez partager tous les journaux du planificateur que vous obtenez dans un fichier.
Je le ferai quand nous reproduirons avec la nouvelle journalisation. À partir de celles existantes, nous pouvons en fait voir que la planification du pod immédiatement après cette mise à jour est la première à échouer. Mais cela ne donne pas assez d'informations pour savoir ce qui s'est passé entre les deux, alors restez à l'écoute ...
@maelk Avez-vous vu un message commençant par snapshot state is not consistent
dans les journaux du planificateur?
Serait-il possible pour vous de fournir des journaux complets du planificateur?
non, ce message n'est pas présent. Je pourrais donner un fichier journal rayé (pour éviter la répétition), mais attendons d'abord d'avoir la sortie avec plus de journaux autour de l'instantané
J'ai trouvé le bogue. Le problème vient de la fonction nodeTree next (), qui ne renvoie pas une liste de tous les nœuds dans certains cas. https://github.com/kubernetes/kubernetes/blob/release-1.18/pkg/scheduler/internal/cache/node_tree.go#L147
Il est visible si vous ajoutez ce qui suit ici: https://github.com/kubernetes/kubernetes/blob/release-1.18/pkg/scheduler/internal/cache/node_tree_test.go#L443
{
name: "add nodes to a new and to an exhausted zone",
nodesToAdd: append(allNodes[5:9], allNodes[3]),
nodesToRemove: nil,
operations: []string{"add", "add", "next", "next", "add", "add", "add", "next", "next", "next", "next"},
expectedOutput: []string{"node-6", "node-7", "node-3", "node-8", "node-6", "node-7"},
},
Le principal problème est que lorsque vous ajoutez un nœud, les index ne sont pas à 0 pour certaines zones. Pour que cela se produise, vous devez avoir au moins deux zones, l'une étant plus courte que l'autre, et la plus longue ayant un index non défini sur 0 lors de l'appel de la fonction suivante pour la première fois.
Le correctif que j'ai choisi est de réinitialiser l'index avant d'appeler next () la première fois. J'ai ouvert un PR pour montrer mon correctif. Bien sûr, c'est contre la version 1.18 car c'est ce sur quoi j'ai travaillé, mais c'est surtout pour discuter de la façon de le réparer (ou peut-être de corriger la fonction next () elle-même). Je peux ouvrir un PR approprié vers le maître et faire les backports si nécessaire par la suite.
J'ai remarqué le même problème avec l'itération. Mais je n'ai pas réussi à lier cela à un doublon dans l'instantané. Avez-vous réussi à créer un scénario où cela se produirait, @maelk?
oui, vous pouvez l'exécuter dans les tests unitaires en ajoutant le petit code que j'ai mis
Je travaille maintenant sur l'ajout d'un cas de test pour l'instantané, pour m'assurer qu'il est correctement testé.
grand merci à
Merci à tous pour le débogage de ce problème notoire. La réinitialisation de l'index avant de créer la liste est sûre, donc je pense que nous devrions aller avec cela pour les correctifs 1.18 et 1.19, et avoir un correctif approprié dans la branche master.
Le but de la fonction next
changé avec l'introduction de NodeInfoList, et nous pouvons donc certainement le simplifier et peut-être le changer en toList
, une fonction qui crée une liste à partir de l'arborescence et commence simplement depuis le début à chaque fois.
Je comprends maintenant le problème: le calcul de l'épuisement ou non d'une zone est erroné car il ne considère pas où dans chaque zone nous avons commencé ce processus "UpdateSnapshot". Et oui, ce ne serait visible qu'avec des zones inégales.
Excellent travail de repérer ce @maelk!
Je pense que nous avons le même problème dans les anciennes versions. Cependant, il est caché par le fait que nous faisons un passage d'arbre à chaque fois. Alors qu'en 1.18, nous avons instantané le résultat jusqu'à ce qu'il y ait des changements dans l'arbre.
Maintenant que la stratégie round-robin est implémentée dans generic_scheduler.go, nous pourrions être d'accord avec la simple réinitialisation de tous les compteurs avant UpdateSnapshot, comme le fait votre PR.
Juste pour vérifier @ ahg-g, cela devrait être bien même dans un cluster où de nouveaux nœuds sont ajoutés / supprimés tout le temps, non?
Merci @maelk d' avoir repéré la cause profonde!
Le but de la fonction suivante a changé avec l'introduction de NodeInfoList, et nous pouvons donc certainement le simplifier et peut-être le changer en toList, une fonction qui crée une liste à partir de l'arborescence et recommence simplement depuis le début à chaque fois.
Étant donné que cache.nodeTree.next()
n'est appelé que lors de la construction de l'instantané nodeInfoList, je pense qu'il est également sûr de supprimer les index (à la fois zoneIndex et nodeIndex) de la structure nodeTree. Au lieu de cela, créez une simple fonction nodeIterator()
pour parcourir sa zone / nœud de manière circulaire.
BTW: il y a une faute de frappe dans https://github.com/kubernetes/kubernetes/issues/91601#issuecomment -662663090, le cas devrait être:
{
name: "add nodes to a new and to an exhausted zone",
nodesToAdd: append(allNodes[6:9], allNodes[3]),
nodesToRemove: nil,
operations: []string{"add", "add", "next", "next", "add", "add", "next", "next", "next", "next"},
expectedOutput: []string{"node-6", "node-7", "node-3", "node-8", "node-6", "node-7"},
// with codecase on master and 1.18, its output is [node-6 node-7 node-3 node-8 node-6 node-3]
},
Juste pour vérifier @ ahg-g, cela devrait être bien même dans un cluster où de nouveaux nœuds sont ajoutés / supprimés tout le temps, non?
Je suppose que vous parlez de la logique dans generic_scheduler.go, si oui, peu importe si des nœuds ont été ajoutés ou supprimés, la principale chose que nous devons éviter est d'itérer les nœuds dans le même ordre à chaque fois nous planifions un pod, nous avons juste besoin d'une bonne approximation de l'itération sur les nœuds à travers les pods.
Étant donné que cache.nodeTree.next () n'est appelé que lors de la construction de l'instantané nodeInfoList, je pense qu'il est également sûr de supprimer les index (à la fois zoneIndex et nodeIndex) de la structure nodeTree. Au lieu de cela, créez une simple fonction nodeIterator () pour parcourir sa zone / nœud de manière circulaire.
oui, nous avons juste besoin d'itérer sur toutes les zones / nœuds dans le même ordre à chaque fois.
J'ai mis à jour le PR avec un test unitaire pour la fonction de mise à jour de la liste de clichés, pour ce bogue en particulier. Je peux également prendre soin de refactoriser la fonction next () pour itérer sur les zones et les nœuds sans round-robin, supprimant ainsi le problème.
Merci, ça sonne bien, mais nous devrions toujours itérer entre les zones de la même manière que nous le faisons maintenant, c'est-à-dire par conception.
Je ne comprends pas vraiment ce que tu veux dire ici. Est-ce pour que l'ordre des nœuds compte et qu'il faut encore faire un tour de rôle entre les zones ou peut-on lister tous les nœuds d'une zone, une zone après l'autre? Disons que vous avez deux zones de deux nœuds chacune, dans quel ordre les attendez-vous, ou est-ce même important?
L'ordre compte, nous devons alterner entre les zones lors de la création de la liste. Si vous avez deux zones de deux nœuds chacun z1: {n11, n12}
et z2: {n21, n22}
, alors la liste devrait être {n11, n21, n12, n22}
ok, merci, je vais y réfléchir. Pouvons-nous entre-temps procéder à la solution miracle? btw, certains tests échouent, mais je ne sais pas comment cela se rapporte à mon PR
Ce sont des flocons. Veuillez également envoyer un correctif à la version 1.18.
OK je le ferai. Merci
{ name: "add nodes to a new and to an exhausted zone", nodesToAdd: append(allNodes[5:9], allNodes[3]), nodesToRemove: nil, operations: []string{"add", "add", "next", "next", "add", "add", "add", "next", "next", "next", "next"}, expectedOutput: []string{"node-6", "node-7", "node-3", "node-8", "node-6", "node-7"}, },
@maelk , voulez-vous dire que ce test ignore le 'node-5'?
J'ai trouvé après avoir corrigé l'ajout dans https://github.com/kubernetes/kubernetes/pull/93516 , le résultat du test, tous les nœuds peuvent être itérés:
{
name: "add nodes to a new and to an exhausted zone",
nodesToAdd: append(append(make([]*v1.Node, 0), allNodes[5:9]...), allNodes[3]),
nodesToRemove: nil,
operations: []string{"add", "add", "next", "next", "add", "add", "add", "next", "next", "next", "next"},
expectedOutput: []string{"node-5", "node-6", "node-3", "node-7", "node-8", "node-5"},
},
Les nœuds 5, 6, 7, 8, 3 peuvent être itérés.
Pardonnez-moi si vous ne comprenez pas quelque chose ici.
oui, c'était exprès, basé sur ce qui était là, mais je peux voir comment cela peut être cryptique, alors mieux vaut faire en sorte que l'append se comporte de manière plus claire. Merci pour le patch.
À quelle distance pensez-vous que ce bug était présent? 1.17? 1.16? Je viens de voir exactement le même problème dans la version 1.17 sur AWS et le redémarrage du nœud non planifié a résolu le problème.
@judgeaxl pourriez-vous fournir plus de détails? Lignes de journal, vidages de cache, etc. Nous pouvons donc déterminer si le problème est le même.
Comme je l'ai noté dans https://github.com/kubernetes/kubernetes/issues/91601#issuecomment -662746695, je pense que ce bogue était présent dans les anciennes versions, mais je pense que c'est transitoire.
@maelk seriez-vous en mesure d'enquêter?
Veuillez également partager la répartition des nœuds dans les zones.
@alculquicondor, malheureusement, je ne peux pas à ce stade. Désolé.
@alculquicondor désolé, j'ai déjà reconstruit le cluster pour d'autres raisons, mais cela peut avoir été un problème de configuration réseau lié aux déploiements multi-az, et dans quel sous-réseau le nœud défectueux a été lancé, donc je ne m'inquiéterais pas pour le moment dans le contexte de cette question. Si je le remarque à nouveau, je ferai un rapport avec de meilleurs détails. Merci!
/ retitle Certains nœuds ne sont pas pris en compte dans la planification en cas de déséquilibre de zone
Commentaire le plus utile
Je travaille maintenant sur l'ajout d'un cas de test pour l'instantané, pour m'assurer qu'il est correctement testé.