Table of Contents
In this article, I will take you through the steps to create a service to expose your apps on Kubernetes. If you are following through my articles, previously I have talked about How to Install and Configure Kubernetes on RedHat/CentOS 7. Let's create a service to expose your apps on Kubernetes cluster. Create a service to expose your apps.
Create a Service to Expose your Apps
What is a Service in Kubernetes ?
A Service enables network access to a set of Pods in Kubernetes. Services select Pods based on their labels. When a network request is made to the service, it selects all Pods in the cluster matching the service's selector, chooses one of them, and forwards the network request to it.
Let's create a Service
You will write a yaml file to create your first service. Here you can provide your replica count, image that you want to use, port no which will be used to run the service.
[root@kuber-master ~]# cat test.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: test
spec:
selector:
matchLabels:
run: test-load-balancer
replicas: 2
template:
metadata:
labels:
run: test-load-balancer
spec:
containers:
- name: test
image: gcr.io/google-samples/node-hello:1.0
ports:
- containerPort: 8080
protocol: TCP
Create a test application
Once yaml is done, you can create the test application by running kubectl apply
command.
[root@kuber-master ~]# kubectl apply -f test.yaml
deployment.apps/test created
Check the test application deployment
Once application is created, you can check the deployment and details of the application.
[root@kuber-master ~]# kubectl get deployment test NAME READY UP-TO-DATE AVAILABLE AGE test 2/2 2 2 32s [root@kuber-master ~]# kubectl describe deployment test Name: test Namespace: default CreationTimestamp: Sat, 16 Nov 2019 04:50:55 -0500 Labels: <none> Annotations: deployment.kubernetes.io/revision: 1 kubectl.kubernetes.io/last-applied-configuration: {"apiVersion":"apps/v1","kind":"Deployment","metadata":{"annotations":{},"name":"test","namespace":"default"},"spec":{"replicas":2,"select... Selector: run=test-load-balancer Replicas: 2 desired | 2 updated | 2 total | 2 available | 0 unavailable StrategyType: RollingUpdate MinReadySeconds: 0 RollingUpdateStrategy: 25% max unavailable, 25% max surge Pod Template: Labels: run=test-load-balancer Containers: test: Image: gcr.io/google-samples/node-hello:1.0 Port: 8080/TCP Host Port: 0/TCP Environment: <none> Mounts: <none> Volumes: <none> Conditions: Type Status Reason ---- ------ ------ Available True MinimumReplicasAvailable Progressing True NewReplicaSetAvailable OldReplicaSets: <none> NewReplicaSet: test-67579c7c87 (2/2 replicas created) Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal ScalingReplicaSet 45s deployment-controller Scaled up replica set test-67579c7c87 to 2
Check the Replicaset
You can also check the replicaset if it is created based on your yaml file configuration before you proceed to create a service to expose your apps on Kubernetes.
[root@kuber-master ~]# kubectl get replicaset NAME DESIRED CURRENT READY AGE test-67579c7c87 2 2 2 85s [root@kuber-master ~]# kubectl describe replicaset Name: test-67579c7c87 Namespace: default Selector: pod-template-hash=67579c7c87,run=test-load-balancer Labels: pod-template-hash=67579c7c87 run=test-load-balancer Annotations: deployment.kubernetes.io/desired-replicas: 2 deployment.kubernetes.io/max-replicas: 3 deployment.kubernetes.io/revision: 1 Controlled By: Deployment/test Replicas: 2 current / 2 desired Pods Status: 2 Running / 0 Waiting / 0 Succeeded / 0 Failed Pod Template: Labels: pod-template-hash=67579c7c87 run=test-load-balancer Containers: test: Image: gcr.io/google-samples/node-hello:1.0 Port: 8080/TCP Host Port: 0/TCP Environment: <none> Mounts: <none> Volumes: <none> Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal SuccessfulCreate 91s replicaset-controller Created pod: test-67579c7c87-b4pz6 Normal SuccessfulCreate 90s replicaset-controller Created pod: test-67579c7c87-4mxhb
Create a Service test-service to expose your deployment
Now you need to create a service to expose your apps deployment.
[root@kuber-master ~]# kubectl expose deployment test --type=NodePort --name=test-service
service/test-service exposed
Check the service
You can check the service through kubectl describe
command.
[root@kuber-master ~]# kubectl describe services test-service
Name: test-service
Namespace: default
Labels: <none>
Annotations: <none>
Selector: run=test-load-balancer
Type: NodePort
IP: 192.168.36.8
Port: <unset> 8080/TCP
TargetPort: 8080/TCP
NodePort: <unset> 30253/TCP
Endpoints: 192.168.0.104:8080,192.168.0.105:8080
Session Affinity: None
External Traffic Policy: Cluster
Events: <none>
Get the pods running our test application
Check the pods if it is running or not. You need the pod running to create a service to expose your apps.
[root@kuber-master ~]# kubectl get pods --selector="run=test-load-balancer" -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
test-67579c7c87-4mxhb 1/1 Running 0 4m52s 192.168.0.104 kuber-worker1 <none> <none>
test-67579c7c87-b4pz6 1/1 Running 0 4m52s 192.168.0.105 kuber-worker1 <none> <none>
Check the application deployment
Finally you can the check the application deployment using curl command.
[root@kuber-master ~]# curl 192.168.0.104:8080
Hello Kubernetes!
Also Read: How to Install and Configure Kubernetes
References: https://kubernetes.io/