不同于公有云,在自有基础设施上搭建一个适用于生产环境的 Kubernetes 集群还是比较令人头疼的一件事情。在上次的 初探基础设施即代码 中的最后我们提到,cluster-api 是适用于 bootstrapping Kubernetes cluster 的“官方”解决方案,但还是有几个问题:

  1. 其 management cluster 在非生产环境下可以用 kind 之类的快速启动,但生产环境下就需要一个 real kubernetes cluster,那是先有鸡还是先有蛋呢?
  2. 其 provider 除了公有云以外就只有 vsphere/openstack,前者需要商业收费授权,后者对于一个几台或者十几台规模的集群又显得 overkill 了。

面对眼前的 11 台物理机,我们决定土法炼钢。

物理机还是虚拟机

Kubernetes 集群节点可以直接是一台物理机,也可以是一台虚拟化平台提供的虚拟机。显然物理机的性能会更好,但我们考虑:

  1. Master 节点需要至少一台物理机,如果要实现高可用就需要三台甚至五台,并且 Master 节点是不推荐承载工作负载的,所以白白浪费了这几台机器的计算资源(Master 本身所需要的资源是很少的,它的目标是追求稳定)。如果采用虚拟化平台,我们可以单独分配一台小 VM 给 Master 节点,这样仅需 3 台物理节点就能实现 Master 的高可用,并在隔离的 VM 里承载工作负载。
  2. 我们缺少对物理机的远程管理支持,机器的 IPMI 支持也仅限于远程开关机,如果我们想进行重装系统等操作还是需要跑到机房一台一台地手动操作。如果采用虚拟化平台,其提供的友好 Web 界面可以轻松实现各种 VM 管理功能,创建销毁 VM 的成本也远低于对物理机的类似操作。
  3. 万一我们想创建多个集群呢?使用物理机时我们就会被物理机的数量所限制,而若使用虚拟化平台则可在 CPU、内存、存储允许的情况下任意创建。

    选哪个虚拟化平台

    面向服务器的虚拟化平台我们通常能听到的有 VMware vSphere ESXi, Microsoft Hyper-V 和 Proxmox VE。ESXi 虽然有免费的版本,也曾是很多组织使用的虚拟化方案,但它缺少对虚拟机备份还原的支持(必须使用收费的 vCenter),并且底层不是我们常见的那种 Linux。而 Microsoft Hyper-V 也是商业解决方案,底层是 Windows,此前试用时发现 Ubuntu Server 的安装 iso 直接进不去安装界面🤣
    所以最终我们选择了 Proxmox VE。Proxmox VE 是一个基于 Debian 的开源的虚拟化平台,并且也相对成熟,提供一个简洁方便的 Web 界面。官方对 Proxmox VE 的介绍是 It tightly integrates KVM hypervisor and LXC, software-defined storage, and networking functionality on a single platform, 除了传统的 KVM 虚拟化以外还支持 LXC 容器,并且深度融合了存储与网络管理,甚至支持多台物理机组成一个虚拟化集群进行管理。

Proxmox   Terraform 搭建 Kubernetes 集群(一)配置 Proxmox - 图1

安装 PVE

就和安装一个 Linux 系统一样简单。

准备安装盘

  1. 首先下载安装需要的 Iso:https://proxmox.com/en/downloads/category/iso-images-pve

    如果你在中山大学校园网内,你可以使用 Matrix 开源镜像站以获得更快的下载速度:https://mirrors.matrix.moe/proxmox/iso/

  2. 如果你使用 Windows,那么可以使用 rufus 来制作安装 U 盘。只需要注意,当 rufus 提示使用 ISO 模式还是 dd 模式时,选择 dd 模式(可以防止一些无法启动安装的情况)。

    一路点点点

    把 U 盘插上服务器,根据服务器的说明书使用 U 盘启动,当你看到这样的画面时你就启动成功了:
    Proxmox   Terraform 搭建 Kubernetes 集群(一)配置 Proxmox - 图2
    选择第一个 Install Proxmox VE 选项,按 Enter 就能进入带有鼠标支持的图形化安装界面。之后一路根据提示输入信息即可。
    Proxmox   Terraform 搭建 Kubernetes 集群(一)配置 Proxmox - 图3
    目标磁盘通常选择默认的 LVM + ext4 即可,但 Proxmox 官方似乎特别推崇 zfs,你也可以使用 zfs 来作为启动磁盘的文件系统。但需要注意,不能在硬件 RAID 阵列卡上使用 zfs,并且 zfs 特别吃内存,实测 2 TB 实际可用容量的 RAIDZ2 阵列吃掉 16 G 内存🤷‍♂️
    Proxmox   Terraform 搭建 Kubernetes 集群(一)配置 Proxmox - 图4
    需要注意的是,Hostname 已经设置就不能轻易更改,需要谨慎设置;IP 地址改起来也比较麻烦(尤其是组建集群时)最好提前确定好;DNS Server 在这个界面里只能设置一个,可以安装完后再加。
    Proxmox   Terraform 搭建 Kubernetes 集群(一)配置 Proxmox - 图5
    到这一步就已经配置完所有的选项,确认后点击 Install 就能进入漫长的软件包安装环节。
    安装完后会提示重启,拔掉 U 盘改为硬盘引导,成功进入 PVE 时屏幕上会显示一个 URL,类似于 https://192.168.30.57:8006 ,这就是 PVE 的 Web 管理界面地址。

    Post-Installation

    装完 PVE 后实际上你就可以创建 VM 了,但通常我们还会做以下几个操作。

    更换软件源

    PVE 实际上是一个 Debian,所以我们可以把 /etc/apt/sources.list 里的 debian 软件源换成内网的,例如 https://mirrors.matrix.moe/debian
    此外,PVE 内置了一个 enterprise 软件源,但是这个软件源必须向 Proxmox 付费订阅才能使用。所以我们要把 /etc/apt/sources.list.d/pve-enterprise.list 里的这个软件源注释掉(当然删掉这个文件也是可以的)。

    1. deb https://enterprise.proxmox.com/debian/pve buster pve-enterprise

    然后更换为无需订阅的 PVE 软件源:在 /etc/apt/sources.list 里加入:

    1. # PVE pve-no-subscription repository provided by proxmox.com,
    2. # NOT recommended for production use
    3. deb http://download.proxmox.com/debian/pve buster pve-no-subscription

    动态配置网络

    默认在 PVE 里更改宿主机的网络配置是需要重启才能生效的,此时所有虚拟机业务都会中断。所以我们需要让 PVE 支持 Reload 网络配置,方法很简单:

    1. apt install ifupdown2

    (如果安装时提示说需要卸载 proxmox-ve,请确保你已经加入了 pve-no-subscription 软件源并 apt update

    配置防火墙

    PVE 的防火墙层级比较复杂,分为集群、主机、VM 三个部分,每个部分都由各自的开关,并且在每个虚拟机网卡上也有开关。
    首先要打开集群(Cluster)的防火墙开关。然后你可以配置整个集群的防火墙规则,比如限制对主机的 22 端口访问。
    但是你会发现没有起作用。这是因为主机(Host)的防火墙开关没开。所以还需要开一下主机(Host)的防火墙开关
    此时主机的防火墙规则应当已经工作,如果还没有工作,请检查网卡的防火墙开关是否开启

    Please however check that you:

    • Enabled firewalling on Data Centre options
    • Enabled firewalling on Node(s)
    • Enabled firewalling on VM
    • Set individual VM network interfaces to firewall

    https://forum.proxmox.com/threads/pve-firewall-doesnt-have-any-effect.47393/

为了搭建 Kubernetes 节点,下一步我们需要创建对应的 VM 节点。但手动创建 VM 节点、安装系统也是痛苦的,所以下一节我们将使用 Terraform 来简化这个过程,并自始至终保持可管理性。