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

GCP GKE入口无法访问后端服务,尽管健康检查、防火墙、服务和部署看起来都正确

危阳
2023-03-14

我正在尝试将node.js应用程序(工件注册表中的Dockerize)部署到GCP库伯内特斯集群中......然后还将服务/部署放在入口后面,以便我们的静态前端可以通过CORS与此应用程序通信。

我可以在不使用入口的情况下让服务正常工作(只是一个标准的服务/部署),但由于CORS错误,前端无法与之通信。经过研究,我了解到我应该创建一个入口来控制此场景的流量。

应用程序部署配置为在任何位置的端口80上运行(在Docker/app和节点端口/targetPort中)。

我主要完成的步骤有:

>

  • 创建一个新的GKE集群(启用HTTP负载平衡,但我不确定这是否必要,因为下面的入口定义会自动创建自己的负载平衡器)

    然后我应用了这个部署服务入口配置:kubectl应用-fdeployment.yaml

    # Main api deployment
    kind: Deployment
    apiVersion: apps/v1
    metadata:
        name: adcloud-api
    spec:
        selector:
            matchLabels:
                app: adcloud-api
        replicas: 1
        template:
            metadata:
                labels:
                    app: adcloud-api
            spec:
    
                containers:
                    - name: adcloud-api
                      image: gcr.io/ad-cloud-328718/adcloud/adcloud-web-api-image:v1
                      imagePullPolicy: IfNotPresent
                      ports:
                      - containerPort: 80
                        protocol: TCP
                      resources:
                          requests:
                              memory: "32Mi"
                              cpu: "100m"
                          limits:
                              memory: "128Mi"
                              cpu: "250m"
    ---
    # Service for the above deployment
    kind: Service
    apiVersion: v1
    metadata:
        name: adcloud-api
        annotations:
            cloud.google.com/backend-config: '{"ports": {"80":"adcloud-api-backendconfig"}, "default": "adcloud-api-backendconfig"}'
    spec:
        #3type: LoadBalancer
        type: NodePort
        selector:
            app: adcloud-api
        ports:
            - protocol: TCP
              port: 80
              targetPort: 80
              nodePort: 32001
    ---
    kind: BackendConfig
    apiVersion: cloud.google.com/v1
    metadata:
        name: adcloud-api-backendconfig
    spec:
        healthCheck:
            # timeoutSec: 10
            # checkIntervalSec: 30
            requestPath: /health
            port: 80
            type: HTTP
      ---
    # Ingress for the above service
    kind: Ingress
    apiVersion: networking.k8s.io/v1
    metadata:
        name: api-ingress
        annotations:
            kubernetes.io/ingress.class: "gce"
            gce.ingress.kubernetes.io/enable-cors: "true"
            gce.ingress.kubernetes.io/cors-allow-credentials: "true"
            gce.ingress.kubernetes.io/cors-allow-methods: "GET, POST, PUT, PATCH, DELETE, OPTIONS"
            gce.ingress.kubernetes.io/cors-allow-origin: "*"
    spec:
        rules:
            - http:
                  paths:
                      - path: /*
                        pathType: ImplementationSpecific
                        backend:
                            service:
                                name: adcloud-api
                                port:
                                    number: 80
    

    您可以看到此后端服务的目标是nodePort 32001。这是正确的吗?我有应用程序的Dockerfile只公开端口80,并且在其他任何地方都定义了端口80(即。在健康检查中)。这里的后端服务应该也使用端口80,还是应该使用nodePort 32001?有一些内部代理处理吗?

    kubectl描述的入口是:

    $ kubectl describe ingress
    Name:             api-ingress
    Namespace:        default
    Address:          35.227.241.142
    Default backend:  default-http-backend:80 (10.0.17.5:8080)
    Rules:
      Host        Path  Backends
      ----        ----  --------
      *
                  /*   adcloud-api:80 (10.0.17.6:80)
    Annotations:  gce.ingress.kubernetes.io/cors-allow-credentials: true
                  gce.ingress.kubernetes.io/cors-allow-methods: GET, POST, PUT, PATCH, DELETE, OPTIONS
                  gce.ingress.kubernetes.io/cors-allow-origin: *
                  gce.ingress.kubernetes.io/enable-cors: true
                  ingress.kubernetes.io/backends: {"k8s-be-32001--8950a5f3e6292d2e":"Unknown","k8s-be-32722--8950a5f3e6292d2e":"Unknown"}
                  ingress.kubernetes.io/forwarding-rule: k8s2-fr-nto0o9ht-default-api-ingress-vo6louo7
                  ingress.kubernetes.io/target-proxy: k8s2-tp-nto0o9ht-default-api-ingress-vo6louo7
                  ingress.kubernetes.io/url-map: k8s2-um-nto0o9ht-default-api-ingress-vo6louo7
                  kubernetes.io/ingress.class: gce
    Events:
      Type    Reason     Age                From                     Message
      ----    ------     ----               ----                     -------
      Normal  Sync       35m                loadbalancer-controller  UrlMap "k8s2-um-nto0o9ht-default-api-ingress-vo6louo7" created
      Normal  Sync       35m                loadbalancer-controller  TargetProxy "k8s2-tp-nto0o9ht-default-api-ingress-vo6louo7" created
      Normal  Sync       34m                loadbalancer-controller  ForwardingRule "k8s2-fr-nto0o9ht-default-api-ingress-vo6louo7" created
      Normal  IPChanged  34m                loadbalancer-controller  IP is now 35.227.241.142
      Normal  Sync       12m (x5 over 35m)  loadbalancer-controller  Scheduled for sync
    

    kubectl描述pods是:

    $ kubectl describe pods
    Name:         adcloud-api-5cb96bb47d-tmrd8
    Namespace:    default
    Priority:     0
    Node:         gke-adcloud-cluster-default-pool-6f91d4e7-z7ks/10.128.15.216
    Start Time:   Wed, 27 Oct 2021 00:51:50 -0400
    Labels:       app=adcloud-api
                  pod-template-hash=5cb96bb47d
    Annotations:  <none>
    Status:       Running
    IP:           10.0.17.6
    IPs:
      IP:           10.0.17.6
    Controlled By:  ReplicaSet/adcloud-api-5cb96bb47d
    Containers:
      adcloud-api:
        Container ID:   containerd://ebd1b857c541b8fdc52dcc6e44d4617d9558bd7e16783a5a016d5bdd1cce7370
        Image:          gcr.io/ad-cloud-328718/adcloud/adcloud-web-api-image:v1
        Image ID:       gcr.io/ad-cloud-328718/adcloud/adcloud-web-api-image@sha256:932e59850992e37854242cac9e70ca65eb52863f63c795d892c84671dca4ba68
        Port:           80/TCP
        Host Port:      0/TCP
        State:          Running
          Started:      Wed, 27 Oct 2021 02:19:48 -0400
        Ready:          True
        Restart Count:  0
        Limits:
          cpu:     250m
          memory:  128Mi
        Requests:
          cpu:        100m
          memory:     32Mi
        Environment:  <none>
        Mounts:
          /var/run/secrets/kubernetes.io/serviceaccount from default-token-4xcjx (ro)
    Conditions:
      Type              Status
      Initialized       True
      Ready             True
      ContainersReady   True
      PodScheduled      True
    Volumes:
      default-token-4xcjx:
        Type:        Secret (a volume populated by a Secret)
        SecretName:  default-token-4xcjx
        Optional:    false
    QoS Class:       Burstable
    Node-Selectors:  <none>
    Tolerations:     node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
                     node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
    Events:
      Type     Reason        Age                From             Message
      ----     ------        ----               ----             -------
      Warning  FailedMount   53m                kubelet          MountVolume.SetUp failed for volume "default-token-4xcjx" : failed to sync secret cache: timed out waiting for the condition
      Normal   Pulling       53m                kubelet          Pulling image "gcr.io/ad-cloud-328718/adcloud/adcloud-web-api-image:v1"
      Normal   Pulled        52m                kubelet          Successfully pulled image "gcr.io/ad-cloud-328718/adcloud/adcloud-web-api-image:v1" in 52.167675207s
      Normal   Created       52m                kubelet          Created container adcloud-api
      Normal   Started       52m                kubelet          Started container adcloud-api
      Normal   Pulling       34m                kubelet          Pulling image "gcr.io/ad-cloud-328718/adcloud/adcloud-web-api-image:v1"
      Normal   Pulled        34m                kubelet          Successfully pulled image "gcr.io/ad-cloud-328718/adcloud/adcloud-web-api-image:v1" in 29.499249423s
      Normal   Started       34m                kubelet          Started container adcloud-api
      Normal   Created       34m                kubelet          Created container adcloud-api
      Warning  NodeNotReady  16m (x7 over 95m)  node-controller  Node is not ready
      Normal   Pulling       14m                kubelet          Pulling image "gcr.io/ad-cloud-328718/adcloud/adcloud-web-api-image:v1"
      Normal   Pulled        13m                kubelet          Successfully pulled image "gcr.io/ad-cloud-328718/adcloud/adcloud-web-api-image:v1" in 27.814932495s
      Normal   Created       13m                kubelet          Created container adcloud-api
      Normal   Started       13m                kubelet          Started container adcloud-api
    

    我真的不知道是什么阻止了单一后端服务的不健康性质,为什么它无法进行健康检查。

    这些是因为健康检查失败而无法访问,还是因为无法访问而导致健康检查失败?有人对这里可能发生的其他事情有什么建议吗?除了上面的部署定义文件之外,我还需要进行任何网络配置吗?运行状况检查应该在开放的应用程序端口(即80)上运行,还是在临时节点端口(即32001)上运行?

    我已经做了几天了,非常感谢您的帮助!

  • 共有1个答案

    慕逸仙
    2023-03-14

    通常的做法是使用不同的端口和目标端口。查看文档中的示例服务
    我还注意到您注释掉了Loadbalancer,并将服务类型更改为NodePort。确保所有yaml文件的设置都对齐。

    如果所有设置都正确且问题仍然存在,请启用GKE日志记录并联系Google支持或通过公共问题跟踪程序报告问题。

     类似资料:
    • 因此,我们正在使用全局MTL部署istio 1.0.2,目前进展顺利。对于健康检查,我们为服务添加了单独的端口,并根据文档进行了配置: https://istio.io/docs/tasks/traffic-management/app-health-check/#mutual-tls-is-enabled 我们的应用程序端口现在位于 8080 上,运行状况检查端口位于 8081 上。完成此操作后

    • 我试图通过GKE部署应用程序。到目前为止,我为应用程序的前端和后端创建了两个服务和两个部署。我使用“gce”控制器创建了一个ingress ressource,并映射了服务,如图所示 它几乎工作得很好(不是所有映射正确的根,但它工作得很好)。我在代码上添加了修改(只有应用程序的代码),我重建了图像并重新创建了服务,但入口似乎对我添加的修改和 我所有的服务都处于不健康状态 这是前台服务 当我描述时,

    • 我怎样才能禁用Debian的保护来允许外部玩家加入我的服务器?

    • 熟悉防火墙的都知道,防火墙一般放在网关上,用来隔离子网之间的访问。因此,防火墙即服务(FireWall as a Service)也是在网络节点上(具体说来是在路由器命名空间中)来实现。 目前,OpenStack 中实现防火墙还是基于 Linux 系统自带的 iptables,所以大家对于其性能和功能就不要抱太大的期望了。 一个可能混淆的概念是安全组(Security Group),安全组的对象是

    • 我是一个码头工人,我在前几天阅读了如何使用它的官方教程。我决定将我非常简单的spring-boot应用程序作为服务部署到集群中,但我无法从外部访问它。顺便说一下,当我用docker run启动docker时,容器是可以访问的。 所以我的春靴tomcat正在收听8081。 Dockerfile: docker-compose.yml: 我部署了两个服务,一个可视化程序和一个Spring引导应用程序。

    • 我正在尝试在基于Spring Cloud的微服务应用中使用Consult。但是当我在tomcat服务器中启用HTTPS时,Consult无法检查服务的健康状况(因为他们试图用http检查服务的健康状况)。我有一个错误: