添加fargate Profile

创建 IAM OIDC Provider

首先,我们必须为集群设置一个 OIDC Provider。 默认情况下未启用 IAM OIDC Provider,可以使用以下命令启用它:

eksctl utils associate-iam-oidc-provider \
    --region ${AWS_REGION} \
    --cluster eksworkshop-eksctl \
    --approve
2021-05-02 17:37:05 []  eksctl version 0.45.0
2021-05-02 17:37:05 []  using region $AWS_REGION
2021-05-02 17:37:05 []  will create IAM Open ID Connect provider for cluster "eksworkshop-eksctl" in "$AWS_REGION"
2021-05-02 17:37:05 []  created IAM Open ID Connect provider for cluster "eksworkshop-eksctl" in "$AWS_REGION"

创建Namespace、 IAM Role和 ServiceAccount

我们将创建prodcatalog-ns 命名空间和 IRSA,用来授予 X-Ray、AppMesh 和 Cloudwatch Logs的访问权限。

kubectl create namespace prodcatalog-ns

cd eks-app-mesh-polyglot-demo
aws iam create-policy \
    --policy-name ProdEnvoyNamespaceIAMPolicy \
    --policy-document file://deployment/envoy-iam-policy.json

eksctl create iamserviceaccount --cluster eksworkshop-eksctl \
  --namespace prodcatalog-ns \
  --name prodcatalog-envoy-proxies \
  --attach-policy-arn arn:aws:iam::$ACCOUNT_ID:policy/ProdEnvoyNamespaceIAMPolicy \
  --override-existing-serviceaccounts \
  --approve 

这样,IAM Role与 K8s的 Service Account绑定。 可以查看创建的Service Account的详细信息:

kubectl describe sa prodcatalog-envoy-proxies -n prodcatalog-ns

image-20210614110256694

在 Amazon EKS 文档中了解有关 IAM Roles for Service Account 的更多信息。

创建 Fargate profile

Fargate profile允许管理员声明哪些 Pod 将在 Fargate 上运行。

  • 每个Profile最多可以有五个selector,包含 namespacelabels(可选)
  • 必须为每个selector定义一个Namespace。
  • label字段由多个可选的键值对组成。
  • 与selector匹配的 Pod(通过匹配Namespace和selector中指定的所有label)将在 Fargate 上运行和调度。

将用户的应用程序部署到 kube-systemdefault 以外的命名空间通常是一种最佳实践,以便有更细的粒度来管理 Pod。

在本节中,我们将创建一个名为 fargate-productcatalog 的新 Fargate 配置文件,该配置文件匹配所有 prodcatalog-ns Namespace下标签为 app: prodcatalog 的 Pod。 可以从 clusterconfig.yaml 看到下面的 Fargate Profile配置:

---
apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig

metadata:
  name: eksworkshop-eksctl
  region: ${AWS_REGION}

fargateProfiles:
  - name: fargate-productcatalog
    selectors:
      - namespace: prodcatalog-ns
        labels:
          app: prodcatalog

运行以下命令以创建 Fargate Profile:

cd eks-app-mesh-polyglot-demo
envsubst < ./deployment/clusterconfig.yaml | eksctl create fargateprofile -f -
2021-05-02 17:44:51 []  eksctl version 0.45.0
2021-05-02 17:44:51 []  using region $AWS_REGION
2021-05-02 17:44:51 []  deploying stack "eksctl-eksworkshop-eksctl-fargate"
2021-05-02 17:44:51 []  waiting for CloudFormation stack "eksctl-eksworkshop-eksctl-fargate"
2021-05-02 17:45:08 []  waiting for CloudFormation stack "eksctl-eksworkshop-eksctl-fargate"
2021-05-02 17:45:24 []  waiting for CloudFormation stack "eksctl-eksworkshop-eksctl-fargate"
2021-05-02 17:45:25 []  creating Fargate profile "fargate-productcatalog" on EKS cluster "eksworkshop-eksctl"
2021-05-02 17:49:43 []  created Fargate profile "fargate-productcatalog" on EKS cluster "eksworkshop-eksctl"

当 EKS 使用 Fargate 调度 Pod 时,Pod 可能需要调用 AWS API 以执行诸如从 Amazon ECR 拉取容器映像之类的操作。 Fargate Pod Execution Role 提供 IAM 权限来执行此操作。

此 IAM 角色是通过上述命令为您自动创建的。

创建 Fargate Profile需要几分钟时间(大约 5 - 7 分钟)。 Profile创建完成后执行以下命令,您应该会看到类似于下面的输出:

eksctl get fargateprofile --cluster eksworkshop-eksctl -o yaml
- name: fargate-productcatalog
  podExecutionRoleARN: arn:aws:iam::$ACCOUNT_ID:role/eksctl-eksworkshop-eksctl-FargatePodExecutionRole-JPQ56PZ7R9NL
  selectors:
  - labels:
      app: prodcatalog
    namespace: prodcatalog-ns
  status: ACTIVE
  subnets:
  - subnet-084a7XXXXXXXXXXXX
  - subnet-0b2dXXXXXXXXXXXXX
  - subnet-08565XXXXXXXXXXXX

登录控制台并进入 Amazon EKS -> 集群 -> 单击 eksworkshop-eksctl -> Configuration -> Compute,您应该会看到创建的Fargate Profile: fargate-productcatalog

fargate 请注意, Fargate 上运行的 Pod 未分配公有 IP 地址,因此在创建 Fargate Profile时仅支持私有子网(没有到 Internet Gateway的直接路由)。

在配置 EKS 集群时,您必须确保您创建的 VPC 包含一个或多个私有子网。

当使用 eksctl 创建 EKS 集群时,它会自动创建满足这些要求的 VPC。