Ubuntu搭建K8S集群(1master, 1worker)
准备
两台轻量级服务器 master节点配置2核4G磁盘60G的的ubuntu服务器, 工作节点配置2核2G磁盘50G的ubuntu服务器,他们直接可以进行内网通讯,并且他们在外网,不在中国大陆内,我们将采用 “内网通信 + 公网管理” 的标准架构。
架构
- 控制平面 (Master): 使用 内网 IP 监听服务,使用 公网 IP 允许你远程管理。
- 数据平面 (Worker): 仅通过 内网 与 Master 通信(速度快、延迟低、不消耗公网流量)。
- 网络插件: Calico(业界标准,支持网络策略)。
- 容器运行时: Containerd(配置 SystemdCgroup)。
⚠️ 注意: 你的 Worker 节点只有 2G 内存,对于 K8s 来说属于“紧凑型”配置。除去系统开销,大约还剩 1.2G 给应用,跑几个 Nginx 或 Go 服务没问题,但不要跑大型 Java 应用。
第一阶段:系统初始化 (在两台机器上都执行)
请在 Master 和 Worker 上都执行以下步骤:
- 设置主机名并配置 Hosts
为了让节点互相认识,我们需要设置名字和 IP 映射。
Master 上执行:
sudo hostnamectl set-hostname k8s-master
Worker 上执行:
sudo hostnamectl set-hostname k8s-node1
在两台机器上编辑 hosts 文件:
sudo vim /etc/hosts
追加以下内容(请替换为你的内网 IP):
Plaintext
<Master的内网IP> k8s-master
<Worker的内网IP> k8s-node1
- 关闭 Swap (必须)
sudo swapoff -a
sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
- 加载内核模块与流量转发
# 生成模块加载脚本
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
sudo modprobe overlay
sudo modprobe br_netfilter
# 配置 sysctl (允许 iptables 检查桥接流量)
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
sudo sysctl --system
- 安装 Containerd
# 安装基础依赖
sudo apt-get update
sudo apt-get install -y ca-certificates curl gnupg lsb-release
# 添加 Docker 官方 GPG Key (Containerd 在 Docker 源里)
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
# 添加仓库
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# 安装 containerd
sudo apt-get update
sudo apt-get install -y containerd.io
# --- 关键配置开始 ---
# 1. 生成默认配置
sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml
# 2. 开启 SystemdCgroup (K8s 强制要求)
sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/g' /etc/containerd/config.toml
# 3. 替换 sandbox 镜像 (解决版本警告)
sudo sed -i 's/registry.k8s.io\/pause:3.6/registry.k8s.io\/pause:3.9/g' /etc/containerd/config.toml
# 4. 重启服务
sudo systemctl restart containerd
sudo systemctl enable containerd
# --- 关键配置结束 ---
第二阶段:安装 K8s 组件 (在两台机器上都执行)
因为你在海外,直接用 Google 官方源,速度快且稳。
# 1. 下载 Google Cloud 公钥
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.29/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
# 2. 添加 K8s 仓库
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.29/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list
# 3. 安装工具
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl
第三阶段:初始化集群 (仅在 Master 执行)
这里是与上次最不同的地方。我们优先使用内网通讯,但保留公网访问能力。
请替换下方命令中的变量:
<Master内网IP>: 填写服务器的局域网 IP。
<Master公网IP>: 填写服务器的公网 IP (用于你远程 kubectl 连接)。
sudo kubeadm init \
--apiserver-advertise-address=<Master内网IP> \
--image-repository registry.k8s.io \
--pod-network-cidr=192.168.0.0/16 \
--apiserver-cert-extra-sans=<Master公网IP>
执行成功后:
配置 Kubectl:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
保存 Join 命令: 终端最后输出的那行 kubeadm join <内网IP>:6443 …,请复制下来。
第四阶段:安装网络插件 (仅在 Master 执行)
因为使用内网通讯,Calico 的配置会简单很多,默认配置通常就能工作。
kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.27.0/manifests/tigera-operator.yaml
kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.27.0/manifests/custom-resources.yaml
等待几分钟,检查 Pod 状态:
kubectl get pods -n calico-system
等到状态都变成 Running。
第五阶段:加入 Worker 节点 (仅在 Worker 执行)
在 k8s-node1 上,执行刚才保存的 Join 命令。注意,这里应该显示的是 Master 的内网 IP。
sudo kubeadm join <Master内网IP>:6443 --token <token> --discovery-token-ca-cert-hash sha256:<hash>
后续如何有节点需要加入和文中worker操作一致即可
第六阶段:最终验证
回到 Master 节点:
- 检查节点状态
kubectl get nodes
如果看到 k8s-master 和 k8s-node1 都是 Ready 状态,恭喜你,搭建成功!
- 部署测试应用
# 部署 Nginx
kubectl create deployment nginx-test --image=nginx
# 暴露端口
kubectl expose deployment nginx-test --port=80 --type=NodePort
# 查看端口
kubectl get svc nginx-test
假设看到 80:32000/TCP。
- 浏览器访问
访问 http://<Worker节点的公网IP>:32000。 如果看到 “Welcome to nginx!”,说明你的网络、路由、DNS、容器运行全部正常。
或者直接的worker节点:
root@k8s-node1:/home/ubuntu# curl http://127.0.0.1:32000
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
安全组/防火墙设置建议 (非常重要)
既然你有公网 IP,安全至关重要。请在云厂商控制台配置:
内网互通: 允许 Master 和 Worker 的内网 IP 之间互通 所有端口(最简单且安全,因为只走内网)。
Master 公网入站:
TCP 6443: 仅允许你的个人电脑 IP (不要全网开放!)。
TCP 22: 仅允许你的个人电脑 IP。
Worker 公网入站:
TCP 30000-32767: 允许公网访问 (用于 NodePort 服务)。
TCP 22: 仅允许你的个人电脑 IP。
按照这个流程,你应该能得到一个非常标准、稳定的 K8s 环境。
注意: 你可能需要在云厂商配置一下两台服务器的防火墙配置,后期有非常多的模块服务需要保证两台服务器的各个端口互通
本作品采用《CC 协议》,转载必须注明作者和本文链接
关于 LearnKu
很好,回头我也是试试