Day 13/40
Static Pods, Manual Scheduling, Labels, and Selectors in Kubernetes
Video Link
@piyushsachdeva
Git Repository
My Git Repo
In this part, node selector, label and selector, static pod and manual scheduling will be covered.
There's one component named scheduler decides which workload run on which node.
root@localhost:~# kubectl get po -n kube-system | grep scheduler
kube-scheduler-lucky-luke-control-plane 1/1 Running 1 (6d10h ago) 7d
In Kubernetes, a static pod is a concept wherein you can deploy a pod that is not managed by the API-server.
Static pods are directly managed by the Kubelet component. The Kubelet service is deployed with the configuration path where we can add the pod manifest for the Kubelet to deploy.source, read more
Note we provisioned our cluster with kind and it's actually kubernetes in docker which means every node is a container so we get help with docker exec command.
root@localhost:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c0266722d131 kindest/node:v1.30.0 "/usr/local/bin/entr…" 7 days ago Up 6 days lucky-luke-worker
f791fa85c269 kindest/node:v1.30.0 "/usr/local/bin/entr…" 7 days ago Up 6 days 0.0.0.0:30001->30001/tcp, 127.0.0.1:39283->6443/tcp lucky-luke-control-plane
9c2d43b4f977 kindest/node:v1.30.0 "/usr/local/bin/entr…" 7 days ago Up 6 days lucky-luke-worker2
c9d85c72c573 weejewel/wg-easy "docker-entrypoint.s…" 5 months ago Up 6 days 0.0.0.0:51820->51820/udp, :::51820->51820/udp, 0.0.0.0:51821->51821/tcp, :::51821->51821/tcp wg-easy
1. Static pods and manual scheduling:
- Run bash on control-plane node
root@localhost:~# docker exec -it lucky-luke-control-plane bash
root@lucky-luke-control-plane:/# pwd
/
root@lucky-luke-control-plane:/# ps ef | grep kubelet
94749 pts/1 S+ 0:00 \_ grep kubelet HOSTNAME=lucky-luke-control-plane PWD=/ container=docker HOME=/root TERM=xterm NO_PROXY= SHLVL=1 HTTPS_PROXY= HTTP_PROXY= KUBECONFIG=/etc/kubernetes/admin.conf PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin _=/usr/bin/grep
- Directory of manifests
kubeletis monitoring this directory and as soon as you remove something in the directory, thecontainerwill be removed fromcluster
root@lucky-luke-control-plane:/# cd /etc/kubernetes/manifests/
root@lucky-luke-control-plane:/etc/kubernetes/manifests# ls -lh
total 16K
-rw------- 1 root root 2.4K Jul 1 16:16 etcd.yaml
-rw------- 1 root root 3.9K Jul 1 16:16 kube-apiserver.yaml
-rw------- 1 root root 3.4K Jul 1 16:16 kube-controller-manager.yaml
-rw------- 1 root root 1.5K Jul 1 16:16 kube-scheduler.yaml
- Manual scheduling
The
schedulerlooks fornodeNameif it's not specified in the manifest of aworkloadoryamlfile to schedule and provision on anode. And if it's specified, it's not its responsible to scheduling it.
root@lucky-luke-control-plane:~# kubectl run nginx --image=nginx -o yaml > nginx-pod.yaml
Define nodeName
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: "2024-07-08T16:55:26Z"
labels:
run: nginx
name: nginx
namespace: default
resourceVersion: "915219"
uid: 17ebe9ec-78db-4886-95ba-3882dd141e5f
spec:
containers:
- image: nginx
imagePullPolicy: Always
name: nginx
nodeName: lucky-luke-worker
First, we need to delete the pod which is created
root@localhost:~# kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx 1/1 Running 0 9m45s
nginx-ds-946m4 1/1 Running 0 4d
nginx-ds-rslrm 1/1 Running 0 4d
root@localhost:~# kubectl delete pods/nginx
pod "nginx" deleted
Then runing the pod:
root@lucky-luke-control-plane:~# kubectl apply -f nginx-pod.yaml
pod/nginx created
root@lucky-luke-control-plane:~# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx 1/1 Running 0 70s 10.244.1.13 lucky-luke-worker <none> <none>
nginx-ds-946m4 1/1 Running 0 4d 10.244.2.10 lucky-luke-worker2 <none> <none>
nginx-ds-rslrm 1/1 Running 0 4d1h 10.244.1.12 lucky-luke-worker <none> <none>
2. Labels and Selectors
The labels are metadata which help to filtering the resources. We also have labels in spec for pods and selector section that is matching the labels of pods with deployments.
root@lucky-luke-control-plane:~# kubectl get pods --show-labels
NAME READY STATUS RESTARTS AGE LABELS
nginx 1/1 Running 0 11m run=nginx
nginx-ds-946m4 1/1 Running 0 4d1h controller-revision-hash=76c9ffb96,env=demo,pod-template-generation=1
nginx-ds-rslrm 1/1 Running 0 4d1h controller-revision-hash=76c9ffb96,env=demo,pod-template-generation=1
root@lucky-luke-control-plane:~# kubectl get pods --selector run=nginx
NAME READY STATUS RESTARTS AGE
nginx 1/1 Running 0 11m
Also, we can see an additional metadata annotations in a workload, which is similar to labels and storing additional details and information related to that object.
root@localhost:~# kubectl edit pod nginx
# Please edit the object below. Lines beginning with a '#' will be ignored,
# and an empty file will abort the edit. If an error occurs while saving this file will be
# reopened with the relevant failures.
#
apiVersion: v1
kind: Pod
metadata:
annotations:
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"v1","kind":"Pod","metadata":{"annotations":{},"creationTimestamp":"2024-07-08T16:55:26Z","labels":{"run":"nginx"},"name":"nginx","namespace":"default","resourceVersion":"915219","uid":"17ebe9ec-78db-4886-95ba-3882dd141e5f"},"spec":{"containers":[{"image":"nginx","imagePullPolicy":"Always","name":"nginx"}],"nodeName":"lucky-luke-worker"}}
creationTimestamp: "2024-07-08T17:09:50Z"
labels:
run: nginx
...
Top comments (0)