不同方式实现集群的可行性-部分不建议踩的坑

73次阅读

共计 2120 个字符,预计需要花费 6 分钟才能阅读完成。

路标

1.System has not been booted with systemd as init system (PID 1). Can’t operate.
2.Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
3.Package virtualbox is not available, but is referred to by another package. This may mean that the package is missing, has been obsoleted, or is only available from another source E: Package ‘virtualbox’ has no installation candidate

  1. grep -E –color ‘vmx|svm’ /proc/cpuinfo 返回 0

结论

无论学习 docker swarms 还是 minikubes,如果你碰到了以上的报错信息,并且检索到这篇文章,很遗憾的说,这是一条死路 (有点深的坑),别(不建议) 浪费时间了 ………

背景

从 docker swarms 向 k8s 过渡时,我碰到了很多坑,最终被 docker for mac 捞出来。这期间我一共使用了以下模式来探索可行性:

  1. 直接放弃了 windows 系统 …….
  2. windows 内通过 VirtualBox 安装 ubuntu 系统,失败:不支持二次虚拟化
  3. windows 内通过串联主机搭建 docker swarms 集群节点,成功:参见我另一篇 blog

    Docker Swarms 跨主机集群搭建
    只是针对 docker swarms 的解决方案,为了学习 minikube 继续探索

  4. 尝试使用 WSL 搭建集群,失败:支持虚拟化,报(PID 1)的问题

    这一条有替代解决方案,后续会给出。

  5. 尝试使用 AliCloud 的 ECS 搭建集群,失败:不支持二次虚拟化
  6. Mac for docker。docker swarms 成功,k8s 成功

中间碰到的问题大致归结为 3 类

  1. 众所周知的网络原因(tizi 或 换镜像源)
  2. 不支持二次虚拟化
  3. WSL, 非线程 1 (PID 1)

分析

将以上情形,根据所使用宿主系统的结构方式差异,我大致将接触 docker swarms 和 minukube 的方式大致分了 2 类:

  1. 常规模式

    • windows 操作系统
    • linux 操作系统
    • Mac 的 OS 操作系统
  2. 非常规模式

    • windows 的 linux 内核:WSL
    • 在宿主系统内安装 linux 系统虚拟机
    • 使用云服务商的 ECS

逐条解释:

  1. windows 操作系统:……
  2. linux 操作系统

推荐,此处说的 linux 操作系统是指直接安装在物理设备上、作为宿主系统的 linux 系统,而不是在虚拟机安装的 linux 系列系统。对于前者,建议安装双系统,对于后者,替代解决方案参见:Docker Swarms 跨主机集群搭建

  1. Mac 的 OS 操作系统

推荐,docker for mac 还是很方便的,尤其在装 k8s 的时候,由于某些众所周知的原因,我被卡了一个星期也跑不起来 minikube,但是使用 docker for mac 和内置 k8s 安装器,非常轻松的完成了 k8s 的安装。


下面开始几乎都是死路

  1. WSL:windows subsystem for linux

不想装虚拟机的用户 win 用户可能会想到这条路,但是会报出以下错误:

System has not been booted with systemd as init system (PID 1). Can't operate.

大致意思就是 WSL 并非系统 id 为 1 的线程,无法完成你想要进行的操作。这是一条“死路“, 但并非完全不可解,国外有位大佬想到一条替代解决方案:将 docker 安装在 win 系统,连接 windows 的 docker 与 WSL。Running Docker containers on Bash on Windows,如果有感兴趣的可以尝试。

  1. 在宿主系统内安装 linux 系统虚拟机
  2. 使用云服务商的 ECS

以上两个情形的问题一样,都是不支持 ”二次虚拟化“,也即不能在虚拟机里再装虚拟机。

无论是 docker swarms 还是 minikube,仔细观察会发现他们都是在宿主系统的虚拟软件中创建了新的虚拟机(通过命令行)

其中,myvm1、myvm2 为 docker swarms 节点
minikube 为 minikbe 主节点

是否支持二次虚拟化的判断标准很简单,在当前系统 (linux 为例) 命令行中执行以下指令即可:(其他系统参见 kubernetes document)

grep -E --color 'vmx|svm' /proc/cpuinfo

如果无返回或返回 0,则不支持虚拟化
若返回具体数字如 4 or 8,则表示可虚拟化

以上

后记

对于云服务商的 ECS 不可二次虚拟这点我初始是有些惊讶的,因为如果使用 ECS 的用户想要搭建集群该怎么办呢?在我和其中一个云服务商的工程师联系后,得到了的回复是:CES 和云虚拟主机都不支持二次虚拟化,裸金属主机支持。云服务商也有单独的集群相关产品,但是实现方式无法透露,他们只在使用中提供技术支持。

最后贴上最低配的弹性裸金属服务器的性能和价格截图:

要获取更多 Haytham 原创文章,请关注公众号 ” 许聚龙 ”:

正文完
 0