在 Kubernetes 上使用 Amazon EKS 部署 2048 游戏 — 端到端 DevOps 项目
Source: Dev.to
项目目标
- 将应用容器化
- 在 Kubernetes 集群上部署
- 对外部网络公开
- 了解 Kubernetes 工作负载在真实云环境中的运行方式
GitHub 仓库:
👉
项目架构概览
工作流遵循典型的 Kubernetes 部署生命周期:
- 容器化 应用程序,使用 Docker
- 创建 Amazon EKS 集群
- 配置 IAM 角色和工作节点
- 部署 应用程序,使用 Kubernetes 清单
- 暴露 应用程序,使用
LoadBalancer服务 - 从 Internet 访问 应用程序
前置条件
在开始之前,安装并配置以下工具:
| 工具 | 目的 |
|---|---|
| kubectl | 用于与 Kubernetes 集群交互的 CLI(部署应用、检查资源、管理集群)。 |
| eksctl | 简化 Amazon EKS 集群的创建和管理(自动化许多 AWS 资源)。 |
| AWS CLI | 允许直接与 AWS 服务交互;用于对 EKS 进行身份验证并更新 kubeconfig 文件。 |
一旦这些工具准备就绪,您就可以开始构建 Kubernetes 环境。
第一步 – 创建 Amazon EKS 集群
EKS 集群由两个主要组件组成:
- 控制平面 – 由 AWS 管理
- 工作节点 – 运行 Pod 的 EC2 实例
创建集群时,需要配置:
- 默认 VPC
- 2–3 个子网
- 安全组
- 公共集群端点访问
集群创建通常需要 10–12 分钟。当状态变为 Active 时,继续下一步。
步骤 2 – 创建 IAM 角色
AWS 服务在很大程度上依赖 IAM 角色和权限。需要两个角色:
1. EKS 集群角色
允许 Kubernetes 控制平面与其他 AWS 服务交互。
Policy attached: AmazonEKSClusterPolicy
2. 节点组角色
为工作节点提供与 AWS 服务通信的权限。
Policies attached:
AmazonEKSWorkerNodePolicy
AmazonEC2ContainerRegistryReadOnly
AmazonEKS_CNI_Policy
这些权限使节点能够:
- 从 ECR 拉取容器镜像
- 与控制平面通信
- 通过 CNI 插件管理网络
第 3 步 – 添加工作节点
创建一个 Node Group 来托管 pod。
| 设置 | 值 |
|---|---|
| AMI | Amazon Linux 2 |
| 期望节点数 | 1(可稍后扩展) |
| 安全组端口 | 22, 80, 8080 |
| SSH 访问 | 已启用 |
几分钟后,节点组将变为 Active 并可用于工作负载。
步骤 4 – 与集群进行身份验证
更新本地 kubeconfig,以便 kubectl 能够与集群通信:
aws eks update-kubeconfig --region us-east-1 --name my-cluster
此命令会在本地存储集群凭证。
验证连接
kubectl get nodes
如果节点列表显示,说明集群已正确配置。
第 5 步 – 部署 2048 游戏 Pod
创建一个用于 2048 游戏的 Pod 定义:
apiVersion: v1
kind: Pod
metadata:
name: 2048-pod
labels:
app: 2048-ws
spec:
containers:
- name: 2048-container
image: blackicebird/2048
ports:
- containerPort: 80
应用清单:
kubectl apply -f 2048-pod.yaml
检查 Pod 状态:
kubectl get pods
当 Pod 显示 Running 时,说明应用已成功部署到集群中。
第 6 步 – 暴露应用
创建一个 LoadBalancer 服务,使游戏可以从 Internet 访问:
apiVersion: v1
kind: Service
metadata:
name: 2048-service
spec:
type: LoadBalancer
selector:
app: 2048-ws
ports:
- protocol: TCP
port: 80
targetPort: 80
应用该服务:
kubectl apply -f 2048-service.yaml
几秒钟后,AWS 会创建一个 ELB。获取它的 DNS 名称:
kubectl get svc 2048-service
在浏览器中打开该 DNS 名称——2048 游戏应已完整可用。
暴露应用的其他细节

虽然 Pod 已经在运行,但仍无法从集群外部访问。为了解决这个问题,我们创建一个 Kubernetes Service:
apiVersion: v1
kind: Service
metadata:
name: mygame-svc
spec:
selector:
app: 2048-ws
ports:
- protocol: TCP
port: 80
targetPort: 80
type: LoadBalancer
部署该服务:
kubectl apply -f mygame-svc.yaml
检查服务详情:
kubectl describe svc mygame-svc
Kubernetes 将自动为其配置一个 公共 LoadBalancer。
第7步 — 访问应用程序
创建 LoadBalancer 后,AWS 会生成一个公共 DNS 端点。 在浏览器中打开该 DNS 名称——2048 游戏界面会出现,应用程序即可公开访问。

扩展应用
Kubernetes 最大的优势之一是 水平扩展。如果流量增加,可以创建额外的副本:
kubectl scale deployment my-app --replicas=3
Kubernetes 将自动在 pod 之间分配流量,确保高可用性和性能提升。
我从此项目中学到的内容
- Kubernetes 工作负载 – 了解 pod 如何在集群内部运行容器化应用。
- 托管式 Kubernetes – 了解 Amazon EKS 如何通过管理控制平面来简化集群管理。
- Kubernetes 网络 – 了解服务和负载均衡器如何将应用程序暴露到外部。
- 云基础设施 – 了解 AWS 如何将网络、计算和容器编排集成在一起。
可能的改进
- 使用 Deployments 代替独立的 pod。
- 实施 Ingress controllers。
- 添加 CI/CD pipelines。
- 使用 Prometheus 和 Grafana 进行监控。
- 使用 Terraform 实现基础设施自动化。
这些补充将使项目更接近 production‑grade Kubernetes deployment。
最后思考
Kubernetes 起初可能让人感到不知所措,但像这样的项目可以更容易地理解所有内容是如何协同工作的。通过部署一个简单的应用程序,例如 2048 游戏,我们可以清晰地看到:
- 容器在 pod 中运行。
- Pod 在工作节点上运行。
- 服务暴露应用程序。
- 负载均衡器提供外部访问。
如果你正在学习 DevOps、Kubernetes 或云工程,构建此类项目是获得实践经验的最佳途径之一。
项目仓库
浏览完整项目仓库中的代码、YAML 清单和设置步骤:
