site/content/en/docs/tutorials/multi_node.md
Default [host-path volume provisioner]({{< ref "/docs/handbook/persistent_volumes" >}}) doesn't support multi-node clusters (#12360). To be able to provision or claim volumes in multi-node clusters, you could use [CSI Hostpath Driver]({{< ref "/docs/tutorials/volume_snapshots_and_csi" >}}) addon.
minikube start --nodes 2 -p multinode-demo
š [multinode-demo] minikube v1.18.1 on Opensuse-Tumbleweed
⨠Automatically selected the docker driver
š Starting control plane node multinode-demo in cluster multinode-demo
š„ Creating docker container (CPUs=2, Memory=8000MB) ...
š³ Preparing Kubernetes v1.20.2 on Docker 20.10.3 ...
āŖ Generating certificates and keys ...
āŖ Booting up control plane ...
āŖ Configuring RBAC rules ...
š Configuring CNI (Container Networking Interface) ...
š Verifying Kubernetes components...
āŖ Using image gcr.io/k8s-minikube/storage-provisioner:v5
š Enabled addons: storage-provisioner, default-storageclass
š Starting node multinode-demo-m02 in cluster multinode-demo
š„ Creating docker container (CPUs=2, Memory=8000MB) ...
š Found network options:
āŖ NO_PROXY=192.168.49.2
š³ Preparing Kubernetes v1.20.2 on Docker 20.10.3 ...
āŖ env NO_PROXY=192.168.49.2
š Verifying Kubernetes components...
š Done! kubectl is now configured to use "multinode-demo" cluster and "default" namespace by default
kubectl get nodes
NAME STATUS ROLES AGE VERSION
multinode-demo Ready control-plane,master 99s v1.20.2
multinode-demo-m02 Ready <none> 73s v1.20.2
minikube status -p multinode-demo
multinode-demo
type: Control Plane
host: Running
kubelet: Running
apiserver: Running
kubeconfig: Configured
multinode-demo-m02
type: Worker
host: Running
kubelet: Running
kubectl apply -f hello-deployment.yaml
deployment.apps/hello created
kubectl rollout status deployment/hello
deployment "hello" successfully rolled out
kubectl apply -f hello-svc.yaml
service/hello created
kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
hello-695c67cf9c-bzrzk 1/1 Running 0 22s 10.244.1.2 multinode-demo-m02 <none> <none>
hello-695c67cf9c-frcvw 1/1 Running 0 22s 10.244.0.3 multinode-demo <none> <none>
minikube service list -p multinode-demo
|-------------|------------|--------------|---------------------------|
| NAMESPACE | NAME | TARGET PORT | URL |
|-------------|------------|--------------|---------------------------|
| default | hello | 80 | http://192.168.49.2:31000 |
| default | kubernetes | No node port | |
| kube-system | kube-dns | No node port | |
|-------------|------------|--------------|---------------------------|
curl http://192.168.49.2:31000
Hello from hello-695c67cf9c-frcvw (10.244.0.3)
curl http://192.168.49.2:31000
Hello from hello-695c67cf9c-bzrzk (10.244.1.2)
curl http://192.168.49.2:31000
Hello from hello-695c67cf9c-bzrzk (10.244.1.2)
curl http://192.168.49.2:31000
Hello from hello-695c67cf9c-frcvw (10.244.0.3)
Multiple nodes!
Referenced YAML files {{% tabs %}} {{% tab hello-deployment.yaml %}}
apiVersion: apps/v1
kind: Deployment
metadata:
name: hello
spec:
replicas: 2
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 100%
selector:
matchLabels:
app: hello
template:
metadata:
labels:
app: hello
spec:
affinity:
# ā¬ā¬ā¬ This ensures pods will land on separate hosts
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions: [{ key: app, operator: In, values: [hello] }]
topologyKey: "kubernetes.io/hostname"
containers:
- name: hello-from
image: pbitty/hello-from:latest
ports:
- name: http
containerPort: 80
terminationGracePeriodSeconds: 1
{{% /tab %}} {{% tab hello-svc.yaml %}}
apiVersion: v1
kind: Service
metadata:
name: hello
spec:
type: NodePort
selector:
app: hello
ports:
- protocol: TCP
nodePort: 31000
port: 80
targetPort: http
{{% /tab %}} {{% /tabs %}}