Kubernetes Cheatsheet

Services Reference

Use this Kubernetes reference while you build software engineering projects, review code for technical interview prep, or polish examples for a software engineer resume.

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