我已经调查过了,似乎问题出在 kubelet 版本上。让我详细说明一下:
SELinux Volumes not relabeled in 1.16 - 此链接提供有关此问题的更多详细信息。
我试图在不同版本的 Kubernetes 上重现这个 coredns 问题。
问题在 1.16 及更高版本上显示。在 1.15.6 版本上启用 SELinux 似乎可以正常工作
为此,您需要工作的 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 安装软件包
- kubelet-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 pod 是否正常运行:
$ 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
在 SELinux 禁用 的 kubernetes 集群中的 Coredns pod 工作正常。
启用 SELinux:
从 root 帐户调用命令以启用 SELinux 并重新启动机器:
$ setenforce 1
$ sed -i s/^SELINUX=.*$/SELINUX=enforcing/ /etc/selinux/config
$ reboot
检查 coredns pod 是否正常运行。它们在运行时应该不会出现 crashloopbackoff 错误:
kubectl get pods -A
Kubernetes v1.16.4
复制步骤:
- 如果来自另一个版本,请运行
$ kubeadm reset
- 使用
$ yum remove OLD_PACKAGES 删除旧的 Kubernetes 包
- 禁用 SELinux 并重启机器:
$ setenforce 0
$ sed -i s/^SELINUX=.*$/SELINUX=disabled/ /etc/selinux/config
$ reboot
- 通过调用命令检查 SELinux 是否被禁用:
$ sestatus
- 使用
$ 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
- 使用以下命令初始化 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 pod 是否正常运行:
$ 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
reboot coredns pods后应该进入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
来自 pod coredns-5644d7b6d9-fgbkl 的日志显示:
plugin/kubernetes: open /var/run/secrets/kubernetes.io/serviceaccount/token: permission denied