3

I am a beginner in kubernetes. I have a cluster running with 4 nodes. All the nodes are currently running fine. They are not tainted, or drained. Every time I deploy a deployment it will only deploy it across 2 nodes instead of 4 nodes. I am trying to look for kube-scheduler logs, but because I am using Oracle Cloud OKE service (kubernetes service for Oracle cloud). They don't make kube-scheduler logs available to customers. What tests or what verifications do I need to do?

2 Answers 2

2

If you want to place a pod on each node you can use DaemonSet. DaemonSets are configured to distribute the application to each node. For detailed information;

https://kubernetes.io/docs/concepts/workloads/controllers/daemonset/

You can find out if DaemonSet is what you need by looking specifically at this title;

https://kubernetes.io/docs/concepts/workloads/controllers/daemonset/#deployments

1

The scheduler placing your pods on one or two nodes, until they're out of resources, could be a "normal" behavior depending on your cluster scheduler policy.

You could try to use an antiAffinity rule, or a topologySpreadConstraints, placing your pods on all 4 nodes.

The following sample, from Kubernetes docs, would use topology key 'kubernetes.io/hostname', which should spread your pods on different nodes:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-server
spec:
  selector:
    matchLabels:
      app: web-store
  replicas: 3
  template:
    metadata:
      labels:
        app: web-store
    spec:
      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
              - key: app
                operator: In
                values:
                - web-store
            topologyKey: kubernetes.io/hostname

The requiredDuringSchedulingIgnoredDuringExecution would prevent the Kubernetes scheduler from ever starting a replicas on a node that already has a Pod that belongs to your deployment.

We could do something similar with a topologySpreadConstraints:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-server
spec:
  selector:
    matchLabels:
      app: web-store
  replicas: 3
  template:
    metadata:
      labels:
        app: web-store
    spec:
      topologySpreadConstraints:
      - maxSkew: 1
        topologyKey: kubernetes.io/hostname
        whenUnsatisfiable: DoNotSchedule
        labelSelector:
          matchLabels:
            app: web-store
2
  • 1
    The OP didn't include a copy of their manifest, but one can likely safely assume that given they are talking about "deployments" that they are deploying a ReplicaSet (the default for deployment.apps) not a DaemonSet, which means that there would only be spec.replicas pods deployed, regardless of the node count. Only a DaemonSet would deploy as many replicas as there are nodes, subject to node affinity/topology constraints.
    – Kyanar
    Jul 24, 2022 at 8:02
  • 1
    There are no mentions to replicas in initial question. Question is: why is it spreading on two nodes. There is no mention of a requirement to run "1 replica per node" either. Very much sounds like OP wants to know why, adding replicas, they're not spreading.
    – SYN
    Jul 24, 2022 at 12:58

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.