ClusterIP vs. NodePort
Table of contents
ClusterIP
kubectl expose deployment nginx --name nginx-svc --port 8080 --target-port 80
NodePort
kubectl expose deployment nginx --name nginx-svc --port 8081 --target-port 80 --type NodePort
Different Ports
target-port
-- container portWhere your pod/container listens
k get endpoints
port
-- service's internal portaccess the svc from other port
k get svc
NodePort
-- expose to external/all nodesk get endpoints
ork get svc
controlplane $ k get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
apache-svc ClusterIP 10.104.249.75 <none> 8080/TCP 2m11s
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 2d8h
nginx-svc NodePort 10.97.210.100 <none> 8081:32433/TCP 3s
controlplane $ k get node -owide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
controlplane Ready control-plane 2d8h v1.31.0 172.30.1.2 <none> Ubuntu 20.04.5 LTS 5.4.0-131-generic containerd://1.7.13
ClusterIP vs. NodeIP
For accessing from nodes:
curl
localhost
:NodePort
orcurl NODE_IP:NodePort
(NodePort)curl SVC_IP:SVC_Port
(ClusterIP)
# SVC_IP:SVC_Port
controlplane $ curl 10.97.210.100:8081
# Node_IP:Node_Port
controlplane $ curl 172.30.1.2:32433
# localhost:NodePort
controlplane $ curl localhost:32433
For accessing from inside another pod:
curl SVC_NAME:SVC_Port
orcurl SVC_IP:SVC_Port
# SVC_NAME:SVC_Port
~ # curl nginx-svc:8081
~ # curl apache-svc:8080
# SVC_IP:SVC_Port
~ # curl 10.104.249.75:8080
~ # curl 10.97.210.100:8081
Endpoints
The Endpoints object (192.168.0.7:80) shows the actual pod IP and port where the traffic will eventually go. It's the backend configuration that tells Kubernetes where to forward the traffic from the service. Therefore, endpoints IP -> Pod IP
controlplane $ k get endpoints
NAME ENDPOINTS AGE
apache-svc 192.168.0.6:80 2m20s
kubernetes 172.30.1.2:6443 2d8h
nginx-svc 192.168.0.7:80 12s