我目前正在安装Ambassador Edge Stack(AES(,以帮助管理GKE集群中运行应用程序的几个应用程序,但我遇到了一些问题。
手册安装指南中的步骤似乎运行良好,除了edgectl
被弃用而支持telepresence
之外(我还没有真正尝试过(。
接下来的步骤,通过GKE设置入口是问题的开始。
根据指南,这可以通过传统的大使API网关或新的AES来完成。对这两种安装进行比较,除了将原始aesambassador
服务和ambassador-admin
服务从LoadBalancer
类型打补丁到NodePort
类型之外,您不需要在API网关安装中执行任何操作。我用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
剩下的都是关于设置GKEIngress
和BackendConfig
。我的是这样的:
# 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
这就是事情开始分崩离析的地方。ambassador
和ambassador-admin
服务和pod运行良好。Ingress
创建了一个HTTP
LB,分配了我保留的全局ip地址,并且a未能从后端健康检查中获得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规范映射到我需要的各个服务之外,这个ingress+后端+前端配置与我过去的配置没有什么不同,没有任何问题。
在这一点上,我已经做了几天了,并寻求一些帮助。
根据谷歌文档,如果您希望负载均衡器终止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/)
不幸的是,这意味着当您同时指定大使Mapping
和Host
时,您将无法充分利用大使的letsencrypt自动证书生成功能。在我从头开始安装AES的GKE集群上,有一个LoadBalancer
类型的Service
,它会自动创建一个谷歌负载均衡器(如果你在GKE中(。该服务具有为443和80自动配置的端口,不需要额外的入口。