In Kubernetes, a service is a set of pods that provides and IP and/or DNS name for the pods to be accessed. This is the entry point for you app. Say you launch a pod or pods with a python api and a Postgres database, you will need a service to connect that to the outside world.
If you are here for the quick answer, here it is. Otherwise, continue to Getting Started.
Save the following to a file service.yaml
apiVersion: v1
kind: Service
metadata:
   name: MyService
spec:
   type: LoadBalancer
   ports:
   - port: 8080 # the port for users to access
   targetPort: 3000 # the port our app runs on internallyThen use the following command.
kubectl apply -f service.yamlIf running locally:
kubectl port-forward MyService 8080:8080We will be working with minikube for most tutorials. This creates a local kubernetes cluster that you can develop on.
Feel free to use another kubernetes cluster for these tutorials as well. There will be articles underneath our kubernetes tags on how to run clusters on multiple providers such as AWS, Google Cloud, and Azure.
Once you have minikube installed, start the cluster using the following command.
minikube startBefore we create a service, we first need an app. Let's start by launching the following deployment which will be a nginx container that serves http requests on port 80.
Create a file called deployment.yml and add the following.
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-app
spec:
  selector:
    matchLabels:
      app: nginx-app
  template:
    metadata:
      labels:
        app: nginx-app
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        ports:
          - containerPort: 80Now, we can create the pod using the following.
kubectl apply -f deployment.ymlCheck the status of our deployment using the get deployment command.
kubectl get deploymentNAME    READY   STATUS    RESTARTS   AGE
nginx   1/1     Running   0          74sAt the moment, we are unable to access our pod, so we will need a service. The service below will allow us to expose the port 80 by using the selector that matches our deployment.
selector:
   app: nginx-appCreate a file called services.yml and add the following:
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
  labels:
    app: nginx-app
spec:
  ports:
  - port: 80
  selector:
    app: nginx-appNow, create the service using the following:
kubectl apply -f services.yml We can get the status of our service with the get service command.
$ kubectl get service
NAME            TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)    AGE
kubernetes      ClusterIP   10.96.0.1      <none>        443/TCP    212d
nginx-service   ClusterIP   10.109.88.45   <none>        80/TCP   16sNow, our service can be access internally via other services, but not externally. If we were deploying this on a managed cluster like AWS, we can add type: LoadBalancer to our service and AWS will create a LB and assign an IP for us. Note this will not work on our local machine.
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
  labels:
    app: nginx-app
spec:
   type: LoadBalancer
  ports:
  - port: 80
  selector:
    app: nginx-appkubectl apply -f services.yml However, since we are running locally, we need to use the port-forward command.
kubectl port-forward svc/nginx-service 4000:80You will then see the following:
Forwarding from 127.0.0.1:4000 -> 80
Forwarding from [::1]:4000 -> 80Open up http://localhost:4000/ and you will see the nginx landing page.
Let's end by cleaning up our resource. Run the following commands to delete our deployment and service.
kubectl delete deployment nginx-app
kubectl delete service nginx-service