Kubespray 禁用"交换"命令失败,返回"非零返回代码"



我在 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) 

在root@ansible中:当我运行kubepray命令来构建集群时,我遇到了此错误:


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 容器配置:(包括:节点 1,节点 2,节点 3,节点 4,节点 5(

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=unconfinednlxc.cap.drop= nlxc.cgroup.devices.allow=anlxc.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: ""

当我尝试在节点中手动交换时,我什么也没收到。

root@node1:~# /sbin/swapoff -a
root@node1:~#

如果有人有想法,那将非常有帮助。

我将这个答案分为两部分:

  • TL;DR为什么 Kubespray 在swapoff -a上失败
  • 如何在 LXC 容器上安装 Kubernetes with Kubespray

TL;博士

Kubespray失败,因为他在运行swapoff -a时收到非退出零代码 (255(。

非零退出状态表示失败。使用这种看似违反直觉的方案,因此有一种明确定义的方式来指示成功,并有多种方法来指示各种失败模式。

Gnu.org:退出状态

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

有一种解决方法,即在主机系统中禁用交换。 您可以通过以下方式做到这一点:

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

之后,您的容器在发出时应生成零退出代码$ swapoff -a


如何在 LXC 容器上安装 Kubernetes with Kubespray

假设您创建了lxc容器并具有对它们的完全 ssh 访问权限,那么在运行kubespray之前仍需要考虑一些事项。

我在lxc容器上运行了kubespray,偶然发现了以下问题:

  • 存储空间
  • 码头工人包
  • kmsg
  • 内核模块
  • conntrack

存储空间

请确保存储池中有足够的存储,因为缺少存储将导致无法预配群集。默认存储池大小可能不足以容纳 5 个节点。

码头工人包

配置群集时,请确保您具有最新的kubespray版本,因为较旧的版本存在 docker 包彼此不兼容的问题。

金星

/

dev/kmsg 字符设备节点提供对内核的 printk 缓冲区的用户空间访问。

Kernel.org:文档:开发-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- 已弃用
  • 在容器内运行echo 'L /dev/kmsg - - - - /dev/console' > /etc/tmpfiles.d/kmsg.conf然后重新启动会导致systemd-journald以 100% 的核心使用率运行。

内核模块

LXC/LXD 系统容器不加载内核模块供自己使用。 你要做的是让主机加载内核模块,这个模块可以在容器中可用。

Linuxcontainers.org:如何将内核模块添加到 LXC 容器

Kubespray将检查您的节点中是否有某些内核模块可用。

您需要在主机上添加以下模块:

  • ip_vs
  • ip_vs_sh
  • ip_vs_rr
  • ip_vs_wrr

您可以使用$ modprobe MODULE_NAME添加上述模块或点击此链接:Cyberciti.biz:Linux 如何自动加载内核模块。

康特拉克

您需要安装conntrack并加载一个名为nf_conntrack的模块:

  • $ apt install conntrack -y
  • modprobe nf_conntrack

如果没有上述命令kubespray将在检查conntrack可用性的步骤中失败。

通过此更改,您应该能够在环境中运行带有kubespray的 Kubernetes 集群lxc并获得类似于以下内容的节点输出:

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 

最新更新