本地系统为树莓派官方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配置,正确的做法是
- 编辑
/etc/dphys-swapfile
- 找到配置项
CONF_SWAPSIZE
(通过名称我们可以知道该配置项为swap大小)该值配置为0 - 使配置生效
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
- 安装containerd doc,据观察containerd文档中的cni可以不安装,系统已经自带.
- 修改containerd 的cgroup driver 配置问systemd, 使用
containerd config default > config.toml
修改SystemdCgroup为true 并把配置文件放到/etc/containerd/config.toml
位置, 重启containerd.
安装kubeadm, kubelet and kubectl
官方文档 要求:
最低 内存:2G CPU:2核
唯一的hostname和MAC地址
关闭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上需要执行的步骤
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
- 其中上述
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
- 按照提示安装网络插件
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
命令输出所有可用参数的默认值