构建用于运行金融工作负载的预配置 Amazon EKS 集群



在开放银行领域,保护敏感金融信息并遵守严格的监管标准至关重要。安全不仅是重中之重,也是建立信任和合规的基石。企业不仅必须保证其容器化应用程序的安全性,还需简化管理流程,同时尽可能减少管理成本。在银行等安全关键型行业中,对于简化且强大的集群设置的需求不言而喻。本教程旨在帮助企业精确满足这一需求。通过结合使用 Amazon Elastic Kubernetes Service (EKS) 和 Fargate(一种摆脱传统节点限制的无服务器容器计算引擎),您可以从复杂的基础设施管理中解放出来。从而建立高度安全的 Kubernetes 集群,无缝满足开放银行等行业的严格安全要求。
本教程介绍如何使用 eksctl 的 quickstart 模板创建基于 Amazon Fargate 的 Amazon EKS 集群。此特定用例模板会创建并设置一个预配置的集群,支持运行您最敏感的安全工作负载。

前提条件
开始本教程学习之前,您需要:
- 拥有有效的亚马逊云科技账户。
- 已安装最新版本的 Amazon CLI (v2)。运行以下命令检查您的 Amazon CLI 版本:aws --version。
- 安装最新版本的 kubectl。运行以下命令检查您的 kubectl 版本:kubectl version。
- 安装最新版本的 eksctl。运行以下命令检查您的 eksctl 版本:eksctl info。
概述
本教程属于使用 Amazon EKS 管理安全敏感工作负载系列,该系列着重介绍通过 Amazon Fargate 简化集群管理。本教程不仅展示如何使用 Fargate 创建 EKS 集群,还展示如何在 Fargate 上管理您的工作负载。本教程包括以下部分:
- 无服务器计算:Amazon Fargate 接管监督底层基础设施,使您无需管理 EC2 实例。传统的 Kubernetes 部署通常涉及为这些实例手动配置、扩展、打补丁和维护。通过 Fargate,亚马逊云科技能够帮助您自动处理这些任务,从而减少管理成本。Amazon Fargate 在创建 Fargate Pod 时,会在独立的子网中向 Pod 附加一个 ENI(弹性网络接口)。
- 身份验证:需要用来让服务账户的 IAM 角色 (IRSA) 映射实现 Kubernetes Pod 和亚马逊云科技服务之间的通信。其中包括用于发布应用程序的 Amazon Load Balancer Controller(负载均衡器控制器)、用于自动管理 DNS 记录和支持外部服务发现的 Kubernetes External DNS(外部 DNS),以及用于简化 SSL/TLS 证书管理的 Cert Manager(证书管理器)。此外,其中还包括一个 OpenID 连接 (OIDC) 端点,用于实现无缝和安全通信。
- 部署示例应用程序:在 mTLS 命名空间中部署一个示例工作负载。此工作负载涵盖了部署一个示例应用程序,并配置为使用 Fargate 来提供计算能力。
- 网络模式:集群端点访问控制可让您配置端点是否可从公共互联网或通过您的 VPC 访问。您可以同时启用公共端点(默认)、私有端点,或者两种端点都启用。您可以随时使用 EKS 控制台或 API 更改端点设置。对于旨在防止来自互联网的不必要连接的金融工作负载来说,禁用公共端点通常是理想选择。
- 控制面板日志:您可以启用 Amazon EKS 控制面板日志功能。该功能直接从 Amazon EKS 控制面板获取审计日志和诊断日志,并提供给 CloudWatch Logs。
- 密钥加密:使用您创建的 KMS 密钥进一步加密 Kubernetes 密钥,或将从另一个系统生成的密钥导入到 Amazon KMS,并将其与集群一起使用。您创建的 KMS 密钥是客户主密钥 (CMK)。对于存储敏感数据的应用程序来说,这种进一步的加密是最佳安全实践。
步骤 1:配置集群
在本节中,您将配置 Amazon EKS 集群以满足安全敏感应用程序的特定需求。通过创建此 cluster-config.yaml文件,您将为服务账户设置 IAM 角色,使用您自己的 Amazon KMS 密钥来启用集群的加密密钥,启用所有可用的 Kubernetes 控制面板组件对应的控制日志类型,并设置日志保留期为 60 天。您还将为特定命名空间中的相应工作负载创建由 Fargate Profiles 提供支持的多个 Linux 节点池。
1. 在您打算创建集群的区域创建一个客户主密钥 (CMK),以进一步加密您的 Kubernetes 密钥。我们将 CMK 输入到创建集群的命令中:
export AWS_DEFAULT_REGION="us-east-2"
aws kms create-alias --alias-name alias/fgsecurityquickstart --target-key-id $(aws kms create-key --query KeyMetadata.Arn --output text)
export KMS_KEY_ARN=$(aws kms describe-key --key-id alias/fgsecurityquickstart --query KeyMetadata.Arn --output text)
echo $KMS_KEY_ARN
2. 创建 cluster-config.yaml 文件,并将以下内容粘贴到其中。请务必将 region 值替换为您要使用的服务地域。该区域应与之前步骤中创建的 CMK 相同。
apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig
metadata:
name: fg-security-quickstart
region: us-east-2
version: "1.28"
tags:
# Add more cloud tags if needed for billing
environment: fargate-security-quickstart
iam:
withOIDC: true
serviceAccounts:
- metadata:
name: aws-load-balancer-controller
namespace: kube-system
wellKnownPolicies:
awsLoadBalancerController: true
- metadata:
name: external-dns
namespace: kube-system
wellKnownPolicies:
externalDNS: true
- metadata:
name: cert-manager
namespace: cert-manager
wellKnownPolicies:
certManager: true
vpc:
cidr: 10.20.0.0/24
# optional: disable public access to endpoint and only allow private access
clusterEndpoints:
publicAccess: true
privateAccess: true
fargateProfiles:
- name: fp-default
selectors:
- namespace: default
- name: fp-nginx-ingress
selectors:
- namespace: ingress-nginx
- name: fp-mtls
selectors:
- namespace: mtls
- name: fp-kube-system
selectors:
- namespace: kube-system
- name: fp-cert-manager
selectors:
- namespace: cert-manager
cloudWatch:
clusterLogging:
# enable all types of cluster control plane logs
enableTypes: ["*"]
# Sets the number of days to retain the logs for (see [CloudWatch docs](https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_PutRetentionPolicy.html#API_PutRetentionPolicy_RequestSyntax)).
# By default, log data is stored in CloudWatch Logs indefinitely.
logRetentionInDays: 60
secretsEncryption:
# replace this with the ARN of the KMS key
keyARN: "arn:aws:kms:us-east-2:000000000000:key/00000000-0000-0000-0000-000000000000"
步骤 2:创建集群
现在,我们已做好创建 Amazon EKS 集群的准备。整个集群创建过程需要几分钟才能完成。如果您想监测集群创建状态,可以登录 Amazon CloudFormation 控制台。
- 运行以下命令,使用 cluster-config.yaml 创建 EKS 集群:
eksctl create cluster -f cluster-config.yaml
创建完成后,输出结果应该如下所示:
2023-12-10 05:24:20 [✔] EKS cluster "fg-security-quickstart" in "us-east-2" region is ready
注意:上述命令将创建一个 Amazon EKS 集群,并预配置一些解决方案中所需步骤的服务账户。
(可选)打开 Amazon EKS 控制台,选择 fg-security-quickstart 并选择 Compute(计算)选项卡。您会发现集群中没有 Amazon EC2 节点,因此无法登录节点来安装或配置软件包。

当上述的命令完成后,运行以下命令验证您的集群状态:
kubectl get pods -A -o wide
输出结果应如下所示:
NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
kube-system coredns-747476996f-bnmrs 1/1 Running 0 7m14s 10.20.0.168 fargate-ip-10-20-0-168.us-east-2.compute.internal <none><none>
kube-system coredns-747476996f-zhvvp 1/1 Running 0 7m14s 10.20.0.133 fargate-ip-10-20-0-133.us-east-2.compute.internal <none><none>
步骤 3:部署示例应用程序
现在,您已完成了准备工作,可以将安全敏感的工作负载部署到您的 Kubernetes 集群中。以下是一个基本的前端 Web 应用程序示例,返回一个文本消息。将以下代码块完整复制并粘贴到您的终端中,以创建示例工作负载:
cat << EOF > mtls.yaml
kind: Deployment
apiVersion: apps/v1
metadata:
name: mtls-app
labels:
app: mtls
spec:
replicas: 1
selector:
matchLabels:
app: mtls
template:
metadata:
labels:
app: mtls
spec:
containers:
- name: mtls-app
image: hashicorp/http-echo
args:
- "-text=Sample Application in Amazon EKS on Fargate"
---
kind: Service
apiVersion: v1
metadata:
name: mtls-service
spec:
selector:
app: mtls
ports:
- port: 5678 # Default port for the container image
EOF
运行以下命令来创建 mtls 命名空间并部署应用程序:
kubectl create namespace mtls
kubectl create -f mtls.yaml -n mtls
大约 60 秒后,验证应用程序是否在 Fargate 上运行:
kubectl get pods -n mtls -o wide
输出结果应如下所示:
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
mtls-app-f586f477c-9h4lj 1/1 Running 0 54s 10.20.0.145 fargate-ip-10-20-0-145.us-east-2.compute.internal <none><none>
运行以下命令在与应用程序相同的命名空间中创建一个测试 Pod:
kubectl run tmp --image=nginx:alpine -n mtls
kubectl get pod tmp -n mtls
等待大约 60 秒,直到 Pod 处于运行状态。验证应用程序是否部署:
kubectl exec -it tmp -n mtls -- curl http://mtls-service:5678
预期结果:
Sample Application in Amazon EKS on Fargate
请参阅在 Amazon EKS Fargate 中使用 mTLS 教程。该教程进一步探索了如何在建立 TLS 加密连接时启用双向 TLS 来认证客户端——这是 B2B 应用程序的常见需求。
清理资源
为避免持续产生费用,建议您删除在学习本教程的过程中创建的资源。您可以使用以下命令删除资源:
# Delete the namespace and all resources
kubectl delete namespace mtls
# Delete the cluster
eksctl delete cluster -f ./cluster-config.yaml
总结
在本教程中,您已成功设置了仅包含 Fargate 节点的 Amazon EKS 集群。此基础设施能够为您建立安全的工作负载部署基础,减少安全风险并减轻了管理集群的人工操作负担。进一步加强集群的安全性,您可以启用仅限私有的集群端点。启用了仅限私用端点后,所有访问您集群 API 服务器的流量必须来自集群的 VPC 内或通过使用 Amazon VPN 或 Amazon DirectConnect 的关联网络。您的 API 服务器无法通过互联网公开访问。任何kubectl命令必须在 VPC 内或通过关联的网络执行。要在此环境基础上进行构建,还需安装 ExternalDNS,Amazon 负载均衡器控制器和 Fargate logging。例如,您可以参阅在 Amazon EKS Fargate 中使用 mTLS 这篇教程。