海外云服务器搭建Kubernetes(K8s)单节点集群完整教程:kubeadm+kubectl从零开始(2026最新版)
Meta Description: 从零开始用海外云服务器搭建Kubernetes单节点集群:kubeadm初始化Master节点、kubectl管理Pod、部署Nginx应用、Ingress入口配置、Dashboard可视化面板、k3s轻量替代方案全流程,附服务器配置推荐与价格对比。
- 前言:为什么要在海外服务器上搭K8s?
- 服务器配置推荐
- 第一步:准备服务器环境
- 第二步:初始化Master节点
- 第三步:取消单节点的污点限制
- 第四步:部署第一个应用验证集群
- 第五步:安装Ingress Controller
- 第六步:安装Kubernetes Dashboard
Meta Description: 从零开始用海外云服务器搭建Kubernetes单节点集群:kubeadm初始化Master节点、kubectl管理Pod、部署Nginx应用、Ingress入口配置、Dashboard可视化面板、k3s轻量替代方案全流程,附服务器配置推荐与价格对比。
关键词:Kubernetes搭建教程、K8s单节点集群、kubeadm安装教程、海外云服务器部署K8s、kubectl管理、K3s轻量Kubernetes、Kubernetes入门教程、容器编排、K8s Dashboard
前言:为什么要在海外服务器上搭K8s?
很多开发者对Kubernetes(简称K8s)既熟悉又陌生——面试时能聊架构,实际动手却不知道从哪开始。Kubernetes是Google开源的容器编排系统,能自动管理Docker容器的部署、扩缩容和负载均衡。对于个人开发者和小团队来说,在海外云服务器上搭建一个单节点Kubernetes集群,既能学习云原生技术栈,又能用它来部署自己的应用。本文用最简单的方式,带你从零开始用kubeadm搭建一个可用的K8s单节点集群,所有命令可直接复制执行。
服务器配置推荐
K8s对资源的要求比普通Web应用高不少——至少需要2核CPU、2GB内存,推荐4核8G起步。
配置档位推荐
| 配置档位 | CPU | 内存 | 系统盘 | 月费参考 | 适用场景 |
|---|---|---|---|---|---|
| 入门学习 | 2核 | 2GB | 40GB SSD | $5-8 | 单节点实验、跑1-2个应用 |
| 推荐配置 | 4核 | 8GB | 80GB SSD | $12-20 | 单节点生产、跑3-5个应用 |
| 进阶配置 | 8核 | 16GB | 160GB SSD | $25-40 | 多副本、有状态应用、CI/CD |
| 生产级 | 16核 | 32GB | 200GB SSD | $50-80 | 多节点集群、高可用部署 |
主流云服务商价格对比
| 服务商 | 最低配 | 4核8G | 数据中心 | 优点 |
|---|---|---|---|---|
| 阿里云国际版 ECS | $4.2/月 | $15/月 | 新加坡/香港/硅谷 | 中文面板、支持支付宝 |
| AWS Lightsail | $3.5/月 | $16/月 | 全球20+区域 | 新用户免费套餐、生态完善 |
| 腾讯云国际版 CVM | $4.5/月 | $16/月 | 香港/新加坡/东京 | 低延迟到国内、微信支付 |
| Vultr | $6.0/月 | $18/月 | 全球32个 | 按小时计费、随时销毁 |
| DigitalOcean | $6.0/月 | $18/月 | 全球14个 | 文档最完善、社区教程多 |
💡 K8s推荐配置:建议选择4核8G以上,因为K8s系统组件(kube-apiserver、etcd、kube-scheduler等)本身就需要约1-2GB内存。通过 5.chengzicloud.cloud 购买阿里云/AWS/腾讯云国际版享专属折扣。
第一步:准备服务器环境
以Ubuntu 22.04 LTS为例(CentOS 7已不推荐,因为Kubernetes 1.25+不再支持CentOS 7)。如果你使用的是其他系统,命令略有不同。
1.1 系统更新与基础配置
// 更新系统包sudo apt update && sudo apt upgrade -y
// 关闭swap分区(K8s要求swap必须关闭)sudo swapoff -a
sudo sed -i '/ swap / s/^/#/' /etc/fstab
// 验证swap已关闭free -h
// 输出中Swap行应为0
// 设置主机名(可选,便于识别)sudo hostnamectl set-hostname k8s-master
// 配置内核参数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
// 加载必要内核模块cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
sudo modprobe overlay
sudo modprobe br_netfilter
1.2 安装containerd容器运行时
Kubernetes从1.24版本开始移除了对dockershim的原生支持,推荐使用containerd作为容器运行时。
// 安装containerdsudo apt install -y containerd
// 生成默认配置文件sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml
// 启用systemd cgroup驱动(K8s推荐)sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml
// 配置国内镜像加速(可选,海外服务器可跳过)sudo sed -i 's|sandbox_image = "registry.k8s.io/pause:.*"|sandbox_image = "registry.k8s.io/pause:3.9"|' /etc/containerd/config.toml
// 重启containerdsudo systemctl restart containerd
sudo systemctl enable containerd
// 验证containerd运行正常sudo systemctl status containerd
// 应显示 active (running)```
### 1.3 安装kubeadm、kubelet和kubectl
// 安装必要工具sudo apt install -y apt-transport-https ca-certificates curl
// 添加Kubernetes官方GPG密钥curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.30/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
// 添加Kubernetes apt源echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.30/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list
// 安装kubeadm、kubelet、kubectlsudo apt update sudo apt install -y kubelet kubeadm kubectl
// 锁定版本,防止自动更新sudo apt-mark hold kubelet kubeadm kubectl
// 验证安装kubeadm version kubectl version --client
> 🚀 还没有海外云服务器?通过 [5.chengzicloud.cloud](https://5.chengzicloud.cloud) 选购阿里云/AWS/腾讯云国际版,4核8G配置最适合学习K8s,享专属折扣和中文技术支持。
## 第二步:初始化Master节点
### 2.1 使用kubeadm init
// 初始化Kubernetes集群// 替换YOUR_SERVER_IP为你的服务器公网IPsudo kubeadm init \ --pod-network-cidr=10.244.0.0/16 \ --apiserver-advertise-address=YOUR_SERVER_IP \ --image-repository registry.aliyuncs.com/google_containers
// 如果使用国内镜像源,去掉 --image-repository 参数// 海外服务器可直接执行:sudo kubeadm init \ --pod-network-cidr=10.244.0.0/16 \ --apiserver-advertise-address=YOUR_SERVER_IP
**参数说明**:
- `--pod-network-cidr=10.244.0.0/16`:Pod网络地址范围,Flannel插件使用此范围
- `--apiserver-advertise-address`:API Server对外暴露的IP地址
- `--image-repository`:指定镜像源,国内用阿里云镜像
### 2.2 配置kubectl
// 创建kubectl配置目录mkdir -p $HOME/.kube sudo cp -f /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config
// 验证集群状态kubectl get nodes // NAME STATUS ROLES AGE VERSION// k8s-master NotReady control-plane 1m v1.30.x // 查看所有系统Podkubectl get pods -n kube-system
此时节点状态为`NotReady`,这是因为还没有安装网络插件。别急,下一步安装。
### 2.3 安装网络插件(Flannel)
// 应用Flannel网络插件kubectl apply -f https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml
// 等待所有Pod变为Running(约1-2分钟)kubectl get pods -n kube-system --watch
// 验证节点状态变为Readykubectl get nodes // NAME STATUS ROLES AGE VERSION// k8s-master Ready control-plane 5m v1.30.x```
第三步:取消单节点的污点限制
默认情况下,Master节点不会调度普通Pod(有taint)。单节点集群需要手动移除这个限制:
// 移除Master节点的taint,允许调度普通Podkubectl taint nodes --all node-role.kubernetes.io/control-plane-
// 验证taint已移除kubectl describe node k8s-master | grep Taint
// 输出为空表示已移除```
## 第四步:部署第一个应用验证集群
### 4.1 部署Nginx测试应用
// 创建一个Nginx Deploymentkubectl create deployment nginx-test --image=nginx:latest --replicas=2
// 查看Pod状态kubectl get pods -o wide // NAME READY STATUS RESTARTS AGE IP NODE// nginx-test-xxx-yyy 1/1 Running 0 30s 10.244.0.5 k8s-master// nginx-test-xxx-zzz 1/1 Running 0 30s 10.244.0.6 k8s-master // 暴露服务(NodePort方式)kubectl expose deployment nginx-test --type=NodePort --port=80
// 查看Servicekubectl get svc nginx-test // NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE// nginx-test NodePort 10.96.xxx.xxx <none> 80:3xxxx/TCP 30s```
4.2 访问测试
// 通过NodePort访问(将3xxxx替换为实际端口号)curl http://YOUR_SERVER_IP:3xxxx
// 应返回Nginx欢迎页面HTML
// 或者使用kubectl port-forwardkubectl port-forward svc/nginx-test 8080:80 &
curl http://localhost:8080
4.3 清理测试资源
kubectl delete deployment nginx-test
kubectl delete svc nginx-test
第五步:安装Ingress Controller
Ingress是K8s中管理外部HTTP/HTTPS流量的入口控制器,类似于Nginx反向代理。
5.1 安装Nginx Ingress Controller
// 使用Helm安装(推荐方式)// 先安装Helmcurl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
// 添加Nginx Ingress Helm仓库helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update
// 安装Nginx Ingress Controllerhelm install ingress-nginx ingress-nginx/ingress-nginx \
--namespace ingress-nginx \
--create-namespace \
--set controller.service.type=NodePort \
--set controller.service.nodePorts.http=30080 \
--set controller.service.nodePorts.https=30443
// 等待Pod就绪kubectl get pods -n ingress-nginx --watch
5.2 配置Ingress规则
// ingress-test.yamlapiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: test-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: yourdomain.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: nginx-test
port:
number: 80
// 应用Ingress规则kubectl apply -f ingress-test.yaml
// 查看Ingress状态kubectl get ingress
第六步:安装Kubernetes Dashboard
Dashboard是K8s的Web管理界面,能直观地查看集群状态、管理资源。
6.1 安装Dashboard
// 应用Dashboard官方YAMLkubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/charts/kubernetes-dashboard.yaml
// 创建管理员用户和Tokencat <<EOF | kubectl apply -f -
apiVersion: v1
kind: ServiceAccount
metadata:
name: admin-user
namespace: kubernetes-dashboard
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: admin-user
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: admin-user
namespace: kubernetes-dashboard
EOF
// 获取登录Tokenkubectl -n kubernetes-dashboard create token admin-user
// 输出的Token字符串用于Dashboard登录```
### 6.2 访问Dashboard
// 通过NodePort访问(默认30001端口)kubectl get svc -n kubernetes-dashboard // 使用上面输出的Token登录 // 或者使用kubectl proxykubectl proxy // 访问 http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/```
🚀 通过 5.chengzicloud.cloud 购买阿里云/AWS/腾讯云国际版,一键部署海外服务器,轻松搭建K8s学习环境。
第七步:k3s轻量替代方案(资源有限时的推荐)
如果服务器配置较低(2核2G以下),或者你只是想快速体验K8s,k3s是最佳选择。k3s是Rancher开发的轻量级Kubernetes发行版,官方安装只需一条命令。
7.1 k3s一键安装
// 一条命令安装k3s(自动配置所有组件)curl -sfL https://get.k3s.io | sh -
// 安装完成后配置kubectlexport KUBECONFIG=/etc/rancher/k3s/k3s.yaml
// 持久化环境变量echo 'export KUBECONFIG=/etc/rancher/k3s/k3s.yaml' >> ~/.bashrc
source ~/.bashrc
// 验证集群状态kubectl get nodes
// NAME STATUS ROLES AGE VERSION// k3s-master Ready control-plane,master 30s v1.29.x+k3s1```
### 7.2 k3s vs kubeadm对比
| 对比项 | kubeadm | k3s |
|--------|---------|-----|
| 安装复杂度 | 需要多步手动配置 | 一条命令自动完成 |
| 内存占用 | 约1.5-2GB | 约512MB |
| 内置组件 | etcd + 外部组件 | 内置SQLite(可选etcd) |
| 生产适用 | 适合多节点生产环境 | 适合边缘/轻量场景 |
| 学习价值 | 了解K8s底层组件 | 快速体验K8s生态 |
| 网络插件 | 需要手动安装 | 内置Flannel |
### 7.3 k3s卸载
// 如果想切换回kubeadm,先卸载k3s/usr/local/bin/k3s-uninstall.sh
## 进阶配置:常用kubectl命令速查
// 查看集群信息kubectl cluster-info
// 查看所有命名空间的Podkubectl get pods -A
// 查看Pod详情(排错用)kubectl describe pod POD_NAME
// 查看Pod日志kubectl logs POD_NAME kubectl logs POD_NAME -f # 实时跟踪
// 进入Pod内部kubectl exec -it POD_NAME -- /bin/bash
// 创建/应用资源kubectl apply -f resource.yaml kubectl create -f resource.yaml
// 删除资源kubectl delete -f resource.yaml kubectl delete pod POD_NAME
// 扩缩容kubectl scale deployment/nginx --replicas=3
// 滚动更新镜像kubectl set image deployment/nginx nginx=nginx:1.25
// 查看资源使用情况kubectl top nodes kubectl top pods
// 导出资源配置(备份用)kubectl get deployment nginx -o yaml > nginx-backup.yaml
## 安全加固:上线前必做
// 1. 禁用Dashboard的匿名访问(如果启用了)kubectl delete clusterrolebinding kubernetes-dashboard
// 2. 配置RBAC权限(最小权限原则)cat <<EOF | kubectl apply -f - apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: namespace: default name: pod-reader rules:
- apiGroups: [""]
resources: ["pods", "pods/log"] verbs: ["get", "watch", "list"]
apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: read-pods namespace: default subjects:
- kind: ServiceAccount
name: default roleRef: kind: Role name: pod-reader apiGroup: rbac.authorization.k8s.io EOF
// 3. 限制Pod资源配额cat <<EOF | kubectl apply -f - apiVersion: v1 kind: ResourceQuota metadata: name: default-quota namespace: default spec: hard: requests.cpu: "2" requests.memory: 4Gi limits.cpu: "4" limits.memory: 8Gi EOF
// 4. 定期备份etcd数据(kubeadm集群)sudo ETCDCTL_API=3 etcdctl snapshot save /backup/etcd-snapshot-$(date +%Y%m%d).db \ --endpoints=https://127.0.0.1:2379 \ --cacert=/etc/kubernetes/pki/etcd/ca.crt \ --cert=/etc/kubernetes/pki/etcd/server.crt \ --key=/etc/kubernetes/pki/etcd/server.key
// 5. 更新K8s组件版本(谨慎操作)sudo apt update && sudo apt install -y --only-upgrade kubeadm kubelet kubectl sudo systemctl restart kubelet
## 延伸阅读
- [海外云服务器搭建Docker+Portainer容器管理平台完整教程](https://5.chengzicloud.cloud/blog.php?post=docker-portainer-deploy-guide)
- [海外云服务器搭建LNMP环境完整教程](https://5.chengzicloud.cloud/blog.php?post=lnmp-deploy-guide)
- [海外云服务器性能压测/跑分完整教程](https://5.chengzicloud.cloud/blog.php?post=server-benchmark-guide)
> 本文由 [5.chengzicloud.cloud](https://5.chengzicloud.cloud) 提供,点击访问首页了解更多海外云服务器部署方案和专属优惠。
常见问题(FAQ)
kubeadm init失败提示端口被占用怎么办?
检查是否已运行K8s相关服务或Docker。执行sudo kubeadm reset清理环境,确认没有其他容器运行时占用2379/2380/10250等端口。如果之前装过k3s,先执行k3s卸载脚本。
Pod一直处于Pending状态?
通常是资源不足或节点有taint。执行kubectl describe pod POD_NAME查看Events部分,如果是Insufficient cpu/memory则需要升级服务器配置,如果是taint则按第二步操作移除。
kubectl命令报错Unable to connect to the server?
检查kubeconfig文件是否正确配置。执行cp /etc/kubernetes/admin.conf $HOME/.kube/config,并确认服务器防火墙开放了6443端口(K8s API Server默认端口)。
k3s和kubeadm应该选哪个?
如果只是学习和测试,选k3s(一条命令搞定,内存占用低)。如果要学习K8s底层原理或准备生产部署,选kubeadm(能了解etcd、API Server等组件)。两者部署的应用完全兼容,随时可以互相切换。
K8s集群如何备份和恢复?
kubeadm集群主要备份etcd数据。执行etcdctl snapshot save命令创建快照,恢复时用etcdctl snapshot restore。k3s则更简单,备份/var/lib/rancher/k3s/server/目录即可。建议配合云厂商的快照功能做双重备份。
单节点集群能跑多少应用?
取决于服务器配置。4核8G的服务器,在合理设置资源配额的情况下,可以稳定运行5-10个轻量级应用。如果应用有数据库等有状态服务,建议减少到3-5个。超过这个数量,建议升级到8核16G或搭建多节点集群。
K8s集群怎么升级到新版本?
先升级kubeadm:sudo apt install kubeadm=VERSION,然后执行sudo kubeadm upgrade apply,再升级kubelet和kubectl。建议在测试环境验证后再在生产环境操作。k3s升级更简单:curl -sfL https://get.k3s.io | INSTALL_K3S_VERSION=v1.29.x+k3s1 sh -。