Kubernetes Create a ClusterIP Service
- Creating a ClusterIP Service
- Open two shell windows so we can watch this
kubectl get pods -w
- In second window, lets start a simple http server using sample code
kubectl create deployment httpenv --image=bretfisher/httpenv
- Scale it to 5 replicas
kubectl scale deployment/httpenv --replicas=5
- Let's create a ClusterIP service (default)
kubectl expose deployment/httpenv --port 8888
- Open two shell windows so we can watch this
- Inspecting ClusterIP Service
- Look up what IP was allocated
kubectl get service
- Remember this IP is Cluster internal only, how do we curl it?
- If you're on Docker Desktop (Host OS is not container OS)
kubectl run --generator=run-pod/v1 tmp-shell --rm -it --image bretfisher/netshoot -- bash
curl httpenv:8888
- If you're on Linux host
curl [ip of service]:8888
- Look up what IP was allocated
- Creating a NodePort Service
- Let's expose a NodePort so we can access it via the host IP (including localhost on Windows/Linux/macOS)
kubectl expose deployment/httpenv --port 8888 --name httpenv-np --type NodePort
- default type 是 ClusterIP 這邊指定為NodePort
- Did you know that a NodePort service also creates a ClusterIP?
- These three service types are additive, each one creates the ones above it:
- ClusterIP
- NodePort
- LoadBalancer
- Let's expose a NodePort so we can access it via the host IP (including localhost on Windows/Linux/macOS)
- Add a LoadBalancer Service
- If you're on Docker Desktop, it provides a built-in LoadBalancer that publishes the --port on localhost
kubectl expose deployment/httpenv --port 8888 --name htpenv-lb --type LoadBalancer
curl localhost:8888
- If you're on kubeadm, minikube, or microk8s
- No built-in LB
- You can still run the command, it'll just stay at "pending" (but its NodePort works)
- If you're on Docker Desktop, it provides a built-in LoadBalancer that publishes the --port on localhost
- Kubernetes Services DNS
- Starting with 1.11, internal DNS is provided by CoreDNS
- Like Swarm, this is DNS-Based Service Discovery
- So far we've been using hostnames to access Services
curl
- But that only works for Services in the same Namespace
kubectl get namespaces
- Services also have a FQDN
curl
. .svc.cluster.local
- END