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

利用 Amazon Fargate 保护敏感财务信息并降低管理成本
发布时间:2024 年 1 月 15 日
EKS 集群设置
EKS
Kubernetes
教程
亚马逊云科技
Olawale Olaleye
亚马逊云科技使用经验
200 - 中级
完成所需时间
30 分钟
前提条件

注册 / 登录 亚马逊云科技账户

上次更新时间
2024 年 1 月 15 日

开放银行领域,保护敏感金融信息并遵守严格的监管标准至关重要。安全不仅是重中之重,也是建立信任和合规的基石。企业不仅必须保证其容器化应用程序的安全性,还需简化管理流程,同时尽可能减少管理成本。在银行等安全关键型行业中,对于简化且强大的集群设置的需求不言而喻。本教程旨在帮助企业精确满足这一需求。通过结合使用 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 控制台

  1. 运行以下命令,使用 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 内或通过关联的网络执行。要在此环境基础上进行构建,还需安装 ExternalDNSAmazon 负载均衡器控制器和 Fargate logging。例如,您可以参阅在 Amazon EKS Fargate 中使用 mTLS 这篇教程。