【问题标题】:How to Create an API with VPC Link Integration for EKS?如何为 EKS 创建具有 VPC 链接集成的 API?
【发布时间】:2021-07-21 14:51:48
【问题描述】:

我有一个正在运行的 EKS 集群,其中运行着一些服务。现在的挑战是有一个 API 网关来调用这些服务。这就是为什么我开始阅读"Integrate Amazon API Gateway with 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

但这导致了另一个错误:

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

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

【问题讨论】:

    标签: amazon-web-services aws-api-gateway aws-cli kubectl amazon-eks


    【解决方案1】:

    我的步骤完全相同——尝试按照相同的教程在 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”命令的结束位置,但后来就很容易了。

    【讨论】:

      猜你喜欢
      • 2022-06-14
      • 2020-11-19
      • 2022-01-13
      • 2019-07-02
      • 2018-08-08
      • 1970-01-01
      • 2019-02-03
      • 2015-08-01
      • 2021-05-30
      相关资源
      最近更新 更多