首先,我们必须为集群设置一个 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"
我们将创建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
在 Amazon EKS 文档中了解有关 IAM Roles for Service Account 的更多信息。
Fargate profile允许管理员声明哪些 Pod 将在 Fargate 上运行。
将用户的应用程序部署到 kube-system 和 default 以外的命名空间通常是一种最佳实践,以便有更细的粒度来管理 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 上运行的 Pod 未分配公有 IP 地址,因此在创建 Fargate Profile时仅支持私有子网(没有到 Internet Gateway的直接路由)。
在配置 EKS 集群时,您必须确保您创建的 VPC 包含一个或多个私有子网。
当使用 eksctl 创建 EKS 集群时,它会自动创建满足这些要求的 VPC。