Nginx 同一K8S群集上的两个入口控制器

Nginx 同一K8S群集上的两个入口控制器,nginx,kubernetes,kubernetes-ingress,istio,Nginx,Kubernetes,Kubernetes Ingress,Istio,我在DigitalOcean管理的K8S群集上安装了以下两个不同的入口控制器: Nginx 伊斯蒂奥 它们被分配到两个不同的IP地址。我的问题是,如果在同一个K8S集群上有两个不同的入口控制器是错误的 我之所以这么做,是因为nginx用于harbor、argocd等工具,而istio用于微服务 我还发现,当两者并排安装时,有时在部署期间,K8S会突然下降 例如,我部署了: apiVersion: v1 kind: Service metadata: name: hello-kuberne

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

  • Nginx

  • 伊斯蒂奥

它们被分配到两个不同的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  

这两种产品都有各自的特点,可以解决不同类型的问题。因此,在集群上安装这两个组件没有问题

称之为入口控制器不正确: -Nginx是一个著名的web服务器 -Nginx入口控制器是基于Nginx(负载平衡、HTTPS终止、身份验证、流量路由等)的Kubernetes入口控制器的实现 -Istio是一个服务网格(微服务架构非常熟悉,用于在POD级别以标准方式解决横切关注点,如日志、跟踪、Https终止等)

你能提供更多关于“K8S突然下降”的细节吗。你说的是集群节点还是内部运行的吊舱


谢谢。

您看过这里提到的指定ingres.class(
kubernetes.io/ingres.class:“nginx”
)了吗 Istio不建议使用K8s入口 重要的是要注意Istio如何不建议使用K8s入口:

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

参考:

如前所述,Istio网关(Istio入口网关和出口网关)充当边缘,您可以在中找到更多信息


Istio中的多个端点 如果您需要为业务需求分配一个公共端点,为监视分配另一个端点(如您提到的Argo CD、Harbor),那么您可以仅通过使用Istio来实现这一点。这大约有两种方法

  • 创建单独的Istio入口通道-一个用于主流量,另一个用于监控
  • 创建一个Istio入口网关,并使用定义处理多个访问模式
  • 这两种方法都是有效的,根据需要,您可能需要选择一种方法或另一种方法

    至于方法#2,这是Istio交通管理系统的亮点。这是Istio强大功能的一个很好的例子,但是如果您是新手,设置会有点复杂。下面是一个例子

    方法示例#2

    当您按照创建Istio IngressGateway时,它将创建
    Istio IngressGateway
    ,如下所示(我过度简化了YAML定义):

    apiVersion:v1 种类:服务 元数据: 标签: 应用程序:istio ingressgateway 伊斯蒂奥:入口大道 姓名:istio ingressgateway 名称空间:istio系统 # ... 其他属性。。。 规格: 类型:负载平衡器 # ... 其他属性。。。 这个LB服务将成为您的端点。(我不熟悉DigitalOcean K8s env,但我想他们会处理LB创建。)

    然后,您可以创建如下所示的网关定义:

    apiVersion:networking.istio.io/v1alpha3 种类:网关 元数据: 名称:您的网关 名称空间:istio系统 规格: 选择器: 应用程序:istio ingressgateway 伊斯蒂奥:入口大道 服务器: -端口: 电话:3000 名称:https您的系统 协议:HTTPS 主持人: -“您的业务域.com” -“*.monitoring domain.com” # ... 其他属性。。。 然后可以创建两个或多个定义

    apiVersion:networking.istio.io/v1alpha3 种类:虚拟服务 元数据: 名称:商务virtsvc 规格: 网关: -istio-ingressgateway.istio-system.svc.cluster.local 主持人: -“您的业务域.com” http: -匹配: -港口:3000 路线: -目的地: 主持人:一些商务舱 端口: 电话:3000 # ... 其他属性。。。 apiVersion:networking.istio.io/v1alpha3 种类:虚拟服务 元数据: 名称:监控virtsvc 规格: 网关: -istio-ingressgateway.istio-system.svc.cluster.local 主持人: -“harbor.monitoring domain.com” http: -匹配: -港口:3000 路线: -目的地: 主持人:港口吊舱 端口: 电话:3000 # ... 其他属性。。。 注意:以上假设了很多事情,例如端口映射、流量处理等。。详情请查阅官方文件


    那么,在绕道很长一段时间后,回到问题上来:

    问题:[在同一K8S群集上使用两个不同的入口控制器是否错误[?] 我相信这是可以的,尽管这可能会导致一个错误,正如您所看到的,因为两个入口控制器争夺K8s入口资源

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

    至于您看到的错误,它来自Nginx部署的webhook,
    ingres Nginx controller acmission.Nginx.svc
    不可用。这意味着您已经使用
    kubernetes.io/ingres.class:istio
    注释创建了一个K8s入口
    helloworld入口
    ,但Nginx webhook正在干扰K8s入口处理。然后,webhook无法处理资源,因为负责webhook流量的Pod/Svc正在运行