coredns не запускается при использовании crio и с selinux на

Я знаю, что этот вопрос задают много раз, но на этот раз все о докере - это крио.

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

Модули CoreDNS находятся в состоянии Error/CrashLoopBackOff, а audit.log показывает, что selinux не позволяет CoreDNS читать из /var/lib/kubelet/container_id/volume /.

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

Если я использую докер новее 1.7, он работает нормально, я предполагаю, что это может быть связано с патчем для монтирования тома с опцией z/Z.

Я могу добавить политику, как показано ниже, но это поставит под угрозу безопасность.

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 };

есть ли лучшее решение? точно так же, как docker, с небольшими усилиями и без ущерба для безопасности.

3 ответа

Я изучил это и похоже, что проблема кроется в версии kubelet. Позвольте мне подробнее остановиться на этом:

Тома SELinux не перемаркированы в 1.16 - эта ссылка предоставляет более подробную информацию о проблеме.

Я пытался воспроизвести эту проблему coredns на разных версиях Kubernetes.

Проблема отображается в версии 1.16 и новее. Кажется, работает правильно с включенным SELinux в версии 1.15.6.

Для этого вам понадобится рабочая среда CentOS и CRI-O.

Версия CRI-O:

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

Чтобы развернуть эту инфраструктуру, я в основном следил за этим сайтом: KubeVirt

Kubernetes v1.15.7

Шаги по воспроизведению:

  • Отключите SELinux и перезапустите компьютер:
    • $ setenforce 0
    • $ sed -i s/^SELINUX=.*$/SELINUX=disabled/ /etc/selinux/config
    • $ reboot
  • Проверьте, отключен ли SELinux, вызвав команду: $ sestatus
  • Установите пакеты с помощью $ yum install INSERT_PACKAGES_BELOW
    • кубелет-1.15.7-0.x86_64
    • kubeadm-1.15.7-0.x86_64
    • kubectl-1.15.7-0.x86_64
  • Инициализируйте кластер Kubernetes с помощью следующей команды $ kubeadm init --pod-network-cidr=10.244.0.0/16
  • Дождитесь правильной инициализации кластера и следуйте инструкциям kubeadm для подключения к кластеру.
  • Применить фланель CNI $ kubectl apply -f https://github.com/coreos/flannel/raw/master/Documentation/kube-flannel.yml

Проверьте правильность работы модулей coredns с помощью команды: $ kubectl get pods -A

Он должен дать аналогичный результат:

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

Поды Coredns в кластере Kubernetes с отключенным SELinux работают правильно.

Включите SELinux:

Из учетной записи root вызовите команды для включения SELinux и перезапустите компьютер:

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

Убедитесь, что стручки coredns работают правильно. Они не должны получать ошибку crashloopbackoff при запуске: kubectl get pods -A

Kubernetes v1.16.4

Шаги по воспроизведению:

  • Пробег $ kubeadm reset если исходит из другой другой версии
  • Удалите старые пакеты Kubernetes с помощью $ yum remove OLD_PACKAGES
  • Отключите SELinux и перезапустите компьютер:
    • $ setenforce 0
    • $ sed -i s/^SELINUX=.*$/SELINUX=disabled/ /etc/selinux/config
    • $ reboot
  • Проверьте, отключен ли SELinux, вызвав команду: $ sestatus
  • Установите пакеты с помощью $ yum install INSERT_PACKAGES_BELOW
    • кубелет-1.16.4-0.x86_64
    • kubeadm-1.16.4-0.x86_64
    • kubectl-1.16.4-0.x86_64
  • Инициализируйте кластер Kubernetes с помощью следующей команды $ kubeadm init --pod-network-cidr=10.244.0.0/16
  • Дождитесь правильной инициализации кластера и следуйте инструкциям kubeadm для подключения к кластеру.
  • Применить фланель CNI $ kubectl apply -f https://github.com/coreos/flannel/raw/master/Documentation/kube-flannel.yml

Проверьте правильность работы модулей coredns с помощью команды: $ kubectl get pods -A

Он должен дать аналогичный результат:

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

Включите SELinux:

Из учетной записи root вызовите команды для включения SELinux и перезапустите компьютер:

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

После перезагрузки поды coredns должны войти в состояние crashloopbackoff, как показано ниже:

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

Журналы из капсулы coredns-5644d7b6d9-fgbkl Показать:

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

На хосте сделайте следующее

chcon -R -t файл_контейнера /var/lib/kubelet/ идентификатор_контейнера / тома

Это изменит метку на томах хоста, чтобы она была доступна для метки SELinux контейнеров.

Я не знаю хорошего способа справиться с передачей секретов. Но добавив

разрешить container_t tmpfs_t: файл открыт;

Было бы, наверное, лучше.

Я считаю, что в OpenShift все это обрабатывается автоматически. Хотя я не работаю на этом уровне стека.

Я сделал это с помощью приведенной ниже команды.

semanage fcontext -a -t container_file_t "/var/lib/kubelet/pods/pod_id/volumes(/.*)?"
restorecon -R -v /var/lib/kubelet/pods/pod_id/
Другие вопросы по тегам