diff --git a/kubernetes/tutorials/basics/README.md b/kubernetes/tutorials/basics/README.md
index e943d50..285271f 100644
--- a/kubernetes/tutorials/basics/README.md
+++ b/kubernetes/tutorials/basics/README.md
@@ -2,6 +2,10 @@
This guide is aimed to fast-track your Kubernetes learning by focusing on a practical hands-on overview guide.
+When learning Kubernetes, you usually have an idea of some existing system you own and manage, or a website that you are building.
+
+The challenge is understanding which Kubernetes building blocks you need in order to run your workloads on Kubernetes
+
The problem: "I want to adopt Kubernetes"
The problem: "I have some common existing infrastructure"
@@ -10,11 +14,113 @@ This guide is aimed to fast-track your Kubernetes learning by focusing on a prac
Our focus: Solving the problem by learning each building block
in order to port our infrastructure to Kubernetes.
-## Docker installation
+## Understanding Containers
+
+Before even looking at Kubernetes, you need to have a general understanding of containers like `docker`.
+Your workloads need to fit in containers in order to be shipped on Kubernetes.
+Containers also have a bunch of assumptions that you need to meet.
+
+* Defining the container - `Dockerfile`
+* Serving traffic - Exposing ports
+* Configuration - mount config files & secrets or `env` variables
+* Data persistence - When a container is terminated, everything inside the container is gone
+* Container entrypoint - The main process that runs in the container. Your app
+
+
+### Docker installation
* Install Docker [here](https://docs.docker.com/get-docker/)
+* Let's take a look at [Wordpress on Docker Hub](https://hub.docker.com/_/wordpress)
+* Build our docker file
-## Run Kubernetes
+## Create Network
+
+```
+docker network create wordpress
+```
+
+## Build & Test container images
+
+ ### Wordpress example
+```
+cd kubernetes\tutorials\basics\
+
+docker build -f dockerfiles/wordpress.dockerfile . -t aimvector/wordpress-example
+
+```
+
+* Run our Wordpress container
+
+```
+docker run -it --rm -p 80:80 --net wordpress aimvector/wordpress-example
+```
+
+The wordpress container will be visible on port 80 on `http://localhost/`
+
+### MySQL example
+
+* We need a database, let's take a look at [MySQL on Docker Hub](https://hub.docker.com/_/mysql)
+* Build our MySQl container image
+
+```
+docker build -f dockerfiles/mysql.dockerfile . -t aimvector/mysql-example
+```
+
+* How do we run our MySQL ?
+
+We need to understand that databases require storage and state
+Just like installing software on a server, it will store its files in some
+directory. Mysql stores its files under `/var/lib/mysql`
+
+* We need a volume mount
+
+Let's see how to run this in docker
+
+```
+mkdir data
+
+docker run --rm -d `
+--name mysql `
+--net wordpress `
+-e MYSQL_DATABASE=exampledb `
+-e MYSQL_USER=exampleuser `
+-e MYSQL_PASSWORD=examplepassword `
+-e MYSQL_RANDOM_ROOT_PASSWORD=1 `
+-v ${PWD}/data:/var/lib/mysql `
+aimvector/mysql-example
+
+# we can see the container with
+docker ps
+CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
+92cde663a3f5 aimvector/mysql-example "docker-entrypoint.s…" 5 seconds ago Up 3 seconds 3306/tcp, 33060/tcp mysql
+
+```
+
+* Run Wordpress and connect it to MySQL
+
+```
+docker run -d `
+--rm `
+-p 80:80 `
+--name wordpress `
+--net wordpress `
+-e WORDPRESS_DB_HOST=mysql `
+-e WORDPRESS_DB_USER=exampleuser `
+-e WORDPRESS_DB_PASSWORD=examplepassword `
+-e WORDPRESS_DB_NAME=exampledb `
+aimvector/wordpress-example
+```
+
+### Clean up
+
+```
+docker rm -f wordpress
+docker rm -f mysql
+docker network rm wordpress
+rm data
+```
+
+## Run Kubernetes Locally
* Install `kubectl` to work with kubernetes
@@ -27,7 +133,7 @@ You will want to head over to the [kind](https://kind.sigs.k8s.io/) site
* Create a cluster
```
-kind create cluster
+kind create cluster --image kindest/node:v1.23.5
```
## Namespaces
@@ -36,23 +142,23 @@ kind create cluster
kubectl create namespace cms
```
-## Deployments
-
-* Deployment [documentation](https://kubernetes.io/docs/concepts/workloads/controllers/deployment/)
-
-cd kubernetes\tutorial
-
-```
-kubectl -n cms apply -f deploy.yaml
-kubectl -n cms get pods
-
-kubectl -n cms port-forward 80
-```
+## Configmaps
[Environment Variables](https://kubernetes.io/docs/tasks/inject-data-application/define-environment-variable-container/) for pods
+[How to use](https://kubernetes.io/docs/concepts/configuration/configmap/) configmaps
+
+```
+kubectl -n cms create configmap mysql `
+--from-literal MYSQL_RANDOM_ROOT_PASSWORD=1
+
+kubectl -n cms get configmaps
+```
+
## Secrets
+[How to use](https://kubernetes.io/docs/concepts/configuration/secret/) secrets in pods
+
```
kubectl -n cms create secret generic wordpress `
--from-literal WORDPRESS_DB_HOST=mysql `
@@ -60,33 +166,80 @@ kubectl -n cms create secret generic wordpress `
--from-literal WORDPRESS_DB_PASSWORD=examplepassword `
--from-literal WORDPRESS_DB_NAME=exampledb
+kubectl -n cms create secret generic mysql `
+--from-literal MYSQL_USER=exampleuser `
+--from-literal MYSQL_PASSWORD=examplepassword `
+--from-literal MYSQL_DATABASE=exampledb
+
+
kubectl -n cms get secret
```
-[How to use](https://kubernetes.io/docs/concepts/configuration/secret/) secrets in pods
-Apply changes to our deployment
+## Deployments
+
+* Deployment [documentation](https://kubernetes.io/docs/concepts/workloads/controllers/deployment/)
+
+cd kubernetes\tutorials\basics
```
-kubectl -n cms apply -f deploy.yaml
+kubectl -n cms apply -f yaml/deploy.yaml
+kubectl -n cms get pods
```
-We can `port-forward` again, and notice an error connecting to the database because the database does not exist
-
-# Statefulset
-
-Statefulset [documentation](https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/)
-
-# Storage Class
-
-StorageClass [documentation](https://kubernetes.io/docs/concepts/storage/storage-classes/)
-
# Services
Services [documentation](https://kubernetes.io/docs/concepts/services-networking/service/)
+# Storage Class
+
+StorageClass [documentation](https://kubernetes.io/docs/concepts/storage/storage-classes/)
+
+```
+kubectl get storageclass
+```
+
+# Statefulset
+
+Statefulset [documentation](https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/)
+
Let's deploy our `mysql` using what we learnt above:
```
-kubectl -n cms apply -f .\statefulset.yaml
+kubectl -n cms apply -f yaml/statefulset.yaml
+
+kubectl -n cms get pods
+```
+
+## Persistent Volumes
+
+[Documentation](https://kubernetes.io/docs/concepts/storage/persistent-volumes/)
+
+## Port Forwarding
+
+We can access private service endpoints or pods using `port-forward` :
+
+```
+kubectl -n cms get pods
+kubectl -n cms port-forward 80
+```
+
+## Public Traffic
+
+In order to make our site public, its common practise to expose web servers via
+a proxy or API gateway.
+In Kubernetes, an Ingress is used.
+
+## Ingress
+
+To use an ingress, we need an ingress controller
+
+```
+kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.1.3/deploy/static/provider/cloud/deploy.yaml
+```
+
+Create an Ingress
+
+```
+kubectl -n cms apply -f yaml/ingress.yaml
```
diff --git a/kubernetes/tutorials/basics/dockerfiles/mysql.dockerfile b/kubernetes/tutorials/basics/dockerfiles/mysql.dockerfile
new file mode 100644
index 0000000..53d0d5d
--- /dev/null
+++ b/kubernetes/tutorials/basics/dockerfiles/mysql.dockerfile
@@ -0,0 +1,5 @@
+FROM mysql:5.7
+
+# make any changes to MySQL installation
+
+EXPOSE 3306
\ No newline at end of file
diff --git a/kubernetes/tutorials/basics/dockerfiles/wordpress.dockerfile b/kubernetes/tutorials/basics/dockerfiles/wordpress.dockerfile
new file mode 100644
index 0000000..42accc8
--- /dev/null
+++ b/kubernetes/tutorials/basics/dockerfiles/wordpress.dockerfile
@@ -0,0 +1,5 @@
+FROM wordpress:5.9-apache
+
+#COPY files , plugins, install extra stuff
+
+EXPOSE 80
\ No newline at end of file
diff --git a/kubernetes/tutorials/basics/yaml/deploy.yaml b/kubernetes/tutorials/basics/yaml/deploy.yaml
index da0992b..74ffc3e 100644
--- a/kubernetes/tutorials/basics/yaml/deploy.yaml
+++ b/kubernetes/tutorials/basics/yaml/deploy.yaml
@@ -39,4 +39,4 @@ spec:
valueFrom:
secretKeyRef:
name: wordpress
- key: WORDPRESS_DB_PASSWORD
\ No newline at end of file
+ key: WORDPRESS_DB_NAME
\ No newline at end of file
diff --git a/kubernetes/tutorials/basics/yaml/statefulset.yaml b/kubernetes/tutorials/basics/yaml/statefulset.yaml
index 28eebc2..b80c23e 100644
--- a/kubernetes/tutorials/basics/yaml/statefulset.yaml
+++ b/kubernetes/tutorials/basics/yaml/statefulset.yaml
@@ -38,20 +38,23 @@ spec:
- name: MYSQL_DATABASE
valueFrom:
secretKeyRef:
- name: wordpress
- key: WORDPRESS_DB_PASSWORD
+ name: mysql
+ key: MYSQL_DATABASE
- name: MYSQL_USER
valueFrom:
secretKeyRef:
- name: wordpress
- key: WORDPRESS_DB_USER
+ name: mysql
+ key: MYSQL_USER
- name: MYSQL_PASSWORD
valueFrom:
secretKeyRef:
- name: wordpress
- key: WORDPRESS_DB_PASSWORD
+ name: mysql
+ key: MYSQL_PASSWORD
- name: MYSQL_RANDOM_ROOT_PASSWORD
- value: "1"
+ valueFrom:
+ configMapKeyRef:
+ name: mysql
+ key: MYSQL_RANDOM_ROOT_PASSWORD
volumeMounts:
- name: db
mountPath: /var/lib/mysql