Ubuntu搭建K8S集群(1master, 1worker)

AI摘要
本文是一份详细的Kubernetes集群搭建技术指南,属于【知识分享】。内容系统阐述了在海外两台Ubuntu服务器上,采用“内网通信+公网管理”架构部署K8s集群的完整流程,涵盖服务器配置、系统初始化、Containerd安装、K8s组件部署、集群初始化、Calico网络插件配置、节点加入、应用测试及安全组设置等关键步骤,并特别提醒了低内存Worker节点的应用部署限制。

准备

两台轻量级服务器 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 上都执行以下步骤:

  1. 设置主机名并配置 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
  1. 关闭 Swap (必须)
sudo swapoff -a
sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
  1. 加载内核模块与流量转发
# 生成模块加载脚本
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
  1. 安装 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 节点:

  1. 检查节点状态
kubectl get nodes

如果看到 k8s-master 和 k8s-node1 都是 Ready 状态,恭喜你,搭建成功!

  1. 部署测试应用
# 部署 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。

  1. 浏览器访问
    访问 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 协议》,转载必须注明作者和本文链接
刻意学习
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 1

很好,回头我也是试试

3周前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!
未填写
文章
140
粉丝
111
喜欢
219
收藏
309
排名:302
访问:3.1 万
私信
所有博文
社区赞助商