我在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,一个是给容器文件系统用的,一个是给网络桥接用的。
阅读全文