mirror of
https://github.com/marcel-dempers/docker-development-youtube-series.git
synced 2025-06-06 17:01:30 +00:00
updates k8s
This commit is contained in:
parent
1cd21b939b
commit
7384d560d9
@ -2,6 +2,10 @@
|
|||||||
|
|
||||||
This guide is aimed to fast-track your Kubernetes learning by focusing on a practical hands-on overview guide. </br>
|
This guide is aimed to fast-track your Kubernetes learning by focusing on a practical hands-on overview guide. </br>
|
||||||
|
|
||||||
|
When learning Kubernetes, you usually have an idea of some existing system you own and manage, or a website that you are building. </br>
|
||||||
|
|
||||||
|
The challenge is understanding which Kubernetes building blocks you need in order to run your workloads on Kubernetes </br>
|
||||||
|
|
||||||
<hr/>
|
<hr/>
|
||||||
<b>The problem:</b> "I want to adopt Kubernetes" </br>
|
<b>The problem:</b> "I want to adopt Kubernetes" </br>
|
||||||
<b>The problem:</b> "I have some common existing infrastructure"
|
<b>The problem:</b> "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
|
|||||||
<b>Our focus:</b> Solving the problem by learning each building block
|
<b>Our focus:</b> Solving the problem by learning each building block
|
||||||
in order to port our infrastructure to Kubernetes.
|
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. </br>
|
||||||
|
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/)
|
* 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
|
* 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
|
* Create a cluster
|
||||||
|
|
||||||
```
|
```
|
||||||
kind create cluster
|
kind create cluster --image kindest/node:v1.23.5
|
||||||
```
|
```
|
||||||
|
|
||||||
## Namespaces
|
## Namespaces
|
||||||
@ -36,23 +142,23 @@ kind create cluster
|
|||||||
kubectl create namespace cms
|
kubectl create namespace cms
|
||||||
```
|
```
|
||||||
|
|
||||||
## Deployments
|
## Configmaps
|
||||||
|
|
||||||
* 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 <pod-name> 80
|
|
||||||
```
|
|
||||||
|
|
||||||
[Environment Variables](https://kubernetes.io/docs/tasks/inject-data-application/define-environment-variable-container/) for pods
|
[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
|
## Secrets
|
||||||
|
|
||||||
|
[How to use](https://kubernetes.io/docs/concepts/configuration/secret/) secrets in pods
|
||||||
|
|
||||||
```
|
```
|
||||||
kubectl -n cms create secret generic wordpress `
|
kubectl -n cms create secret generic wordpress `
|
||||||
--from-literal WORDPRESS_DB_HOST=mysql `
|
--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_PASSWORD=examplepassword `
|
||||||
--from-literal WORDPRESS_DB_NAME=exampledb
|
--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
|
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
|
||||||
|
|
||||||
Services [documentation](https://kubernetes.io/docs/concepts/services-networking/service/)
|
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:
|
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 <pod-name> 80
|
||||||
|
```
|
||||||
|
|
||||||
|
## Public Traffic
|
||||||
|
|
||||||
|
In order to make our site public, its common practise to expose web servers via </br>
|
||||||
|
a proxy or API gateway. </br>
|
||||||
|
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
|
||||||
```
|
```
|
||||||
|
5
kubernetes/tutorials/basics/dockerfiles/mysql.dockerfile
Normal file
5
kubernetes/tutorials/basics/dockerfiles/mysql.dockerfile
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
FROM mysql:5.7
|
||||||
|
|
||||||
|
# make any changes to MySQL installation
|
||||||
|
|
||||||
|
EXPOSE 3306
|
@ -0,0 +1,5 @@
|
|||||||
|
FROM wordpress:5.9-apache
|
||||||
|
|
||||||
|
#COPY files , plugins, install extra stuff
|
||||||
|
|
||||||
|
EXPOSE 80
|
@ -39,4 +39,4 @@ spec:
|
|||||||
valueFrom:
|
valueFrom:
|
||||||
secretKeyRef:
|
secretKeyRef:
|
||||||
name: wordpress
|
name: wordpress
|
||||||
key: WORDPRESS_DB_PASSWORD
|
key: WORDPRESS_DB_NAME
|
@ -38,20 +38,23 @@ spec:
|
|||||||
- name: MYSQL_DATABASE
|
- name: MYSQL_DATABASE
|
||||||
valueFrom:
|
valueFrom:
|
||||||
secretKeyRef:
|
secretKeyRef:
|
||||||
name: wordpress
|
name: mysql
|
||||||
key: WORDPRESS_DB_PASSWORD
|
key: MYSQL_DATABASE
|
||||||
- name: MYSQL_USER
|
- name: MYSQL_USER
|
||||||
valueFrom:
|
valueFrom:
|
||||||
secretKeyRef:
|
secretKeyRef:
|
||||||
name: wordpress
|
name: mysql
|
||||||
key: WORDPRESS_DB_USER
|
key: MYSQL_USER
|
||||||
- name: MYSQL_PASSWORD
|
- name: MYSQL_PASSWORD
|
||||||
valueFrom:
|
valueFrom:
|
||||||
secretKeyRef:
|
secretKeyRef:
|
||||||
name: wordpress
|
name: mysql
|
||||||
key: WORDPRESS_DB_PASSWORD
|
key: MYSQL_PASSWORD
|
||||||
- name: MYSQL_RANDOM_ROOT_PASSWORD
|
- name: MYSQL_RANDOM_ROOT_PASSWORD
|
||||||
value: "1"
|
valueFrom:
|
||||||
|
configMapKeyRef:
|
||||||
|
name: mysql
|
||||||
|
key: MYSQL_RANDOM_ROOT_PASSWORD
|
||||||
volumeMounts:
|
volumeMounts:
|
||||||
- name: db
|
- name: db
|
||||||
mountPath: /var/lib/mysql
|
mountPath: /var/lib/mysql
|
||||||
|
Loading…
x
Reference in New Issue
Block a user