# 11. Kubernetes
[toc]
### Keywords
:::success
- Software Application architectures
- Monolithic
- SOA (Service Oriented Architecture)
- Microservices
- Stateless vs Stateful applications
- k8s (Kubernetes)
- With great **flexibility** comes great **complexity**
- Kubernetes ~= Datacentres
- Storage (CSI)
- Networking (CNI)
- Flannel
- Weave
- Calico
- compute (Pods)
- Security (Authentication/RBAC)
- namespaces ~= applications
:::
**Software Evolution**
:::warning
Monolithic --> SOA --> Microservices
:::
### Topics
:::info
- Introduction
- Monolithic vs Microservices
- Kubernetes Architecture
- Installation and Configuration (via k3s)
- Kubernetes Objects
- Kubernetes Object Definitions (YAML)
:::
### Introduction
#### Monolithic vs Microservices

#### Benefits of Microservices
:::warning
- One component failing does not result in failing of app as a whole
- Easier testing and deployment
- API based communication
- Services can be Scaled individually
- Loosely coupled
- Different services can be developed using different languages
:::
#### Kubernetes Architecture

### Installation and Configuration
#### k3s installation
````yaml=
curl -sfL https://get.k3s.io | sh -
##### Check for Ready node, takes ~30 seconds
root@sl-controller:~# kubectl get nodes
NAME STATUS ROLES AGE VERSION
sl-controller Ready control-plane,master 18s v1.25.6+k3s1
root@sl-controller:~#
````
#### Creating command alias for shortcuts (Optional)
````yaml=
Configure the alias/shortcut command:
alias kc='k3s kubectl'
or
alias kc='sudo k3s kubectl'
check/test the alias:
kc get node
````
#### Add a worker node to cluster
````yaml=!
Make sure that Docker (or any other runtime) is installed and run the following command on the worker node:
Syntax:
curl -sfL https://get.k3s.io | K3S_URL=https://myserver:6443 K3S_TOKEN=mynodetoken sh -
Example:
curl -sfL https://get.k3s.io | K3S_URL=https://<worker-node-ip>:6443 K3S_TOKEN=K10089aed2050d7c7336f87961059c6fa56a5cc69e886cbc2c2e0c2ed4c5685a3ed::server:0b3ab3945d645d4c60b70bf29497ec64 sh -
````
:mag: `K3S_TOKEN` is stored at `/var/lib/rancher/k3s/server/node-token` on the Manager/controller node
### Working with Kubernetes Objects
#### Explore your Kubernetes cluster
````yaml=
kubectl version
kubectl cluster-info
kubectl get nodes (nodes/node/no)
kubectl get pods (pods/pod/po)
kubectl get namespaces (namespaces/namespace/ns)
kubectl get pods --all-namespaces
kubectl get pods -n kube-system
kubectl get pods [pod name]
kubectl get pods -o wide --all-namespaces #Show pods along with nodes
kubectl get pods -o wide --all-namespaces | grep <node> #Show pods on specified node
kubectl describe node <node> #Show all of the non-terminated pods running on that node
````
#### Pods
Pods are the smallest deployable units of computing that you can create and manage in Kubernetes.

:arrow_right: *Source: https://kubernetes.io/docs/*
#### Pods inside a worker node

:arrow_right: *Source: https://kubernetes.io/docs/*
#### K8s pod definition
Example 1:
````yaml=
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
````
Create the pod from above definition
````
kubectl create -f <file-name.yaml>
````
### References
:::success
- https://medium.com/@sajithswa/soa-vs-microservices-with-docker-and-kubernetes-1-291686200a0f
- https://12factor.net/
- https://www.rancher.com/
- https://k3s.io/
- https://www.cncf.io/phippy/the-childrens-illustrated-guide-to-kubernetes/
- https://www.youtube.com/watch?v=BE77h7dmoQU&t=1s
**Kubernetes workshops**
- https://kubernetes.io/docs/tutorials/kubernetes-basics/
EKS
- https://www.eksworkshop.com/
- https://labs.play-with-k8s.com/
AKS
- https://www.microsoft.com/azure/partners/news/article/azure-kubernetes-service-workshop
- https://github.com/carlosalexei/aks-workshop
:::