Problèmes connus des clusters Anthos sur Bare Metal

Installation

Incompatibilité du groupe de contrôle v2

Le groupe de contrôle v2 (cgroup v2) n'est pas compatible avec la version 1.6 des clusters Anthos sur Bare Metal. Kubernetes 1.18 n'est pas compatible avec cgroup v2. En outre, Docker n'offre une compatibilité expérimentale qu'à partir de 20.10. systemd est passé à cgroup v2 par défaut dans la version 247.2-2. La présence de /sys/fs/cgroup/cgroup.controllers indique que votre système utilise cgroup v2.

À partir de la version 1.6.2 des clusters Anthos sur Bare Metal, les vérifications préalables permettent de vérifier que cgroup v2 n'est pas utilisé sur la machine du cluster.

Messages d'erreur anodins pendant l'installation

Lors de l'installation du cluster à haute disponibilité (HA), vous pouvez rencontrer des erreurs concernant etcdserver leader change. Ces messages d'erreur sont anodins et peuvent être ignorés.

Lorsque vous utilisez bmctl pour l'installation du cluster, un message de journal Log streamer failed to get BareMetalMachine peut s'afficher à la fin du create-cluster.log. Ce message d'erreur est anodin et peut être ignoré.

En examinant les journaux de création de clusters, vous remarquerez peut-être des défaillances temporaires concernant l'enregistrement des clusters ou l'appel des webhooks. Ces erreurs peuvent être ignorées en toute sécurité, car l'installation effectuera de nouveau ces opérations jusqu'à ce qu'elles aboutissent.

Vérifications préliminaires et identifiants du compte de service

Pour les installations déclenchées par des clusters d'administrateur ou hybrides (autrement dit, des clusters qui n'ont pas été créés avec bmctl, comme les clusters d'utilisateurs), la vérification préalable ne vérifie pas les identifiants du compte de service Google Cloud Platform ou les autorisations qui leur sont associées.

Vérifications préliminaires et autorisation refusée

Lors de l'installation, vous pouvez rencontrer des erreurs concernant /bin/sh: /tmp/disks_check.sh: Permission denied. Ces messages d'erreur surviennent, car /tmp est installé avec l'option noexec. Pour que bmctl fonctionne, vous devez supprimer l'option noexec du point d'installation /tmp.

Créer un espace de travail Cloud Monitoring avant d'afficher les tableaux de bord

Vous devez créer un espace de travail Cloud Monitoring via Google Cloud Console avant de pouvoir afficher les tableaux de bord de surveillance des clusters Anthos sur Bare Metal.

Identifiants par défaut de l'application et bmctl

bmctl utilise les identifiants par défaut de l'application pour valider la valeur d'emplacement de l'opération de cluster dans les spécifications de cluster cluster spec lorsqu'elle n'est pas définie sur global.

Pour que les identifiants par défaut de l'application fonctionne, vous devez faire pointer la variable d'environnement GOOGLE_APPLICATION_CREDENTIALS vers un fichier d'identifiants de compte de service, ou exécuter gcloud auth application-default login.

Ubuntu 20.04 LTS et bmctl

Sur les clusters Anthos sur versions Bare Metal antérieures à 1.8.2, certaines distributions Ubuntu 20.04 LTS avec un noyau Linux plus récent (y compris les images GCP Ubuntu 20.04 LTS sur le noyau 5.8) faisaient passer /proc/sys/net/netfilter/nf_conntrack_max en lecture seule dans les espaces de noms réseau non init. Cela empêche bmctl de définir la taille maximale pour la table de suivi des connexions, ce qui bloque le démarrage du cluster d'amorçage. Une taille de table incorrecte peut entraîner une boucle de plantage du pod kube-proxy du cluster d'amorçage, comme illustré dans l'exemple de journal d'erreurs suivant :

kubectl logs -l k8s-app=kube-proxy -n kube-system --kubeconfig ./bmctl-workspace/.kindkubeconfig
I0624 19:05:08.009565       1 conntrack.go:100] Set sysctl 'net/netfilter/nf_conntrack_max' to 393216
F0624 19:05:08.009646       1 server.go:495] open /proc/sys/net/netfilter/nf_conntrack_max: permission denied

La solution consiste à définir manuellement net/netfilter/nf_conntrack_max sur la valeur requise sur l'hôte : sudo sysctl net.netfilter.nf_conntrack_max=393216 Notez que la valeur requise dépend du nombre de cœurs pour le nœud. Utilisez la commande kubectl logs ci-dessus pour confirmer la valeur souhaitée dans les journaux kube-proxy.

Ce problème est résolu dans les clusters Anthos sur version Bare Metal 1.8.2 et versions ultérieures.

Ubuntu 20.04.3+ LTS et HWE

Ubuntu 20.04.3 a activé le noyau 5.11 dans son package HWE (Hardware Enablement). Les clusters Anthos sur solution Bare Metal version 1.7.x ne sont pas compatibles avec ce noyau. Si vous souhaitez utiliser le noyau 5.11, téléchargez et mettez à jour vers les clusters Anthos sur solution Bare Metal 1.8.0 ou une version ultérieure.

Service Docker

Sur les machines du nœud de cluster, si l'exécutable Docker est présent dans la variable d'environnement PATH, mais que le service Docker n'est pas actif, la vérification préliminaire échoue et renvoie le message Docker service is not active. Pour corriger cette erreur, supprimez Docker ou activez le service Docker.

Containerd requiert /usr/local/bin dans PATH

Les clusters avec l'environnement d'exécution Containerd nécessitent que /usr/local/bin se trouve dans le PATH de l'utilisateur SSH pour que la commande kubeadm init puisse trouver le binaire crictl. Si crictl est introuvable, la création du cluster échoue.

Lorsque vous n'êtes pas connecté en tant qu'utilisateur racine, sudo permet d'exécuter la commande kubeadm init. Le chemin d'accès sudo peut différer du profil racine et peut ne pas contenir /usr/local/bin.

Pour corriger cette erreur, mettez à jour le fichier secure_path dans /etc/sudoers afin d'inclure /usr/local/bin. Vous pouvez également créer un lien symbolique pour crictl dans un autre répertoire /bin.

À partir de la version 1.8.2, les clusters Anthos sur Bar Metal ajoutent /usr/local/bin au chemin d'accès lors de l'exécution de commandes. Toutefois, l'exécution d'un instantané en tant qu'utilisateur non racine contiendra toujours crictl: command not found (qui peut être corrigé par la solution ci-dessus).

Oscillation du niveau de préparation du nœud

Les clusters peuvent parfois présenter un comportement d'oscillation du niveau de préparation des nœuds (l'état des nœuds change rapidement entre Ready et NotReady). Ce comportement est dû à un générateur d'événements de cycle de vie des pods (PLEG) non opérationnel. Le PLEG est un module dans kubelet.

Pour confirmer qu'un PLEG non opérationnel est à l'origine de ce comportement, utilisez la commande journalctl suivante afin de rechercher les entrées de journal PLEG :

journalctl -f | grep -i pleg

Les entrées de journal telles que les suivantes indiquent que le PLEG n'est pas opérationnel :

...
skipping pod synchronization - PLEG is not healthy: pleg was last seen active
3m0.793469
...

Une condition de concurrence runc connue est la cause probable d'un PLEG non opérationnel. Les processus runc bloqués sont un symptôme de la condition de concurrence. Exécutez la commande suivante pour vérifier l'état du processus runc init :

ps aux | grep 'runc init'

Pour résoudre ce problème :

  1. Exécutez les commandes suivantes sur chaque nœud pour installer la dernière version de containerd.io et extraire la dernière version de l'outil de ligne de commande runc :

    Ubuntu

    sudo apt update
    sudo apt install containerd.io
    # Back up current runc
    cp /usr/local/sbin/runc ~/
    sudo cp /usr/bin/runc /usr/local/sbin/runc
    
    # runc version should be > 1.0.0-rc93
    /usr/local/sbin/runc --version
    

    CentOS/RHEL

    sudo dnf install containerd.io
    # Back up current runc
    cp /usr/local/sbin/runc ~/
    sudo cp /usr/bin/runc /usr/local/sbin/runc
    
    # runc version should be > 1.0.0-rc93
    /usr/local/sbin/runc --version
    
  2. Redémarrez le nœud si des processus runc init sont bloqués.

    Vous pouvez également libérer manuellement tous les processus bloqués.

Mises à niveau et mises à jour

Échec de bmctl update cluster si le répertoire .manifests est manquant

Si le répertoire .manifests est supprimé avant l'exécution de bmctl update cluster, la commande échoue avec une erreur semblable à celle-ci:

Error updating cluster resources.: failed to get CRD file .manifests/1.9.0/cluster-operator/base/crd/bases/baremetal.cluster.gke.io_clusters.yaml: open .manifests/1.9.0/cluster-operator/base/crd/bases/baremetal.cluster.gke.io_clusters.yaml: no such file or directory

Vous pouvez résoudre ce problème en exécutant d'abord bmctl check cluster, qui recréera le répertoire .manifests.

Ce problème s'applique aux clusters Anthos sur Bare Metal 1.10 et versions antérieures. Il est résolu dans les versions 1.11 et ultérieures.

Mise à niveau bloquée à error during manifests operations

Dans certains cas, les mises à niveau de cluster échouent et la CLI bmctl ne répond plus. Ce problème peut être causé par une ressource mal mise à jour. Pour savoir si vous êtes concerné par ce problème et le résoudre, procédez comme suit :

  1. Consultez les journaux anthos-cluster-operator et recherchez des erreurs semblables aux entrées suivantes :

    controllers/Cluster "msg"="error during manifests operations" "error"="1 error occurred:
    ...
    {RESOURCE_NAME} is invalid: metadata.resourceVersion: Invalid value: 0x0: must be specified for an update
    

    Ces entrées sont des symptômes d'une ressource mal mise à jour, où {RESOURCE_NAME} est le nom de la ressource problématique.

  2. Si vous trouvez ces erreurs dans vos journaux, utilisez kubectl edit pour supprimer l'annotation kubectl.kubernetes.io/last-applied-configuration de la ressource contenue dans le message de journal.

  3. Enregistrez et appliquez vos modifications à la ressource.

  4. Réessayez d'effectuer la mise à niveau du cluster.

bmctl update ne supprime pas les blocs de maintenance.

La commande bmctl update ne peut ni supprimer ni modifier la section maintenanceBlocks de la configuration des ressources du cluster. Pour en savoir plus, y compris sur les instructions concernant la suppression de nœuds du mode de maintenance, consultez la section Passer des nœuds en mode de maintenance.

La mise à niveau des clusters depuis la version 1.7.5 vers la version 1.7.6 est bloquée

Vous ne pouvez pas mettre à niveau la version 1.7.5 d'Anthos on bare metal vers la version 1.7.6. Ce blocage n'a aucune incidence sur les autres versions d'Anthos clusters on bare metal. Par exemple, vous pouvez faire passer vos clusters d'une version 1.7.4 à une version 1.7.6. Si vous disposez de clusters version 1.7.5, pour obtenir les correctifs des failles de sécurité traités dans la version 1.7.6, vous devez effectuer une mise à niveau vers une version ultérieure lorsqu'elle sera disponible.

Mise à jour depuis la version 1.6.0

La mise à niveau n'est pas disponible dans la release 1.6.0.

Mise à jour de la version 1.7.0 à la version 1.7.x

Lors de la mise à jour de la version 1.7.0 à la version 1.7.x, votre cluster peut rester bloqué sur la mise à jour du nœud du plan de contrôle. Il est possible que MACHINE-IP-machine-upgrade tâches s'exécutent et échouent régulièrement. Ce problème affecte les clusters 1.7.0 sur lesquels :

  • Docker est préinstallé sur les nœuds du plan de contrôle ;
  • containerd est sélectionné comme environnement d'exécution.

Ce problème est dû à la configuration incorrecte du socket CRI par les clusters Anthos sur Bare Metal au lieu de containerd. Pour résoudre ce problème, vous devez définir les identifiants d'extraction d'images pour Docker :

  1. Connectez-vous à Docker :

    docker login gcr.io
    

    Cette opération crée un fichier $HOME/.docker/config.json.

  2. Répertoriez les adresses IP de tous les nœuds du plan de contrôle, séparées par un espace :

    IPs=(NODE_IP1 NODE_IP2 ...)
    
  3. Copiez la configuration Docker sur les nœuds :

    for ip in "${IPs[@]}"; do
      scp $HOME/.docker/config.json USER_NAME@{ip}:docker-config.json
    

    Remplacez USER_NAME par le nom d'utilisateur défini dans le fichier de configuration du cluster d'administrateur.

  4. Définissez les identifiants d'extraction d'images pour Docker :

    ssh USER_NAME@${ip} "sudo mkdir -p /root/.docker && sudo cp docker-config.json /root/.docker/config.json"
    

Limite de mise à niveau des correctifs du cluster d'utilisateur

Les clusters d'utilisateur gérés par un cluster d'administrateur doivent appartenir aux mêmes clusters Anthos sur une version Bare Metal ou inférieure, et dans une version mineure. Par exemple, un cluster d'administrateur de version 1.8.1 (anthosBareMetalVersion: 1.8.1) gérant les clusters d'utilisateurs version 1.7.2 est acceptable, mais les clusters d'utilisateur version 1.6.3 ne font pas l'objet d'une version mineure.

Une limitation de mise à niveau vous empêche de mettre à niveau vos clusters d'utilisateur vers un nouveau correctif de sécurité lorsque le correctif est publié après la version utilisée par le cluster d'administrateur. Par exemple, si votre cluster d'administrateur est à la version 1.8.2, qui a été publiée le 29 juillet 2021, vous ne pouvez pas mettre à niveau vos clusters d'utilisateur vers la version 1.7.3, car elle a été publiée le 16 août 2021.

Le pilote du groupe de contrôle est configuré sur cgroupfs de manière incorrecte

Si vous rencontrez des problèmes liés au pilote du groupe de contrôle (cgroup), cela peut être dû à une configuration incorrecte sur cgroupfs par les clusters Anthos sur Bare Metal, au lieu de systemd.

Pour résoudre ce problème :

  1. Connectez-vous à vos machines et ouvrez /etc/containerd/config.toml.

  2. Sous [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options], ajoutez SystemdCgroup = true :

    ...
       [plugins."io.containerd.grpc.v1.cri".containerd.runtimes]
         [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
           runtime_type = "io.containerd.runc.v2"
           runtime_engine = ""
           runtime_root = ""
           privileged_without_host_devices = false
           base_runtime_spec = ""
           [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
             SystemdCgroup = true
     [plugins."io.containerd.grpc.v1.cri".cni]
       bin_dir = "/opt/cni/bin"
       conf_dir = "/etc/cni/net.d"
       max_conf_num = 1
       conf_template = ""
    ...
    
  3. Enregistrez les modifications et fermez le fichier.

  4. Ouvrir /etc/systemd/system/kubelet.service.d/10-kubeadm.conf

  5. À la fin du fichier, ajoutez --cgroup-driver=systemd --runtime-cgroups=/system.slice/containerd.service :

    [Service]
    Environment="HOME=/root"
    Environment="KUBELET_KUBECONFIG_ARGS=--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf"
    Environment="KUBELET_CONFIG_ARGS=--config=/var/lib/kubelet/config.yaml"
    # This is a file that "kubeadm init" and "kubeadm join" generates at runtime, populating the KUBELET_KUBEADM_ARGS variable dynamically
    EnvironmentFile=-/var/lib/kubelet/kubeadm-flags.env
    # This is a file that the user can use for overrides of the kubelet args as a last resort. Preferably, the user should use
    # the .NodeRegistration.KubeletExtraArgs object in the configuration files instead. KUBELET_EXTRA_ARGS should be sourced from this file.
    EnvironmentFile=-/etc/default/kubelet
    ExecStart=
    ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_ARGS $KUBELET_EXTRA_ARGS --cgroup-driver=systemd --runtime-cgroups=/system.slice/containerd.service
    
  6. Enregistrez les modifications et redémarrez le serveur.

  7. Vérifiez que systemd est le pilote du groupe de contrôle en exécutant la commande suivante :

    systemd-cgls
    

    Vérifiez qu'il existe une section kubepods.slice et que tous les pods se trouvent dans cette section.

Opération

kubeconfig secret overwritten

Lorsqu'elle est exécutée sur des clusters d'utilisateur, la commande bmctl check cluster écrase le secret kubeconfig du cluster d'utilisateur par celui du cluster d'administrateur. L'écrasement du fichier entraîne l'échec des opérations de cluster standards, telles que les mises à jour et les mises à niveau, pour les clusters d'utilisateur concernés. Ce problème s'applique aux versions 1.11.1 et antérieures d'Anthos clusters on bare metal.

Pour déterminer si un cluster d'utilisateur est affecté par ce problème, exécutez la commande suivante :

kubectl --kubeconfig ADMIN_KUBECONFIG get secret -n cluster-USER_CLUSTER_NAME \
    USER_CLUSTER_NAME -kubeconfig  -o json  | jq -r '.data.value'  | base64 -d

Remplacez les éléments suivants :

  • ADMIN_KUBECONFIG : chemin d'accès au fichier kubeconfig du cluster d'administrateur.
  • USER_CLUSTER_NAME : nom du cluster d'utilisateur à vérifier.

Si le nom du cluster dans la sortie (consultez contexts.context.cluster dans l'exemple de sortie suivant) correspond au nom du cluster d'administrateur, le cluster d'utilisateur spécifié est concerné.

user-cluster-kubeconfig  -o json  | jq -r '.data.value'  | base64 -d
apiVersion: v1
clusters:
- cluster:
    certificate-authority-data:LS0tLS1CRU...UtLS0tLQo=
    server: https://10.200.0.6:443
  name: ci-aed78cdeca81874
contexts:
- context:
    cluster: ci-aed78cdeca81874
    user: ci-aed78cdeca81874-admin
  name: ci-aed78cdeca81874-admin@ci-aed78cdeca81874
current-context: ci-aed78cdeca81874-admin@ci-aed78cdeca81874
kind: Config
preferences: {}
users:
- name: ci-aed78cdeca81874-admin
  user:
    client-certificate-data: LS0tLS1CRU...UtLS0tLQo=
    client-key-data: LS0tLS1CRU...0tLS0tCg==

Les étapes suivantes permettent de restaurer une fonction sur un cluster d'utilisateur concerné (USER_CLUSTER_NAME) :

  1. Localisez le fichier kubeconfig du cluster d'utilisateur.

    Les clusters Anthos sur Bare Metal génèrent le fichier kubeconfig sur le poste de travail administrateur lorsque vous créez un cluster. Par défaut, le fichier se trouve dans le répertoire bmctl-workspace/USER_CLUSTER_NAME.

  2. Vérifiez que le fichier kubeconfig du cluster d'utilisateur est correct :

    kubectl get nodes --kubeconfig PATH_TO_GENERATED_FILE
    

    Remplacez PATH_TO_GENERATED_FILE par le chemin d'accès au fichier kubeconfig du cluster d'utilisateur. La réponse renvoie des informations sur les nœuds du cluster d'utilisateur. Vérifiez que les noms de machine sont corrects pour votre cluster.

  3. Exécutez la commande suivante pour supprimer le fichier kubeconfig corrompu dans le cluster d'administrateur :

    kubectl delete secret -n USER_CLUSTER_NAMESPACE USER_CLUSTER_NAME-kubeconfig
    
  4. Exécutez la commande suivante pour enregistrer le secret kubeconfig approprié dans le cluster d'administrateur :

    kubectl create secret generic -n USER_CLUSTER_NAMESPACE USER_CLUSTER_NAME-kubeconfig \
        --from-file=value=PATH_TO_GENERATED_FILE
    

Réinitialisation/Suppression

Compatibilité du cluster utilisateur

Vous ne pouvez pas réinitialiser les clusters d'utilisateur à l'aide de la commande bmctl reset.

Points d'installation et fstab

La réinitialisation ne permet pas de désinstaller les points d'installation dans /mnt/localpv-share/, ni de nettoyer les entrées correspondantes dans /etc/fstab.

Suppression d'un espace de noms

La suppression d'un espace de noms empêche la création de nouvelles ressources dans ce dernier, y compris les tâches permettant de réinitialiser les machines. Lors de la suppression d'un cluster d'utilisateur, vous devez d'abord supprimer l'objet du cluster avant de supprimer son espace de noms. Autrement, les tâches de réinitialisation des machines ne peuvent pas être créées et le processus de suppression ignore l'étape de nettoyage de la machine.

Service containerd

La commande bmctl reset ne supprime aucun fichier de configuration containerd ni fichier binaire. Le service containerd systemd est conservé à l'état opérationnel. La commande supprime les conteneurs qui exécutent des pods programmés sur le nœud.

Sécurité

L'autorité de certification/le certificat du cluster font l'objet d'une rotation lors de la mise à niveau. La rotation à la demande n'est actuellement pas disponible.

Les clusters Anthos sur Bare Metal procèdent automatiquement à la rotation des certificats de diffusion kubelet. Chaque agent de nœud kubelet peut envoyer une demande de signature de certificat (CSR) lorsqu'un certificat arrive à expiration. Un contrôleur dans vos clusters d'administrateur valide et approuve la demande CRS.

Journaux et surveillance

Les journaux de nœuds ne sont pas exportés vers Cloud Logging.

Les journaux de nœuds provenant de nœuds comportant un point (".") dans leur nom ne sont pas exportés vers Cloud Logging. Pour contourner ce problème, suivez les instructions ci-dessous pour ajouter un filtre à la ressource stackdriver-log-forwarder-config afin de permettre à l'opérateur Stackdriver de reconnaître et d'exporter ces journaux.

  1. Effectuez le scaling à la baisse de l'opérateur Stackdriver, stackdriver-operator :

    kubectl --kubeconfig ADMIN_KUBECONFIG -n kube-system scale \
        deploy stackdriver-operator --replicas=0
    
  2. Modifiez le fichier ConfigMap du service de transfert de journaux, stackdriver-log-forwarder-config :

    kubectl --kubeconfig ADMIN_KUBECONFIG -n kube-system edit configmap \
        stackdriver-log-forwarder-config
    
  3. Ajoutez le filtre suivant à la fin de la section input-systemd.conf du fichier ConfigMap :

       [FILTER]
           Name    lua
           Match_Regex   container-runtime|kubelet|node-problem-detector|node-journal
           script  replace_dot.lua
           call    replace
    
     replace_dot.lua: |
       function replace(tag, timestamp, record)
           new_record = record
    
           local local_resource_id_key = "logging.googleapis.com/local_resource_id"
    
           -- Locate the local_resource_id
           local local_resource_id = record[local_resource_id_key]
    
           local first = 1
           local new_local_resource_id = ""
           for s in string.gmatch(local_resource_id, "[^.]+") do
               new_local_resource_id = new_local_resource_id .. s
               if first == 1 then
                   new_local_resource_id = new_local_resource_id .. "."
                   first = 0
               else
                   new_local_resource_id = new_local_resource_id .. "_"
               end
           end
    
           -- Remove the trailing underscore
           new_local_resource_id = new_local_resource_id:sub(1, -2)
           new_record[local_resource_id_key] = new_local_resource_id
           return 1, timestamp, new_record
       end
    
  4. Supprimez tous les pods du service de transfert de journaux :

    kubectl --kubeconfig ADMIN_KUBECONFIG -n kube-system patch daemonset \
        stackdriver-log-forwarder -p \
        '{"spec": {"template": {"spec": {"nodeSelector": {"non-existing": "true"}}}}}'
    

    Vérifiez que les pods stackdriver-log-forwarder sont bien supprimés avant de passer à l'étape suivante.

  5. Déployez un daemonset pour nettoyer toutes les données non traitées dans les tampons en flux continu :

    kubectl --kubeconfig ADMIN_KUBECONFIG -n kube-system apply -f - << EOF
        apiVersion: apps/v1
        kind: DaemonSet
        metadata:
          name: fluent-bit-cleanup
          namespace: kube-system
        spec:
          selector:
            matchLabels:
              app: fluent-bit-cleanup
          template:
            metadata:
              labels:
                app: fluent-bit-cleanup
            spec:
              containers:
              - name: fluent-bit-cleanup
                image: debian:10-slim
                command: ["bash", "-c"]
                args:
                - |
                  rm -rf /var/log/fluent-bit-buffers/
                  echo "Fluent Bit local buffer is cleaned up."
                  sleep 3600
                volumeMounts:
                - name: varlog
                  mountPath: /var/log
                securityContext:
                  privileged: true
              tolerations:
              - key: "CriticalAddonsOnly"
                operator: "Exists"
              - key: node-role.kubernetes.io/master
                effect: NoSchedule
              - key: node-role.gke.io/observability
                effect: NoSchedule
              volumes:
              - name: varlog
                hostPath:
                  path: /var/log
    EOF
    
  6. Vérifiez que le DaemonSet a nettoyé tous les nœuds à l'aide des commandes suivantes.

    kubectl --kubeconfig ADMIN_KUBECONFIG logs -n kube-system \
        -l app=fluent-bit-cleanup | grep "cleaned up" | wc -l
    
    kubectl --kubeconfig ADMIN_KUBECONFIG -n kube-system get pods \
        -l app=fluent-bit-cleanup --no-headers | wc -l
    

    Le résultat des deux commandes doit être égal au numéro de nœud du cluster.

  7. Supprimez le DaemonSet de nettoyage :

    kubectl --kubeconfig ADMIN_KUBECONFIG -n kube-system delete ds fluent-bit-cleanup
    
  8. Redémarrez les pods :

    kubectl --kubeconfig ADMIN_KUBECONFIG -n kube-system patch \
        daemonset stackdriver-log-forwarder --type json \
        -p='[{"op": "remove", "path": "/spec/template/spec/nodeSelector/non-existing"}]'
    

Mise en réseau

Adresse IP source du client avec équilibrage de charge groupé de couche 2

La définition de la règle de trafic externe sur Local peut entraîner des erreurs de routage, telles que No route to host, pour l'équilibrage de charge groupé de couche 2. La règle de trafic externe est définie par défaut sur Cluster (externalTrafficPolicy: Cluster). Avec ce paramètre, Kubernetes gère le trafic à l'échelle du cluster. Les services de type LoadBalancer ou NodePort peuvent utiliser externalTrafficPolicy: Local pour conserver l'adresse IP source du client. Avec ce paramètre, Kubernetes ne gère que le trafic de nœud local.

Si vous souhaitez conserver l'adresse IP source du client, une configuration supplémentaire peut être requise pour s'assurer que les adresses IP des services sont accessibles. Pour plus d'informations sur la configuration, consultez la section Conserver l'adresse IP source du client dans la section "Configurer l'équilibrage de charge groupé".

La modification de firewalld entraîne la suppression des chaînes de règles iptable Cilium

Lorsque vous exécutez des clusters Anthos sur Bare Metal avec firewalld activé sur CentOS ou Red Had Enterprise Linux (RHEL), les modifications apportées à firewalld peuvent supprimer les chaînes Cilium iptables sur le réseau hôte. Les chaînes iptables sont ajoutées par le pod anetd à son démarrage. La perte des chaînes iptables Cilium entraîne la perte de la connectivité réseau en dehors du nœud du pod sur le nœud.

Les modifications apportées à firewalld qui suppriment les chaînes iptables incluent, sans s'y limiter, les éléments suivants :

  • Le redémarrage de firewalld avec systemctl
  • L'actualisation du fichier firewalld avec le client de ligne de commande (firewall-cmd --reload)

Vous pouvez résoudre ce problème de connectivité en redémarrant anetd sur le nœud. Localisez et supprimez le pod anetd à l'aide des commandes suivantes pour redémarrer anetd :

kubectl get pods -n kube-system
kubectl delete pods -n kube-system ANETD_XYZ

Remplacez ANETD_XYZ par le nom du pod anetd.

Échecs de connectivité des pods en raison du délai avant expiration des E/S et du filtrage du chemin d'accès inverse

Les clusters Anthos sur Bare Metal configurent le filtrage du chemin d'accès inverse sur les nœuds pour désactiver la validation source (net.ipv4.conf.all.rp_filter=0). Si le paramètre rp_filter est défini sur 1 ou 2, les pods échouent en raison de délais de communication hors nœud.

L'observation des échecs de connectivité lors de la communication avec les adresses IP du service Kubernetes est un symptôme du problème. Voici quelques exemples d'erreurs que vous pouvez rencontrer :

  • Si tous les pods d'un nœud donné ne communiquent pas avec les adresses IP du service, le pod istiod peut signaler une erreur semblable à celle-ci :

     {"severity":"Error","timestamp":"2021-11-12T17:19:28.907001378Z",
        "message":"watch error in cluster Kubernetes: failed to list *v1.Node:
        Get \"https://172.26.0.1:443/api/v1/nodes?resourceVersion=5  34239\":
        dial tcp 172.26.0.1:443: i/o timeout"}
    
  • Pour l'ensemble daemon localpv qui s'exécute sur chaque nœud, le journal peut afficher un délai d'expiration semblable à celui-ci :

     I1112 17:24:33.191654       1 main.go:128] Could not get node information
    (remaining retries: 2): Get
    https://172.26.0.1:443/api/v1/nodes/NODE_NAME:
    dial tcp 172.26.0.1:443: i/o timeout
    

Le filtrage des chemins inverses est défini à l'aide des fichiers rp_filter du dossier de configuration IPv4 (net/ipv4/conf/all). La commande sysctl stocke les paramètres de filtrage du chemin d'accès inverse dans un fichier de configuration de sécurité réseau, tel que /etc/sysctl.d/60-gce-network-security.conf. La commande sysctl peut remplacer le paramètre de filtrage du chemin inverse.

Pour restaurer la connectivité du pod, redéfinissez net.ipv4.conf.all.rp_filter manuellement sur 0 ou redémarrez le pod anetd pour redéfinir net.ipv4.conf.all.rp_filter sur 0. Pour redémarrer le pod anetd, utilisez les commandes suivantes pour localiser et supprimer le pod anetd. Un nouveau pod anetd démarre à sa place :

kubectl get pods -n kube-system
kubectl delete pods -n kube-system ANETD_XYZ

Remplacez ANETD_XYZ par le nom du pod anetd.

Pour définir net.ipv4.conf.all.rp_filter manuellement, exécutez la commande suivante :

sysctl -w net.ipv4.conf.all.rp_filter = 0

Chevauchement des adresses IP de cluster d'amorçage (genre) et des adresses IP des nœuds de cluster

192.168.122.0/24 et 10.96.0.0/27 sont les CIDR de pod et de service par défaut utilisés par le cluster d'amorçage (genre). Les vérifications préliminaires échouent s'ils chevauchent les adresses IP des machines du nœud de cluster. Pour éviter ce conflit, vous pouvez transmettre les options --bootstrap-cluster-pod-cidr et --bootstrap-cluster-service-cidr à bmctl pour spécifier des valeurs différentes.

Chevauchement d'adresses IP dans différents clusters

Aucune vérification préalable n'est nécessaire pour valider les adresses IP qui se chevauchent dans différents clusters.

Fonctionnalité hostport dans les clusters Anthos sur Bare Metal

La fonctionnalité hostport de ContainerPort n'est actuellement pas disponible.

OS

Échec de la création ou de la mise à niveau du cluster sur CentOS

En décembre 2020, la communauté CentOS et Red Hat ont annoncé l'abandon de CentOS. Le 31 janvier 2022, CentOS 8 est arrivé en fin de vie. En raison de la fin de vie, les dépôts yum ont cessé de fonctionner pour CentOS, ce qui entraîne l'échec des opérations de création et de mise à niveau du cluster. Cela s'applique à toutes les versions compatibles de CentOS et affecte toutes les versions d'Anthos clusters sur solution Bare Metal.

Pour contourner ce problème, exécutez les commandes suivantes pour que votre CentOS utilise un flux d'archive:

sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-Linux-*
sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' \
    /etc/yum.repos.d/CentOS-Linux-*

En tant que solution à long terme, envisagez de migrer vers un autre système d'exploitation compatible, tel que Ubuntu ou RHEL.

Limites des points de terminaison du système d'exploitation

Sur RHEL et CentOS, une limite de 100 000 points de terminaison est définie au niveau du cluster. Ce nombre correspond à la somme de tous les pods référencés par un service Kubernetes. Si deux services font référence au même ensemble de pods, cela compte comme deux ensembles de points de terminaison distincts. Cette limite est due à la mise en œuvre sous-jacente de nftable sur RHEL et CentOS. Il ne s'agit pas d'une limite intrinsèque des clusters Anthos sur bare metal.

Configuration

Spécifications du plan de contrôle et de l'équilibreur de charge

Les spécifications du pool de nœuds d'équilibreur de charge et du plan de contrôle sont spéciales. Ces spécifications déclarent et contrôlent les ressources critiques du cluster. La source canonique de ces ressources correspond à leurs sections respectives dans le fichier de configuration du cluster :

  • spec.controlPlane.nodePoolSpec
  • spec.LoadBalancer.nodePoolSpec

Par conséquent, ne modifiez pas directement les ressources de premier niveau du pool de nœuds d'équilibreur de charge et du plan de contrôle. Modifiez plutôt les sections associées dans le fichier de configuration du cluster.

Champs modifiables dans la spécification du cluster et du pool de nœuds

Actuellement, seuls les champs de spécification de cluster et de pool de nœuds suivants dans le fichier de configuration de cluster peuvent être mis à jour après la création du cluster (il s'agit de champs modifiables) :

  • Pour l'objet Cluster (kind: Cluster), les champs suivants sont modifiables :

    • spec.anthosBareMetalVersion
    • spec.bypassPreflightCheck
    • spec.controlPlane.nodePoolSpec.nodes
    • spec.loadBalancer.nodePoolSpec.nodes
    • spec.maintenanceBlocks
    • spec.nodeAccess.loginUser
  • Pour l'objet NodePool (kind: NodePool), les champs suivants sont modifiables :

    • spec.nodes

Instantanés

Prendre un instantané en tant qu'utilisateur de connexion non racine

Pour Anthos clusters on bare metal 1.8.1 et versions antérieures, si vous n'êtes pas connecté en tant qu'utilisateur racine, vous ne pouvez pas prendre d'instantané de cluster à l'aide de la commande bmctl. À partir de la version 1.8.2, Anthos clusters on bare metal respecte la valeur nodeAccess.loginUser dans la spécification de cluster. Si le cluster d'administrateur est inaccessible, vous pouvez spécifier l'utilisateur de connexion à l'aide de l'option --login-user.

Notez que si vous utilisez containerd en tant qu'environnement d'exécution de conteneur, l'instantané ne parvient toujours pas à exécuter les commandes crictl. Consultez la section Containerd nécessite /usr/local/bin dans PATH pour obtenir une solution de contournement. Les paramètres PATH utilisés pour SUDO sont à l'origine de ce problème.

GKE Connect

Pod gke-connect-agent en boucle de plantage

Une utilisation intensive de la passerelle GKE Connect peut parfois entraîner des problèmes de mémoire saturée pour le pod gke-connect-agent. Les symptômes de ces problèmes de mémoire saturée sont les suivants :

  • Le pod gke-connect-agent affiche un grand nombre de redémarrages ou se retrouve en état de boucle de plantage.
  • La passerelle de connexion cesse de fonctionner.

Pour résoudre ce problème de mémoire saturée, modifiez le déploiement avec le préfixe gke-connect-agent sous l'espace de noms gke-connect et augmentez la limite de mémoire jusqu'à 256 Mio ou plus.

kubectl patch deploy $(kubectl get deploy -l app=gke-connect-agent -n gke-connect -o jsonpath='{.items[0].metadata.name}') -n gke-connect --patch '{"spec":{"containers":[{"resources":{"limits":{"memory":"256Mi"}}}]}}'

Ce problème est résolu dans les clusters Anthos sur Bare Metal 1.8.2 et versions ultérieures.