系统选择
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文件:
-
创建文件夹
sudo mkdir -p /etc/systemd/system/docker.service.d
-
创建文件
touch /etc/systemd/system/docker.service.d/http-proxy.conf
-
编辑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"
-
重启docker服务
sudo systemctl daemon-reload sudo systemctl restart docker
-
查看配置是否生效
sudo systemctl show --property=Environment docker
参考: