本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
从 Amazon EKS 容器访问 Amazon Neptune 数据库
Ramakrishnan Palaninathan,Amazon Web Services
Summary
这种模式在完全托管的图形数据库 Amazon Neptune 与容器编排服务 Amazon Elastic Kubernetes Service(Amazon EKS)之间建立连接,用于访问 Neptune 数据库。Neptune 数据库集群被限制在 AWS上的虚拟私有云(VPC)中。因此,访问 Neptune 需要仔细配置 VPC 以启用连接。
与 Amazon Relational Database Service(Amazon RDS)for PostgreSQL 不同,Neptune 不依赖典型的数据库访问凭证。相反,它使用 AWS Identity and Access Management (IAM) 角色进行身份验证。因此,从 Amazon EKS 连接到 Neptune 需要设置一个拥有访问 Neptune 所需权限的 IAM 角色。
此外,Neptune 端点仅在集群所在的 VPC 内可访问。这意味着您必须配置网络设置以促进 Amazon EKS 与 Neptune 之间的通信。根据您的具体要求和联网偏好,可以采用多种方法配置 VPC,以在 Neptune 与 Amazon EKS 之间实现无缝连接。每种方法都有不同的优势和注意事项,这让用户能够灵活地设计数据库架构以满足应用程序的需求。
先决条件和限制
先决条件
安装最新版本的 kubectl(请参阅说明)。要检查版本,请运行:
kubectl version --short
安装最新版本的 eksctl(请参阅说明)。要检查版本,请运行:
eksctl info
安装最新版本的 AWS Command Line Interface (AWS CLI) 版本 2(参见说明)。要检查版本,请运行:
aws --version
创建 Neptune 数据库集群(请参阅说明)。确保通过 VPC 对等、AWS Transit Gateway 或其他方法在集群的 VPC 和 Amazon EKS 之间建立通信。此外,请确保集群的状态为“可用”,并且在端口 8182 上有针对安全组的入站规则。
在现有 Amazon EKS 集群上配置 IAM OpenID Connect(OIDC)提供商(请参阅说明)。
产品版本
架构
下图显示了 Amazon EKS 集群中的 Kubernetes 容器组(pod)与 Neptune 之间的连接,通过该连接可访问 Neptune 数据库。
自动化和扩展
您可以使用 Amazon EKS Horizontal Pod Autoscaler 来扩展此解决方案。
服务
最佳实践
有关最佳实践,请参阅 Amazon EKS 最佳实践指南中的身份和访问权限管理。
操作说明
| Task | 说明 | 所需技能 |
|---|
验证集群上下文。 | 在使用 Helm 或其他命令行工具与 Amazon EKS 集群进行交互之前,必须定义用于封装集群详细信息的环境变量。这些变量将在后续命令中使用,以确保它们针对正确的集群和资源。 首先,确认您在正确的集群环境中运行。这样可以确保将任何后续命令发送到预期的 Kubernetes 集群。要验证当前上下文,请运行以下命令。 kubectl config current-context
| AWS 管理员、云管理员 |
定义 CLUSTER_NAME 变量。 | 定义 Amazon EKS 集群的 CLUSTER_NAME 环境变量。在以下命令中,将示例值us-west-2替换 AWS 区域 为适用于您的集群的正确值。将示例值 eks-workshop 替换为您的现有集群名称。 export CLUSTER_NAME=$(aws eks describe-cluster --region us-west-2 --name eks-workshop --query "cluster.name" --output text)
| AWS 管理员、云管理员 |
验证输出。 | 要验证变量已正确设置,请运行以下命令。 echo $CLUSTER_NAME
验证此命令的输出与您在上一步中指定的输入相匹配。 | AWS 管理员、云管理员 |
| Task | 说明 | 所需技能 |
|---|
创建服务账户。 | 您可使用服务账户的 IAM 角色将您的 Kubernetes 服务账户映射到 IAM 角色,从而对 Amazon EKS 上运行的应用程序启用精细的权限管理。您可以使用 eksctl 创建 IAM 角色并将其与您的 Amazon EKS 集群中的特定 Kubernetes 服务账户相关联。 AWS 托管策略NeptuneFullAccess允许对您指定的 Neptune 集群进行写入和读取访问。 创建要与名为的 AWS 托管策略关联的服务帐号NeptuneFullAccess。 eksctl create iamserviceaccount --name eks-neptune-sa --namespace default --cluster $CLUSTER_NAME --attach-policy-arn arn:aws:iam::aws:policy/NeptuneFullAccess --approve --override-existing-serviceaccounts
其中,eks-neptune-sa 是您希望创建的服务账户的名称。 此命令执行完成后,将显示以下响应信息: 2024-02-07 01:12:39 [ℹ] created serviceaccount "default/eks-neptune-sa"
| AWS 管理员、云管理员 |
验证账户设置正确。 | 确保在集群的默认命名空间中正确设置了 eks-neptune-sa 服务账户。 kubectl get sa eks-neptune-sa -o yaml
输出应该如下所示: apiVersion: v1
kind: ServiceAccount
metadata:
annotations:
eks.amazonaws.com/role-arn: arn:aws:iam::123456789123:role/eksctl-eks-workshop-addon-iamserviceaccount-d-Role1-Q35yKgdQOlmM
creationTimestamp: "2024-02-07T01:12:39Z"
labels:
app.kubernetes.io/managed-by: eksctl
name: eks-neptune-sa
namespace: default
resourceVersion: "5174750"
uid: cd6ba2f7-a0f5-40e1-a6f4-4081e0042316
| AWS 管理员、云管理员 |
检查连接。 | 部署一个名为 pod-util 的示例容器组(pod)并检查与 Neptune 的连接。 apiVersion: v1
kind: Pod
metadata:
name: pod-util
namespace: default
spec:
serviceAccountName: eks-neptune-sa
containers:
- name: pod-util
image: public.ecr.aws/patrickc/troubleshoot-util
command:
- sleep
- "3600"
imagePullPolicy: IfNotPresent
kubectl apply -f pod-util.yaml
kubectl exec --stdin --tty pod-util -- /bin/bash
bash-5.1# curl -X POST -d '{"gremlin":"g.V().limit(1)"}' https://db-neptune-1.cluster-xxxxxxxxxxxx.us-west-2.neptune.amazonaws.com:8182/gremlin
{"requestId":"a4964f2d-12b1-4ed3-8a14-eff511431a0e","status":{"message":"","code":200,"attributes":{"@type":"g:Map","@value":[]}},"result":{"data":{"@type":"g:List","@value":[]},"meta":{"@type":"g:Map","@value":[]}}}
bash-5.1# exit
exit
| AWS 管理员、云管理员 |
| Task | 说明 | 所需技能 |
|---|
启用 IAM 数据库身份验证。 | 默认情况下,创建 Neptune 数据库集群时禁用 IAM 数据库身份验证。您可以使用 AWS 管理控制台启用或禁用 IAM 数据库身份验证。 按照 AWS 文档中的步骤在 Nept une 中启用 IAM 数据库身份验证。 | AWS 管理员、云管理员 |
验证连接。 | 在此步骤中,您将与已处于运行状态的 pod-util 容器进行交互,以安装 awscurl 并验证连接。 运行以下命令以查找容器组(pod)。 kubectl get pods
输出应该如下所示: NAME READY STATUS RESTARTS AGE
pod-util 1/1 Running 0 50m
运行以下命令安装 awscurl。 kubectl exec --stdin --tty pod-util -- /bin/bash bash-5.1#pip3 install awscurl Installing collected packages: idna, configparser, configargparse, charset-normalizer, certifi, requests, awscurl Successfully installed awscurl-0.32 certifi-2024.2.2 charset-normalizer-3.3.2 configargparse-1.7 configparser-6.0.0 idna-3.6 requests-2.31.0 bash-5.1# awscurl https://db-neptune-1.cluster-xxxxxxxxxxxx.us-west-2.neptune.amazonaws.com:8182/status --region us-west-2 --service neptune-db {"status":"healthy","startTime":"Thu Feb 08 01:22:14 UTC 2024","dbEngineVersion":"1.3.0.0.R1","role":"writer","dfeQueryEngine":"viaQueryHint","gremlin":{"version":"tinkerpop-3.6.4"},"sparql":{"version":"sparql-1.1"},"opencypher":{"version":"Neptune-9.0.20190305-1.0"},"labMode":{"ObjectIndex":"disabled","ReadWriteConflictDetection":"enabled"},"features":{"SlowQueryLogs":"disabled","ResultCache":{"status":"disabled"},"IAMAuthentication":"enabled","Streams":"disabled","AuditLog":"disabled"},"settings":{"clusterQueryTimeoutInMs":"120000","SlowQueryLogsThreshold":"5000"}}
| AWS 管理员、云管理员 |
问题排查
| 问题 | 解决方案 |
|---|
无法访问 Neptune 数据库。 | 查看附加到服务账号的 IAM 策略。确保它允许对您要运行的操作执行必要的操作(例如 neptune:Connec,neptune:DescribeDBInstances)。 |
相关资源