2 votes

coredns ne peut pas démarrer en utilisant crio et avec selinux activé

Je sais que cette question est posée de nombreuses fois, mais tout ce qui concerne docker, cette fois-ci c'est crio.

CentOS Linux release 7.6
CRI-O Version: 1.16.1
Kubernetes: v1.16.3
KubeAdm: v1.16.3

Les pods CoreDNS sont dans l'état Error/CrashLoopBackOff, et audit.log montre que selinux empêche CoreDNS de lire dans /var/lib/kubelet/container_id/volumes/.

type=AVC msg=audit(1576203392.727:1431): avc: denied { read } for pid=15866 comm="coredns" name="Corefile" dev="dm-0" ino=35369330 scontext=system_u:system_r:container_t:s0:c307,c586 tcontext=system_u:object_r:var_lib_t:s0 tclass=file permissive=1

type=AVC msg=audit(1576203392.727:1431): avc: denied { open } for pid=15866 comm="coredns" path="/etc/coredns/..2019_12_13_02_13_30.965446608/Corefile" dev="dm-0" ino=35369330 scontext=system_u:system_r:container_t:s0:c307,c586 tcontext=system_u:object_r:var_lib_t:s0 tclass=file permissive=1

type=AVC msg=audit(1576203393.049:1432): avc: denied { open } for pid=15866 comm="coredns" path="/var/run/secrets/kubernetes.io/serviceaccount/..2019_12_13_02_13_30.605147375/token" dev="tmpfs" ino=124481 scontext=system_u:system_r:container_t:s0:c307,c586 tcontext=system_u:object_r:tmpfs_t:s0 tclass=file permissive=1

Si j'utilise un docker plus récent que la version 1.7, cela fonctionne bien, je suppose que cela peut être lié au patch de montage de volume avec l'option z/Z.

Je peux ajouter une politique comme en dessous, mais cela compromettra la sécurité.

module coredns 0.1;

require {
  type tmpfs_t;
  type container_t;
  type var_lib_t;

  class file { open read };
}

allow container_t tmpfs_t:file open;
allow container_t var_lib_t:file { open read };

Une meilleure solution existe-t-elle ? comme docker, avec un peu d'efforts et sans compromettre la sécurité.

2voto

rhatdan Points 154

Sur l'hôte, procédez comme suit

chcon -R -t fichier_conteneur_t /var/lib/kubelet/container_id/volumes

Cela modifiera l'étiquette sur les volumes de l'hôte pour qu'ils soient accessibles par l'étiquette SELinux des conteneurs.

Je ne connais pas de bonne façon de gérer la transmission des secrets. Mais en ajoutant le

autorise container_t tmpfs_t:file open ;

Ce serait probablement la meilleure solution.

Dans OpenShift, tout cela est géré automatiquement, je crois. Bien que je ne travaille pas à ce niveau de la pile.

2voto

Dawid Kruk Points 4851

Je me suis penché sur la question et il semble que le problème se situe au niveau de version de kubelet . Permettez-moi de développer ce point :

Les volumes SELinux ne sont pas réétiquetés dans la version 1.16 - Ce lien fournit plus de détails sur la question.

J'ai essayé de reproduire ce problème de coredns sur différentes versions de Kubernetes.

Le problème apparaît à partir de la version 1.16. Il semble fonctionner correctement avec SELinux activé sur la version 1.15.6.

Pour que cela fonctionne, vous aurez besoin d'un environnement CentOS et CRI-O fonctionnel.

Version CRI-O :

Version:  0.1.0
RuntimeName:  cri-o
RuntimeVersion:  1.16.2
RuntimeApiVersion:  v1alpha1

Pour déployer cette infrastructure, j'ai suivi ce site pour l'essentiel : KubeVirt

Kubernetes v1.15.7

Étapes de la reproduction :

  • Désactiver SELinux et redémarrer la machine :
    • $ setenforce 0
    • $ sed -i s/^SELINUX=.*$/SELINUX=disabled/ /etc/selinux/config
    • $ reboot
  • Vérifier si SELinux est désactivé en invoquant la commande : $ sestatus
  • Installer les paquets avec $ yum install INSERT_PACKAGES_BELOW
    • kubelet-1.15.7-0.x86_64
    • kubeadm-1.15.7-0.x86_64
    • kubectl-1.15.7-0.x86_64
  • Initialiser le cluster Kubernetes avec la commande suivante $ kubeadm init --pod-network-cidr=10.244.0.0/16
  • Attendez que le cluster s'initialise correctement et suivez les instructions de kubeadm pour vous connecter au cluster.
  • Appliquer la flanelle CNI $ kubectl apply -f https://github.com/coreos/flannel/raw/master/Documentation/kube-flannel.yml

Vérifier que les pods coredns fonctionnent correctement avec la commande : $ kubectl get pods -A

Le résultat devrait être similaire à celui-ci :

NAMESPACE     NAME                                         READY   STATUS    RESTARTS   AGE
kube-system   coredns-5c98db65d4-2c7lt                     1/1     Running   2          7m59s
kube-system   coredns-5c98db65d4-5dp9s                     1/1     Running   2          7m59s
kube-system   etcd-centos-kube-master                      1/1     Running   2          7m20s
kube-system   kube-apiserver-centos-kube-master            1/1     Running   2          7m4s
kube-system   kube-controller-manager-centos-kube-master   1/1     Running   2          6m55s
kube-system   kube-flannel-ds-amd64-mzh27                  1/1     Running   2          7m14s
kube-system   kube-proxy-bqll8                             1/1     Running   2          7m58s
kube-system   kube-scheduler-centos-kube-master            1/1     Running   2          6m58s

Pods Coredns dans un cluster kubernetes avec SELinux désactivé fonctionnent correctement.

Activer SELinux :

À partir du compte racine, invoquez les commandes pour activer SELinux et redémarrer la machine :

  • $ setenforce 1
  • $ sed -i s/^SELINUX=.*$/SELINUX=enforcing/ /etc/selinux/config
  • $ reboot

Vérifiez que les pods coredns fonctionnent correctement. Ils doivent ne pas obtenir l'erreur crashloopbackoff en cours d'exécution : kubectl get pods -A

Kubernetes v1.16.4

Étapes de la reproduction :

  • Exécuter $ kubeadm reset si elle provient d'une autre version
  • Supprimez les anciens paquets Kubernetes avec $ yum remove OLD_PACKAGES
  • Désactiver SELinux et redémarrer la machine :
    • $ setenforce 0
    • $ sed -i s/^SELINUX=.*$/SELINUX=disabled/ /etc/selinux/config
    • $ reboot
  • Vérifier si SELinux est désactivé en invoquant la commande : $ sestatus
  • Installer les paquets avec $ yum install INSERT_PACKAGES_BELOW
    • kubelet-1.16.4-0.x86_64
    • kubeadm-1.16.4-0.x86_64
    • kubectl-1.16.4-0.x86_64
  • Initialiser le cluster Kubernetes avec la commande suivante $ kubeadm init --pod-network-cidr=10.244.0.0/16
  • Attendez que le cluster s'initialise correctement et suivez les instructions de kubeadm pour vous connecter au cluster.
  • Appliquer la flanelle CNI $ kubectl apply -f https://github.com/coreos/flannel/raw/master/Documentation/kube-flannel.yml

Vérifier si les pods coredns fonctionnent correctement avec la commande : $ kubectl get pods -A

Le résultat devrait être similaire à celui-ci :

NAMESPACE     NAME                                         READY   STATUS             RESTARTS   AGE
kube-system   coredns-5644d7b6d9-fgbkl                     1/1     Running            1          13m
kube-system   coredns-5644d7b6d9-x6h4l                     1/1     Running            1          13m
kube-system   etcd-centos-kube-master                      1/1     Running            1          12m
kube-system   kube-apiserver-centos-kube-master            1/1     Running            1          12m
kube-system   kube-controller-manager-centos-kube-master   1/1     Running            1          12m
kube-system   kube-proxy-v52ls                             1/1     Running            1          13m
kube-system   kube-scheduler-centos-kube-master            1/1     Running            1          12m

Activer SELinux :

À partir du compte racine, invoquez les commandes pour activer SELinux et redémarrer la machine :

  • $ setenforce 1
  • $ sed -i s/^SELINUX=.*$/SELINUX=enforcing/ /etc/selinux/config
  • $ reboot

Après le redémarrage, les pods coredns doit entrer dans l'état crashloopbackoff comme indiqué ci-dessous :

NAMESPACE     NAME                                         READY   STATUS             RESTARTS   AGE
kube-system   coredns-5644d7b6d9-fgbkl                     0/1     CrashLoopBackOff   25         113m
kube-system   coredns-5644d7b6d9-x6h4l                     0/1     CrashLoopBackOff   25         113m
kube-system   etcd-centos-kube-master                      1/1     Running            1          112m
kube-system   kube-apiserver-centos-kube-master            1/1     Running            1          112m
kube-system   kube-controller-manager-centos-kube-master   1/1     Running            1          112m
kube-system   kube-proxy-v52ls                             1/1     Running            1          113m
kube-system   kube-scheduler-centos-kube-master            1/1     Running            1          112m

Journaux du pod coredns-5644d7b6d9-fgbkl spectacle :

plugin/kubernetes: open /var/run/secrets/kubernetes.io/serviceaccount/token: permission denied

0voto

Cyron Points 31

Je l'ai fait par la commande en dessous.

semanage fcontext -a -t container_file_t "/var/lib/kubelet/pods/pod_id/volumes(/.*)?"
restorecon -R -v /var/lib/kubelet/pods/pod_id/

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X