Deploying a hello world application to GKE

This tutorial is for deploying a very simple application to Google Kubernetes Engine.

But before starting, you need:

  • gcloud command line tools installed and configured
  • kubectl command line installed

It is better if you already know the basics of Docker. I created a image rafaelhdr/server-hello for it. This image just responds Hello, World! for a GET /.

Create the cluster

gcloud container clusters create hello-cluster

This command will create a new kubernetes cluster. After some time it will print:

hello-cluster  us-central1-a  1.8.10-gke.0  n1-standard-1  1.8.10-gke.0  3          RUNNING

Deploying the application

We have our cluster but no application running. Check with the following kubectl commands:

$ kubectl get deployment
No resources found.

$ kubectl get pods
No resources found.

So let’s deploy our application. Create the deployment configuration file sh-service-lb.yaml:

If you want to deploy your own application, change the image and cointanerPort.

apiVersion: extensions/v1beta1
kind: Deployment
  name: sh-deployment
    app: sh-deployment
  replicas: 2
        app: sh-deployment
        - name: sh-deployment
          image: rafaelhdr/server-hello
            - containerPort: 5000

To deploy to our cluster, run:

$ kubectl apply -f sh-deployment.yaml 
deployment.extensions "sh-deployment" created

We deployed our application. You can check by running:

$ kubectl get deployment
sh-deployment   2         2         2            2           39s

$ kubectl get pods
NAME                             READY     STATUS    RESTARTS   AGE
sh-deployment-6db6b8856d-q9j95   1/1       Running   0          53s
sh-deployment-6db6b8856d-tgmmh   1/1       Running   0          53s

What did we just do? - We created two replicas of our application running in our cluster (replicas: 2). That is why we see 2 pods and only one deployment.

What is a Pod? It is the smallest deployable unit in Kubernetes. We could have two containers running together, so they could share the same volume.

The problem is that it is not exposed yet. Let’s create a Load Balancer.

Service Load Balancer

We will follow the same steps (create our configuration file and apply using kubectl). Create the file sh-service-lb.yaml.

apiVersion: v1
kind: Service
  name: sh-service
    app: sh-service
  type: LoadBalancer
  - port: 80
    targetPort: 5000
    app: sh-deployment

Now we run the same command for this new file:

$ kubectl apply -f sh-service-lb.yaml
service "sh-service" created

What did we just do? We created our Load Balancer redirecting requests from external access (port 80) to our container (port 5000).

Ok. Our service is created. But it needs some time to start. Wait for the EXTERNAL-IP to change from PENDING to a real one:

$ kubectl get services
NAME         TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP     <none>        443/TCP        25m
sh-service   LoadBalancer   <pending>     80:30138/TCP   1s

# Wait some time

$ kubectl get services
NAME         TYPE           CLUSTER-IP      EXTERNAL-IP     PORT(S)        AGE
kubernetes   ClusterIP     <none>          443/TCP        27m
sh-service   LoadBalancer   80:30138/TCP   1m

My external IP is Get your external IP and access using your browser (http://YOUR_EXTERNAL_IP/).

Accessing Web UI

Retrieve the token for Sign In running kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | awk '/^deployment-controller-token-/{print $1}') | awk '$1=="token:"{print $2}'.

And access the UI locally proxying it by running kubectl config view and opening For Sign In, use the token obtained before.

Delete all

Ok, we could make our tests. We can remove everything if we just delete the cluster.

$ gcloud container clusters delete hello-cluster
The following clusters will be deleted.
 - [hello-cluster] in [us-central1-a]

Do you want to continue (Y/n)?  Y



In this tutorial, you created a cluster, deployed a hello world application and it’s load balancer service, accessed the Web UI and deleted the cluster.

This is just the beginning for Kubernetes, but we could check the basics. I will try to make more posts about Kubernetes. Meanwhile, you could check Learn Kubernetes in Under 3 Hours: A Detailed Guide to Orchestrating Containers. It is more complete than this one, so you will learn deeper the concepts we tested here, but in a local cluster.