CKAD — Labels and Selectors

2 minute read

What Are Labels?

Labels are key-value pairs attached to Kubernetes objects. They are the primary mechanism for organizing and selecting resources. Almost every Kubernetes feature — Services, Deployments, ReplicaSets, NetworkPolicies — uses labels to find the objects it manages.

Adding Labels

# Add labels when creating a Pod
kubectl run web --image=nginx --labels="app=web,env=prod,tier=frontend"

# Add labels to an existing resource
kubectl label pod web version=v1

# Overwrite an existing label
kubectl label pod web env=staging --overwrite

# Remove a label (note the minus sign)
kubectl label pod web version-

Viewing Labels

# Show labels for all Pods
kubectl get pods --show-labels

# Show specific label columns
kubectl get pods -L app,env

# Expected output:
# NAME   READY   STATUS    AGE   APP   ENV
# web    1/1     Running   30s   web   prod

Selecting Resources with Labels

Selectors use labels to filter objects. There are two types of selectors:

Equality-Based Selectors

kubectl get pods -l app=web
kubectl get pods -l env=prod
kubectl get pods -l app=web,env=prod    # AND logic
kubectl get pods -l 'app!=cache'         # Not equal

Set-Based Selectors

kubectl get pods -l 'env in (prod, staging)'
kubectl get pods -l 'app notin (cache, db)'
kubectl get pods -l 'tier,!version'              # Has tier, does NOT have version

Selector Comparison Table

Selector Type Syntax Example
Equality key=value app=web
Not equal key!=value env!=dev
In set key in (v1,v2) env in (prod,staging)
Not in set key notin (v1,v2) app notin (cache,db)
Exists key tier
Does not exist !key !version
Multiple (AND) k1=v1,k2=v2 app=web,env=prod

Labels in YAML

apiVersion: v1
kind: Pod
metadata:
  name: web
  labels:
    app: web
    env: prod
    tier: frontend
    version: v2
spec:
  containers:
  - name: nginx
    image: nginx:1.27

Label Selectors in Other Resources

Labels are used everywhere in Kubernetes. Here are the most common patterns:

Service Selecting Pods

apiVersion: v1
kind: Service
metadata:
  name: web-svc
spec:
  selector:
    app: web
    tier: frontend
  ports:
  - port: 80
    targetPort: 80

Deployment Managing Pods

apiVersion: apps/v1
kind: Deployment
metadata:
  name: web
spec:
  replicas: 3
  selector:
    matchLabels:
      app: web
  template:
    metadata:
      labels:
        app: web
        version: v2
    spec:
      containers:
      - name: nginx
        image: nginx:1.27

NetworkPolicy Targeting Pods

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-web
spec:
  podSelector:
    matchLabels:
      app: web
  ingress:
  - from:
    - podSelector:
        matchLabels:
          role: frontend

Label Best Practices

Practice Reason
Use consistent naming conventions Makes selecting resources predictable
Include app, env, tier, version Covers most filtering needs
Use Kubernetes recommended labels app.kubernetes.io/name, app.kubernetes.io/version, etc.
Keep label values short 63-character max, alphanumeric + -_.
Don’t encode data in labels Use annotations for large or complex metadata
metadata:
  labels:
    app.kubernetes.io/name: nginx
    app.kubernetes.io/instance: web-prod
    app.kubernetes.io/version: "1.27"
    app.kubernetes.io/component: frontend
    app.kubernetes.io/part-of: ecommerce
    app.kubernetes.io/managed-by: helm

Exam tip: Labels are used everywhere — Services select Pods by labels, Deployments manage Pods by label selectors, and NetworkPolicies target Pods by labels. Get fast at working with them.


Next: Learn about non-identifying metadata with Annotations →

Updated: