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/