海外云服务器搭建Kubernetes(K8s)单节点集群完整教程:kubeadm+kubectl从零开始(2026最新版)

📅 · 海外云服务器自建服务教程 - ChengziCloud

一句话结论

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核2GB40GB SSD$5-8单节点实验、跑1-2个应用
推荐配置4核8GB80GB SSD$12-20单节点生产、跑3-5个应用
进阶配置8核16GB160GB SSD$25-40多副本、有状态应用、CI/CD
生产级16核32GB200GB 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 -。