发布于 2026-01-06 1 阅读
0

创建 AWS EKS Fargate v1.30 并畅玩波斯王子!

创建 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
Enter fullscreen mode Exit fullscreen mode

eksctl 版本
现在,让我们使用 Fargate 1.30 版本创建集群。运行以下命令。(请确保将集群创建在与 VPC 相同的区域中)

eksctl create cluster --name gaming-cluster --version 1.30 --region us-east-1 --fargate
Enter fullscreen mode Exit fullscreen mode

如果要将集群创建在特定的 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
Enter fullscreen mode Exit fullscreen mode

EKS 创建
这个过程可能需要20~25分钟以上。

现在让我们在集群中关联一个 OIDC 提供程序。

eksctl utils associate-iam-oidc-provider --region us-east-1 --cluster gaming-cluster --approve
Enter fullscreen mode Exit fullscreen mode

我们的集群现在已准备就绪,并包含默认的 Fargate 配置,其中包含命名空间 default 和 kube-system。

集群新

让我们为游戏应用创建一个 Fargate 配置。(请务必同时在 Kubernetes 集群内部创建 ns。)
默认 FP

eksctl create fargateprofile \
  --cluster gaming-cluster \
  --name fp-gaming \
  --namespace gaming \
  --region us-east-1
Enter fullscreen mode Exit fullscreen mode

现在,让我们添加 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
Enter fullscreen mode Exit fullscreen mode

创建 IAM 策略

aws iam create-policy \
    --policy-name AWSLoadBalancerControllerIAMPolicy-EKS \
    --policy-document file://iam-policy.json
Enter fullscreen mode Exit fullscreen mode

EKS政策

现在让我们为这个控制器创建一个服务帐户。

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
Enter fullscreen mode Exit fullscreen mode

服务帐户

太棒了!现在轮到 Helm 了,来安装一些有用的图表,在本例中是 AWS 负载均衡器控制器。

curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
Enter fullscreen mode Exit fullscreen mode

运行以下命令:

helm repo add eks https://aws.github.io/eks-charts
Enter fullscreen mode Exit fullscreen mode
kubectl apply -k "github.com/aws/eks-charts/stable/aws-load-balancer-controller/crds?ref=master"
Enter fullscreen mode Exit fullscreen mode
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>
Enter fullscreen mode Exit fullscreen mode

albc

太棒了,现在我们可以访问我们的集群了。

aws eks update-kubeconfig  --name gaming-cluster --region us-east-1
Enter fullscreen mode Exit fullscreen mode

EKS

在继续之前,让我们先创建游戏命名空间。

kubectl create ns gaming
Enter fullscreen mode Exit fullscreen mode

我们离胜利只差一步之遥了,现在轮到你赢了。

为此,我将使用oklemenzultrabolidojmechner提供的这个分支。

git clone https://github.com/bdllerena/PrinceJS
Enter fullscreen mode Exit fullscreen mode

克隆我们的镜像后,请务必创建一个 ECR 存储库(或者使用您选择的任何存储库来托管我们的波斯王子镜像)。

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
Enter fullscreen mode Exit fullscreen mode

我们的仓库中应该有一个类似这样的 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"]

Enter fullscreen mode Exit fullscreen mode

在我们的代码仓库中执行以下命令

docker build -t prince-of-persia .    
Enter fullscreen mode Exit fullscreen mode

镜像构建完成后,我们给它打标签并将其推送到 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                                
Enter fullscreen mode Exit fullscreen mode

ECR代码

ECR Repo

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
Enter fullscreen mode Exit fullscreen mode

确认我们的镜像与推送到 ECR 的镜像相同后,执行我们的清单!

kubectl apply -f manifest.yaml
Enter fullscreen mode Exit fullscreen mode

此清单将创建一个包含 1 个副本(1 个 pod)的部署,以及一个面向客户端(公共)的网络负载均衡器服务。

几分钟后,使用此命令检查服务是否已创建。

kubectl get svc -n gaming
Enter fullscreen mode Exit fullscreen mode

服务已创建

太棒了!如果你愿意,可以查看 pod 的日志,看看一切是否正常运行。

kubectl get pods -n gaming
kubectl logs -f prince-of-persia-.... -n gaming
Enter fullscreen mode Exit fullscreen mode

日志

最后,让我们进入之前创建的服务页面(svc)来享受游戏吧,它应该看起来像这样。

k8s-gaming-princeof-15fa57ff31-6933c5aaecd54910.elb.us-east-1.amazonaws.com
Enter fullscreen mode Exit fullscreen mode

波斯王子

选修的

如果您想启用 Pod 的日志记录,请按照以下步骤操作。

为 aws-observability 创建一个命名空间,并创建一个 Fargate 配置文件。

kubectl create ns aws-observability
Enter fullscreen mode Exit fullscreen mode
eksctl create fargateprofile \
  --cluster gaming-cluster \
  --name fp-observability \
  --namespace aws-observability \
  --region us-east-1
Enter fullscreen mode Exit fullscreen mode

新个人资料

验证此 Fargate 配置文件的执行角色是否具有将日志事件执行到 CloudWatch 的必要权限,否则在该角色中创建具有以下权限的内联策略。

注意:请务必添加您要使用的日志组的具体名称。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogStream",
                "logs:CreateLogGroup",
                "logs:DescribeLogStreams",
                "logs:PutLogEvents"
            ],
            "Resource": "*"
        }
    ]
}

Enter fullscreen mode Exit fullscreen mode

JSON 策略

现在创建一个类似这样的 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

Enter fullscreen mode Exit fullscreen mode
kubectl apply -f observability.yaml
Enter fullscreen mode Exit fullscreen mode

请务必重启部署!

kubectl rollout restart deployment prince-of-persia -n gaming
Enter fullscreen mode Exit fullscreen mode

注意:建议仅过滤关键日志,并修改日志组的保留策略,因为获取大量日志可能会产生高昂的成本。

日志组

希望本指南对您有所帮助!祝您游戏愉快!

文章来源:https://dev.to/aws-builders/create-an-aws-eks-fargate-v130-and-play-prince-of-persia--a40