首页 > 解决方案 > 带 GKE 运行状况检查和 LB 配置错误的大使边缘堆栈

问题描述

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

手动安装指南中的步骤似乎工作正常,除了edgectl被弃用telepresence(我还没有真正尝试过)。

接下来的步骤,使用 GKE 设置入口是问题开始的地方。

根据指南,这可以通过传统的 Ambassador API 网关或新的 AES 来完成。对两种安装进行比较,您不需要在 API Gateway 安装中执行任何操作,除了整理修补原始aesambassador服务和ambassador-admin服务 from LoadBalancertoNodePort类型。我已经做到了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

剩下的就是设置 GKEIngressBackendConfig. 我的看起来像这样:

# 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-adminpod 运行良好。Ingress创建一个分配我保留的全局 IP 地址的HTTPLB,并且无法从后端运行状况检查中获得 OK。我相信因为 LB 是 HTTP 并且没有暴露端口 443,所以ManagedCertificate也无法提供NOT_VISIBLE错误。

进行一些故障排除,我现在添加了 aFrontEndConfig并使用注释添加到我的入口networking.gke.io/v1beta1.FrontendConfig: "my-frontend"以设置 HTTP 重定向 LB,但是这个新的仅重定向 LB 被分配了具有This load balancer has no frontend configured. 下面是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-kubernetes-enginekubernetes-ingressambassador

解决方案


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

这些链接到谷歌在原始文档中关于如何创建 L7 负载均衡器的链接,链接在大使文档中:https ://cloud.google.com/kubernetes-engine/docs/tutorials/http-balancer (链接来自步骤您链接的本网站的 1 个:https ://www.getambassador.io/docs/edge-stack/latest/topics/running/ambassador-with-gke/ )

不幸的是,这意味着当您同时指定大使MappingHost. 在我从头开始安装 AES 的 GKE 集群上,有一个自动创建谷歌负载均衡器Service的类型LoadBalancer(如果你在 GKE 中)。此服务自动为 443 和 80 配置端口,不需要额外的入口。


推荐阅读