首页 > 解决方案 > 如何为 EKS 创建具有 VPC 链接集成的 API?

问题描述

我有一个正在运行的 EKS 集群,其中运行了一些服务。现在的挑战是有一个 API 网关来调用这些服务。这就是为什么我开始阅读“将 Amazon API Gateway 与 Amazon EKS 集成”的原因,解释说这是可能的,但要完成这项工作需要执行一些步骤。这就是我所做的,但在取得了一些进展后,我遇到了一个问题。

这是我执行的命令行语句之一。

aws apigatewayv2 get-vpc-links --region $AGW_AWS_REGION

这将产生以下输出:

在此处输入图像描述

显然,VPC 链接可用,安全组 ID 可用,两个 SubnetId 可用(在记录的示例中,它是三个,但这并不重要,请随时对此发表评论)并且状态消息表明可用VPC 链接已准备好路由流量。

在那里,我决定继续下一个记录在案的步骤:

使用 VPC 链接集成创建 API

cat > apigw-api.yaml<<EOF
apiVersion: apigatewayv2.services.k8s.aws/v1alpha1
kind: API
metadata:
  name: apitest-private-nlb
spec:
  body: '{
              "openapi": "3.0.1",
              "info": {
                "title": "ack-apigwv2-import-test-private-nlb",
                "version": "v1"
              },
              "paths": {
              "/\$default": {
                "x-amazon-apigateway-any-method" : {
                "isDefaultRoute" : true,
                "x-amazon-apigateway-integration" : {
                "payloadFormatVersion" : "1.0",
                "connectionId" : "$(kubectl get vpclinks.apigatewayv2.services.k8s.aws \
  nlb-internal \
  -o jsonpath="{.status.vpcLinkID}")",
                "type" : "http_proxy",
                "httpMethod" : "GET",
                "uri" : "$(aws elbv2 describe-listeners \
  --load-balancer-arn $(aws elbv2 describe-load-balancers \
  --region $AGW_AWS_REGION \
  --query "LoadBalancers[?contains(DNSName, '$(kubectl get service authorservice \
  -o jsonpath="{.status.loadBalancer.ingress[].hostname}")')].LoadBalancerArn" \
  --output text) \
  --region $AGW_AWS_REGION \
  --query "Listeners[0].ListenerArn" \
  --output text)",
               "connectionType" : "VPC_LINK"
                  }
                }
              },
              "/meta": {
                  "get": {
                    "x-amazon-apigateway-integration": {
                       "uri" : "$(aws elbv2 describe-listeners \
  --load-balancer-arn $(aws elbv2 describe-load-balancers \
  --region $AGW_AWS_REGION \
  --query "LoadBalancers[?contains(DNSName, '$(kubectl get service echoserver \
  -o jsonpath="{.status.loadBalancer.ingress[].hostname}")')].LoadBalancerArn" \
  --output text) \
  --region $AGW_AWS_REGION \
  --query "Listeners[0].ListenerArn" \
  --output text)",
                      "httpMethod": "GET",
                      "connectionId": "$(kubectl get vpclinks.apigatewayv2.services.k8s.aws \
  nlb-internal \
  -o jsonpath="{.status.vpcLinkID}")",
                      "type": "HTTP_PROXY",
                      "connectionType": "VPC_LINK",
                      "payloadFormatVersion": "1.0"
                    }
                  }
                }
              },
              "components": {}
        }'
EOF

不幸的是,这导致了以下错误:

在此处输入图像描述

我试图找出问题所在,但后来又遇到了另一个问题。在命令行中,我只是执行了上面显示的一小部分。

aws elbv2 describe-load-balancers --load-balancer-arn --region $AGW_AWS_REGION query "LoadBalancers[?contains(DNSName, '$(kubectl get service authorservice  -o jsonpath="{.status.loadBalancer.ingress[].hostname}")')].LoadBalancerArn" --output text

但这导致了另一个错误:

调用 DescribeLoadBalancers 操作时发生错误 (ValidationError):“查询”不是有效的负载均衡器 ARN

那么如何让这个工作呢?我想要的只是创建一个带有 VPC 链接集成的 API。但是记录在案的方法对我不起作用。请让我知道如何解决这种问题,或者以不同的方式做同样的事情。

标签: amazon-web-servicesaws-api-gatewayaws-clikubectlamazon-eks

解决方案


我完全在同一步骤上 - 尝试按照相同的教程在 EKS 上为微服务创建 API。我还开始将执行分解为小块,以检查从编写教程时起事情是否仍然正确。所以取最小的应该是可执行的

kubectl get service authorservice  -o jsonpath="{.status.loadBalancer.ingress[].hostname}"

您必须已经配置并运行“authorservice”,否则可能会根据您的特定情况将其称为其他名称。

对我来说,这些行给了我所需的主机名。如果它没有给你主机名,你最好检查一下

 kubectl get service <the_service_you_have>  -o json

您拥有的服务是否已正确配置并且在输出的末尾是否有类似的内容

"status": {
        "loadBalancer": {
            "ingress": [
                {
                    "hostname": "k8s-XXXXXXXXXXXXXXXXXXXXXX.elb.us-west-2.amazonaws.com"
                }
            ]
        }

我的建议是检查所有“kubectl”执行并检查它们是否正常工作并为您的案例返回一些有意义的结果并在需要时进行调整。一开始可能很难找到“kubectl”命令的结束位置,但后来就很容易了。


推荐阅读