树梅派安装kubernetes

系统选择

Ubuntu 20.04 (Focal Fossa)提供完整版的64位树梅派镜像,包括64位的内核和用户空间。因为我们是要在树梅派上运行k8s集群,所以能支持运行AArch64容器镜像是非常重要的,使用32位系统很难找到相应的镜像。另外,AArch64架构的系统可以运行32位ARM镜像的容器,反过来则不行。因此我们选择Ubuntu ARM64的镜像来构建k8s集群。

需要注意的是,AArch64和x86_64是完全不同的两个架构,运行在64位ARM架构上的k8s节点无法运行为x86_64架构构建的容器。不过,我们可以把x86_64的节点加入到现有集群中去,这样我们就可以把为x86_64构建的容器镜像调度到x86_64的节点上运行。

环境需求

为了练习我们本次选择:

  • 至少三台树梅派4(8G版)

  • 所有树梅派上都安装了Ubuntu 20.04 ARM64

安装配置Docker

sudo apt install -y docker.io

在安装完docker之后,我们需要修改一些配置以启动cgroup(Control Groups)。cgroup允许linux内核限制和隔离资源。这将允许k8s更好的管理容器所使用的资源同时通过隔离增加容器间的安全性。

在修改树梅派系统配置之前先检查docker info(以root身份运行)的输出信息:

$ sudo docker info
(...)
 Cgroup Driver: cgroups
(...)
WARNING: No memory limit support
WARNING: No swap limit support
WARNING: No kernel memory limit support
WARNING: No kernel memory TCP limit support
WARNING: No oom kill disable support

像上面的输出,我们需要修改cgroup driver和cgroup的限制支持。

首先,把docker的cgroup driver从cgroup改为systemd,使systemd充当cgroup的管理者并且确保是唯一再用的管理者。这将提高系统的稳定性同时也是kubernets建议的方式。为了实现这些变更我们需要创建或修改/etc/docker/daemon.json文件

$ sudo cat > /etc/docker/daemon.json <<EOF
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m",
    "max-file": "3"
  },
  "storage-driver": "overlay2"
}
EOF

启用cgroup的限制支持(limit support)

像上面docker info输出的警告,我们需要修改内核启动参数,对于Raspberry Pi 4添加以下参数到/boot/firmware/cmdline.txt文件:

  • cgroup_enable=cpuset

  • cgroup_enable=memory

  • cgroup_memory=1

  • swapaccount=1

确保他们是添加在cmdline.txt文件的行尾,这些也可以使用sed添加:

$ sudo sed -i '$ s/$/ cgroup_enable=cpuset cgroup_enable=memory cgroup_memory=1 swapaccount=1/' /boot/firmware/cmdline.txt

配置完成之后,docker和内核都应该满足了kubernetes的需要。重启树梅派,然后在检查docker info的输出,此时cgroup driver已经是systemd,之前的那些警告已经没有了。

允许iptables查看桥接流量

根据文档k8s需要iptables查看桥接流量,所以我们需要修改sysctl的配置:

cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
$ sudo sysctl --system

安装Kubernetes

#添加k8s源,由于google被墙,所以我们使用一个镜像源
cat <<EOF | sudo tee /etc/apt/sources.list.d/kubernetes.list
#deb https://apt.kubernetes.io/ kubernetes-xenial main
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys  6A030B21BA07F4FB
sudo apt update
sudo apt install -y kubelet kubeadm kubectl

禁止k8s更新

#Disable (mark as held) updates for the Kubernetes packages
$ sudo apt-mark hold kubelet kubeadm kubectl

获取kubernetes服务镜像

由于种种原因,我们无法直接访问gcr.io,所以在我们创建k8s集群之前,首先要设置docker的代理模式。

Docker守护程序在其启动环境中使用HTTP_PROXY,HTTPS_PROXY和NO_PROXY环境变量来配置HTTP或HTTPS代理行为。 我们不能使用daemon.json文件配置这些环境变量。

下面我们将通过示例覆盖默认的docker.service文件:

  1. 创建文件夹

    sudo mkdir -p /etc/systemd/system/docker.service.d
  2. 创建文件

    touch /etc/systemd/system/docker.service.d/http-proxy.conf
  3. 编辑http-proxy.conf,添加以下内容:

    [Service]
    Environment="HTTP_PROXY=socks5://127.0.0.1:7070"
    Environment="HTTPS_PROXY=socks5://127.0.0.1:7070"
    Environment="NO_PROXY=localhost,127.0.0.1,docker-registry.example.com,.corp"
  4. 重启docker服务

    sudo systemctl daemon-reload
    sudo systemctl restart docker
  5. 查看配置是否生效

    sudo systemctl show --property=Environment docker

参考: