<p>I have installed ingress controller via helm as a daemonset. I have configured the ingress as follows:</p>
<pre><code>apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: webapp-ingress
  namespace: rcc
  annotations:
    haproxy.org/check: 'true'
    haproxy.org/check-http: /serviceCheck
    haproxy.org/check-interval: 5s
    haproxy.org/cookie-persistence: SERVERID
    haproxy.org/forwarded-for: 'true'
    haproxy.org/load-balance: leastconn
    kubernetes.io/ingress.class: haproxy
spec:
  rules:
    - host: example.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: webapp-frontend
                port:
                  number: 8080
</code></pre>
<pre><code>kubectl get ingress -n rcc
Warning: extensions/v1beta1 Ingress is deprecated in v1.14+, unavailable in v1.22+; use networking.k8s.io/v1 Ingress
NAME            CLASS    HOSTS                    ADDRESS          PORTS   AGE
webapp-ingress   &lt;none&gt;   example.com   10.110.186.170   80      11h
</code></pre>
<p>The type chosen was loadbalancer.
I can ping from any node the ip address of the ingress on port 80 also can curl it just fine. I can also browse any of the ingress pods ip address from the node just fine. But when I browse the node ip o port 80 I get connection refused. Anything that I am missing here?</p>

<p>I installed last <code>haproxy ingress</code> which is <code>0.13.4</code> version using helm.</p>
<p>By default it's installed with <code>LoadBalancer</code> service type:</p>
<pre><code>$ kubectl get svc -n ingress-haproxy

NAME              TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)                      AGE
haproxy-ingress   LoadBalancer   10.102.166.149   &lt;pending&gt;     80:30312/TCP,443:32524/TCP   3m45s
</code></pre>
<p>Since I have the same <code>kubeadm</code> cluster, <code>EXTERNAL-IP</code> will be pending. And as you correctly mentioned in question, <code>CLUSTER-IP</code> is accessible on the nodes when cluster is set up using <code>kubeadm</code>.</p>
<hr />
<p>There are two options how to access your ingress:</p>
<ol>
<li>Using <code>NodePort</code>:</li>
</ol>
<p>From output above there's a <code>NodePort 30312</code> for internally exposed port <code>80</code>. Therefore from outside the cluster it should be accessed by <code>Node_IP:NodePort</code>:</p>
<pre><code>curl NODE_IP:30312 -IH &quot;Host: example.com&quot;
HTTP/1.1 200 OK
</code></pre>
<ol start="2">
<li>Set up <a href="https://metallb.universe.tf/installation/" rel="nofollow noreferrer"><code>metallb</code></a>:</li>
</ol>
<p>Follow <a href="https://metallb.universe.tf/installation/" rel="nofollow noreferrer">installation guide</a> and second step is to configure <code>metallb</code>. I use <a href="https://metallb.universe.tf/configuration/#layer-2-configuration" rel="nofollow noreferrer">layer 2</a>. Be careful to assign not used ip range!</p>
<p>After I installed and set up the <code>metallb</code>, my haproxy has <code>EXTERNAL-IP</code> now:</p>
<pre><code>$ kubectl get svc -n ingress-haproxy

NAME              TYPE           CLUSTER-IP       EXTERNAL-IP    PORT(S)                      AGE
haproxy-ingress   LoadBalancer   10.102.166.149   172.16.1.241   80:30312/TCP,443:32524/TCP   10m
</code></pre>
<p>And now I can access ingress by <code>EXTERNAL-IP</code> on port <code>80</code>:</p>
<pre><code>curl 172.16.1.241 -IH &quot;Host: example.com&quot;
HTTP/1.1 200 OK
</code></pre>
<hr />
<p>Useful to read:</p>
<ul>
<li><a href="https://kubernetes.io/docs/concepts/services-networking/service/#publishing-services-service-types" rel="nofollow noreferrer">Kubernetes service types</a></li>
</ul>
