Kubespray 禁用 'swapoff' 命令失败并返回 'non-zero return code'
Kubespray disable 'swapoff' command failed with returning 'non-zero return code'
I 运行 具有以下配置的 lxc 容器中的 Kubespray:(server_ram:8G | ubuntu:18.04 中的所有节点)
| NAME | STATE | IPV4
+---------+---------+-------------------
| ansible | RUNNING | 10.21.185.23 (eth0)
| node1 | RUNNING | 10.21.185.158 (eth0)
| node2 | RUNNING | 10.21.185.186 (eth0)
| node3 | RUNNING | 10.21.185.65 (eth0)
| node4 | RUNNING | 10.21.185.106 (eth0)
| node5 | RUNNING | 10.21.185.14 (eth0)
In root@ansible: when i ran kubespray command to build cluster i encountered with this Error:
TASK [kubernetes/preinstall : Disable swap] ******************
fatal: [node1]: FAILED! => {"changed": true, "cmd": ["/sbin/swapoff", "-a"], "delta": "0:00:00.020302", "end": "2020-05-13 07:21:24.974910", "msg": "non-zero return code", "rc": 255, "start": "2020-05-13 07:21:24.954608", "stderr": "", "stderr_lines": [], "stdout": "", "stdout_lines": []}
fatal: [node2]: FAILED! => {"changed": true, "cmd": ["/sbin/swapoff", "-a"], "delta": "0:00:00.010084", "end": "2020-05-13 07:21:25.051443", "msg": "non-zero return code", "rc": 255, "start": "2020-05-13 07:21:25.041359", "stderr": "", "stderr_lines": [], "stdout": "", "stdout_lines": []}
fatal: [node3]: FAILED! => {"changed": true, "cmd": ["/sbin/swapoff", "-a"], "delta": "0:00:00.008382", "end": "2020-05-13 07:21:25.126695", "msg": "non-zero return code", "rc": 255, "start": "2020-05-13 07:21:25.118313", "stderr": "", "stderr_lines": [], "stdout": "", "stdout_lines": []}
fatal: [node4]: FAILED! => {"changed": true, "cmd": ["/sbin/swapoff", "-a"], "delta": "0:00:00.006829", "end": "2020-05-13 07:21:25.196145", "msg": "non-zero return code", "rc": 255, "start": "2020-05-13 07:21:25.189316", "stderr": "", "stderr_lines": [], "stdout": "", "stdout_lines": []}
lxc containers configuration:(include:node1,node2,node3,node4,node5)
architecture: x86_64
config:
image.architecture: amd64
image.description: ubuntu 18.04 LTS amd64 (release) (20200506)
image.label: release
image.os: ubuntu
image.release: bionic
image.serial: "20200506"
image.version: "18.04"
limits.cpu: "2"
limits.memory: 2GB
limits.memory.swap: "false"
linux.kernel_modules: ip_tables,ip6_tables,netlink_diag,nf_nat,overlay
raw.lxc: "lxc.apparmor.profile=unconfined\nlxc.cap.drop= \nlxc.cgroup.devices.allow=a\nlxc.mount.auto=proc:rw
sys:rw"
security.nesting: "true"
security.privileged: "true"
volatile.base_image: 93b9eeb85479af2029203b4a56a2f1fdca6a0e1bf23cdc26b567790bf0f3f3bd
volatile.eth0.hwaddr: 00:16:3e:5a:91:9a
volatile.idmap.base: "0"
volatile.idmap.next: '[]'
volatile.last_state.idmap: '[]'
volatile.last_state.power: RUNNING
devices: {}
ephemeral: false
profiles:
- default
stateful: false
description: ""
When i try to swapoff manually in nodes i receive nothing.
root@node1:~# /sbin/swapoff -a
root@node1:~#
如果有人有想法,那将非常有帮助。
我把这个答案分为两部分:
- TL;DR 为什么 Kubespray 在
swapoff -a
上失败
- 如何在 LXC 容器上使用 Kubespray 安装 Kubernetes
TL;DR
Kubespray
失败,因为他在 运行ning swapoff -a
时得到非退出零代码 (255)。
A non-zero exit status indicates failure. This seemingly counter-intuitive scheme is used so there is one well-defined way to indicate success and a variety of ways to indicate various failure modes.
即使您在与容器关联的配置文件中设置 limits.memory.swap: "false"
,它仍然会产生此错误。
通过在您的 host 系统中禁用交换可以解决此问题。
您可以通过以下方式完成:
$ swapoff -a
- 删除与
/etc/fstab
中的交换关联的行
$ reboot
在那之后你的容器应该在发布时产生零退出代码
$ swapoff -a
如何在 LXC 容器上使用 Kubespray 安装 Kubernetes
假设您创建了 lxc
容器并且对它们具有完整的 ssh 访问权限,在 运行ning kubespray
。
我 运行 kubespray
在 lxc
容器上偶然发现问题:
- 存储space
- docker 包裹
kmsg
- 内核模块
conntrack
存储空间space
请确保您的存储池中有足够的存储空间,否则将导致无法配置集群。默认存储池大小可能不足以容纳 5 个节点。
Docker 包
配置集群时,请确保您拥有最新的 kubespray
版本,因为旧版本存在 docker 包彼此不兼容的问题。
Kmsg
The /dev/kmsg character device node provides userspace access to the kernel's printk buffer.
默认情况下,当 /dev/kmsg
在节点(lxc 容器)上不可用时,kubespray
将无法配置集群。
/dev/kmsg
在 lxc
容器上不可用,这将导致 kubespray
配置失败。
有一个解决方法。 在每个 lxc
个容器中 运行:
# Hack required to provision K8s v1.15+ in LXC containers
mknod /dev/kmsg c 1 11
chmod +x /etc/rc.d/rc.local
echo 'mknod /dev/kmsg c 1 11' >> /etc/rc.d/rc.local
Github.com: Justmeandopensource: lxd-provisioning: bootstrap-kube.sh
我尝试了其他解决方法,例如:
- 将
lxc.kmsg = 1
添加到 /etc/lxc/default.conf
- deprecated
- 运行在容器内安装
echo 'L /dev/kmsg - - - - /dev/console' > /etc/tmpfiles.d/kmsg.conf
然后重新启动导致 systemd-journald
处于核心使用率 100% 的状态。
内核模块
The LXC/LXD system containers do not load kernel modules for their own use.
What you do, is get the host it load the kernel module, and this module could be available in the container.
Linuxcontainers.org: How to add kernel modules to LXC container
Kubespray
将检查某些内核模块是否在您的节点中可用。
您需要在您的主机上添加以下模块:
ip_vs
ip_vs_sh
ip_vs_rr
ip_vs_wrr
您可以使用 $ modprobe MODULE_NAME
添加以上模块或按照此 link: Cyberciti.biz: Linux how to load a kernel module automatically.
连接跟踪
您将需要安装 conntrack
并加载名为 nf_conntrack
的模块:
$ apt install conntrack -y
modprobe nf_conntrack
如果没有上述命令,kubespray
将无法检查 conntrack
的可用性。
进行此更改后,您应该能够在 lxc
环境中使用 kubespray
运行 Kubernetes 集群并获得类似于以下的节点输出:
root@k8s1:~# kubectl get nodes -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
k8s1 Ready master 14h v1.18.2 10.224.47.185 <none> Ubuntu 18.04.4 LTS 5.4.0-31-generic docker://18.9.7
k8s2 Ready master 14h v1.18.2 10.224.47.98 <none> Ubuntu 18.04.4 LTS 5.4.0-31-generic docker://18.9.7
k8s3 Ready <none> 14h v1.18.2 10.224.47.46 <none> Ubuntu 18.04.4 LTS 5.4.0-31-generic docker://18.9.7
k8s4 Ready <none> 14h v1.18.2 10.224.47.246 <none> Ubuntu 18.04.4 LTS 5.4.0-31-generic docker://18.9.7
I 运行 具有以下配置的 lxc 容器中的 Kubespray:(server_ram:8G | ubuntu:18.04 中的所有节点)
| NAME | STATE | IPV4
+---------+---------+-------------------
| ansible | RUNNING | 10.21.185.23 (eth0)
| node1 | RUNNING | 10.21.185.158 (eth0)
| node2 | RUNNING | 10.21.185.186 (eth0)
| node3 | RUNNING | 10.21.185.65 (eth0)
| node4 | RUNNING | 10.21.185.106 (eth0)
| node5 | RUNNING | 10.21.185.14 (eth0)
In root@ansible: when i ran kubespray command to build cluster i encountered with this Error:
TASK [kubernetes/preinstall : Disable swap] ******************
fatal: [node1]: FAILED! => {"changed": true, "cmd": ["/sbin/swapoff", "-a"], "delta": "0:00:00.020302", "end": "2020-05-13 07:21:24.974910", "msg": "non-zero return code", "rc": 255, "start": "2020-05-13 07:21:24.954608", "stderr": "", "stderr_lines": [], "stdout": "", "stdout_lines": []}
fatal: [node2]: FAILED! => {"changed": true, "cmd": ["/sbin/swapoff", "-a"], "delta": "0:00:00.010084", "end": "2020-05-13 07:21:25.051443", "msg": "non-zero return code", "rc": 255, "start": "2020-05-13 07:21:25.041359", "stderr": "", "stderr_lines": [], "stdout": "", "stdout_lines": []}
fatal: [node3]: FAILED! => {"changed": true, "cmd": ["/sbin/swapoff", "-a"], "delta": "0:00:00.008382", "end": "2020-05-13 07:21:25.126695", "msg": "non-zero return code", "rc": 255, "start": "2020-05-13 07:21:25.118313", "stderr": "", "stderr_lines": [], "stdout": "", "stdout_lines": []}
fatal: [node4]: FAILED! => {"changed": true, "cmd": ["/sbin/swapoff", "-a"], "delta": "0:00:00.006829", "end": "2020-05-13 07:21:25.196145", "msg": "non-zero return code", "rc": 255, "start": "2020-05-13 07:21:25.189316", "stderr": "", "stderr_lines": [], "stdout": "", "stdout_lines": []}
lxc containers configuration:(include:node1,node2,node3,node4,node5)
architecture: x86_64
config:
image.architecture: amd64
image.description: ubuntu 18.04 LTS amd64 (release) (20200506)
image.label: release
image.os: ubuntu
image.release: bionic
image.serial: "20200506"
image.version: "18.04"
limits.cpu: "2"
limits.memory: 2GB
limits.memory.swap: "false"
linux.kernel_modules: ip_tables,ip6_tables,netlink_diag,nf_nat,overlay
raw.lxc: "lxc.apparmor.profile=unconfined\nlxc.cap.drop= \nlxc.cgroup.devices.allow=a\nlxc.mount.auto=proc:rw
sys:rw"
security.nesting: "true"
security.privileged: "true"
volatile.base_image: 93b9eeb85479af2029203b4a56a2f1fdca6a0e1bf23cdc26b567790bf0f3f3bd
volatile.eth0.hwaddr: 00:16:3e:5a:91:9a
volatile.idmap.base: "0"
volatile.idmap.next: '[]'
volatile.last_state.idmap: '[]'
volatile.last_state.power: RUNNING
devices: {}
ephemeral: false
profiles:
- default
stateful: false
description: ""
When i try to swapoff manually in nodes i receive nothing.
root@node1:~# /sbin/swapoff -a
root@node1:~#
如果有人有想法,那将非常有帮助。
我把这个答案分为两部分:
- TL;DR 为什么 Kubespray 在
swapoff -a
上失败
- 如何在 LXC 容器上使用 Kubespray 安装 Kubernetes
TL;DR
Kubespray
失败,因为他在 运行ning swapoff -a
时得到非退出零代码 (255)。
A non-zero exit status indicates failure. This seemingly counter-intuitive scheme is used so there is one well-defined way to indicate success and a variety of ways to indicate various failure modes.
即使您在与容器关联的配置文件中设置 limits.memory.swap: "false"
,它仍然会产生此错误。
通过在您的 host 系统中禁用交换可以解决此问题。 您可以通过以下方式完成:
$ swapoff -a
- 删除与
/etc/fstab
中的交换关联的行
$ reboot
在那之后你的容器应该在发布时产生零退出代码
$ swapoff -a
如何在 LXC 容器上使用 Kubespray 安装 Kubernetes
假设您创建了 lxc
容器并且对它们具有完整的 ssh 访问权限,在 运行ning kubespray
。
我 运行 kubespray
在 lxc
容器上偶然发现问题:
- 存储space
- docker 包裹
kmsg
- 内核模块
conntrack
存储空间space
请确保您的存储池中有足够的存储空间,否则将导致无法配置集群。默认存储池大小可能不足以容纳 5 个节点。
Docker 包
配置集群时,请确保您拥有最新的 kubespray
版本,因为旧版本存在 docker 包彼此不兼容的问题。
Kmsg
The /dev/kmsg character device node provides userspace access to the kernel's printk buffer.
默认情况下,当 /dev/kmsg
在节点(lxc 容器)上不可用时,kubespray
将无法配置集群。
/dev/kmsg
在 lxc
容器上不可用,这将导致 kubespray
配置失败。
有一个解决方法。 在每个 lxc
个容器中 运行:
# Hack required to provision K8s v1.15+ in LXC containers mknod /dev/kmsg c 1 11 chmod +x /etc/rc.d/rc.local echo 'mknod /dev/kmsg c 1 11' >> /etc/rc.d/rc.local
Github.com: Justmeandopensource: lxd-provisioning: bootstrap-kube.sh
我尝试了其他解决方法,例如:
- 将
lxc.kmsg = 1
添加到/etc/lxc/default.conf
- deprecated - 运行在容器内安装
echo 'L /dev/kmsg - - - - /dev/console' > /etc/tmpfiles.d/kmsg.conf
然后重新启动导致systemd-journald
处于核心使用率 100% 的状态。
内核模块
The LXC/LXD system containers do not load kernel modules for their own use. What you do, is get the host it load the kernel module, and this module could be available in the container.
Linuxcontainers.org: How to add kernel modules to LXC container
Kubespray
将检查某些内核模块是否在您的节点中可用。
您需要在您的主机上添加以下模块:
ip_vs
ip_vs_sh
ip_vs_rr
ip_vs_wrr
您可以使用 $ modprobe MODULE_NAME
添加以上模块或按照此 link: Cyberciti.biz: Linux how to load a kernel module automatically.
连接跟踪
您将需要安装 conntrack
并加载名为 nf_conntrack
的模块:
$ apt install conntrack -y
modprobe nf_conntrack
如果没有上述命令,kubespray
将无法检查 conntrack
的可用性。
进行此更改后,您应该能够在 lxc
环境中使用 kubespray
运行 Kubernetes 集群并获得类似于以下的节点输出:
root@k8s1:~# kubectl get nodes -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
k8s1 Ready master 14h v1.18.2 10.224.47.185 <none> Ubuntu 18.04.4 LTS 5.4.0-31-generic docker://18.9.7
k8s2 Ready master 14h v1.18.2 10.224.47.98 <none> Ubuntu 18.04.4 LTS 5.4.0-31-generic docker://18.9.7
k8s3 Ready <none> 14h v1.18.2 10.224.47.46 <none> Ubuntu 18.04.4 LTS 5.4.0-31-generic docker://18.9.7
k8s4 Ready <none> 14h v1.18.2 10.224.47.246 <none> Ubuntu 18.04.4 LTS 5.4.0-31-generic docker://18.9.7