You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在EC2实例搭建单节点Kubernetes集群并从笔记本安全访问与调试?

在EC2上搭建单节点Kubernetes集群并安全访问的完整方案

我之前帮朋友解决过类似的问题,minikube确实更适合本地开发,在EC2上用它反而容易踩网络配置的坑,换成kubeadm搭建单节点集群会更稳定,完全能满足你跑10个服务+本地调试的需求。下面是一步步的实操指南:

一、准备EC2实例

  • 实例类型:选t3.medium就够了(2核4G内存),跑10个普通服务完全没问题,预算有限的话t3.small也能凑合用,但优先推荐medium避免资源不足。
  • 操作系统:优先选Ubuntu 22.04 LTS或者Amazon Linux 2,这两个发行版对Kubernetes的依赖支持最完善,兼容性问题最少。
  • 安全组配置:这是安全的关键,一定要锁死访问权限:
    • 允许SSH(22端口):只开放给你的笔记本公网IP,避免被暴力破解。
    • 允许K8s API(6443端口):如果用SSH隧道方案,这里可以不用开;如果直接用公网IP访问,同样只开放给你的笔记本IP。
    • 暂时不用开其他端口,后续调试用kubectl port-forward就能搞定,无需暴露服务到公网。

二、在EC2上安装单节点K8s集群

1. 初始化系统环境

首先SSH登录到EC2实例,执行以下命令:

# 关闭swap(K8s要求必须关闭)
swapoff -a
# 永久禁用swap,注释掉/etc/fstab里的swap行
sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab

# 加载K8s需要的内核模块
sudo modprobe overlay
sudo modprobe br_netfilter

# 配置内核参数
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

2. 安装Containerd容器运行时

K8s现在默认推荐用Containerd,比Docker更轻量:

# 安装依赖
sudo apt-get update && sudo apt-get install -y ca-certificates curl gnupg lsb-release

# 添加Docker官方GPG密钥(Containerd在Docker源里)
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/docker.gpg

# 添加Docker软件源
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/trusted.gpg.d/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

# 生成默认配置文件
sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml

# 修改配置,启用systemd cgroup驱动(和Kubelet匹配)
sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/g' /etc/containerd/config.toml

# 重启Containerd并设置开机自启
sudo systemctl restart containerd
sudo systemctl enable containerd

3. 安装Kubeadm、Kubelet和Kubectl

# 添加K8s官方GPG密钥
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.28/deb/Release.key | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/kubernetes-apt-keyring.gpg

# 添加K8s软件源
echo 'deb [signed-by=/etc/apt/trusted.gpg.d/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.28/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list

# 安装指定版本(这里用1.28稳定版,你可以换成最新稳定版)
sudo apt-get update && sudo apt-get install -y kubelet kubeadm kubectl

# 锁定版本,避免自动更新导致兼容性问题
sudo apt-mark hold kubelet kubeadm kubectl

# 启动Kubelet并设置开机自启
sudo systemctl enable --now kubelet

4. 初始化单节点集群

# 初始化集群,用EC2私网IP作为apiserver的广告地址,pod网段用Flannel默认的10.244.0.0/16
# 如果后续要直接用公网IP访问,加上--apiserver-cert-extra-sans=<你的EC2公网IP>参数
sudo kubeadm init --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address=<EC2私网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

# 允许pod在master节点上运行(单节点集群必须做这一步)
kubectl taint nodes --all node-role.kubernetes.io/control-plane-

5. 安装CNI网络插件(Flannel)

单节点集群用Flannel最简单,不需要复杂配置:

# 先从Flannel官方渠道获取kube-flannel.yml配置文件,保存到本地后上传到EC2实例
# 然后执行以下命令应用配置:
kubectl apply -f kube-flannel.yml

# 等待所有pod启动完成,执行这个命令看到所有pod都是Running状态就OK了
kubectl get pods -n kube-flannel

三、从笔记本安全访问集群

给你两种方案,优先选第一种,安全性更高:

方案1:SSH隧道(推荐,无需开放6443到公网)

这种方式通过SSH把本地的6443端口转发到EC2的localhost,完全不用在安全组里开6443端口,最安全:

  1. 在笔记本上打开终端,执行SSH隧道命令:
# 替换成你的EC2密钥路径和公网IP
ssh -i "your-ec2-key.pem" -L 6443:localhost:6443 ubuntu@<EC2公网IP>

这个窗口要保持打开,隧道才会一直生效。

  1. 把EC2上的kubectl配置文件复制到笔记本:
scp -i "your-ec2-key.pem" ubuntu@<EC2公网IP>:~/.kube/config ~/.kube/config-ec2
  1. 修改笔记本上的配置文件,把server地址改成https://localhost:6443:
# 用文本编辑器打开config-ec2,找到server那一行修改
# 比如用vim:
vim ~/.kube/config-ec2
  1. 测试访问:
kubectl --kubeconfig=~/.kube/config-ec2 get nodes

如果能看到EC2节点的状态是Ready,就成功了!你也可以把这个配置合并到默认的~/.kube/config里,方便直接用kubectl命令。

方案2:直接用公网IP访问(需要安全组限制)

如果不想一直开着SSH窗口,可以用这种方式,但一定要在安全组里把6443端口只开放给你的笔记本IP:

  1. 在EC2初始化集群的时候,一定要加上--apiserver-cert-extra-sans=<EC2公网IP>,这样apiserver的证书里会包含公网IP,不会出现证书验证错误。

  2. 把EC2的config文件复制到笔记本,然后修改server字段为https://<EC2公网IP>:6443。

  3. 测试访问,同样用kubectl get nodes验证。

四、调试服务的常用操作

  • 端口转发调试:部署服务后,用这个命令把容器端口转发到笔记本本地:
# 比如把my-api服务的80端口转发到本地8080
kubectl port-forward service/my-api 8080:80

然后在笔记本浏览器访问localhost:8080就能调试了。

  • 查看日志:
# 查看某个pod的实时日志
kubectl logs -f <pod-name>

# 查看某个容器的日志(如果pod里有多个容器)
kubectl logs -f <pod-name> -c <container-name>
  • 进入pod调试:
kubectl exec -it <pod-name> -- /bin/bash

注意事项

  • 一定要确保EC2实例的安全组配置正确,不要把SSH或6443端口开放给0.0.0.0/0,否则会有被攻击的风险。
  • 如果遇到kubelet启动失败,先检查swap是否完全关闭,或者containerd的cgroup驱动是否配置正确。
  • 集群版本尽量选稳定版,不要用最新的测试版,避免出现未知bug。

内容的提问来源于stack exchange,提问作者Tom White

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 09:40:31