带 GKE 健康检查和 LB 配置错误的 Ambassador Edge Stack

Ambassador Edge Stack w/ GKE Health Check and LB Provisioning Errors

我目前正在安装 Ambassador Edge Stack (AES) 以帮助管理我们 GKE 集群中的多个应用程序 运行ning 应用程序,但我遇到了几个问题。

the manual install guide 中的步骤似乎工作正常,除了 edgectl 被弃用以支持 telepresence(我还没有真正尝试过)。

接下来的步骤,setting up the ingress with GKE 是问题开始的地方。

根据指南,这可以通过旧版 Ambassador API 网关或新 AES 来完成。比较这两个安装,除了从 the original aes ambassador 服务和来自LoadBalancerNodePort 类型。我用 kustomize

完成了这个
# prod/ambassador-service-patches.yaml
---
apiVersion: v1
kind: Service
metadata:
  name: ambassador
  namespace: ambassador
  annotations:
    cloud.google.com/backend-config: '{"ports": {"8080": "my-backend"}}'
spec:
  # loadBalancerIP: 35.244.139.65
  type: NodePort # needed for GKE ingress LB
  ports:
   - name: backend
     port: 8080
     targetPort: 8080
---
apiVersion: v1
kind: Service
metadata:
  name: ambassador-admin
  namespace: ambassador
spec:
  type: NodePort # needed for GKE ingress backend health check
  ports:
   - name: backend
     port: 8877
     targetPort: 8877
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: ambassador
  namespace: ambassador
spec:
  replicas: 3

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: ambassador-agent
  namespace: ambassador
spec:
  replicas: 3

剩下的就是设置 GKE IngressBackendConfig。我的看起来像这样:

# prod/ingress.yaml
---
apiVersion: networking.gke.io/v1
kind: ManagedCertificate
metadata:
  name: my-cluster-ssl
spec:
  domains:
    - www.mydomain.com
---
apiVersion: cloud.google.com/v1
kind: BackendConfig
metadata:
  name: my-backend
  namespace: ambassador
spec:
    timeoutSec: 30
  connectionDraining:
      drainingTimeoutSec: 30
  healthCheck:
    checkIntervalSec: 10
    timeoutSec: 10
    healthyThreshold: 2
    unhealthyThreshold: 2
    type: HTTP
    requestPath: /ambassador/v0/check_ready
    port: 8877
  logging:
    enable: true
    sampleRate: 1.0
 ---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: my-ingress
  namespace: ambassador
  annotations:
    kubernetes.io/ingress.global-static-ip-name: "my-global-ip"
    networking.gke.io/managed-certificates: "my-cluster-ssl"
    kubernetes.io/ingress.class: "gce"
spec:
  backend:
    serviceName: ambassador
    servicePort: 8080

这就是事情开始分崩离析的地方。 ambassadorambassador-admin 服务以及 pods 运行 很好。 Ingress 创建了一个 HTTP LB,并分配了我保留的全局 IP 地址,但无法从后端健康检查中获得 OK。我相信因为 LB 是 HTTP 并且没有公开端口 443,所以 ManagedCertificate 也无法提供 NOT_VISIBLE 错误。

做一些故障排除我现在添加了一个 FrontEndConfig 并使用注释 networking.gke.io/v1beta1.FrontendConfig: "my-frontend" 添加到我的入口以设置 HTTP 重定向 LB 但是这个新的仅重定向 LB 被分配了全局静态具有 This load balancer has no frontend configured 的 IP 地址(不是 HTTPS LB)。下面是 FrontendConfig.

apiVersion: networking.gke.io/v1beta1
kind: FrontendConfig
metadata:
  name: my-frontend
  namespace: ambassador
spec:
  redirectToHttps:
    enabled: true

我也玩过 kubernetes.io/ingress.allow-http: "false" 但运气不好。这个 ingress+backend+frontend 配置与我以前的配置没有什么不同,除了 Ingress 规范映射到我需要的各个服务,没有任何问题。

在这一点上,我已经研究了几天并寻求帮助。

根据 google 文档,如果您希望负载平衡器终止 SSL 流量,则需要对其进行配置。您可以使用以下指令:https://kubernetes.io/docs/concepts/services-networking/ingress/#tls

google 关于如何创建 L7 负载均衡器的原始文档链接到大使文档中的链接:https://cloud.google.com/kubernetes-engine/docs/tutorials/http-balancer (link comes from Step 1 of this site you linked: https://www.getambassador.io/docs/edge-stack/latest/topics/running/ambassador-with-gke/)

不幸的是,这意味着当您同时指定大使 MappingHost 时,您将无法充分利用大使的 letsencrypt 自动证书生成。在我从头开始安装 AES 的 GKE 集群上,有一个类型为 LoadBalancerService,它会自动创建一个 google 负载均衡器(如果你在 GKE 中)。此服务自动为 443 和 80 配置了端口,不需要额外的入口。