如何在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端口,最安全:
- 在笔记本上打开终端,执行SSH隧道命令:
# 替换成你的EC2密钥路径和公网IP ssh -i "your-ec2-key.pem" -L 6443:localhost:6443 ubuntu@<EC2公网IP>
这个窗口要保持打开,隧道才会一直生效。
- 把EC2上的kubectl配置文件复制到笔记本:
scp -i "your-ec2-key.pem" ubuntu@<EC2公网IP>:~/.kube/config ~/.kube/config-ec2
- 修改笔记本上的配置文件,把server地址改成
https://localhost:6443:
# 用文本编辑器打开config-ec2,找到server那一行修改 # 比如用vim: vim ~/.kube/config-ec2
- 测试访问:
kubectl --kubeconfig=~/.kube/config-ec2 get nodes
如果能看到EC2节点的状态是Ready,就成功了!你也可以把这个配置合并到默认的~/.kube/config里,方便直接用kubectl命令。
方案2:直接用公网IP访问(需要安全组限制)
如果不想一直开着SSH窗口,可以用这种方式,但一定要在安全组里把6443端口只开放给你的笔记本IP:
在EC2初始化集群的时候,一定要加上
--apiserver-cert-extra-sans=<EC2公网IP>,这样apiserver的证书里会包含公网IP,不会出现证书验证错误。把EC2的config文件复制到笔记本,然后修改server字段为
https://<EC2公网IP>:6443。测试访问,同样用
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
相关产品推荐
相关产品推荐

