创建 AWS EKS Fargate v1.30 并畅玩波斯王子!
本文将提供使用 eksctl (v1.30) 创建 EKS 集群的分步指南。此外,还将演示如何部署基于 MS-DOS 版《波斯王子》的游戏。
要求
- AWS 账户/AWS CLI
- GitHub 帐户或任何 Git 仓库
- Docker
- eksctl
- 舵
攻略
在 AWS 中打开 Cloud Shell 服务。
如果尚未安装 eksctl,请使用以下命令安装:
curl --silent --location "https://github.com/weaveworks/eksctl/releases/latest/download/eksctl_$(uname -s)_amd64.tar.gz" | tar xz -C /tmp
sudo mv /tmp/eksctl /usr/local/bin

现在,让我们使用 Fargate 1.30 版本创建集群。运行以下命令。(请确保将集群创建在与 VPC 相同的区域中)
eksctl create cluster --name gaming-cluster --version 1.30 --region us-east-1 --fargate
如果要将集群创建在特定的 VPC 中,请务必指定相应的子网(否则,此命令将创建一个专用于 EKS 的 VPC)。
eksctl create cluster --name gaming-cluster --version 1.30 --region us-east-1 --fargate --vpc-private-subnets subnet-private-1, subnet-private-2
现在让我们在集群中关联一个 OIDC 提供程序。
eksctl utils associate-iam-oidc-provider --region us-east-1 --cluster gaming-cluster --approve
我们的集群现在已准备就绪,并包含默认的 Fargate 配置,其中包含命名空间 default 和 kube-system。
让我们为游戏应用创建一个 Fargate 配置。(请务必同时在 Kubernetes 集群内部创建 ns。)
eksctl create fargateprofile \
--cluster gaming-cluster \
--name fp-gaming \
--namespace gaming \
--region us-east-1
现在,让我们添加 AWS 负载均衡器控制器,以便使用 AWS 负载均衡器公开我们的应用程序。
为此,我们需要创建一个 IAM 策略、一个服务帐户,并使用 Helm 安装插件。
以这个 IAM 策略为例:
curl -o iam-policy.json https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/main/docs/install/iam_policy.json
创建 IAM 策略
aws iam create-policy \
--policy-name AWSLoadBalancerControllerIAMPolicy-EKS \
--policy-document file://iam-policy.json
现在让我们为这个控制器创建一个服务帐户。
eksctl create iamserviceaccount --cluster=gaming-cluster --namespace=kube-system --name=aws-load-balancer-controller --attach-policy-arn=arn:aws:iam::<account_id>:policy/AWSLoadBalancerControllerIAMPolicy-EKS --approve
太棒了!现在轮到 Helm 了,来安装一些有用的图表,在本例中是 AWS 负载均衡器控制器。
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
运行以下命令:
helm repo add eks https://aws.github.io/eks-charts
kubectl apply -k "github.com/aws/eks-charts/stable/aws-load-balancer-controller/crds?ref=master"
helm upgrade -i aws-load-balancer-controller eks/aws-load-balancer-controller -n kube-system --set clusterName=gaming-cluster --set serviceAccount.create=false --set serviceAccount.name=aws-load-balancer-controller --set vpcId=<the same vpc as the cluster>
太棒了,现在我们可以访问我们的集群了。
aws eks update-kubeconfig --name gaming-cluster --region us-east-1
在继续之前,让我们先创建游戏命名空间。
kubectl create ns gaming
我们离胜利只差一步之遥了,现在轮到你赢了。
为此,我将使用oklemenz、ultrabolido和jmechner提供的这个分支。
git clone https://github.com/bdllerena/PrinceJS
克隆我们的镜像后,请务必创建一个 ECR 存储库(或者使用您选择的任何存储库来托管我们的波斯王子镜像)。
现在复制推送命令,它应该看起来像这样。
aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin <account_id>.dkr.ecr.us-east-1.amazonaws.com
我们的仓库中应该有一个类似这样的 Dockerfile 文件。
注意:我们使用 `--platform=linux/amd64` 标志是因为我们的 Kubernetes 集群支持此平台。否则,如果我们使用 Docker Desktop 等工具构建 Docker 镜像,它将使镜像与本地操作系统兼容。
FROM --platform=linux/amd64 node:18
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 8080
CMD ["npm", "start"]
在我们的代码仓库中执行以下命令
docker build -t prince-of-persia .
镜像构建完成后,我们给它打标签并将其推送到 ECR。
docker tag prince-of-persia:latest <account_id>.dkr.ecr.us-east-1.amazonaws.com/prince-of-persia:latest
docker push <account_id>.dkr.ecr.us-east-1.amazonaws.com/prince-of-persia:latest
apiVersion: apps/v1
kind: Deployment
metadata:
name: prince-of-persia
namespace: gaming
spec:
replicas: 1
selector:
matchLabels:
app: prince-of-persia
template:
metadata:
labels:
app: prince-of-persia
spec:
containers:
- name: prince-of-persia
image: <account_id>.dkr.ecr.us-east-1.amazonaws.com/prince-of-persia:latest
ports:
- containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
annotations:
service.beta.kubernetes.io/aws-load-balancer-nlb-target-type: ip
service.beta.kubernetes.io/aws-load-balancer-scheme: internet-facing
service.beta.kubernetes.io/aws-load-balancer-type: external
name: prince-of-persia
namespace: gaming
spec:
ports:
- port: 80
protocol: TCP
targetPort: 8080
selector:
app: prince-of-persia
type: LoadBalancer
确认我们的镜像与推送到 ECR 的镜像相同后,执行我们的清单!
kubectl apply -f manifest.yaml
此清单将创建一个包含 1 个副本(1 个 pod)的部署,以及一个面向客户端(公共)的网络负载均衡器服务。
几分钟后,使用此命令检查服务是否已创建。
kubectl get svc -n gaming
太棒了!如果你愿意,可以查看 pod 的日志,看看一切是否正常运行。
kubectl get pods -n gaming
kubectl logs -f prince-of-persia-.... -n gaming
最后,让我们进入之前创建的服务页面(svc)来享受游戏吧,它应该看起来像这样。
k8s-gaming-princeof-15fa57ff31-6933c5aaecd54910.elb.us-east-1.amazonaws.com
选修的
如果您想启用 Pod 的日志记录,请按照以下步骤操作。
为 aws-observability 创建一个命名空间,并创建一个 Fargate 配置文件。
kubectl create ns aws-observability
eksctl create fargateprofile \
--cluster gaming-cluster \
--name fp-observability \
--namespace aws-observability \
--region us-east-1
验证此 Fargate 配置文件的执行角色是否具有将日志事件执行到 CloudWatch 的必要权限,否则在该角色中创建具有以下权限的内联策略。
注意:请务必添加您要使用的日志组的具体名称。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"logs:CreateLogStream",
"logs:CreateLogGroup",
"logs:DescribeLogStreams",
"logs:PutLogEvents"
],
"Resource": "*"
}
]
}
现在创建一个类似这样的 ConfigMap 并应用它,请务必根据您的需求进行修改。此 ConfigMap 将在 CloudWatch 中名为 gaming-cluster 的日志组中开始记录日志。
apiVersion: v1
kind: ConfigMap
metadata:
name: aws-logging
namespace: aws-observability
data:
flb_log_cw: "false" # set to true to ship Fluent Bit process logs to CloudWatch.
filters.conf: |
[FILTER]
Name parser
Match *
Key_name log
Parser crio
[FILTER]
Name kubernetes
Match kube.*
Merge_Log On
Keep_Log Off
Buffer_Size 0
Kube_Meta_Cache_TTL 300s
output.conf: |
[OUTPUT]
Name cloudwatch_logs
Match kube.*
region us-east-1
log_group_name gaming-cluster
log_stream_prefix from-fluent-bit-
log_retention_days 60
auto_create_group true
parsers.conf: |
[PARSER]
Name crio
Format Regex
Regex ^(?<time>[^ ]+) (?<stream>stdout|stderr) (?<logtag>P|F) (?<log>.*)$
Time_Key time
Time_Format %Y-%m-%dT%H:%M:%S.%L%z
kubectl apply -f observability.yaml
请务必重启部署!
kubectl rollout restart deployment prince-of-persia -n gaming
注意:建议仅过滤关键日志,并修改日志组的保留策略,因为获取大量日志可能会产生高昂的成本。
希望本指南对您有所帮助!祝您游戏愉快!













