本地系统为树莓派官方64位系统 Raspberry Pi OS Lite 64(Debian GNU/Linux 11)

在master和node都需要执行的步骤

本机cgroup配置

在执行kubeadm init 时出现 missing required cgroup: memory时,可以在/boot/cmdline.txt(有的系统可能在/boot/firmware/cmdline.txt)中追加 cgroup_enable=memory cgroup_memory=1

cgroup_enable=memory: 启用Cgroup子系统中的内存控制 cgroup_memory=1: 将内存控制子系统的版本设置为1

在某些特定的发行版中,可能会出于兼容性或其他原因而禁用了Cgroup子系统中的内存控制功能,所以需要手动开启

关闭swap

网上很多教程通过编辑/etc/fstab编辑swap, 但是在树莓派系统中,并不使用fstab配置,正确的做法是

  1. 编辑/etc/dphys-swapfile
  2. 找到配置项CONF_SWAPSIZE (通过名称我们可以知道该配置项为swap大小)该值配置为0
  3. 使配置生效 sudo /etc/init.d/dphys-swapfile restart 或者 sudo reboot 重启

通过free -h命令查看swap大小

系统模块加载

# 必要的模块加载
# overlay 文件系统
# br_netfilter 网桥网络包过滤
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
# 这个命令会将 "overlay" 和 "br_netfilter" 内核模块的名称添加到 /etc/modules-load.d/k8s.conf 文件中,以便在系统启动时自动加载这些模块

sudo modprobe overlay
sudo modprobe br_netfilter
# sudo modprobe overlay:加载 overlay 的内核模块,该模块提供了用于 overlayfs 的文件系统类型。在使用容器化技术如 Docker 时,通常需要使用 overlayfs 进行容器镜像的存储和管理。因此,在启用容器化环境时,需要确保该模块已加载。
# sudo modprobe br_netfilter:加载 br_netfilter 的内核模块,该模块提供了用于 Linux 桥接网络的过滤和 NAT 功能。在使用 Kubernetes 集群时,通常需要将容器内部的网络流量转发到主机上的网络设备,以实现容器与外部网络的通信。因此,在启用 Kubernetes 集群时,需要确保该模块已加载。

# 开启转发和流量可观测(开机启动)
# sysctl params required by setup, params persist across reboots
# bridge-nf-call-iptables 让ip表可以看到桥接流量
# bridge-nf-call-ip6tables 让ip6表可以看到桥接流量

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

# 这个命令的作用是将其写入 /etc/sysctl.d/k8s.conf 文件中。在系统启动时,这些参数就会被自动设置。
# net.bridge.bridge-nf-call-iptables: 设置为 1,表示将 Linux 桥接网络中的 IP 数据包转发给 iptables 进行过滤。在使用 Kubernetes 时,需要启用此功能以实现网络策略等功能。
# net.bridge.bridge-nf-call-ip6tables: 设置为 1,表示将 Linux 桥接网络中的 IPv6 数据包转发给 ip6tables 进行过滤。
# net.ipv4.ip_forward: 设置为 1,表示启用 IPv4 数据包的转发功能。在使用 Kubernetes 时,需要启用此功能以实现跨节点的容器网络互通。



# Apply sysctl params without reboot(不用开机立刻生效)
sudo sysctl --system

CRI安装

根据官方文档配置环境doc

  1. 安装containerd doc,据观察containerd文档中的cni可以不安装,系统已经自带.
  2. 修改containerd 的cgroup driver 配置问systemd, 使用containerd config default > config.toml 修改SystemdCgroup为true 并把配置文件放到/etc/containerd/config.toml位置, 重启containerd.

安装kubeadm, kubelet and kubectl

官方文档 要求:

  1. 最低 内存:2G CPU:2核

  2. 唯一的hostname和MAC地址

  3. 关闭swap(上文已配置)

安装方式

# 安装工具
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl

# 添加公钥
sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg

# 添加源
echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list

# 更新源 并安装
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl

# 锁版本
sudo apt-mark hold kubelet kubeadm kubectl

在master上需要执行的步骤

  1. kubeadm init --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address=192.168.0.104

–pod-network-cidr 指定pod网段, 10.244.0.0/16 时flannel 默认网段, 可以自行修改

–apiserver-advertise-address 指定apiserver 地址

等待出现类似输出则说明安装成功

Your Kubernetes control-plane has initialized successfully!

To start using your cluster, you need to run the following as a regular user:

  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config

Alternatively, if you are the root user, you can run:

  export KUBECONFIG=/etc/kubernetes/admin.conf

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 192.168.0.104:6443 --token f4lb9o.jj5i07q4rzhf6krf  --discovery-token-ca-cert-hash sha256:2ad164a1be1a262ef5c7e79ebaae6ad83d6a4a5b6a03304eb4b7437aed5c98e2
  1. 其中上述
To start using your cluster, you need to run the following as a regular user:

  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config

Alternatively, if you are the root user, you can run:

  export KUBECONFIG=/etc/kubernetes/admin.conf

一定要操作,否则不能访问api-server

  1. 按照提示安装网络插件
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

这里我们安装最简单的插件flannel,进入上述链接 找到上述flannel插件

按提示执行kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml

主节点操作结束

ndoe节点使用提示中

kubeadm join 192.168.0.104:6443 --token f4lb9o.jj5i07q4rzhf6krf  --discovery-token-ca-cert-hash sha256:2ad164a1be1a262ef5c7e79ebaae6ad83d6a4a5b6a03304eb4b7437aed5c98e2

把node节点加入集群

使用kubectl get nodes 等节点都变为Readay时集群安装完成

Join Token 刷新

kubeadm 提供了 kubeadm token 子命令来管理 token。要刷新已有的 join token,可以使用以下命令:

kubeadm token create --print-join-command

这将创建一个新的 join token 并输出加入命令,可以将其复制到要加入集群的节点上执行。如果你想在当前集群中添加新节点,可以将 –print-join-command 替换为 –print-join-command-only,然后将生成的加入命令复制到新的节点上执行。

kubeadm token create --print-join-command 命令将生成一个加入命令,并在最后添加新的 token,并将输出复制到需要加入集群的节点上执行。这个命令将创建一个新的 token,所以如果你使用它来更新节点的 token,旧的 token 将不再有效。

kubeadm token create --print-join-command-only 命令将只输出加入命令,并不会生成新的 token。这个命令的输出可以在当前集群中添加新的节点时使用,或者用于更新现有节点的 token。如果你想刷新节点的 token,你需要在当前集群的主节点上生成新的 token,并将其复制到节点上。

其他

kubeadm init常用参数

--apiserver-advertise-address:用于指定 API 服务器的访问地址,可以是主机的 IP 地址或 DNS 名称。

--control-plane-endpoint:用于指定控制平面的访问地址,这个地址将被用于部署负载均衡器或者代理服务器。如果未指定,Kubernetes 将自动使用 API 服务器的地址作为控制平面的访问地址。

--pod-network-cidr:用于指定 Pod 网络的 CIDR 地址段,这个地址段将被用于分配 Pod IP 地址。

--service-cidr:用于指定服务网络的 CIDR 地址段,这个地址段将被用于分配 Service IP 地址。

--kubernetes-version:用于指定 Kubernetes 的版本号,可以是完整的版本号,如 1.21.0,也可以是短版本号,如 1.21。

--image-repository:用于指定容器镜像仓库的地址和仓库名,如果不指定,默认使用 k8s.gcr.io。

--skip-phases:用于跳过某些初始化阶段,以加速初始化过程,常见的跳过阶段包括 preflight、kubelet-start、certs、kubeconfig、etcd。

--ignore-preflight-errors:用于忽略某些初始化阶段的错误,以便继续进行初始化,常见的错误包括 num_cpu、swap、system-verification

可以使用kubeadm config print init-defaults命令输出所有可用参数的默认值