In this blog, we will explore how to expose applications using Kubernetes Services and manage Deployments for scaling and accessibility. We'll create Services of type NodePort
and LoadBalancer
, test the application’s accessibility, and discuss Service types and their use cases.
Task 1: Create a Service of Type NodePort
Objective:
Create a NodePort
Service named myapp-service
to expose your application on port 80, accessible externally via a Node's IP and NodePort.
Solution
Step 1: Define the Service YAML
apiVersion: v1
kind: Service
metadata:
name: myapp-service
spec:
type: NodePort
selector:
app: myapp
ports:
- port: 80
targetPort: 80
nodePort: 30080
Step 2: Apply the YAML
kubectl apply -f nodeport-service.yml
Step 3: Verify the Service
kubectl get svc myapp-service
Expected output:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
myapp-service NodePort 10.96.100.123 <none> 80:30080/TCP 5s
Step 4: Access the Service
Use a Node's IP and the NodePort to test access:
wget http://<Node-IP>:30080
Task 2: Create a Deployment
Objective:
Deploy an application using the nginx:1.23.4-alpine
image, expose port 80, and ensure 1 replica is running.
Solution
Step 1: Define the Deployment YAML
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
spec:
replicas: 1
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: nginx
image: nginx:1.23.4-alpine
ports:
- containerPort: 80
Step 2: Apply the YAML
kubectl apply -f deployment.yml
Step 3: Verify the Deployment
kubectl get deploy myapp
kubectl get pods
Task 3: Scale the Deployment
Objective:
Scale the Deployment to run 2 replicas.
Solution
Step 1: Scale the Deployment
kubectl scale deploy myapp --replicas=2
Step 2: Verify the Scale
kubectl get deploy myapp
kubectl get pods
Task 4: Test the Service Internally (Not necessary but anyway..)
Objective:
Create a temporary Pod using the busybox
image and test the internal accessibility of the Service.
Solution
Step 1: Run a Temporary Pod
kubectl run busybox --rm -it --image=busybox -- /bin/sh
Step 2: Test the Service
Inside the busybox shell:
wget -O- http://myapp-service
exit
Task 5: Test the Service Externally
Objective:
Verify that the Service is accessible outside the cluster.
Solution
From a host outside the cluster, use a Node's IP and the NodePort to test access:
wget http://<Node-IP>:30080
Task 6: Expose the Service via LoadBalancer
Objective:
Modify the Service to use the LoadBalancer
type, making it accessible with an external IP.
Solution
Step 1: Update the Service Type
kubectl edit svc myapp-service
Change the type
field to LoadBalancer
:
type: LoadBalancer
Step 2: Verify the External IP
kubectl get svc myapp-service
Check the EXTERNAL-IP
field for the assigned IP address.
Step 3: Test the Service
wget http://<EXTERNAL-IP>
Task 7: Can Pods Be Exposed Without a Deployment?
Discussion:
Yes, Pods can be exposed without a Deployment by creating a Service with a label selector matching the Pods. However, this approach lacks features like:
- Automatic restart of failed Pods.
- Scaling capabilities.
- Rolling updates or rollbacks.
Best Practice: Use Deployments for most scenarios to leverage Kubernetes’ scaling and fault-tolerance features.
Task 8: When to Use Different Service Types
ClusterIP (Default)
- Purpose: Internal-only communication between services.
- Use Case: Backend services accessed by frontend Pods.
NodePort
- Purpose: Expose a Service on each Node's IP and a specific port.
- Use Case: Testing applications locally or in environments without a LoadBalancer.
LoadBalancer
- Purpose: Provide external access using a cloud provider’s load balancer.
- Use Case: Production environments hosted on cloud platforms.
ExternalName
- Purpose: Map a Service to an external DNS name.
- Use Case: Redirect traffic to legacy systems or external APIs.
Conclusion
In this guide, we explored:
- Creating and using
NodePort
andLoadBalancer
Services. - Managing Deployments for scaling and reliability.
- Testing Service accessibility internally and externally.
- Understanding Service types and their appropriate use cases.
These practices are essential for building and exposing scalable, accessible Kubernetes applications. Stay tuned for more Kubernetes insights! 🚀
Top comments (0)