【问题标题】:Two ingress controller on same K8S cluster同一个 K8S 集群上的两个入口控制器
【发布时间】:2020-08-21 21:28:55
【问题描述】:

我在 DigitalOcean 托管的 K8S 集群上安装了以下两个不同的入口控制器:

  • Nginx

  • Istio

它们已被分配到两个不同的 IP 地址。我的问题是,如果在同一个 K8S 集群上有两个不同的入口控制器是错误的?

之所以这样做,是因为nginx是针对harbor、argocd等工具的,而istio是针对微服务的。

我也发现,当两者并排安装时,有时在部署过程中,K8S 会突然掉线。

比如我已经部署了:

apiVersion: v1
kind: Service
metadata:
  name: hello-kubernetes-first
  namespace: dev
spec:
  type: ClusterIP
  ports:
    - port: 80
      targetPort: 8080
  selector:
    app: hello-kubernetes-first
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: hello-kubernetes-first
  namespace: dev
spec:
  replicas: 3
  selector:
    matchLabels:
      app: hello-kubernetes-first
  template:
    metadata:
      labels:
        app: hello-kubernetes-first
    spec:
      containers:
        - name: hello-kubernetes
          image: paulbouwer/hello-kubernetes:1.7
          ports:
            - containerPort: 8080
          env:
            - name: MESSAGE
              value: Hello from the first deployment!
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    kubernetes.io/ingress.class: istio
  name: helloworld-ingress
  namespace: dev
spec:
  rules:
    - host: hello.service.databaker.io
      http:
        paths:
          - path: /*
            backend:
              serviceName: hello-kubernetes-first
              servicePort: 80
---

那么我有:

Error from server (InternalError): error when creating "istio-app.yml": Internal error occurred: failed calling webhook "validate.nginx.ingress.kubernetes.io": Post https://ingress-nginx-controller-admission.nginx.svc:443/extensions/v1beta1/ingresses?timeout=30s: dial tcp 10.245.107.175:443: i/o timeout  

【问题讨论】:

  • 我会说,例如,here 提到的 gce ingress 和 nginx ingress 应该没有问题。我不确定 istio 和 nginx。也许尝试将 nginx 限制为提到的限制命名空间here?也许尝试将 nginx 入口配置为 istio 负载均衡器,而不是两者兼而有之?

标签: nginx kubernetes kubernetes-ingress istio


【解决方案1】:

您提出了几点 - 在回答您的问题之前,让我们退后一步。


K8s Ingress Istio 推荐

重要的是要注意 Istio 不推荐使用 K8s Ingress:

建议使用 Istio Gateway 而不是 Ingress,以利用 Istio 提供的完整功能集,例如丰富的流量管理和安全功能。

参考:https://istio.io/latest/docs/tasks/traffic-management/ingress/kubernetes-ingress/

如上所述,Istio 网关(Istio IngressGateway 和 EgressGateway)充当边缘,您可以在 https://istio.io/latest/docs/tasks/traffic-management/ingress/ingress-control/ 中找到更多信息。


Istio 中的多个端点

如果您需要为业务需求分配一个公共端点,而另一个用于监控(例如您提到的 Argo CD、Harbor),您可以仅使用 Istio 来实现。大致有两种方法。

  1. 创建单独的 Istio IngressGateways - 一个用于主要流量,另一个用于监控
  2. 创建一个 Istio IngressGateway,并使用Gateway 定义来处理多种访问模式

两者都是有效的,根据要求,您可能需要选择一种方式或其他方式。

至于方法 #2,这是 Istio 的流量管理系统大放异彩的地方。这是 Istio 强大功能的一个很好的例子,但如果您是新手,设置会稍微复杂一些。所以这里举个例子。

方法 #2 示例

当您按照 default installation 创建 Istio IngressGateway 时,它会创建如下 istio-ingressgateway(我过度简化了 YAML 定义):

apiVersion: v1
kind: Service
metadata:
  labels:
    app: istio-ingressgateway
    istio: ingressgateway
  name: istio-ingressgateway
  namespace: istio-system
  # ... other attributes ...
spec:
  type: LoadBalancer
  # ... other attributes ...

然后,此 LB 服务将成为您的端点。 (我不熟悉 DigitalOcean K8s env,但我想他们会处理 LB 创建。)

然后,您可以像下面这样创建网关定义:

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: your-gateway
  namespace: istio-system
spec:
  selector:
    app: istio-ingressgateway
    istio: ingressgateway
  servers:
    - port:
        number: 3000
        name: https-your-system
        protocol: HTTPS
      hosts:
        - "your-business-domain.com"
        - "*.monitoring-domain.com"
      # ... other attributes ...

然后您可以创建 2 个或更多 VirtualService 定义。

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: business-virtsvc
spec:
  gateways:
    - istio-ingressgateway.istio-system.svc.cluster.local
  hosts:
    - "your-business-domain.com"
  http:
    - match:
        - port: 3000
      route:
        - destination:
            host: some-business-pod
            port:
              number: 3000
    # ... other attributes ...
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: monitoring-virtsvc
spec:
  gateways:
    - istio-ingressgateway.istio-system.svc.cluster.local
  hosts:
    - "harbor.monitoring-domain.com"
  http:
    - match:
        - port: 3000
      route:
        - destination:
            host: harbor-pod
            port:
              number: 3000
    # ... other attributes ...

注意:以上假设了很多东西,比如端口映射、流量处理等。详情请查看官方文档。


那么,绕道而行回到问题:

问题:[是否]在同一个 K8S 集群上有两个不同的入口控制器是错误的[?]

我相信这没问题,尽管这可能会导致您看到的错误,因为两个入口控制器争夺 K8s Ingress 资源。

如上所述,如果您使用的是 Istio,最好坚持使用 Istio IngressGateway 而不是 K8s Ingress。如果您出于某种特定原因需要 K8s Ingress,您可以使用其他 Ingress 控制器进行 K8s Ingress,例如 Nginx。

关于您看到的错误,它来自 Nginx 部署的 webhook,ingress-nginx-controller-admission.nginx.svc 不可用。这意味着您已经创建了一个带有 kubernetes.io/ingress.class: istio 注释的 K8s Ingress helloworld-ingress,但是 Nginx webhook 正在干扰 K8s Ingress 处理。然后 webhook 无法处理资源,因为没有找到负责 webhook 流量的 Pod / Svc。

错误本身只是说明 K8s 中的某些东西不健康——可能没有足够的节点分配给集群,因此没有发生 Pod 分配。还需要注意的是,Istio 确实需要一些 CPU 和内存占用,这可能会给集群带来更大的压力。

【讨论】:

    【解决方案2】:

    这两种产品都有不同的特点,解决不同类型的问题。因此,将两者都安装在您的集群上没有问题。

    称它们为 Ingress Controller 是不正确的: - Nginx 是一个众所周知的网络服务器 - Nginx 入口控制器是基于 Nginx 的 Kubernetes 入口控制器的实现(负载均衡、HTTPS 终止、身份验证、流量路由等) - Istio 是一个服务网格(在微服务架构中广为人知,用于在 POD 级别以标准方式解决横切关注点,例如日志记录、跟踪、Https 终止等)

    您能否提供更多详细信息来说明“K8S 突然宕机”的含义。你说的是集群节点还是里面运行的 POD?

    谢谢。

    【讨论】:

      【解决方案3】:

      您是否看过指定 ingress.class (kubernetes.io/ingress.class: "nginx" ),就像这里提到的那样? - https://kubernetes.github.io/ingress-nginx/user-guide/multiple-ingress/

      【讨论】:

        猜你喜欢
        • 2020-07-09
        • 2021-07-14
        • 2021-03-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-23
        • 1970-01-01
        相关资源
        最近更新 更多