<p>I am new to this containerization stuff.
I am running minikube on Ubuntu 18.04
I am following installation from:
<a href="https://kubernetes.github.io/ingress-nginx/deploy/" rel="nofollow noreferrer">https://kubernetes.github.io/ingress-nginx/deploy/</a>
so simply executing <code>minikube addons enable ingress</code>
when I execute <code>kubectl get services -n ingress-nginx</code></p>
<pre><code>it shows 
NAME                                 TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                      AGE
ingress-nginx-controller             NodePort    10.100.216.141   &lt;none&gt;        80:32205/TCP,443:31915/TCP   5d2h
ingress-nginx-controller-admission   ClusterIP   10.106.58.189    &lt;none&gt;        443/TCP                      5d2h
</code></pre>
<p>however based on course that I am following ingress-nginx-controller type should be load balancer.</p>
<p>My ingress config:</p>
<pre><code>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
</code></pre>

<p>I have tested this with 2 latest releases and what can I see at the moment there is no service associated with ingress-nginx controller (deployed as minikube addon).</p>
<p>Please take a look at ports within ingress-nginx deployment.</p>
<p>Enabling ingress addon created deployment in kube-system namespace with this spec:</p>
<pre><code>...
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
...
</code></pre>
<hr />
<p>It looks that in current minikube release ingress-nginx is using <strong>--hostPorts</strong> instead of nginx ingress nodeport service.
The most important information is if your current cni networking plugin support <a href="https://github.com/containernetworking/plugins/tree/master/plugins/meta/portmap" rel="nofollow noreferrer">Port-mapping</a></p>
<p>From the official docs the <a href="https://kubernetes.io/docs/concepts/extend-kubernetes/compute-storage-net/network-plugins/#support-hostport" rel="nofollow noreferrer">CNI networking plugin supports hostPort</a></p>
<blockquote>
<p>The CNI networking plugin supports hostPort.</p>
</blockquote>
<p>You can examine this settings inside minikube node:</p>
<pre><code>minikube -p your_name ssh
cat /etc/cni/net.d/your_config

&quot;type&quot;: &quot;portmap&quot;,
        &quot;capabilities&quot;: {&quot;portMappings&quot;: true},

    
</code></pre>
<p>Limitations are the same as for  <code>hostNetwork: true</code> configuration:</p>
<blockquote>
<p>One major limitation of this deployment approach is that only a single NGINX Ingress controller Pod may be scheduled on each cluster node, because binding the same port multiple times on the same network interface is technically impossible</p>
</blockquote>
<hr />
<p>-- <strong>report-node-internal-ip-address</strong></p>
<blockquote>
<p>because bare-metal nodes usually don't have an ExternalIP, one has to enable the --report-node-internal-ip-address flag, which sets the status of all Ingress objects to the internal IP address of all nodes running the NGINX Ingress controller.</p>
</blockquote>
<ul>
<li>Publishing Services: <a href="https://kubernetes.io/docs/concepts/services-networking/service/#publishing-services-service-types" rel="nofollow noreferrer">ServiceTypes</a></li>
</ul>
<blockquote>
<p><strong>Kubernetes ServiceTypes</strong> allow you to specify what kind of Service you want. The <strong>default is ClusterIP</strong>.</p>
<p>Type values and their behaviors are:</p>
<ul>
<li><p><strong>ClusterIP</strong>: Exposes the Service on a cluster-internal IP. Choosing this value makes the Service only reachable from within the cluster. This is the default ServiceType.</p>
</li>
<li><p><strong>NodePort</strong>: Exposes the Service on each Node's IP at a static port (the NodePort). A ClusterIP Service, to which the NodePort Service routes, is automatically created. You'll be able to contact the NodePort Service, from outside the cluster, by requesting :.</p>
</li>
<li><p><strong>LoadBalancer</strong>: Exposes the Service externally using a cloud provider's load balancer. NodePort and ClusterIP Services, to which the external load balancer routes, are automatically created.</p>
</li>
</ul>
</blockquote>
<p>Special note for service type <a href="https://kubernetes.io/docs/tasks/access-application-cluster/create-external-load-balancer/#external-load-balancer-providers" rel="nofollow noreferrer">Loadbalancer</a></p>
<blockquote>
<p>When the <strong>Service type</strong> is <strong>set to LoadBalancer</strong>, Kubernetes provides functionality equivalent to type equals ClusterIP to pods within the cluster and extends it by programming the (external to Kubernetes) load balancer with entries for the Kubernetes pods. The Kubernetes service controller automates the creation of the external load balancer, health checks (if needed), firewall rules (if needed) and retrieves the external IP allocated by the cloud provider and populates it in the service object</p>
</blockquote>
<p>As workaround in your bare metal environment, you can use <a href="https://kubernetes.github.io/ingress-nginx/deploy/baremetal/#a-pure-software-solution-metallb" rel="nofollow noreferrer"><strong>MetalLB</strong></a></p>
<blockquote>
<p><strong>MetalLB</strong> provides a network load-balancer implementation for Kubernetes clusters that do not run on a supported cloud provider, effectively allowing the usage of LoadBalancer Services within any cluster.</p>
</blockquote>
