我已经调查过了,似乎问题出在kubelet 版本上。让我详细说明一下:
SELinux 卷未在 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
如果来自另一个版本,则运行
- 删除旧的 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
- 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
重启 coredns 后,pod应该会进入 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