【问题标题】:NGINX Ingress creates NodePort rather than LoadBalancerNGINX Ingress 创建 NodePort 而不是 LoadBalancer
【发布时间】:2020-08-01 20:14:00
【问题描述】:

我不熟悉这种容器化的东西。 我在 Ubuntu 18.04 上运行 minikube 我正在以下安装: https://kubernetes.github.io/ingress-nginx/deploy/ 所以只需执行minikube addons enable ingress 当我执行kubectl get services -n ingress-nginx

it shows 
NAME                                 TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                      AGE
ingress-nginx-controller             NodePort    10.100.216.141   <none>        80:32205/TCP,443:31915/TCP   5d2h
ingress-nginx-controller-admission   ClusterIP   10.106.58.189    <none>        443/TCP                      5d2h

但是根据我所关注的课程,ingress-nginx-controller 类型应该是负载均衡器。

我的入口配置:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress-service
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/use-regex: 'true'
spec:
  rules:
    - host: we-creators.dev
      http:
        paths:
          - path: /api/users/?(.*)
            backend:
              serviceName: auth-srv
              servicePort: 3000
          - path: /?(.*)
            backend:
              serviceName: client-srv
              servicePort: 3000

【问题讨论】:

  • 嘿,那么您希望 minikube 联系哪个云提供商来创建LoadBalancer
  • 你的kubernetes/minikube版本是什么?,kubectl get ingress,nodes -o wide的输出是什么

标签: ubuntu nginx kubernetes kubernetes-ingress


【解决方案1】:

我已经用 2 个最新版本对此进行了测试,目前我可以看到没有与 ingress-nginx 控制器关联的服务(部署为 minikube 插件)。

请查看 ingress-nginx 部署中的端口。

使用此规范在 kube-system 命名空间中启用入口插件创建部署:

...
spec:
  containers:
  - args: 
    - --report-node-internal-ip-address
...
    ports:
    - cotainerPort: 80
      hostPort:80
      name: http
      protocol: TCP
    - cotainerPort: 443
      hostPort: 443
      name: https
      protocol: TCP
...

看起来在当前的 minikube 版本中,ingress-nginx 正在使用 --hostPorts 而不是 nginx ingress nodeport 服务。 最重要的信息是你当前的 cni 网络插件是否支持Port-mapping

来自官方文档CNI networking plugin supports hostPort

CNI 网络插件支持 hostPort。

您可以在 minikube 节点中检查此设置:

minikube -p your_name ssh
cat /etc/cni/net.d/your_config

"type": "portmap",
        "capabilities": {"portMappings": true},

    

限制与hostNetwork: true 配置相同:

这种部署方法的一个主要限制是每个集群节点上只能调度一个 NGINX Ingress 控制器 Pod,因为在同一个网络接口上多次绑定同一个端口在技术上是不可能的


-- 报告节点内部IP地址

因为裸机节点通常没有 ExternalIP,所以必须启用 --report-node-internal-ip-address 标志,它将所有 Ingress 对象的状态设置为所有节点的内部 IP 地址运行 NGINX Ingress 控制器。

Kubernetes ServiceTypes 允许您指定所需的服务类型。 默认为 ClusterIP

类型值及其行为是:

  • ClusterIP:在集群内部 IP 上公开服务。选择此值使服务只能从集群内访问。这是默认的 ServiceType。

  • NodePort:在每个节点的 IP 上的静态端口(NodePort)上公开服务。自动创建 NodePort 服务路由到的 ClusterIP 服务。您可以通过以下请求从集群外部联系 NodePort 服务:。

  • LoadBalancer:使用云提供商的负载平衡器将服务公开到外部。自动创建外部负载均衡器路由到的 NodePort 和 ClusterIP 服务。

服务类型Loadbalancer的特别说明

服务类型设置为LoadBalancer时,Kubernetes 为集群内的 pod 提供与 type equals ClusterIP 等价的功能,并通过编程(Kubernetes 外部)来扩展它具有 Kubernetes pod 条目的负载均衡器。 Kubernetes 服务控制器自动创建外部负载均衡器、健康检查(如果需要)、防火墙规则(如果需要)并检索云提供商分配的外部 IP 并将其填充到服务对象中

作为裸机环境中的解决方法,您可以使用MetalLB

MetalLB 为不在受支持的云提供商上运行的 Kubernetes 集群提供网络负载平衡器实现,从而有效地允许在任何集群中使用 LoadBalancer 服务。

【讨论】:

    猜你喜欢
    • 2021-04-22
    • 2019-09-10
    • 2021-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-14
    • 2020-01-23
    相关资源
    最近更新 更多