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

时间:2020-05-06 19:06:16

标签: nginx kubernetes kubernetes-ingress istio

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

  • Nginx

  • Istio

,并且它们已分配给两个不同的IP地址。我的问题是,在同一K8S群集上拥有两个不同的入口控制器是否错误?

之所以这样做,是因为nginx用于港口,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  

2 个答案:

答案 0 :(得分:1)

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


Istio推荐的

K8s Ingress not

重要的是要注意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强大功能的一个很好的例子,但是如果您不熟悉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入口资源。

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

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

错误本身仅表明K8中存在某些问题-可能节点分配给群集的节点不足,因此Pod分配未发生。还需要注意的是,Istio确实需要占用一些CPU和内存,这可能会给群集带来更多压力。

答案 1 :(得分:0)

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