从 Amazon EKS 容器访问 Amazon Neptune 数据库 - AWS 规范指引

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

从 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 数据库。

连接 Kubernetes 节点中的容器组(pod)与 Amazon 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 集群进行写入和读取访问。

重要

在运行这些命令之前,您必须拥有与集群关联的 OIDC 端点

创建要与名为的 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 并验证连接。

  1. 运行以下命令以查找容器组(pod)。

    kubectl get pods

    输出应该如下所示:

    NAME READY STATUS RESTARTS AGE pod-util 1/1 Running 0 50m
  2. 运行以下命令安装 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)。

相关资源