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.

Gnu.org: Exit Status

即使您在与容器关联的配置文件中设置 limits.memory.swap: "false",它仍然会产生此错误。

通过在您的 host 系统中禁用交换可以解决此问题。 您可以通过以下方式完成:

  • $ swapoff -a
  • 删除与 /etc/fstab
  • 中的交换关联的行
  • $ reboot

在那之后你的容器应该在发布时产生零退出代码 $ swapoff -a


如何在 LXC 容器上使用 Kubespray 安装 Kubernetes

假设您创建了 lxc 容器并且对它们具有完整的 ssh 访问权限,在 运行ning kubespray

我 运行 kubespraylxc 容器上偶然发现问题:

  • 存储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.

Kernel.org: Documentation: dev-kmsg

默认情况下,当 /dev/kmsg 在节点(lxc 容器)上不可用时,kubespray 将无法配置集群。

/dev/kmsglxc 容器上不可用,这将导致 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