1
0
Fork 0
trainings/kubernetes/training/lessons/1-k8s101.md

7.3 KiB
Raw Blame History

Kubernetes 101

Install k3s

For this lesson, we will use k3s as kubernetes flavor. k3s is really easy to install:

curl -sfL https://get.k3s.io | sh -

Check

Check the nodes:

kubectl get nodes
NAME         STATUS   ROLES                  AGE    VERSION
isen-x       Ready    control-plane,master   100s   v1.22.5+k3s1

k3s will use your server as control-plane but also as worker (master)

First deployment

Create your first deployment

kubectl create deployment first-dep --image=gcr.io/google-samples/kubernetes-bootcamp:v1

View the deployment

kubectl get deployments
NAME         READY   UP-TO-DATE   AVAILABLE   AGE
first-dep    1/1     1            1           1m

View the pods:

kubectl get pods

NAME                         READY   STATUS    RESTARTS   AGE
first-dep-69c7f7c9f4-jzbh8   1/1     Running   0          14s

View the events:

kubectl get events

Create a Service

By default, the Pod is only accessible by its internal IP address within the Kubernetes cluster. To make the first-dep container accessible from outside the Kubernetes virtual network, you have to expose the Pod as a Kubernetes Service.

Expose the Pod to the public internet using the kubectl expose command:

kubectl expose deployment first-dep --type=LoadBalancer --port=8080

The --type=LoadBalancer flag indicates that you want to expose your Service outside of the cluster.

View the Service you created:

kubectl get services

The output is similar to:

NAME         TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
first-dep    LoadBalancer   10.108.144.78   141.95.107.55     8080:30369/TCP   21s
kubernetes   ClusterIP      10.96.0.1       <none>        443/TCP          23m

Check that the service works as expected.

Q: using curl, which command can you run to perform a HTTP request to your first-dep deployment?

List pods again

kubectl get pods

Q: how many pods do you have? Why?

Logs

You can check the logs of your pods.

First list your pods:

kubectl get pods

Then logs:

kubectl logs first-dep-69c7f7c9f4-jzbh8

Kubernetes Bootcamp App Started At: 2022-01-08T21:09:13.992Z | Running On:  first-dep-69c7f7c9f4-jzbh8 

Running On: first-dep-69c7f7c9f4-jzbh8 | Total Requests: 1 | App Uptime: 38.775 seconds | Log Time: 2022-01-08T21:09:52.767Z
Running On: first-dep-69c7f7c9f4-jzbh8 | Total Requests: 2 | App Uptime: 41.24 seconds | Log Time: 2022-01-08T21:09:55.232Z
Running On: first-dep-69c7f7c9f4-jzbh8 | Total Requests: 3 | App Uptime: 41.879 seconds | Log Time: 2022-01-08T21:09:55.871Z

Edit your deployment

kubectl describe deployment first-dep
# You will see yaml output
# This will show you what your deployment look like in your k8s environment

You can also describe your service:

kubectl describe services/first-dep

Now edit your deployment

kubectl edit deployment first-dep
# This will open vim with the yaml of your deployment

Change the replicas (in spec section) to 2

Check again the pods

kubectl get pods -o wide

Q: how can you do a curl request to a specific pod?

Q: how many pods do you have?

Test your application multiple time:

curl http://141.95.107.55:8080/  # change 141.95.107.55 with your ip
...
curl http://141.95.107.55:8080/  # change 141.95.107.55 with your ip
...
curl http://141.95.107.55:8080/  # change 141.95.107.55 with your ip

Q: is the output always the same? Explain why.

You can also change the replicas using the scale command:

kubectl scale deployment/first-dep --replicas=3

Execution from pods

We can execute commands directly on the container once the Pod is up and running. For this, we use the exec command and use the name of the Pod as a parameter. Lets list the environment variables:

kubectl exec first-dep-69c7f7c9f4-jzbh8 -- env

Next lets start a bash session in the Pods container:

kubectl exec -it first-dep-69c7f7c9f4-jzbh8 -- bash

We have now an open console on the container where we run our NodeJS application. The source code of the app is in the server.js file:

cat server.js

You can check that the application is up by running a curl command:

curl localhost:8080

Note: here we used localhost because we executed the command inside the NodeJS Pod. If you cannot connect to localhost:8080, check to make sure you have run the kubectl exec command and are launching the command from within the Pod

To close your container connection type exit.

Updating the app

To update the image of the application to version 2, use the set image command, followed by the deployment name and the new image version:

kubectl set image deployments/first-dep kubernetes-bootcamp=jocatalin/kubernetes-bootcamp:v2

The command notified the Deployment to use a different image for your app and initiated a rolling update. Check the status of the new Pods, and view the old one terminating with the get pods command:

kubectl get pods

Verify the update using curl

curl http://141.95.107.55:8080/  # change 141.95.107.55 with your ip

Q: do you see the v=2?

You can also check if everything went fine using:

kubectl rollout status deployments/first-dep

To view the current image version of the app, run the describe pods command:

kubectl describe pods

In the Image field of the output, verify that you are running the latest image version (v2).

Rollbacking the app

Lets perform another update, and deploy an image tagged with v10 :

kubectl set image deployments/first-dep kubernetes-bootcamp=gcr.io/google-samples/kubernetes-bootcamp:v10

Use get deployments to see the status of the deployment:

kubectl get deployments

Notice that the output doesn't list the desired number of available Pods. Run the get pods command to list all Pods:

kubectl get pods

Notice that some of the Pods have a status of ImagePullBackOff.

To get more insight into the problem, run the describe pods command:

kubectl describe pods

In the Events section of the output for the affected Pods, notice that the v10 image version did not exist in the repository.

Note: you can also use kubectl get events to retrieve the error.

To roll back the deployment to your last working version, use the rollout undo command:

kubectl rollout undo deployments/first-dep

The rollout undo command reverts the deployment to the previous known state (v2 of the image). Updates are versioned and you can revert to any previously known state of a deployment.

Use the get pods commands to list the Pods again:

kubectl get pods

Three Pods are running. To check the image deployed on these Pods, use the describe pods command:

kubectl describe pods

The deployment is once again using a stable version of the app (v2). The rollback was successful.

Clean up

Now you can clean up the resources you created in your cluster:

kubectl delete service first-dep
kubectl delete deployment first-dep

demo-flask app

Now, you are on your own, deploy the demo-flask app with 3 replicas on your kubernetes cluster.

The demo-flask app image is available at: arnaudmorin/demo-flask