当前位置: 首页 > 知识库问答 >
问题:

GKE NEG准备就绪门在Windows容器和准备就绪探测器中出现故障

盖高畅
2023-03-14

我遇到了一个问题:

获取健康检查以成功。尝试使用容器本机负载平衡(CNLB)时,在IIS容器中运行的Net app。

我有一个网络endpoint组(NEG),由GKE中的入口资源定义和VPC本机集群创建。

当我通过公开NodePort或制作LoadBalancer类型的服务来规避CNLB时,站点会毫无问题地解决。

所有的吊舱条件从一个描述看起来不错:吊舱准备就绪

运行时会显示网络endpoint描述endpoint:就绪地址

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

当从同一VPC中的其他容器或VM命中这些endpoint时,/health.htm以200响应。这是来自同一命名空间中的容器,尽管我使用LinuxVM复制了它,不是在集群中,而是在同一VPC中:endpoint响应

但尽管如此,健康检查报告了我的NEG中的POD不健康:不健康终点

堆栈驱动程序日志确认请求超时,但我不确定为什么当endpoint响应其他实例而不是LB时:堆栈驱动程序健康检查日志

我确认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                 

入口是非常基本的,因为我们在这个网站上没有真正需要多条路线,但是,我怀疑我们在这里有什么问题。

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容器或就绪探测:https://cloud.google.com/kubernetes-engine/docs/how-to/container-native-load-balancing#using-pod就绪反馈

任何建议都将不胜感激。我花了两天时间在这个问题上,我相信这很明显,但我就是看不出问题所在。

共有3个答案

楚良平
2023-03-14

您可以参考此GCP文件。注意:Windows Server节点池不支持此功能。

功能限制Windows Server容器尚不支持某些Kubernetes功能。此外,某些功能是特定于Linux的,不适用于Windows。有关支持和不支持的Kubernetes功能的完整列表,请参阅Kubernetes文档。

除了不受支持的Kubernetes特性外,还有一些GKE特性不受支持。

对于GKE群集,Windows Server节点池不支持以下功能:

云tpu(--启用tpu)具有网络endpoint组的图像流入口节点内可见性(--启用节点内可见性)IP伪装代理Kubernetes alpha群集(--启用Kubernetes alpha)节点本地DNS缓存私有使用E类IP地址私有使用公共IP地址网络策略日志记录Kubernetes服务。spec.sessionAffinity Spot VMs GPU(--加速器)

https://cloud.google.com/kubernetes-engine/docs/concepts/windows-server-gke https://cloud.google.com/kubernetes-engine/docs/concepts/ingress#container-native\u load\u平衡

狄英哲
2023-03-14

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

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

您需要通过BackendConfig CRD添加自定义healthCheck。请查看此链接[1]。您可以在同一页中找到如何将BackendConfig与入口关联

您使用的是什么版本的GKE?从您使用的入口API来看,这似乎是一个旧版本。

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

郭志泽
2023-03-14

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

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

因为,入口NEG将无法工作(根据限制),我建议您使用您提到的任何选项,要么公开NodePort,要么创建LoadBalancer类型的服务。

 类似资料:
  • 我无法创建某个docker容器,因为jenkins告诉我该名称已在使用中。 我已尝试查找或删除此容器,但无法执行以下操作: 容器是通过jenkins构建的,在不同的构建中,总是有相同的容器id在使用中被否认。我们有八个不同的jenkins节点,这项工作在其中七个节点上工作,创建和删除具有该名称的docker图像。 如何移除这个“幽灵”容器?Allready尝试了但没有成功:

  • 我是测试新手,我正在使用codeception和phpunit来做一些TDD。 然而,我的方法有很多代码。我是否使用了最佳实践?有没有一种方法可以提高我的代码的就绪性,它能更干净吗?

  • 我正在尝试设置istio1。5.1在minicube kubernetes集群中,我遵循Knative的官方文档,在不使用侧车注入的情况下设置istio。我我面临istio入口网关服务的问题,该服务将入口网关服务的外部ip显示为。我已经浏览了这里发布的其他答案,以及许多其他论坛,但没有一个对我有帮助。 使用Minikube v1.9.1与驱动=无头盔v2.16.5 kubectl v1.18.0

  • 问题内容: 我正在使用Cordova和AngularJS开发移动应用程序。在准备好Cordova设备之前,如何限制AngluarJS的引导。基本上,我不想在设备准备就绪之前使用任何AngularJS控制器。 问题答案: 手动引导您的Angular应用程序: 从HTML代码中删除属性,因此Angular不会自行启动。 在您的JavaScript代码中添加以下内容: 有关引导应用程序的角度文档。

  • 现在,我注意到具有,但是events列表中的最后一个事件将状态列为,因为准备状态探测失败。(在应用程序日志中,我可以看到,自那以后,有更多的请求传入准备状态探测,并且它们都成功了。) 我应该如何解释这些信息?Kubernetes认为我的豆荚准备好了,还是没有准备好?

  • 我创建了一个Kubernetes部署,其中包含由模板定义的pod。我需要更新pod定义以包含就绪性和活动性探测,因为据我所知,模板不允许创建这些探测。有什么想法吗? 部署的问题是它不允许我添加探测定义。如果我使用如下的探测定义: 它失败,错误:解析 .yaml 错误:将 YAML 转换为 JSON 时出错:yaml:第 22 行:找到无法启动任何令牌的字符 该行是就绪情况探测器的定义。