我在 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/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
添加上述模块或点击此链接: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