1

我在具有以下配置的 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:当我运行 kubespray 命令来构建集群时,我遇到了这个错误:


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 容器配置:(包括: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: ""

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

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

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

4

1 回答 1

2

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

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

TL;博士

Kubespray失败,因为他在运行时获得非退出零代码(255)swapoff -a

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

Gnu.org:退出状态

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

通过禁用主机系统中的交换可以解决此问题。你可以这样做:

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

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


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

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

kubespraylxc容器上运行并偶然发现了以下问题:

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

储存空间

请确保您的存储池中有足够的存储空间,否则将导致无法配置集群。默认存储池大小可能不足以容纳 5 个节点。

码头工人包

配置集群时,请确保您拥有最新kubespray版本,因为旧版本存在 docker 软件包相互不兼容的问题。

公里数

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

Kernel.org:文档:dev-kmsg

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

/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-已弃用
  • 在容器内运行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您可以使用或点击以下链接添加上述模块: Cyber​​citi.biz:Linux 如何自动加载内核模块

连接轨道

您将需要安装conntrack并加载一个名为nf_conntrack

  • $ apt install conntrack -y
  • modprobe nf_conntrack

如果没有上述命令kubespray,在检查conntrack.

进行此更改后,您应该能够kubespraylxc环境中运行 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 
于 2020-05-28T10:32:27.203 回答