Qué sucedió : Actualizamos 15 clústeres de kubernetes de 1.17.5 a 1.18.2 / 1.18.3 y comenzamos a ver que los conjuntos de demonios ya no funcionan correctamente.
El problema es que no todos los pods de daemonset se aprovisionan. Devolverá el siguiente mensaje de error a los eventos:
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.
Sin embargo, todos los nodos están disponibles y no tiene selector de nodos. Los nodos tampoco tienen contaminaciones.
daemonset 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>
Intenté reiniciar apiserver / Schedulers / controller-managers pero no ayudó. También he intentado reiniciar ese único nodo que está atascado (nodes-z2-1-kaasprod-k8s-local) pero tampoco ayuda. Solo eliminar ese nodo y volver a crearlo ayuda.
% 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
Estamos viendo esto al azar en todos nuestros clústeres.
Lo que esperaba que sucediera : espero que el daemonset se suministre a todos los nodos.
Cómo reproducirlo (de la manera más mínima y precisa posible) : Realmente no tengo idea, instale 1.18.x kubernetes e implemente daemonset y luego espere días (?)
¿Algo más que necesitemos saber? : Cuando esto sucede, tampoco podemos aprovisionar ningún otro conjunto de demonios en ese nodo. Como puede ver, también falta el registro fluent-bit. No puedo ver ningún error en los registros de ese nodo kubelet y, como se dijo, reiniciar no ayuda.
% 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
Como puede ver, a la mayoría de los daemonsets les falta un pod
Medio ambiente :
kubectl version
): 1.18.3cat /etc/os-release
): debian busteruname -a
): Linux nodes-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 programación
¿Puede proporcionar el yaml completo del nodo, el conjunto de demonios, un pod de ejemplo y el espacio de nombres que lo contiene tal como se recupera del servidor?
nodo:
https://gist.github.com/zetaab/2a7e8d3fe6cb42a617e17abc0fa375f7
daemonset:
https://gist.github.com/zetaab/31bb406c8bd622b3017bf4f468d0154f
pod de ejemplo (en funcionamiento):
https://gist.github.com/zetaab/814871bec6f2879e371f5bbdc6f2e978
pod de ejemplo (sin programación):
https://gist.github.com/zetaab/f3488d65486c745af78dbe2e6173fd42
espacio de nombres:
https://gist.github.com/zetaab/4625b759f4e21b50757c79e5072cd7d9
Los pods de DaemonSet programan con un selector nodeAffinity que solo coincide con un único nodo, por lo que se espera el mensaje "12 de 13 no coinciden".
No veo una razón por la que el programador no esté satisfecho con el combo pod / nodo ... no hay puertos que puedan entrar en conflicto en la especificación del pod, el nodo no es no programable o contaminado, y tiene recursos suficientes
Bien, reinicié los 3 programadores (cambié el nivel de registro a 4 si podemos ver algo interesante allí). Sin embargo, solucionó el problema.
% 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
ahora todos los conjuntos de demonios están aprovisionados correctamente. Extraño, de todos modos, parece que hay algo mal con el programador
cc @ kubernetes / sig-scheduling-bugs @ ahg-g
Vemos el mismo problema similar en v1.18.3, un nodo no se puede programar para los pods de daemonset.
reiniciar el programador ayuda.
[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
Difícil de depurar sin saber cómo repreducir. ¿Tiene los registros del programador por casualidad para el pod no programado?
Bien, reinicié los 3 programadores
Supongo que solo uno de ellos se llama default-scheduler
, ¿correcto?
cambió el nivel de registro a 4 si podemos ver algo interesante allí
¿Puedes compartir lo que notaste?
establezca loglevel en 9, pero parece que no hay nada más interesante, los registros a continuación se repiten.
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)
sí, no pude ver nada más que la misma línea
no fit: 0/8 nodes are available: 7 node(s) didn't match node selector.; waiting
lo extraño es que el mensaje de registro muestra el resultado solo para 7 nodos, como el problema informado en https://github.com/kubernetes/kubernetes/issues/91340
/ cc @damemi
@ ahg-g, esto parece el mismo problema que informé allí, parece que tenemos un complemento de filtro que no siempre informa su error o alguna otra condición que falla silenciosamente si tuviera que adivinar
Tenga en cuenta que en mi problema, reiniciar el programador también lo solucionó (como se menciona en este hilo también https://github.com/kubernetes/kubernetes/issues/91601#issuecomment-636360092)
El mío también era sobre un daemonset, así que creo que es un duplicado. Si ese es el caso, podemos cerrar esto y continuar la discusión en https://github.com/kubernetes/kubernetes/issues/91340
De todos modos, el programador necesita una opción de registro más detallada, es imposible depurar estos problemas si no hay registros sobre lo que hace
@zetaab +1, el programador podría utilizar mejoras significativas en sus capacidades de registro actuales. Esa es una actualización que he querido abordar durante un tiempo y finalmente abrí un problema aquí: https://github.com/kubernetes/kubernetes/issues/91633
/asignar
Estoy investigando esto. Algunas preguntas para ayudarme a acotar el caso. Todavía no he podido reproducirme.
Los nodos se crearon antes que el daemonset.
supongamos que usamos el perfil predeterminado, ¿a qué perfil te refieres y cómo verificar?
sin extensores.
command:
- /usr/local/bin/kube-scheduler
- --address=127.0.0.1
- --kubeconfig=/etc/kubernetes/kube-scheduler.kubeconfig
- --profiling=false
- --v=1
Otra cosa que puede afectar es que el rendimiento del disco no es muy bueno para etcd, etcd se queja de operaciones lentas.
Sí, esos indicadores harían que el programador se ejecutara con el perfil predeterminado. Seguiré buscando. Todavía no pude reproducirme.
Todavía nada ... ¿Hay algo más que estés usando que creas que podría estar impactando? contaminaciones, puertos, otros recursos?
Hice algunos intentos relacionados con esto. Cuando el problema está activado, los pods aún se pueden programar en el nodo (sin definición o con el selector "nodeName").
Si intenta utilizar Affinity / Antiaffinity, los pods no se programan en el nodo.
Trabajando cuando el problema está activado:
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
No funciona al mismo tiempo:
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
Además, cuando se verificaron estos últimos, incluso aquellos fueron bastante interesantes:
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" no es un selector. El uso de nodeName evitaría la programación.
El cuarto vino cuando el nodo volvió a subir. El nodo que tenía un problema era el maestro, por lo que el nodo no iba allí (pero muestra que el nodo no se encontró en 3 eventos anteriores). Lo interesante del cuarto evento es que todavía falta información de un nodo. El evento dice que hay 0/9 nodos disponibles, pero la descripción se proporciona solo de 8.
¿Está diciendo que la razón por la que el pod no debería haberse programado en el nodo faltante es porque era un maestro?
Estamos viendo 8 node(s) didn't match node selector
yendo a 7. Supongo que no se eliminaron nodos en este punto, ¿correcto?
"nodeName" no es un selector. El uso de nodeName evitaría la programación.
El intento de "NodeName" fue resaltar, ese nodo es utilizable y el pod llega allí si se desea. Entonces, la cuestión no es la incapacidad del nodo para iniciar pods.
El cuarto vino cuando el nodo volvió a subir. El nodo que tenía un problema era el maestro, por lo que el nodo no iba allí (pero muestra que el nodo no se encontró en 3 eventos anteriores). Lo interesante del cuarto evento es que todavía falta información de un nodo. El evento dice que hay 0/9 nodos disponibles, pero la descripción se proporciona solo de 8.
¿Está diciendo que la razón por la que el pod no debería haberse programado en el nodo faltante es porque era un maestro?
Estamos viendo
8 node(s) didn't match node selector
yendo a 7. Supongo que no se eliminaron nodos en este punto, ¿correcto?
El grupo de prueba tiene 9 nodos; 3 maestros y 6 trabajadores. Antes de que el nodo que no funcionaba se iniciara con éxito, los eventos ofrecían información sobre todos los nodos disponibles: 0/8 nodes are available: 8 node(s) didn't match node selector.
. Pero cuando apareció ese nodo que coincidiría con el selector de nodo, el evento dijo 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.
explicación dice que hay 8 que no coinciden, pero no dice nada sobre el noveno (que se reconoció en el evento anterior).
Entonces el estado del evento:
Al final, la cápsula de prueba no se inició en el nodo correspondiente debido a las manchas, pero esa es otra historia (y debería haber sido el caso ya en el primer evento).
El intento de "NodeName" fue resaltar, ese nodo es utilizable y el pod llega allí si se desea. Entonces, la cuestión no es la incapacidad del nodo para iniciar pods.
Tenga en cuenta que nada protege contra el compromiso excesivo de un nodo, excepto el planificador. Entonces esto realmente no muestra mucho.
Al final, la cápsula de prueba no se inició en el nodo correspondiente debido a las manchas, pero esa es otra historia (y debería haber sido el caso ya en el primer evento).
Mi pregunta es: ¿el noveno nodo estaba contaminado desde el principio? Estoy tratando de buscar (1) pasos reproducibles para alcanzar el estado o (2) donde podría estar el error.
Mi pregunta es: ¿el noveno nodo estaba contaminado desde el principio? Estoy tratando de buscar (1) pasos reproducibles para alcanzar el estado o (2) donde podría estar el error.
Sí, la mancha estuvo allí todo el tiempo en este caso, ya que el nodo no receptor era el maestro. Pero hemos visto el mismo problema tanto en los amos como en los trabajadores.
Todavía no tengo idea de dónde proviene el problema, solo que al menos la recreación del nodo y el reinicio del nodo parecen estar solucionando el problema. Pero esas son formas un poco "difíciles" de arreglar las cosas.
Es una posibilidad remota, pero si te encuentras con él nuevamente ... ¿podrías verificar si hay alguna cápsula nominada en el nodo que no aparece?
Estoy publicando preguntas mientras pienso en posibles escenarios:
* Do you have other master nodes in your cluster?
Todos los clústeres tienen 3 maestros (por lo que reiniciarlos es fácil)
* Do you have extenders?
No.
Hoy noté algo interesante: tenía un clúster en el que un maestro no recibía el pod de DaemonSet. Tenemos ChaosMonkey en uso, que finalizó uno de los nodos de trabajo. Eso es interesante, esto hizo que la cápsula fuera al maestro que no la estaba recibiendo antes. Entonces, de alguna manera, la eliminación de otro nodo que no sea el problemático parecía estar solucionando el problema en ese punto.
Debido a ese "arreglo", tengo que esperar a que el problema vuelva a ocurrir para poder responder sobre los grupos nominados.
Estoy confundido ahora ... ¿Tu daemonset tolera la contaminación para los nodos maestros? En otras palabras ... ¿el error para usted es solo el evento de programación o también el hecho de que los pods deberían haber sido programados?
El problema es que el programador no encuentra ese nodo, incluso si hay al menos una configuración de afinidad (o antiafinidad) coincidente.
Es por eso que dije que se esperaba el error de taint y que ya debería haber estado allí en el primer evento (ya que la taint no es parte de los criterios de afinidad)
Entendido. Estaba intentando confirmar tu configuración para asegurarme de que no me falta nada.
No creo que el planificador "no vea" el nodo. Dado que vemos 0/9 nodes are available
, podemos concluir que el nodo está en la caché. Es más como si el motivo no programable se perdiera en algún lugar, por lo que no lo incluimos en el evento.
Es cierto que el recuento total coincide siempre con el recuento real de nodos. No se proporciona un texto de evento más descriptivo en todos los nodos, pero ese puede ser un problema separado como mencionó.
¿Puede ver los registros de su programador de kube? ¿Algo que parezca relevante?
Creo que @zetaab intentó buscar eso sin éxito. Puedo intentarlo cuando el problema vuelva a ocurrir (así como la cosa de la cápsula nominada que se preguntó anteriormente)
Si es posible, ejecute también 1.18.5, en caso de que solucionemos el problema sin darnos cuenta.
Puedo reproducir esto de manera confiable en mi grupo de prueba si necesita más registros
@dilyevsky Comparte los pasos de reproducción. ¿Puede identificar de alguna manera cuál es el filtro que está fallando?
Parece ser solo el metadata.name del nodo para el pod ds ... raro. Aquí está el 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 forma en que reproduzco esto es girando un nuevo clúster con 3 maestros y 3 nodos de trabajo (usando Cluster API) y aplicando Cilium 1.7.6:
Cilium yaml:
---
# 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
Aquí está el registro del programador:
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
Después de reiniciar los pods del programador, el pod pendiente se programa inmediatamente.
¿Qué eventos de pod obtienes? ¿Sabes si hay taints en el nodo?
¿Dónde no está programado? ¿Solo falla para los nodos maestros o cualquier
nodos? ¿Hay suficiente espacio en el nodo?
El jueves 9 de julio de 2020 a las 7:49 pm dilyevsky, [email protected]
escribió:
Parece ser solo el metadata.name del nodo para el pod ds ...
extraño. Aquí está el pod yaml:apiVersion: v1kind: Podmetadata:
anotaciones:
Scheduler.alpha.kubernetes.io/critical-pod: ""
creationTimestamp: "2020-07-09T23: 17: 53Z"
generateName: cilium-
etiquetas:
controlador-revisión-hash: 6c94db8bb8
k8s-app: cilium
pod-template-generation: "1"
managedFields:
# basura de campos gestionados
nombre: cilium-d5n4f
espacio de nombres: kube-system
propietarioReferencias:
- apiVersion: aplicaciones / v1
blockOwnerDeletion: verdadero
controlador: verdadero
tipo: DaemonSet
nombre: cilio
uid: 0f00e8af-eb19-4985-a940-a02fa84fcbc5
resourceVersion: "2840"
selfLink: / api / v1 / namespaces / kube-system / pods / cilium-d5n4f
uid: e3f7d566-ee5b-4557-8d1b-f0964cde2f22spec:
afinidad:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchFields:
- clave: metadata.name
operador: En
valores:
- us-central1-dilyevsky-master-qmwnl
contenedores:- argumentos:
- --config-dir = / tmp / cilium / config-map
mando:- agente de cilio
env:- nombre: K8S_NODE_NAME
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: spec.nodeName- nombre: CILIUM_K8S_NAMESPACE
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: metadata.namespace- nombre: CILIUM_FLANNEL_MASTER_DEVICE
valueFrom:
configMapKeyRef:
clave: franela-dispositivo-maestro
nombre: cilium-config
opcional: verdadero- nombre: CILIUM_FLANNEL_UNINSTALL_ON_EXIT
valueFrom:
configMapKeyRef:
clave: franela-desinstalar-al-salir
nombre: cilium-config
opcional: verdadero- nombre: CILIUM_CLUSTERMESH_CONFIG
valor: / var / lib / cilium / clustermesh /- nombre: CILIUM_CNI_CHAINING_MODE
valueFrom:
configMapKeyRef:
clave: modo de encadenamiento cni
nombre: cilium-config
opcional: verdadero- nombre: CILIUM_CUSTOM_CNI_CONF
valueFrom:
configMapKeyRef:
clave: custom-cni-conf
nombre: cilium-config
opcional: verdadero
imagen: docker.io/cilium/ cilium: v1.7.6
imagePullPolicy: IfNotPresent
ciclo vital:
postStart:
ejecutivo:
mando:
- /cni-install.sh
- --enable-debug = falso
preStop:
ejecutivo:
mando:- /cni-uninstall.sh
livenessProbe:
ejecutivo:
mando:
- cilio
- estado
- --breve
FailThreshold: 10
initialDelaySeconds: 120
periodSeconds: 30
successThreshold: 1
timeoutSeconds: 5
nombre: cilio-agente
readinessProbe:
ejecutivo:
mando:- cilio
- estado
- --breve
falla Umbral: 3
initialDelaySeconds: 5
periodSeconds: 30
successThreshold: 1
timeoutSeconds: 5
recursos: {}
securityContext:
capacidades:
añadir:- NET_ADMIN
- SYS_MODULE
privilegiado: verdadero
terminationMessagePath: / dev / termination-log
terminationMessagePolicy: Archivo
volumeMounts:- mountPath: / var / run / cilium
nombre: cilium-run- mountPath: / host / opt / cni / bin
nombre: cni-path- mountPath: /host/etc/cni/net.d
nombre: etc-cni-netd- mountPath: / var / lib / cilium / clustermesh
nombre: clustermesh-secrets
readOnly: verdadero- mountPath: / tmp / cilium / config-map
nombre: cilium-config-path
readOnly: verdadero- mountPath: / lib / modules
nombre: lib-modules
readOnly: verdadero- mountPath: /run/xtables.lock
nombre: xtables-lock- mountPath: /var/run/secrets/kubernetes.io/serviceaccount
nombre: cilium-token-j74lr
readOnly: verdadero
dnsPolicy: ClusterFirst
enableServiceLinks: verdadero
hostNetwork: verdadero
initContainers:- mando:
- /init-container.sh
env:- nombre: CILIUM_ALL_STATE
valueFrom:
configMapKeyRef:
clave: estado de cilio limpio
nombre: cilium-config
opcional: verdadero- nombre: CILIUM_BPF_STATE
valueFrom:
configMapKeyRef:
clave: clean-cilium-bpf-state
nombre: cilium-config
opcional: verdadero- nombre: CILIUM_WAIT_BPF_MOUNT
valueFrom:
configMapKeyRef:
clave: espera-bpf-mount
nombre: cilium-config
opcional: verdadero
imagen: docker.io/cilium/ cilium: v1.7.6
imagePullPolicy: IfNotPresent
nombre: estado de cilio limpio
recursos: {}
securityContext:
capacidades:
añadir:
- NET_ADMIN
privilegiado: verdadero
terminationMessagePath: / dev / termination-log
terminationMessagePolicy: Archivo
volumeMounts:- mountPath: / var / run / cilium
nombre: cilium-run- mountPath: /var/run/secrets/kubernetes.io/serviceaccount
nombre: cilium-token-j74lr
readOnly: verdadero
prioridad: 2000001000
PriorityClassName: sistema-nodo-crítico
reiniciarPolítica: Siempre
SchedulerName: planificador predeterminado
securityContext: {}
serviceAccount: cilium
serviceAccountName: cilium
terminationGracePeriodSeconds: 1
tolerancias:- operador: existe
- efecto: NoExecute
clave: node.kubernetes.io/not-ready
operador: existe- efecto: NoExecute
clave: node.kubernetes.io/unreachable
operador: existe- efecto: NoSchedule
clave: node.kubernetes.io/disk-pressure
operador: existe- efecto: NoSchedule
clave: node.kubernetes.io/memory-pressure
operador: existe- efecto: NoSchedule
clave: node.kubernetes.io/pid-pressure
operador: existe- efecto: NoSchedule
clave: node.kubernetes.io/unschedulable
operador: existe- efecto: NoSchedule
clave: node.kubernetes.io/network-unavailable
operador: existe
volúmenes:- hostPath:
ruta: / var / run / cilium
tipo: DirectoryOrCreate
nombre: cilium-run- hostPath:
ruta: / opt / cni / bin
tipo: DirectoryOrCreate
nombre: cni-path- hostPath:
ruta: /etc/cni/net.d
tipo: DirectoryOrCreate
nombre: etc-cni-netd- hostPath:
ruta: / lib / modules
tipo: ""
nombre: lib-modules- hostPath:
ruta: /run/xtables.lock
tipo: FileOrCreate
nombre: xtables-lock- nombre: clustermesh-secrets
secreto:
defaultMode: 420
opcional: verdadero
secretName: cilium-clustermesh- configMap:
defaultMode: 420
nombre: cilium-config
nombre: cilium-config-path- nombre: cilium-token-j74lr
secreto:
defaultMode: 420
secretName: cilium-token-j74lrstatus:
condiciones:- lastProbeTime: nulo
lastTransitionTime: "2020-07-09T23: 17: 53Z"
mensaje: '0/6 nodos están disponibles: 5 nodos no coinciden con el selector de nodos'.
motivo: no programable
estado: "Falso"
tipo: PodScheduled
fase: Pendiente
qosClass: BestEffortLa forma en que reproduzco esto es girando un nuevo clúster con 2 maestros y
3 nodos de trabajo (usando Cluster API) y aplicando Cilium 1.7.6:--- # Fuente: cilium / charts / agent / templates / serviceaccount.yamlapiVersion: v1kind: ServiceAccountmetadata:
nombre: cilio
espacio de nombres: kube-system
--- # Fuente: cilium / charts / operator / templates / serviceaccount.yamlapiVersion: v1kind: ServiceAccountmetadata:
nombre: cilio-operador
espacio de nombres: kube-system
--- # Fuente: cilium / charts / config / templates / configmap.yamlapiVersion: v1kind: ConfigMapmetadata:
nombre: cilium-config
espacio de nombres: kube-systemdata:# El modo de asignación de identidad selecciona cómo se comparten las identidades entre el cilio
# nodos configurando cómo se almacenan. Las opciones son "crd" o "kvstore".
# - "crd" almacena identidades en kubernetes como CRD (definición de recurso personalizado).
# Estos se pueden consultar con:
# kubectl obtener ciliumid
# - "kvstore" almacena identidades en un kvstore, etcd o cónsul, es decir
# configurado a continuación. Las versiones de Cilium anteriores a 1.6 solo admitían kvstore
# backend. Las actualizaciones de estas versiones anteriores de cilium deberían seguir usando
# el kvstore comentando el modo de asignación de identidad a continuación, o
# configurándolo en "kvstore".
modo de asignación de identidad: crd# Si desea ejecutar cilium en modo de depuración, cambie este valor a verdadero
debug: "falso"# Habilite el direccionamiento IPv4. Si está habilitado, a todos los puntos finales se les asigna un IPv4
# habla a.
enable-ipv4: "verdadero"# Habilite el direccionamiento IPv6. Si está habilitado, a todos los puntos finales se les asigna un IPv6
# habla a.
enable-ipv6: "falso"# Si desea que el monitor de cilio agregue el seguimiento de los paquetes, establezca este nivel
# a "bajo", "medio" o "máximo". Cuanto mayor sea el nivel, menos paquetes
# que se verá en la salida del monitor.
monitorización-agregación: media# El intervalo de agregación del monitor rige el tiempo típico entre monitorización
# eventos de notificación para cada conexión permitida.
#
# Solo es efectivo cuando la agregación de monitores se establece en "media" o superior.
intervalo de agregación del monitor: 5 s# Los indicadores de agregación de monitores determinan qué indicadores de TCP
# primera observación, hace que se generen notificaciones del monitor.
#
# Solo es efectivo cuando la agregación de monitores se establece en "media" o superior.
indicadores-de-agregación-monitor: todos# ct-global-max-entries- * especifica el número máximo de conexiones
# admitido en todos los puntos finales, dividido por protocolo: tcp u otro. Un par
# de mapas usa estos valores para conexiones IPv4 y otro par de mapas
# use estos valores para conexiones IPv6.
#
# Si estos valores se modifican, durante el próximo inicio de Cilium el
# el seguimiento de las conexiones en curso puede verse interrumpido. Esto puede conducir a breves
# caídas de políticas o cambios en las decisiones de equilibrio de carga para una conexión.
#
# Para usuarios que actualizan desde Cilium 1.2 o anterior, para minimizar las interrupciones
# durante el proceso de actualización, comente estas opciones.
bpf-ct-global-tcp-max: "524288"
bpf-ct-global-any-max: "262144"# bpf-policy-map-max especificó el número máximo de entradas en el punto final
# mapa de políticas (por punto final)
bpf-policy-map-max: "16384"# La preasignación de entradas de mapa permite reducir la latencia por paquete, en
# el gasto de la asignación de memoria inicial para las entradas en los mapas. los
# El valor predeterminado a continuación minimizará el uso de memoria en la instalación predeterminada;
# usuarios que son sensibles a la latencia pueden considerar establecer esto en "verdadero".
#
# Esta opción se introdujo en Cilium 1.4. Cilium 1.3 y anteriores ignoran
# esta opción y se comporta como si estuviera configurada como "verdadera".
#
# Si se modifica este valor, durante el próximo inicio de Cilium, la restauración
Es posible que se interrumpa el número de puntos finales existentes y el seguimiento de las conexiones en curso.
# Esto puede dar lugar a caídas de políticas o un cambio en las decisiones de equilibrio de carga para un
# conexión durante algún tiempo. Es posible que sea necesario volver a crear los puntos finales para restaurarlos
# conectividad.
#
# Si esta opción se establece en "falso" durante una actualización de 1.3 o anterior a
# 1.4 o posterior, entonces puede causar interrupciones únicas durante la actualización.
preallocate-bpf-maps: "falso"# Expresiones regulares que coinciden con Istio sidecar istio-proxy compatibles
# nombres de imágenes de contenedores
sidecar-istio-proxy-image: "cilium / istio_proxy"# Modo de encapsulación para comunicación entre nodos
# Valores posibles:
# - discapacitado
# - vxlan (predeterminado)
# - geneve
túnel: vxlan# Nombre del clúster. Solo es relevante cuando se construye una malla de clústeres.
nombre-clúster: predeterminado# DNS Polling emite periódicamente una búsqueda de DNS para cada
matchName
de
# agente de cilio. El resultado se utiliza para regenerar la política de punto final.
# Las búsquedas de DNS se repiten con un intervalo de 5 segundos y están hechas para
# Direcciones A (IPv4) y AAAA (IPv6). Si falla una búsqueda, la IP más reciente
En su lugar, se utilizan # datos. Un cambio de IP desencadenará una regeneración del Cilium
# política para cada punto final e incrementar la política de agente por cilio
# revisión del repositorio.
#
# Esta opción está deshabilitada por defecto a partir de la versión 1.4.x a favor
N.º de una implementación basada en proxy DNS más potente, consulte [0] para obtener más detalles.
# Habilite esta opción si desea usar políticas FQDN pero no desea usar
# el proxy DNS.
#
# Para facilitar la actualización, los usuarios pueden optar por establecer esta opción en "verdadero".
# De lo contrario, consulte la Guía de actualización [1] que explica cómo
# preparar reglas de política para la actualización.
#
# [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: "falso"# wait-bpf-mount hace que el contenedor init espere hasta que se monte el sistema de archivos bpf
wait-bpf-mount: "falso"mascarada: "verdadero"
enable-xt-socket-fallback: "verdadero"
install-iptables-rules: "verdadero"
rutas-de-nodo-directo-automático: "falso"
kube-proxy-replacement: "sonda"
enable-host-reachable-services: "falso"
enable-external-ips: "falso"
enable-node-port: "falso"
protección de enlace de puerto de nodo: "verdadero"
enable-auto-protect-node-port-range: "verdadero"
enable-endpoint-health-check: "verdadero"
enable-well-known-identities: "false"
enable-remote-node-identity: "verdadero"
--- # Fuente: cilium / charts / agent / templates / clusterrole.yamlapi Versión: rbac.authorization.k8s.io/v1kind: ClusterRolemetadata:
nombre: ciliumrules:
- apiGroups:
- networking.k8s.io
recursos:- políticas de red
verbos:- obtener
- lista
- reloj
- apiGroups:
- discovery.k8s.io
recursos:- rebanadas
verbos:- obtener
- lista
- reloj
- apiGroups:
- ""
recursos:- espacios de nombres
- servicios
- nodos
- puntos finales
verbos:- obtener
- lista
- reloj
- apiGroups:
- ""
recursos:- vainas
- nodos
verbos:- obtener
- lista
- reloj
- actualizar
- apiGroups:
- ""
recursos:- nodos
- nodos / estado
verbos:- parche
- apiGroups:
- apiextensions.k8s.io
recursos:- definiciones de recursos personalizados
verbos:- crear
- obtener
- lista
- reloj
- actualizar
- apiGroups:
- cilium.io
recursos:- políticas de red de cilios
- ciliumnetworkpolicies / status
- ciliumclusterwidenetworkpolicies
- ciliumclusterwidenetworkpolicies / status
- ciliumendpoints
- ciliumendpoints / status
- ciliados
- ciliumnodes / estado
- cilioidentidades
- ciliumidentities / estado
verbos:- '*'
--- # Fuente: cilium / charts / operator / templates / clusterrole.yamlapi Versión: rbac.authorization.k8s.io/v1kind: ClusterRolemetadata:
nombre: cilium-operator reglas:- apiGroups:
- ""
recursos:
# para eliminar automáticamente los pods de dns de [core | kube] para que empiecen a ser
# gestionado por Cilium- vainas
verbos:- obtener
- lista
- reloj
- Eliminar
- apiGroups:
- discovery.k8s.io
recursos:- rebanadas
verbos:- obtener
- lista
- reloj
- apiGroups:
- ""
recursos:
# para leer automáticamente desde k8s e importar el CIDR de la vaina del nodo a cilium's
# etcd para que todos los nodos sepan cómo llegar a otro pod que se ejecuta en una
# nodo.- nodos
# para realizar la traducción de un CNP que contieneToGroup
a sus puntos finales- servicios
- puntos finales
# para comprobar la conectividad de un servidor- espacios de nombres
verbos:- obtener
- lista
- reloj
- apiGroups:
- cilium.io
recursos:- políticas de red de cilios
- ciliumnetworkpolicies / status
- ciliumclusterwidenetworkpolicies
- ciliumclusterwidenetworkpolicies / status
- ciliumendpoints
- ciliumendpoints / status
- ciliados
- ciliumnodes / estado
- cilioidentidades
- ciliumidentities / estado
verbos:- '*'
--- # Fuente: cilium / charts / agent / templates / clusterrolebinding.yamlapi Versión: rbac.authorization.k8s.io/v1kind: ClusterRoleBindingmetadata:
nombre: ciliumroleRef:
apiGroup: rbac.authorization.k8s.io
tipo: ClusterRole
nombre: ciliumsubjects:- tipo: ServiceAccount
nombre: cilio
espacio de nombres: kube-system
--- # Fuente: cilium / charts / operator / templates / clusterrolebinding.yamlapi Versión: rbac.authorization.k8s.io/v1kind: ClusterRoleBindingmetadata:
nombre: cilium-operatorroleRef:
apiGroup: rbac.authorization.k8s.io
tipo: ClusterRole
nombre: cilium-operatorubjects:- tipo: ServiceAccount
nombre: cilio-operador
espacio de nombres: kube-system
--- # Fuente: cilium / charts / agent / templates / daemonset.yamlapi Versión: apps / v1kind: DaemonSetmetadata:
etiquetas:
k8s-app: cilium
nombre: cilio
espacio de nombres: kube-systemspec:
selector:
matchLabels:
k8s-app: cilium
modelo:
metadatos:
anotaciones:
# Esta anotación más la tolerancia CriticalAddonsOnly hace
# cilio para ser una vaina crítica en el grupo, lo que asegura el cilio
# obtiene programación prioritaria.
# https://kubernetes.io/docs/tasks/administer-cluster/guaranteed-scheduling-critical-addon-pods/
Scheduler.alpha.kubernetes.io/critical-pod: ""
etiquetas:
k8s-app: cilium
Especificaciones:
contenedores:
- argumentos:
- --config-dir = / tmp / cilium / config-map
mando:- agente de cilio
livenessProbe:
ejecutivo:
mando:
- cilio
- estado
- --breve
FailThreshold: 10
# El retraso inicial para la sonda de actividad es intencionalmente grande para
# evite un ciclo interminable de apagado y reinicio si en el caso de que el
# bootstrapping tarda más de lo esperado.
initialDelaySeconds: 120
periodSeconds: 30
successThreshold: 1
timeoutSeconds: 5
readinessProbe:
ejecutivo:
mando:- cilio
- estado
- --breve
falla Umbral: 3
initialDelaySeconds: 5
periodSeconds: 30
successThreshold: 1
timeoutSeconds: 5
env:- nombre: K8S_NODE_NAME
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: spec.nodeName- nombre: CILIUM_K8S_NAMESPACE
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: metadata.namespace- nombre: CILIUM_FLANNEL_MASTER_DEVICE
valueFrom:
configMapKeyRef:
clave: franela-dispositivo-maestro
nombre: cilium-config
opcional: verdadero- nombre: CILIUM_FLANNEL_UNINSTALL_ON_EXIT
valueFrom:
configMapKeyRef:
clave: franela-desinstalar-al-salir
nombre: cilium-config
opcional: verdadero- nombre: CILIUM_CLUSTERMESH_CONFIG
valor: / var / lib / cilium / clustermesh /- nombre: CILIUM_CNI_CHAINING_MODE
valueFrom:
configMapKeyRef:
clave: modo de encadenamiento cni
nombre: cilium-config
opcional: verdadero- nombre: CILIUM_CUSTOM_CNI_CONF
valueFrom:
configMapKeyRef:
clave: custom-cni-conf
nombre: cilium-config
opcional: verdadero
imagen: "docker.io/cilium/ cilium : v1.7.6 "
imagePullPolicy: IfNotPresent
ciclo vital:
postStart:
ejecutivo:
mando:
- "/cni-install.sh"
- "--enable-debug = false"
preStop:
ejecutivo:
mando:- /cni-uninstall.sh
nombre: cilio-agente
securityContext:
capacidades:
añadir:
- NET_ADMIN
- SYS_MODULE
privilegiado: verdadero
volumeMounts:- mountPath: / var / run / cilium
nombre: cilium-run- mountPath: / host / opt / cni / bin
nombre: cni-path- mountPath: /host/etc/cni/net.d
nombre: etc-cni-netd- mountPath: / var / lib / cilium / clustermesh
nombre: clustermesh-secrets
readOnly: verdadero- mountPath: / tmp / cilium / config-map
nombre: cilium-config-path
readOnly: verdadero
# Necesario para poder cargar módulos del kernel- mountPath: / lib / modules
nombre: lib-modules
readOnly: verdadero- mountPath: /run/xtables.lock
nombre: xtables-lock
hostNetwork: verdadero
initContainers:- mando:
- /init-container.sh
env:- nombre: CILIUM_ALL_STATE
valueFrom:
configMapKeyRef:
clave: estado de cilio limpio
nombre: cilium-config
opcional: verdadero- nombre: CILIUM_BPF_STATE
valueFrom:
configMapKeyRef:
clave: clean-cilium-bpf-state
nombre: cilium-config
opcional: verdadero- nombre: CILIUM_WAIT_BPF_MOUNT
valueFrom:
configMapKeyRef:
clave: espera-bpf-mount
nombre: cilium-config
opcional: verdadero
imagen: "docker.io/cilium/ cilium : v1.7.6 "
imagePullPolicy: IfNotPresent
nombre: estado de cilio limpio
securityContext:
capacidades:
añadir:
- NET_ADMIN
privilegiado: verdadero
volumeMounts:- mountPath: / var / run / cilium
nombre: cilium-run
reiniciarPolítica: Siempre
PriorityClassName: sistema-nodo-crítico
serviceAccount: cilium
serviceAccountName: cilium
terminationGracePeriodSeconds: 1
tolerancias:- operador: existe
volúmenes:
# Para mantener el estado entre reinicios / actualizaciones- hostPath:
ruta: / var / run / cilium
tipo: DirectoryOrCreate
nombre: cilium-run
# Para instalar el complemento cilium cni en el host- hostPath:
ruta: / opt / cni / bin
tipo: DirectoryOrCreate
nombre: cni-path
# Para instalar la configuración cni de cilium en el host- hostPath:
ruta: /etc/cni/net.d
tipo: DirectoryOrCreate
nombre: etc-cni-netd
# Para poder cargar módulos del kernel- hostPath:
ruta: / lib / modules
nombre: lib-modules
# Para acceder a iptables al mismo tiempo que otros procesos (por ejemplo, kube-proxy)- hostPath:
ruta: /run/xtables.lock
tipo: FileOrCreate
nombre: xtables-lock
# Para leer la configuración de clustermesh- nombre: clustermesh-secrets
secreto:
defaultMode: 420
opcional: verdadero
secretName: cilium-clustermesh
# Para leer la configuración del mapa de configuración- configMap:
nombre: cilium-config
nombre: cilium-config-path
updateStrategy:
rollingUpdate:
maxUnavailable: 2
tipo: RollingUpdate
--- # Fuente: cilium / charts / operator / templates / deployment.yamlapiVersion: apps / v1kind: Deploymentmetadata:
etiquetas:
io.cilium / app: operador
nombre: cilio-operador
nombre: cilio-operador
espacio de nombres: kube-systemspec:
réplicas: 1
selector:
matchLabels:
io.cilium / app: operador
nombre: cilio-operador
estrategia:
rollingUpdate:
maxSurge: 1
maxUnavailable: 1
tipo: RollingUpdate
modelo:
metadatos:
anotaciones:
etiquetas:
io.cilium / app: operador
nombre: cilio-operador
Especificaciones:
contenedores:- argumentos:
- --debug = $ (CILIUM_DEBUG)
- - modo-asignación-identidad = $ (CILIUM_IDENTITY_ALLOCATION_MODE)
- --synchronize-k8s-nodes = verdadero
mando:- operador de cilio
env:- nombre: CILIUM_K8S_NAMESPACE
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: metadata.namespace- nombre: K8S_NODE_NAME
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: spec.nodeName- nombre: CILIUM_DEBUG
valueFrom:
configMapKeyRef:
clave: depurar
nombre: cilium-config
opcional: verdadero- nombre: CILIUM_CLUSTER_NAME
valueFrom:
configMapKeyRef:
clave: nombre-clúster
nombre: cilium-config
opcional: verdadero- nombre: CILIUM_CLUSTER_ID
valueFrom:
configMapKeyRef:
clave: cluster-id
nombre: cilium-config
opcional: verdadero- nombre: CILIUM_IPAM
valueFrom:
configMapKeyRef:
clave: ipam
nombre: cilium-config
opcional: verdadero- nombre: CILIUM_DISABLE_ENDPOINT_CRD
valueFrom:
configMapKeyRef:
clave: deshabilitar-endpoint-crd
nombre: cilium-config
opcional: verdadero- nombre: CILIUM_KVSTORE
valueFrom:
configMapKeyRef:
clave: kvstore
nombre: cilium-config
opcional: verdadero- nombre: CILIUM_KVSTORE_OPT
valueFrom:
configMapKeyRef:
clave: kvstore-opt
nombre: cilium-config
opcional: verdadero- nombre: AWS_ACCESS_KEY_ID
valueFrom:
secretKeyRef:
clave: AWS_ACCESS_KEY_ID
nombre: cilium-aws
opcional: verdadero- nombre: AWS_SECRET_ACCESS_KEY
valueFrom:
secretKeyRef:
clave: AWS_SECRET_ACCESS_KEY
nombre: cilium-aws
opcional: verdadero- nombre: AWS_DEFAULT_REGION
valueFrom:
secretKeyRef:
clave: AWS_DEFAULT_REGION
nombre: cilium-aws
opcional: verdadero- nombre: CILIUM_IDENTITY_ALLOCATION_MODE
valueFrom:
configMapKeyRef:
clave: modo de asignación de identidad
nombre: cilium-config
opcional: verdadero
imagen: "docker.io/cilium/ operator: v1.7.6 "
imagePullPolicy: IfNotPresent
nombre: cilio-operador
livenessProbe:
httpGet:
anfitrión: '127.0.0.1'
ruta: / healthz
puerto: 9234
esquema: HTTP
initialDelaySeconds: 60
periodSeconds: 10
timeoutSeconds: 3
hostNetwork: verdadero
reiniciarPolítica: Siempre
serviceAccount: cilium-operator
serviceAccountName: cilium-operator-
Está recibiendo esto porque fue asignado.
Responda a este correo electrónico directamente, véalo en GitHub
https://github.com/kubernetes/kubernetes/issues/91601#issuecomment-656404841 ,
o darse de baja
https://github.com/notifications/unsubscribe-auth/AAJ5E6BMTNCADT5K7D4PMF3R2ZJRVANCNFSM4NOTPEDA
.
¿Podría intentar aumentar el nivel de registro y usar grep para filtrar el nodo?
o la vaina?
El jueves 9 de julio de 2020 a las 7:55 pm dilyevsky, [email protected]
escribió:
Aquí está el registro del programador:
I0709 23: 08: 22.056081 1 registry.go: 150] Registro de función de prioridad y predicado EvenPodsSpread
I0709 23: 08: 23.137451 1 serve.go: 313] Certificado en memoria autofirmado generado
W0709 23: 08: 33.843509 1 authentication.go: 297] Error al buscar la configuración de autenticación en el clúster: etcdserver: se agotó el tiempo de espera de la solicitud
W0709 23: 08: 33.843671 1 authentication.go: 298] Continuando sin configuración de autenticación. Esto puede tratar todas las solicitudes como anónimas.
W0709 23: 08: 33.843710 1 authentication.go: 299] Para requerir que la búsqueda de configuración de autenticación sea exitosa, establezca --authentication-tolerate-lookup-failure = false
I0709 23: 08: 33.911805 1 registry.go: 150] Registro de función de prioridad y predicado EvenPodsSpread
I0709 23: 08: 33.911989 1 registry.go: 150] Registro de función de prioridad y predicado EvenPodsSpread
W0709 23: 08: 33.917999 1 autorización.go: 47] La autorización está deshabilitada
W0709 23: 08: 33.918162 1 authentication.go: 40] La autenticación está deshabilitada
I0709 23: 08: 33.918238 1 deprecated_insecure_serving.go: 51] Sirviendo healthz de forma insegura en [::]: 10251
I0709 23: 08: 33.925860 1 configmap_cafile_content.go: 202] Iniciando client-ca :: kube-system :: extension-apiserver-authentication :: client-ca-file
I0709 23: 08: 33.926013 1 shared_informer.go: 223] Esperando que las cachés se sincronicen para client-ca :: kube-system :: extension-apiserver-authentication :: client-ca-file
I0709 23: 08: 33.930685 1 secure_serving.go: 178] Sirviendo de forma segura en 127.0.0.1:10259
I0709 23: 08: 33.936198 1 tlsconfig.go: 240] Iniciando DynamicServingCertificateController
I0709 23: 08: 34.026382 1 shared_informer.go: 230] Los cachés se sincronizan para client-ca :: kube-system :: extension-apiserver-authentication :: client-ca-file
I0709 23: 08: 34.036998 1 leaderelection.go: 242] intentando adquirir el arrendamiento líder kube-system / kube-Scheduler ...
I0709 23: 08: 50.597201 1 leaderelection.go: 252] arrendamiento adquirido con éxito kube-system / kube-planificador
E0709 23: 08: 50.658551 1 factory.go: 503] pod: kube-system / coredns-66bff467f8-9rjvd ya está presente en la cola activa
E0709 23: 12: 27.673854 1 factory.go: 503] pod kube-system / cilium-vv466 ya está presente en la cola de retroceso
E0709 23: 12: 58.099432 1 leaderelection.go: 320] error al recuperar el bloqueo de recursos kube-system / kube-Scheduler: etcdserver: líder cambiadoDespués de reiniciar los pods del programador, el pod pendiente se programa inmediatamente.
-
Está recibiendo esto porque fue asignado.
Responda a este correo electrónico directamente, véalo en GitHub
https://github.com/kubernetes/kubernetes/issues/91601#issuecomment-656406215 ,
o darse de baja
https://github.com/notifications/unsubscribe-auth/AAJ5E6E4QPGNNBFUYSZEJC3R2ZKHDANCNFSM4NOTPEDA
.
Estos son eventos:
`` Eventos:
Escriba el motivo de la antigüedad del mensaje
---- ------ ---- ---- -------
Advertencia fallida
Advertencia fallida
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
Intentaré aumentar el nivel de registro del programador ahora ...
Su pod yaml en realidad no tiene tolerancia node-role.kubernetes.io/master
. Entonces no debería haber sido programado en el maestro.
¡Hola! Nos enfrentamos al mismo problema. Sin embargo, vemos el mismo problema con las implementaciones, donde usamos antiafinidad para asegurarnos de que se programe un pod en cada nodo o un selector de pod que se dirija al nodo específico.
Simplemente crear un pod con un selector de nodo configurado para que coincida con el nombre de host del nodo que falla fue suficiente para hacer que la programación fallara. Decía que 5 nodos no coincidían con el selector, pero nada sobre el sexto. Reiniciar el programador resolvió el problema. Parece que algo se almacena en caché sobre ese nodo e impide la programación en el nodo.
Como dijeron otras personas antes, no tenemos nada en el registro sobre la falla.
Tratamos la implementación fallida al mínimo (habíamos eliminado la mancha en el maestro que falla):
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
Estábamos teniendo el mismo problema cuando el maestro tenía una mancha y el despliegue una tolerancia para la mancha. Por lo tanto, no parece estar relacionado específicamente con conjuntos de demonios, tolerancias o afinidad / antiafinidad. Cuando la falla comienza a ocurrir, no se puede programar nada que se dirija al nodo específico. Vemos el problema en 1.18.2 hasta 1.18.5 (no lo intenté con 1.18.0 o .1)
La simple creación de un pod con un selector de nodo configurado para que coincida con el nombre de host del nodo que falla fue suficiente para hacer que la programación fallara
¿Podría aclarar si comenzó a fallar después de que creó dicho pod o antes? Supongo que este nodo no tenía una mancha que la vaina no tolerara.
@nodo va a ayudar a reproducir. ¿Podrías mirar el código de NodeSelector? Es posible que deba agregar líneas de registro adicionales durante la prueba. También puede imprimir el caché.
$ pidof kube-scheduler
$ sudo kill -SIGUSR2 <pid>
. Tenga en cuenta que esto no matará el proceso del planificador./ prioridad crítica-urgente
/ desasignar
Ya estábamos viendo algunos daemonset y la implementación atascados en "Pendiente" antes de intentar implementar esta implementación de prueba, por lo que ya estaba fallando. y las manchas se habían eliminado del nodo.
En este momento, perdimos el entorno donde estaba sucediendo esto porque tuvimos que reiniciar los nodos para que el problema ya no sea visible. Tan pronto como nos reproduzcamos, intentaremos volver con más información.
Por favor, hazlo. Intenté reproducir esto en el pasado sin éxito. Me interesa más la primera instancia de fracaso. Todavía podría estar relacionado con las corrupciones.
Hemos reproducido el problema. Ejecuté el comando que pediste, aquí está la información:
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:
Desafortunadamente eso no parece ayudar
Vaciar la caché es para depurar, no cambiará nada. ¿Podría incluir el vertedero?
Además, suponiendo que este fue el primer error, ¿podría incluir el pod yaml y el nodo?
eso es prácticamente todo lo que se arrojó, simplemente eliminé los otros nodos. Este no fue el primer error, pero puede ver el pod de coredns en el volcado, ese fue el primero. No estoy seguro de qué más estás pidiendo en el basurero.
Voy a buscar los ñames
Gracias, no me di cuenta de que había recortado el nodo y la vaina correspondientes.
Sin embargo, ¿podría incluir los pods programados para ese nodo? Por si acaso hay un error en los cálculos de uso de recursos.
Requested Resources: {MilliCPU:1100 Memory:52428800 EphemeralStorage:0 AllowedPodNumber:0 ScalarResources:map[]}
Ese AllowedPodNumber: 0
parece extraño.
Aquí están los otros pods en ese nodo:
`
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:
Todos los nodos tienen allowPodNumber establecido en 0 en los recursos solicitados en el volcado, pero los otros nodos son programables
El nodo 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
y la vaina:
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
Muchas gracias por toda la información. @nodo, ¿puedes tomarlo?
También estamos probando con https://github.com/Nordix/kubernetes/commit/5c00cdf195fa61316f963f59e73c6cafc2ad9bdc ahora, para obtener más información
/ayuda
@maelk no dude en tomar esto y enviar un PR si encuentra el error. Es probable que las líneas de registro que agregó sean útiles. De lo contrario, me estoy abriendo a los contribuyentes.
@alculquicondor :
Esta solicitud se ha marcado como que necesita ayuda de un colaborador.
Asegúrese de que la solicitud cumpla con los requisitos enumerados aquí .
Si esta solicitud ya no cumple con estos requisitos, la etiqueta se puede quitar
comentando con el comando /remove-help
.
En respuesta a esto :
/ayuda
@maelk no dude en tomar esto y enviar un PR si encuentra el error. Es probable que las líneas de registro que agregó sean útiles. De lo contrario, me estoy abriendo a los contribuyentes.
Las instrucciones para interactuar conmigo usando comentarios de relaciones públicas están disponibles aquí . Si tiene preguntas o sugerencias relacionadas con mi comportamiento, presente un problema en el repositorio de kubernetes / test-infra .
/asignar
@maelk ¿Hay algo específico sobre el momento en que se produce este problema por primera vez? Por ejemplo, ¿sucede justo después de que se inicia el nodo?
No, hay bastantes pods que se programan allí y funcionan bien. Pero una vez que ocurre el problema, ya no se puede programar.
Reduciendo la prioridad hasta que tengamos un caso reproducible.
Pudimos reproducir el error con un programador que tenía las entradas de registro adicionales. Lo que vemos es que uno de los maestros desaparece por completo de la lista de nodos por los que se itera. Podemos ver que el proceso comienza con los 6 nodos (de la instantánea):
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)}
pero después, podemos ver que itera solo sobre 5 nodos, y luego obtenemos:
I0720 13:58:28.247420 1 generic_scheduler.go:505] pod kube-system/coredns-cd64c8d7c-tcxbq : processed 5 nodes, 0 fit
Entonces uno de los nodos se elimina de la lista de nodos potenciales. Desafortunadamente, no teníamos suficientes registros al comienzo del proceso, pero intentaremos obtener más.
Referencias de código por línea de registro:
@maelk
¿Viste alguna línea para %v/%v on node %v, too many nodes fit
?
De lo contrario, @pancernik , workqueue.ParallelizeUntil(ctx, 16, len(allNodes), checkNode)
?
No, ese registro no apareció. También creo que podría ser que tengamos un problema con la paralelización o que el nodo se haya filtrado antes. Si estaba fallando con un error aquí: https://github.com/Nordix/kubernetes/commit/5c00cdf195fa61316f963f59e73c6cafc2ad9bdc#diff -c237cdd9e4cb201118ca380732d7f361R464 sería visible en los registros de depuración para agregar más entradas específicamente función y la paralelización.
¡Me acabo de dar cuenta de que un nodo está pasando por el filtrado dos veces!
Los registros son:
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)}
Como puede ver, el nodo worker-pool1-60846k0y-Scheduler pasa dos veces por el filtrado
No, ese registro no apareció. También creo que podría ser que tengamos un problema con la paralelización o que el nodo se haya filtrado antes. Si fallaba con un error aquí: Nordix @ 5c00cdf # diff -c237cdd9e4cb201118ca380732d7f361R464 sería visible en los registros afaik, así que intentaré agregar más entradas de depuración específicamente sobre la función y la paralelización.
Sí, un error allí se manifestaría como un Error de programación en los eventos del pod.
¡Me acabo de dar cuenta de que un nodo está pasando por el filtrado dos veces!
Honestamente, no pensaría que la paralelización tiene errores (aún vale la pena verificar), pero esto podría ser una señal de que no pudimos construir la instantánea desde el caché (como vimos en el volcado de caché, el caché es correcto), agregando un nodo dos veces. Dado que los estados son un mapa, entonces tiene sentido que solo "veamos" 5 nodos en la última línea de registro.
Este es el código (consejo de 1,18) https://github.com/kubernetes/kubernetes/blob/ec73e191f47b7992c2f40fadf1389446d6661d6d/pkg/scheduler/internal/cache/cache.go#L203
cc @ ahg-g
Intentaré agregar muchos registros en la parte de caché del programador, específicamente en torno a la adición y actualización de nodos, y alrededor de la instantánea. Sin embargo, desde la última línea de los registros, puede ver que la instantánea es realmente correcta y contiene todos los nodos, por lo que cualquier cosa que suceda parece suceder más adelante, cuando se trabaja en esa instantánea.
caché! = instantánea
La caché es el ser vivo que se actualiza a partir de los eventos. La instantánea se actualiza (desde la caché) antes de cada ciclo de programación para "bloquear" el estado. Agregamos optimizaciones para que este último proceso sea lo más rápido posible. Es posible que el error esté ahí.
¡Gracias @maelk! Esto es muy útil. Sus registros indican que (*nodeinfo.NodeInfo)(0xc000952000)
está duplicado en la lista en https://github.com/Nordix/kubernetes/commit/5c00cdf195fa61316f963f59e73c6cafc2ad9bdc#diff -c237cdd9e4cb201118ca380732d7f361 código paralelo R441 antes de que se ejecute. De hecho, eso significaría que está duplicado antes de que se actualice la instantánea.
En realidad, eso proviene de la instantánea, que sucede antes de este mensaje de registro: https://github.com/Nordix/kubernetes/commit/5c00cdf195fa61316f963f59e73c6cafc2ad9bdc#diff -c237cdd9e4cb201118ca380732d7f361R161. Por lo tanto, parece que el contenido de la instantánea tiene la duplicación, ya que proviene de https://github.com/Nordix/kubernetes/commit/5c00cdf195fa61316f963f59e73c6cafc2ad9bdc#diff -c237cdd9e4cb201118ca380732d7f361R436
Así es. Quiero decir que ya está duplicado antes de que finalice la actualización de la instantánea.
Así es. Quiero decir que ya está duplicado antes de que finalice la actualización de la instantánea.
No, la instantánea se actualiza al inicio del ciclo de programación. El error se produce durante la actualización de la instantánea o antes. Pero el caché es correcto, según el volcado en https://github.com/kubernetes/kubernetes/issues/91601#issuecomment -659465008
EDITAR: lo leí mal, no vi la palabra "termina" :)
La instantánea de actualización de optimización de relaciones públicas se realizó en 1.18: https://github.com/kubernetes/kubernetes/pull/85738 y https://github.com/kubernetes/kubernetes/pull/86919
Me pregunto si el árbol de nodos también tiene registros duplicados.
Me pregunto si el árbol de nodos también tiene registros duplicados.
@maelk, ¿ podría mostrar un volcado de la lista completa de nodos en el caché?
no agregamos / eliminamos elementos de NodeInfoList, creamos la lista completa del árbol o no, así que si hay duplicados, creo que probablemente provengan del árbol.
Solo para aclarar:
1) el clúster tiene 6 nodos (incluidos los maestros)
2) el nodo que se supone que aloja el pod no se examinó en absoluto (no hay una línea de registro que indique eso), lo que puede significar que no está en NodeInfoList en absoluto
3) NodeInfoList tiene 6 nodos, pero uno de ellos está duplicado
Me pregunto si el árbol de nodos también tiene registros duplicados.
@maelk, ¿ podría mostrar un volcado de la lista completa de nodos en el caché?
un volcado de cada árbol de nodos, lista y mapa sería genial.
Trabajaré para conseguirlos. Mientras tanto, una pequeña actualización. Podemos ver en los registros:
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
Y ese es el punto exacto en el que desaparece el nodo faltante. La última aparición en los registros es a las 13:37:24. En la siguiente programación, el nodo faltante desaparece. por lo que parece que el error está en / sigue a la actualización del node_tree. Todos los nodos pasan por esa actualización, es solo que este trabajador 608 es el último en pasar por ella.
Al descargar el caché (con SIGUSR2), los seis nodos se enumeran allí, con los pods ejecutándose en los nodos, sin duplicación ni falta de nodos.
Lo intentaremos de nuevo con una depuración adicional en torno a la funcionalidad de instantánea: https://github.com/Nordix/kubernetes/commit/53279fb06536558f9a91836c771b182791153791
Se eliminó el nodo "worker-pool1-60846k0y-Scheduler" en el grupo "" de NodeTree
Interesante, creo que la eliminación / adición se activa mediante una llamada a updateNode. La clave de zona falta en la eliminación, pero existe en el complemento, por lo que la actualización básicamente agregó las etiquetas de zona y región.
¿Tiene otros registros del programador relacionados con este nodo?
Estamos intentando reproducir el error con el registro añadido. Volveré cuando tenga más información
Trabajaré para conseguirlos. Mientras tanto, una pequeña actualización. Podemos ver en los registros:
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
Señalaré que dicho nodo es el nodo que se repite. @maelk , ¿viste mensajes similares para otros nodos o no
sí, sucedió para todos los nodos, y se espera. la coincidencia es que este nodo en concreto es el último actualizado, y es en ese momento exacto cuando el otro nodo desaparece
¿Obtuviste registros de actualización para el nodo faltante?
¿Obtuviste registros de actualización para el nodo faltante?
lol, estaba escribiendo esta pregunta.
quizás el error es que toda la zona se elimina del árbol antes de eliminar todos los nodos.
Solo para aclarar, no estoy mirando personalmente el código, solo estoy tratando de asegurarme de que tengamos toda la información. Y creo que, con lo que tenemos ahora, deberíamos poder detectar el error. No dude en enviar PR y mucho mejor si puede proporcionar una prueba unitaria que falle.
¿Obtuviste registros de actualización para el nodo faltante?
sí, muestra que la zona está actualizada para ese nodo faltante. Hay una entrada de registro para todos los nodos.
Para ser honesto, todavía no tengo ni idea de la razón del error, pero si podemos acercarnos a averiguarlo, enviaré un PR o pruebas unitarias.
sí, muestra que la zona está actualizada para ese nodo faltante. Hay una entrada de registro para todos los nodos.
Si es así, creo que suponiendo que este "es el punto exacto en el que desaparece el nodo faltante". puede no estar correlacionado. Esperemos los nuevos registros. Sería genial si pudiera compartir todos los registros del programador que obtenga en un archivo.
Lo haré cuando nos reproduzcamos con el nuevo registro. De los existentes, podemos ver que la programación del pod inmediatamente después de esa actualización es la primera en fallar. Pero no da suficiente información para saber qué pasó en el medio, así que estad atentos ...
@maelk ¿Ha visto un mensaje que comienza con snapshot state is not consistent
en los registros del programador?
¿Le sería posible proporcionar registros completos del programador?
no, ese mensaje no está presente. Podría dar un archivo de registro rayado (para evitar la repetición), pero primero esperemos hasta que tengamos la salida con más registros alrededor de la instantánea
Encontré el error. El problema es con la función nodeTree next (), que no devuelve una lista de todos los nodos en algunos casos. https://github.com/kubernetes/kubernetes/blob/release-1.18/pkg/scheduler/internal/cache/node_tree.go#L147
Es visible si agrega lo siguiente aquí: 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"},
},
El principal problema es que cuando agrega un nodo, los índices no están en 0 para algunas de las zonas. Para que esto suceda, debe tener al menos dos zonas, una más corta que la otra y la más larga con un índice no establecido en 0 al llamar a la siguiente función por primera vez.
La solución con la que fui es restablecer el índice antes de llamar a next () la primera vez. Abrí un PR para mostrar mi solución. Por supuesto, está en contra de la versión 1.18, ya que esto es en lo que he estado trabajando, pero es principalmente para discutir cómo solucionarlo (o tal vez arreglar la función next () en sí). Puedo abrir un PR adecuado hacia el maestro y hacer los backports si es necesario después.
Noté el mismo problema con la iteración. Pero no pude vincular eso a un duplicado en la instantánea. ¿Has logrado crear un escenario en el que eso suceda, @maelk?
sí, puedes ejecutarlo en las pruebas unitarias agregando el pequeño código que puse
Ahora estoy trabajando para agregar un caso de prueba para la instantánea, para asegurarme de que se haya probado correctamente.
felicitaciones a
Gracias a todos por depurar este notorio problema. Restablecer el índice antes de crear la lista es seguro, así que creo que deberíamos ir con eso para los parches 1.18 y 1.19, y tener una solución adecuada en la rama maestra.
El propósito de la función next
cambió con la introducción de NodeInfoList, por lo que ciertamente podemos simplificarlo y quizás cambiarlo a toList
, una función que crea una lista desde el árbol y simplemente desde el principio cada vez.
Ahora entiendo el problema: el cálculo de si una zona está agotada o no es incorrecto porque no considera en qué parte de cada zona comenzamos este proceso de "UpdateSnapshot". Y sí, solo sería visible con zonas irregulares.
¡Buen trabajo al detectar esto @maelk!
Creo que tenemos el mismo problema en versiones anteriores. Sin embargo, está oculto por el hecho de que hacemos un pase de árbol cada vez. Mientras que en 1.18 capturamos el resultado hasta que haya cambios en el árbol.
Ahora que la estrategia round-robin está implementada en generic_scheduler.go, podríamos estar bien con simplemente restablecer todos los contadores antes de UpdateSnapshot, como lo está haciendo su RP.
Solo para verificar dos veces @ ahg-g, esto debería estar bien incluso en un clúster donde se agregan / eliminan nuevos nodos todo el tiempo, ¿verdad?
¡Gracias @maelk por descubrir la causa raíz!
El propósito de la siguiente función cambió con la introducción de NodeInfoList, por lo que ciertamente podemos simplificarlo y quizás cambiarlo a toList, una función que crea una lista a partir del árbol y simplemente comienza desde el principio cada vez.
Dado que cache.nodeTree.next()
solo se llama al compilar la instantánea nodeInfoList, creo que también es seguro eliminar los índices (zoneIndex y nodeIndex) de la estructura nodeTree. En su lugar, cree una función nodeIterator()
simple para iterar a través de su zona / nodo de manera rotatoria.
Por cierto: hay un error tipográfico en https://github.com/kubernetes/kubernetes/issues/91601#issuecomment -662663090, el caso debería ser:
{
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]
},
Solo para verificar dos veces @ ahg-g, esto debería estar bien incluso en un clúster donde se agregan / eliminan nuevos nodos todo el tiempo, ¿verdad?
Supongo que está hablando de la lógica en generic_scheduler.go, si es así, no importa mucho si se agregaron o eliminaron nodos, lo principal que debemos evitar es iterar sobre los nodos en el mismo orden cada vez programamos un pod, solo necesitamos una buena aproximación de iterar sobre los nodos en los pods.
Dado que cache.nodeTree.next () solo se llama al compilar la instantánea nodeInfoList, creo que también es seguro eliminar los índices (tanto zoneIndex como nodeIndex) de la estructura nodeTree. En su lugar, cree una función simple nodeIterator () para iterar a través de su zona / nodo de manera rotatoria.
sí, solo necesitamos iterar sobre todas las zonas / nodos en el mismo orden cada vez.
He actualizado el PR con una prueba unitaria para la función que actualiza la lista de instantáneas, específicamente para ese error. También puedo encargarme de refactorizar la función next () para iterar sobre las zonas y nodos sin round robin, eliminando así el problema.
Gracias, suena bien, pero aún deberíamos iterar entre zonas de la misma manera que lo hacemos ahora, es decir, por diseño.
Realmente no entiendo lo que quieres decir aquí. ¿Es así que el orden de los nodos es importante y todavía debemos ir por turnos entre zonas o podemos enumerar todos los nodos de una zona, una zona tras otra? Digamos que tiene dos zonas de dos nodos cada una, ¿en qué orden las espera, o incluso importa en absoluto?
El orden es importante, necesitamos alternar entre zonas al crear la lista. Si tiene dos zonas de dos nodos cada z1: {n11, n12}
y z2: {n21, n22}
, entonces la lista debería ser {n11, n21, n12, n22}
ok, gracias, lo pensaré. Mientras tanto, ¿podemos continuar con la solución rápida? por cierto, algunas pruebas fallan, pero no estoy seguro de cómo se relaciona eso con mi PR
Son copos. Envíe también un parche a la versión 1.18.
OK lo haré. Gracias
{ 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 , ¿quieres decir que esta prueba ignora el 'nodo-5'?
Encontré que después de arreglar el anexo en https://github.com/kubernetes/kubernetes/pull/93516 , el resultado de la prueba todos los nodos se pueden iterar:
{
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"},
},
El nodo 5, 6, 7, 8, 3 se puede iterar.
Perdóname si malinterpretas algo aquí.
sí, fue a propósito, basado en lo que había allí, pero puedo ver cómo esto puede ser críptico, así que es mejor que lo haga para que el anexo se comporte de una manera más clara. Gracias por el parche.
¿Cuánto tiempo atrás cree que estuvo presente este error? 1,17? 1,16? Acabo de ver exactamente el mismo problema en 1.17 en AWS y reiniciar el nodo no programado solucionó el problema.
@judgeaxl ¿ podría proporcionar más detalles? Líneas de registro, volcados de caché, etc. Para que podamos determinar si el problema es el mismo.
Como señalé en https://github.com/kubernetes/kubernetes/issues/91601#issuecomment -662746695, creo que este error estaba presente en versiones anteriores, pero mi opinión es que es transitorio.
@maelk, ¿podrías investigar?
Comparta también la distribución de nodos en las zonas.
@alculquicondor lamentablemente no puedo en este momento. Lo siento.
@alculquicondor lo siento, ya reconstruí el clúster por otras razones, pero puede haber sido un problema de configuración de red relacionado con implementaciones multi-az, y en qué subred se lanzó el nodo defectuoso, así que no me preocuparía por ahora en el contexto de este problema. Si lo vuelvo a notar, lo informaré con mejores detalles. ¡Gracias!
/ retitle Algunos nodos no se consideran en la programación cuando hay un desequilibrio de zona
Comentario más útil
Ahora estoy trabajando para agregar un caso de prueba para la instantánea, para asegurarme de que se haya probado correctamente.