2

我遇到了一个问题:

尝试使用容器本机负载平衡 (CNLB) 时,对在 IIS 容器中运行的 .Net 应用程序进行运行状况检查以成功。

我有一个由 GKE 中的入口资源定义和 VPC 原生集群创建的网络端点组 (NEG)。

当我通过暴露 NodePort 或提供 LoadBalancer 类型的服务来规避 CNLB 时,该站点可以毫无问题地解决。

描述中的所有吊舱条件看起来都不错: 吊舱准备就绪

运行时出现网络端点describe endpoints就绪地址

这是负载均衡器生成的运行状况检查:GCP 运行状况检查

当从同一 VPC 中的其他容器或虚拟机访问这些端点时,/health.htm 以 200 响应。这是来自同一命名空间中的一个容器,尽管我已经使用 Linux 虚拟机复制了这一点,但不是在集群中,而是在同一个VPC:端点响应

但尽管如此,健康检查报告我的 NEG 中的 pod 不健康:不健康的端点

stackdriver 日志确认请求超时,但我不确定为什么端点响应其他实例而不响应 LB:Stackdriver Health Check Log

我确认 GKE 创建了看起来像正确的防火墙规则,应该允许从 LB 到 Pod 的流量:防火墙

这是我正在使用的 YAML:

部署:

apiVersion: apps/v1                                                  
kind: Deployment                                                     
metadata:                                                            
  labels:                                                            
    app: subdomain.domain.tld                                       
  name: subdomain-domain-tld                                       
  namespace: subdomain-domain-tld
spec:                                                                
  replicas: 3                                                        
  selector:                                                          
    matchLabels:                                                     
      app: subdomain.domain.tld                                     
  template:                                                          
    metadata:                                                        
      labels:                                                        
        app: subdomain.domain.tld
    spec:                                                            
      containers:                                                    
      - image: gcr.io/ourrepo/ourimage
        name: subdomain-domain-tld
        ports:                                                       
        - containerPort: 80                                          
        readinessProbe:                                              
          httpGet:                                                   
            path: /health.htm                                        
            port: 80                                                 
          initialDelaySeconds: 60                                    
          periodSeconds: 60                                          
          timeoutSeconds: 10                                         
        volumeMounts:                                                
        - mountPath: C:\some-secrets                                      
          name: some-secrets
      nodeSelector:                                                  
        kubernetes.io/os: windows                                    
      volumes:                                                       
      - name: some-secrets                                    
        secret:                                                      
          secretName: some-secrets

服务:

apiVersion: v1                                                       
kind: Service                                                        
metadata:                                                            
  labels:                                                            
    app: subdomain.domain.tld                                     
  name: subdomain-domain-tld-service
  namespace: subdomain-domain-tld
spec:                                                                
  ports:                                                             
  - port: 80                                                         
    targetPort: 80                                                   
  selector:                                                          
    app: subdomain.domain.tld                                       
  type: NodePort                 

Ingress 是非常基本的,因为我们在这个站点上不需要多条路由,但是,我怀疑我们在这里遇到的任何问题。

apiVersion: extensions/v1beta1                                       
kind: Ingress                                                        
metadata:                                                            
  annotations:                                                       
    kubernetes.io/ingress.class: gce
  labels:                                                            
    app: subdomain.domain.tld                                       
  name: subdomain-domain-tld-ingress
  namespace: subdomain-domain-tld
spec:                                                                
  backend:                                                           
    serviceName: subdomain-domain-tld-service
    servicePort: 80

最后一些相关的细节是我尝试了本文档中的步骤并且它有效,但它与我的情况不同,因为它没有使用 Windows Containers 或 Readiness Probes:https ://cloud.google.com/kubernetes-engine/docs/how -to/container-native-load-balancing#using-pod-readiness-feedback

任何建议将不胜感激。我已经花了两天的时间来解决这个问题,我确信这很明显,但我就是看不到问题所在。

4

2 回答 2

1

显然它没有记录,但在撰写本文时,此功能不适用于 Windows 容器。我能够与 GCP 工程师取得联系,他们提供了以下信息:

经过进一步调查,我发现使用 LoadBalancer 服务的 Windows 容器可以工作,但是使用带有 NEGS 的 Ingress 的 Windows 容器是一个限制,所以我已经打开了一个内部案例来更新公共文档 [1]。

由于 Ingress + NEG 不起作用(根据限制),我建议您使用您提到的任何选项,要么公开 NodePort,要么提供 LoadBalancer 类型的服务。

于 2020-07-28T19:35:47.303 回答
0

创建 Ingress 时,生成的 HC 探测将默认在与应用相同的服务端口和路径上执行 HealthCheck。在这种情况下,路径上的端口 80 /

似乎您的应用程序在端口 80 上报告它的 healthCheck,但在 /health.htm 路径上。

您将需要通过 BackendConfig CRD 添加自定义 healthCheck。看看这个链接 [1]。您可以在同一页面中找到如何将 BackendConfig 关联到 Ingress

你在哪个版本的 GKE 上?从您使用的 Ingress API 来看,这似乎是一个旧版本。

[1] https://cloud.google.com/kubernetes-engine/docs/how-to/ingress-features#direct_health

于 2021-06-15T08:17:32.243 回答