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

当我在GKE中将NodePort服务指定为入口后端时,我得到了两个后端

劳高爽
2023-03-14

--概览

我在GKE上自定义安装了istio(类型=nodeport)。安装命令如下

istioctl install --set profile=default --set values.gateways.istio-ingressgateway.type=NodePort

我正在构建入口并指定NodePort服务作为后端。我发现GCP指定的另一个后端设置为默认值,即使我指定了NodePort。因此,我无法通过TCP/IP连接到GCP LoadBalancer。如果我为入口等设置了与pod readinessprobe相同的端口,那么健康检查也会在那里进行。有没有办法解决这个问题?

--细节

  • 具有两个后端的LB的详细视图(顶部后端服务是GCP中的默认配置)

LB的详细视图

  • NodePort配置
# This is a value that is automatically set by istio
$ k get svc istio-ingressgateway -n istio-system -o yaml
  ports:
  - name: status-port
    nodePort: 32476
    port: 15021
    protocol: TCP
    targetPort: 15021
  - name: http2
    nodePort: 32241
    port: 80
    protocol: TCP
    targetPort: 8080
  - name: https
    nodePort: 31739
    port: 443
    protocol: TCP
    targetPort: 8443
  - name: tcp-istiod
    nodePort: 32488
    port: 15012
    protocol: TCP
    targetPort: 15012
  - name: tls
    nodePort: 32741
    port: 15443
    protocol: TCP
    targetPort: 15443
  • istio入口通道(pod)准备就绪设置
$ k get po istio-ingressgateway-6f8bbbbd8c-qmkln -n istio-system -o yaml
:
    readinessProbe:
      failureThreshold: 30
      httpGet:
        path: /healthz/ready
        port: 15021
        scheme: HTTP
      initialDelaySeconds: 1
      periodSeconds: 2
      successThreshold: 1
      timeoutSeconds: 1
  • 入口设置
# 
spec:
  rules:
  - host: www.custom.com
    http:
      paths:
      - backend:
          serviceName: istio-ingressgateway
          servicePort: 80
      - backend:
          serviceName: istio-ingressgateway
          servicePort: 15021
  • kubectl get svc的结果
istio-system   istio-ingressgateway   NodePort    10.47.13.185   <none>        15021:31761/TCP,80:31561/TCP,443:31257/TCP,15012:31841/TCP,15443:32172/TCP   9h

共有1个答案

蓬运诚
2023-03-14

我把这个答案分成了几个部分:

  • 使用GKE创建入口资源时有两个后端
  • 问题中的入口定义
  • 将云装甲与Istio集成

这正如预期的那样工作,因为使用GKE创建的入口将有2个后端:

  • YAML清单中指定的。
  • 默认后端:default-超文本传输协议-backend

例如,您可以遵循以下步骤:

  • kubectl创建部署nginx--image=nginx

之后,您应该会看到类似的设置:

第一个后端服务使用实例组将请求发送到与入口资源不匹配的默认后端。

第二个后端服务是使用NEG(网络endpoint组)发送与Inrit资源匹配的请求(在本例中为nginx部署)。

我已经标记了红色方块以将其与库伯内特斯资源连接起来(查看端口):

  • $kubectl获取svc nginx
NAME    TYPE       CLUSTER-IP    EXTERNAL-IP   PORT(S)        AGE
nginx   NodePort   10.20.6.229   <none>        80:32612/TCP   51m
  • <代码>$kubectl get svc-n kube系统默认http后端
NAME                   TYPE       CLUSTER-IP    EXTERNAL-IP   PORT(S)        AGE
default-http-backend   NodePort   10.20.15.39   <none>        80:30603/TCP   121m

问题中包含的入口定义部分是以引用具有两个不同后端的相同路径的方式创建的:

    http:
      paths:
      - backend:
          serviceName: istio-ingressgateway
          servicePort: 80
      - backend:
          serviceName: istio-ingressgateway
          servicePort: 15021

以上示例

  • 有两个不同的后端

要解决这个问题,您需要删除15021后端,并使用backendConfig资源来配置健康检查和安全策略(稍后将详细介绍)。

旁注!

YAML清单正在使用一种古老且很快会被弃用的方式来描述入口。有关更多参考,请参阅本文档:

  • Cloud.google.com:库伯内特斯引擎:文档:概念:入口

将云装甲与Istio结合使用的方法之一是:

  • 创建安全策略。
  • 创建一个backendConfig作为IstioService的先决条件。
  • 安装Istio并修改其服务
  • 创建一个入口资源以指向istio-ingressgate
  • 用一个例子进行测试。

例如,可以创建仅阻止单个IP地址的安全策略。可以通过云控制台(Web UI)或云控制台(Web UI)完成:

  • 云。谷歌。com:装甲:文档:配置安全策略

让我们假设创建了名为:denend-first的安全策略来阻止单个IP地址。

您需要创建一个backendConfig来配置运行状况检查并强制执行安全策略:

apiVersion: cloud.google.com/v1
kind: BackendConfig
metadata:
  name: ingress-backendconfig
  namespace: istio-system
spec:
  healthCheck:
    requestPath: /healthz/ready
    port: 15021
    type: HTTP
  securityPolicy:
    name: deny-single # <-- IMPORTANT

您需要在istio ingressgateway的服务中添加以下注释:

    cloud.google.com/backend-config: '{"default": "ingress-backendconfig"}'
    cloud.google.com/neg: '{"ingress":true}'

此注释将通知GCP要应用的安全策略以及将流量传递到istio-ingress网关所需的健康检查。

将请求从HTTP(S)负载平衡器发送到istio ingressgateway的基本定义如下:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: istio-ingress
  namespace: istio-system
spec:
  rules:
  - http:
      paths:
      - path: /*
        pathType: ImplementationSpecific
        backend:
          service:
            name: istio-ingressgateway
            port:
              number: 80

要检查设置是否正常工作,您可以生成Bookinfo应用程序。

使用2个不同的IP地址进行测试:

  • $curl ifconfig。me
217.AAA.BBB.CCC
  • $curl 34. XXX. YYY. ZZZ/productpage
<!doctype html><meta charset="utf-8"><meta name=viewport content="width=device-width, initial-scale=1"><title>403</title>403 Forbidden%
  • $curl ifconfig。me
94.EEE.FFF.GGG
  • $curl 34. XXX. YYY. ZZZ/productpage
<html>
  <head>
    <title>Simple Bookstore App</title>
<-- REDACTED --> 

旁注!

您收到的“封闭端口”可能与以下事实有关,即istio ingressgateway被配置为侦听特定路径,如productpage,而不是code。(如果请求专门针对端口80而不是15021)

其他资源:

  • AlwaysPalwayson:帖子:2021:04:云甲
 类似资料:
  • 我已经在laravel中创建了一个项目,但是当我尝试使用php artisan serve运行它时,我得到了一个错误:需要Mcrypt php扩展。我需要一些帮助

  • 在AWS EKS上,我有ALB入口控制器,入口资源指向端口32509上的NodePort服务,目标端口80,服务上有。 在这种情况下,外部流量如何在NodePort服务下路由到我的pod? 类似于,ALB

  • 我设置服务的方式如下: 部署(2个吊舱)- 到目前为止,它提供了正确的证书,但由于某些原因,它指向了“错误”的后端。在GKE wbeconsole上,它只是说我的后端服务不健康,一旦我点击它们,它们就不存在了。我在这里做错了什么? 这是我的ingress yaml文件 部署yaml LB服务yaml

  • 我正在学习如何使用入口在谷歌Kubernetes引擎上公开我的应用程序。我学习了几本教程,大致了解了需要什么。然而,我不知道为什么我的服务被标记为不健康,尽管它们可以从我直接定义的NodePort服务访问。 这是我的部署文件:(我删除了一些数据,但大部分保持不变) 在阅读时,我需要一个ReadinessProbe和LivinessProbe,以便GKE在我定义的路径上运行健康检查,并且通过使用我自

  • 在使用GKE ingress时,我观察到GKE ingress为负载平衡器创建了多个后端服务,这导致后端服务如此之多,我们甚至面临后端服务作为其全局配额的配额耗尽问题。我的问题是,尽管ingress中有多条路径规则,但为什么NGINX ingress controller不像GCE ingress那样创建多个后端服务。我阅读了这里的文档, https://cloud.google.com/kube

  • 在我开始之前,我想提一下,我正在使用GKE的免费试用版。我有一个在GKE集群中运行的简单服务器。我有一个用于公开服务器的服务。我正在尝试配置入口控制器并将其连接到此服务。 如果我的服务是LoadBalancer、NodePort类型,那么一切都会完美工作。但是,如果我的服务是ClusterIP类型,则会出现以下错误 然后,GKE停止尝试为入口配置IP。为什么我不能配置集群IP类型的服务,是否有解决