Kubernetes Cheatsheet

Services Reference

Use this Kubernetes reference while you build software engineering projects, review code, or refresh the syntax you reach for most.

Service Types

TypeAccessibilityUse case
ClusterIPInside cluster onlyDefault; Pod-to-Pod communication
NodePortNodeIP:port from outsideDev/testing; exposes on 30000-32767
LoadBalancerExternal via cloud LBProduction ingress (costs money)
ExternalNameDNS alias to external FQDNRoute to external service by name
HeadlessDirect Pod DNS (no VIP)StatefulSets, service-discovery sidecars

ClusterIP Service (default)

apiVersion: v1
kind: Service
metadata:
  name: api
spec:
  selector:
    app: api          # matches Pod labels
  ports:
  - name: http
    port: 80          # port the Service listens on
    targetPort: 8080  # port on the Pod (or named port)
    protocol: TCP
  type: ClusterIP

DNS: api.default.svc.cluster.local (short form: api within same namespace).

NodePort Service

apiVersion: v1
kind: Service
metadata:
  name: api-nodeport
spec:
  selector:
    app: api
  ports:
  - port: 80
    targetPort: 8080
    nodePort: 31000     # omit to auto-assign (30000-32767)
  type: NodePort

Access via <NodeIP>:31000.

LoadBalancer Service

apiVersion: v1
kind: Service
metadata:
  name: api-lb
  annotations:
    service.beta.kubernetes.io/aws-load-balancer-type: "nlb"   # AWS NLB
spec:
  selector:
    app: api
  ports:
  - port: 443
    targetPort: 8080
  type: LoadBalancer
kubectl get svc api-lb    # EXTERNAL-IP column shows the LB address once provisioned

Headless Service

No ClusterIP; DNS returns individual Pod IPs. Required by StatefulSets.

apiVersion: v1
kind: Service
metadata:
  name: postgres
spec:
  clusterIP: None         # headless
  selector:
    app: postgres
  ports:
  - port: 5432

DNS for StatefulSet pod: postgres-0.postgres.default.svc.cluster.local

ExternalName Service

apiVersion: v1
kind: Service
metadata:
  name: external-db
spec:
  type: ExternalName
  externalName: my-rds.us-east-1.rds.amazonaws.com

Pods resolve external-db → CNAME → the external hostname.

Multi-Port Service

spec:
  ports:
  - name: http
    port: 80
    targetPort: 8080
  - name: metrics
    port: 9090
    targetPort: 9090

Port names are required when more than one port is defined.

Session Affinity

spec:
  sessionAffinity: ClientIP
  sessionAffinityConfig:
    clientIP:
      timeoutSeconds: 3600

kubectl Service Commands

CommandWhat it does
kubectl get svcList services
kubectl get svc -o wideShow selector and endpoints
kubectl describe svc apiEndpoints, selectors, events
kubectl get endpoints apiList the backing Pod IPs
kubectl port-forward svc/api 8080:80Forward local 8080 → service 80
kubectl expose deployment api --port=80 --target-port=8080Quick ClusterIP
kubectl expose deployment api --type=LoadBalancer --port=80Quick LB
kubectl delete svc apiDelete service

Service DNS Naming

<service>.<namespace>.svc.<cluster-domain>
ReferenceResolves from
apiSame namespace only
api.productionAny namespace
api.production.svc.cluster.localAlways (FQDN)

Endpoint Slices

Modern replacement for Endpoints; auto-managed by the controller:

kubectl get endpointslices -l kubernetes.io/service-name=api