apiVersion:v1kind:Servicemetadata:name:my-clusterip-servicelabels:app:my-appspec:type:ClusterIP# Default service type (can be omitted)selector:app:my-appports:-name:httpprotocol:TCPport:80# Service porttargetPort:8080# Container port
nodeport-service.yaml — External access via NodePort¶
apiVersion:v1kind:Servicemetadata:name:web-nodeportlabels:app:webspec:type:NodePortselector:app:webports:-name:httpprotocol:TCPport:80targetPort:80nodePort:30080# Optional: specify port in 30000-32767 range
# ClusterIP Service - Internal cluster communication onlyapiVersion:v1kind:Servicemetadata:name:web-servicelabels:app:webspec:type:ClusterIPselector:app:webports:-name:httpprotocol:TCPport:80# Port exposed by the servicetargetPort:80# Port on the container---# Deployment for the service to route traffic toapiVersion:apps/v1kind:Deploymentmetadata:name:weblabels:app:webspec:replicas:3selector:matchLabels:app:webtemplate:metadata:labels:app:webspec:containers:-name:nginximage:nginx:1.25-alpineports:-containerPort:80
multi-port-service.yaml — Service exposing multiple ports¶
# Multi-port Service - Expose multiple ports from the same applicationapiVersion:v1kind:Servicemetadata:name:webapp-servicelabels:app:webappspec:type:ClusterIPselector:app:webappports:-name:httpprotocol:TCPport:80targetPort:8080-name:metricsprotocol:TCPport:9090targetPort:9090---# Deployment with multiple portsapiVersion:apps/v1kind:Deploymentmetadata:name:webapplabels:app:webappspec:replicas:2selector:matchLabels:app:webapptemplate:metadata:labels:app:webappspec:containers:-name:appimage:nginx:1.25-alpineports:-name:httpcontainerPort:8080-name:metricscontainerPort:9090command:["/bin/sh","-c"]args:-|# Start nginx on port 8080sed -i 's/listen.*80;/listen 8080;/g' /etc/nginx/conf.d/default.confnginx -g 'daemon off;'
# Docker Compose equivalent for Services# In Compose, services are automatically discoverable by their service name# This is similar to Kubernetes Services providing DNS-based discoveryservices:# Similar to ClusterIP Serviceweb:image:nginx:1.25-alpinedeploy:replicas:3# In Compose, this service is accessible via DNS name "web"# In K8s, ClusterIP Service makes it accessible via "web-service"networks:-app-network# Similar to NodePort Service - exposing ports to hostweb-external:image:nginx:1.25-alpineports:-"30080:80"# Similar to NodePort 30080deploy:replicas:2networks:-app-network# Multi-port service examplewebapp:image:nginx:1.25-alpinecommand:>sh -c "sed -i 's/listen.*80;/listen 8080;/g' /etc/nginx/conf.d/default.conf && nginx -g 'daemon off;'"deploy:replicas:2# Both ports accessible via service name "webapp"# No need to explicitly map internal portsnetworks:-app-network# Client accessing the servicesclient:image:busybox:1.36command:sh -c "while true; do sleep 3600; done"networks:-app-network# Can access via:# - wget -O- http://web# - wget -O- http://webapp:80# - wget -O- http://webapp:9090networks:app-network:# Key Differences:# 1. Compose: Service name = DNS name (automatic)# K8s: Service resource name = DNS name (explicit)# # 2. Compose: No distinction between internal/external by default# K8s: ClusterIP (internal) vs NodePort/LoadBalancer (external)# # 3. Compose: ports: ["host:container"] for external exposure# K8s: NodePort or LoadBalancer Service types# # 4. Compose: All containers in same network can communicate freely# K8s: Need Service resource for stable DNS and load balancing