<p>We have a 2 node K3S cluster with one master and one worker node and would like &quot;reasonable availability&quot; in that, if one or the other nodes goes down the cluster still works i.e. ingress reaches the services and pods which we have replicated across both nodes. We have an external load balancer (F5) which does active health checks on each node and only sends traffic to up nodes.</p>
<p><strong>Unfortunately, if the master goes down the worker will not serve any traffic (ingress).</strong></p>
<p>This is strange because all the service pods (which ingress feeds) on the worker node are running.</p>
<p>We suspect the reason is that key services such as the <code>traefik</code> ingress controller and <code>coredns</code> are only running on the master.</p>
<p>Indeed when we simulated a master failure, restoring it from a backup, none of the pods on the worker could do any DNS resolution. Only a reboot of the worker solved this.</p>
<p>We've tried to increase the number of replicas of the <code>traefik</code> and <code>coredns</code> deployment which helps a bit BUT:</p>
<ul>
<li>This gets lost on the next reboot</li>
<li>The worker still functions when the master is down but every 2nd ingress request fails
<ul>
<li>It seems the worker still blindly (round-robin) sends traffic to a non-existant master</li>
</ul>
</li>
</ul>
<p>We would appreciate some advice and explanation:</p>
<ul>
<li>Should not key services such as <code>traefik</code> and <code>coredns</code> be DaemonSets by default?</li>
<li>How can we change the service description (e.g. replica count) in a persistent way that does not get lost</li>
<li>How can we get intelligent traffic routing with ingress to only &quot;up&quot; nodes</li>
<li>Would it make sense to make this a 2-master cluster?</li>
</ul>
<p>UPDATE: Ingress Description:</p>
<pre><code>kubectl describe ingress -n msa
Name:             msa-ingress
Namespace:        msa
Address:          10.3.229.111,10.3.229.112
Default backend:  default-http-backend:80 (&lt;error: endpoints &quot;default-http-backend&quot; not found&gt;)
TLS:
  tls-secret terminates service.ourdomain.com,node1.ourdomain.com,node2.ourdomain.com
Rules:
  Host                           Path  Backends
  ----                           ----  --------
  service.ourdomain.com
                                /   gateway:8443 (10.42.0.100:8443,10.42.1.115:8443)
  node1.ourdomain.com
                                /   gateway:8443 (10.42.0.100:8443,10.42.1.115:8443)
  node2.ourdomain.com
                                /   gateway:8443 (10.42.0.100:8443,10.42.1.115:8443)
Annotations:                     kubernetes.io/ingress.class: traefik
                                traefik.ingress.kubernetes.io/router.middlewares: msa-middleware@kubernetescrd
Events:                          &lt;none&gt;
</code></pre>

<p>Your goals seems can be achievable with a few K8S internal features (not specific to Traffic):</p>
<ol>
<li><p>Assure you have 1 replica of <a href="https://kubernetes.io/docs/concepts/services-networking/ingress-controllers/" rel="nofollow noreferrer">Ingress Controller's Pod</a> on each Node =&gt; use <a href="https://kubernetes.io/docs/concepts/workloads/controllers/daemonset/" rel="nofollow noreferrer">Daemon Set</a> as a installation method</p>
</li>
<li><p>To fix the error from Ingress Description set the correct load Balancer IP of Ingress Controller's Service.</p>
</li>
<li><p>Use external Traffic Policy to &quot;Local&quot; - this assures that traffic is routed to local endpoints only (Controller Pads running on Node accepting traffic from Load Balancer)</p>
</li>
</ol>
<blockquote>
<p><code>externalTrafficPolicy</code> - denotes if this Service desires to route external traffic to node-local or cluster-wide endpoints. There are two available options: <code>Cluster</code> (default) and <code>Local</code>. <code>Cluster</code> obscures the client source IP and may cause a second hop to another node, but should have good overall load-spreading. <code>Local</code> preserves the client source IP and avoids a second hop for LoadBalancer and NodePort type Services, but risks potentially imbalanced traffic spreading.</p>
</blockquote>
<pre><code>apiVersion: v1
kind: Service
metadata:
  name: example-service
spec:
  selector:
    app: example
  ports:
    - port: 8765
      targetPort: 9376
  externalTrafficPolicy: Local
  type: LoadBalancer
</code></pre>
<ol start="5">
<li>Service name of Ingress Backend should use <a href="https://kubernetes.io/docs/tasks/access-application-cluster/create-external-load-balancer/" rel="nofollow noreferrer">external Traffic Policy</a> <code>externalTrafficPolicy: Local</code> too.</li>
</ol>
