Exposing App through NodePort
Deploy app
kubectl run kubernetes-bootcamp --image=gcr.io/google-samples/kubernetes-bootcamp:v1 --port=8080
deployment.apps "kubernetes-bootcamp" created
kubectl get deployments
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
kubernetes-bootcamp 1 1 1 0 8s
kubectl get pods
NAME READY STATUS RESTARTS AGE
kubernetes-bootcamp-5c69669756-gtrcd 1/1 Running 0 28s
Expose app
kubectl expose deployment/kubernetes-bootcamp --type="NodePort" --port 8080
service "kubernetes-bootcamp" exposed
The option –type=NodePort specifies a type of the service. Now, we need to get the exposed port
kubectl describe services/kubernetes-bootcamp
...
NodePort: <unset> 30022/TCP
...
Test that the app is exposed outside of the cluster
curl icanhazip.com
159.89.165.6
curl 159.89.165.6:30022
Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-5c69669756-gtrcd | v=1
The Service is exposed
Scale app
kubectl scale deployments/kubernetes-bootcamp --replicas=4
deployment.extensions "kubernetes-bootcamp" scaled
kubectl get deployments
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
kubernetes-bootcamp 4 4 4 4 4m
kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE
kubernetes-bootcamp-5c69669756-4fgc2 1/1 Running 0 20s 10.42.3.6 k8s-01
kubernetes-bootcamp-5c69669756-gtrcd 1/1 Running 0 4m 10.42.0.2 k8s-04
kubernetes-bootcamp-5c69669756-kdvkb 1/1 Running 0 20s 10.42.1.2 k8s-03
kubernetes-bootcamp-5c69669756-qxmvw 1/1 Running 0 20s 10.42.4.2 k8s-02
There are 4 Pods now, with different IP addresses
curl 159.89.165.6:30022
Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-5c69669756-kdvkb | v=1
curl 159.89.165.6:30022
Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-5c69669756-4fgc2 | v=1
curl 159.89.165.6:30022
Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-5c69669756-qxmvw | v=1
curl 159.89.165.6:30022
Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-5c69669756-gtrcd | v=1
We hit a different Pod with every request. This demonstrates that the load-balancing is working
Custom NodePort Port
kubectl delete svc kubernetes-bootcamp
service "kubernetes-bootcamp" deleted
cat << EOF > custom_node_port.yaml
apiVersion: v1
kind: Service
metadata:
creationTimestamp: null
labels:
run: kubernetes-bootcamp
name: kubernetes-bootcamp
selfLink: /api/v1/namespaces/default/services/kubernetes-bootcamp
spec:
externalTrafficPolicy: Cluster
ports:
- port: 8080
protocol: TCP
targetPort: 8080
nodePort: 30080
selector:
run: kubernetes-bootcamp
sessionAffinity: None
type: NodePort
status:
loadBalancer: {}
EOF
kubectl create -f custom_node_port.yaml
service "kubernetes-bootcamp" created
kubectl describe services/kubernetes-bootcamp
...
NodePort: <unset> 30080/TCP
...
curl icanhazip.com
13.127.135.16
curl 13.127.135.16:30080
Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-5dbf48f7d4-f7v5v | v=1
curl 13.127.135.16:30080
Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-5dbf48f7d4-gj4sl | v=1
curl 13.127.135.16:30080
Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-5dbf48f7d4-mcdr7 | v=1
curl 13.127.135.16:30080
Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-5dbf48f7d4-mqltq | v=1