我在Debian 11上把K8s单机搭起来了,过程难道不是你想象中的那么顺利吗?
摘要:前言 这事儿得从前天晚上说起。我手头有一台 Debian 11 的虚拟机,想着搭个 K8s 单节点环境平时做实验用。网上教程一搜一大把,可真跟着做的时候才发现,十个教程九个坑,还有一个写了一半就不见了。 踩了两天坑之后,我终于把这套流程捋顺
前言
这事儿得从前天晚上说起。我手头有一台 Debian 11 的虚拟机,想着搭个 K8s 单节点环境平时做实验用。网上教程一搜一大把,可真跟着做的时候才发现,十个教程九个坑,还有一个写了一半就不见了。
踩了两天坑之后,我终于把这套流程捋顺了,而且还特意把所有数据目录都挪到了 /opt 下面——因为系统盘就剩 20G,不挪地方早晚要崩。我把整个过程记了下来,既给自己留个底,也给遇到同样问题的朋友省点时间。这篇文章不是流水账,里面夹了不少我的真实感受,比如“呵呵,这我没想到”的那种瞬间,你懂的。
强烈建议搭配AI食用(当然,也别把AI太当一回事~)
环境与思路
项目
我的实际配置
主机名
k8s-master
IP
192.168.1.10(改成你自己的)
系统
Debian 11
数据目录
/opt(所有容器、kubelet 数据都放这)
Kubernetes
v1.31
容器运行时
containerd
网络插件
Flannel
重点:IP 和主机名后面会反复用到,千万别写错了。我第一遍就是 hosts 文件里多打了一个空格,结果 kubeadm init 直接报错退出了,排查了半小时,只能说“没办法,自己手贱”。
一、把主机名和 hosts 收拾干净
这是第一步,也是最容易翻车的一步。很多人上来就装软件,结果后面 service 启动不了还不知道为什么。
sudo hostnamectl set-hostname k8s-master
然后编辑 /etc/hosts:
sudo nano /etc/hosts
内容改成这样(注意 IP 换成你自己的):
127.0.0.1 localhost
127.0.1.1 k8s-master
192.168.1.10 k8s-master
验证一下解析:
hostname
hostname -i
必须返回你的真实 IP,否则 kubelet 会找不到北。
二、系统初始化,顺手装些常用工具
这步没啥好说的,纯体力活:
sudo apt update
sudo apt upgrade -y
sudo apt install -y curl vim wget net-tools gnupg lsb-release
早知道后面要频繁 curl,我第一个就该装它。
三、iptables 切换成 legacy 模式——Debian 11 绕不过的坎
Deiban 11 默认用的是 nftables,而 K8s 的一些组件(尤其是 kube-proxy)跟 legacy 模式更搭。不切换的话,后面网络会有各种莫名其妙的问题。我一开始没当回事,结果 Pod 之间死活不通,查了半天日志才发现是这里。
sudo apt install -y iptables arptables ebtables
sudo update-alternatives --set iptables /usr/sbin/iptables-legacy
sudo update-alternatives --set ip6tables /usr/sbin/ip6tables-legacy
sudo update-alternatives --set arptables /usr/sbin/arptables-legacy
sudo update-alternatives --set ebtables /usr/sbin/ebtables-legacy
检查一下:
iptables --version
看到 (legacy) 字样就对了。呵呵,这步不做后面有你哭的时候。
四、关掉 Swap,不然 kubelet 会抗议
Kubernetes 很固执,它认为 swap 会影响性能,所以只要检测到 swap 开着,kubelet 就直接罢工。
sudo swapoff -a
sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
用 free -m 看一眼,Swap 那行全是 0 就对了。
五、加载内核模块
两个模块必须提前加载:overlay 和 br_netfilter,一个是给容器文件系统用的,一个是给网络桥接用的。
