From e1379fb6b5681d18e3a7d8313036736958da972c Mon Sep 17 00:00:00 2001 From: abregman Date: Mon, 12 Jul 2021 04:26:03 +0300 Subject: [PATCH] Add system design notebook image As well as two Kubernetes basic exercises. --- README.md | 14 ++++++++----- exercises/kubernetes/pods_01.md | 11 ++++++++++ exercises/kubernetes/services_01.md | 11 ++++++++++ .../kubernetes/solutions/pods_01_solution.md | 6 ++++++ .../solutions/services_01_solution.md | 19 ++++++++++++++++++ images/system_design_notebook.png | Bin 0 -> 15979 bytes 6 files changed, 56 insertions(+), 5 deletions(-) create mode 100644 exercises/kubernetes/pods_01.md create mode 100644 exercises/kubernetes/services_01.md create mode 100644 exercises/kubernetes/solutions/pods_01_solution.md create mode 100644 exercises/kubernetes/solutions/services_01_solution.md create mode 100644 images/system_design_notebook.png diff --git a/README.md b/README.md index 9dc416ca7..e5e8e9bc6 100644 --- a/README.md +++ b/README.md @@ -73,7 +73,7 @@ Mongo
Mongo
puppet
Puppet
Distributed
Distributed
- you
Questions you can ask
+ you
Questions you can ask
@@ -5220,7 +5220,9 @@ Because each container has its own writable container layer, and all changes are |Name|Topic|Objective & Instructions|Solution|Comments| |--------|--------|------|----|----| -|My First Pod|Dockerfile|WIP|WIP +| My First Pod | Pods | [Exercise](exercises/kubernetes/pods_01.md) | [Solution](exercises/kubernetes/solutions/pods_01_solution.md) +| Creating a service | Service | [Exercise](exercises/kubernetes/services_01.md) | [Solution](exercises/kubernetes/solutions/services_01_solution.md) + ### Kubernetes Self Assesment @@ -6342,13 +6344,15 @@ View more [here](https://www.youtube.com/watch?v=rDCWxkvPlAw)
What is Helm?
-Package manager for Kubernetes. Basically the ability to package YAML files and distribute them to other users. +Package manager for Kubernetes. Basically the ability to package YAML files and distribute them to other users and apply them in different clusters.
Why do we need Helm? What would be the use case for using it?
-Sometimes when you would like to deploy a certain application to your cluster, you need to create multiple YAML files / Components like: Secret, Service, ConfigMap, etc. This can be tedious task. So it would make sense to ease the process by introducing something that will allow us to share these bundle of YAMLs every time we would like to add an application to our cluster. This something is called Helm. +Sometimes when you would like to deploy a certain application to your cluster, you need to create multiple YAML files/components like: Secret, Service, ConfigMap, etc. This can be tedious task. So it would make sense to ease the process by introducing something that will allow us to share these bundle of YAMLs every time we would like to add an application to our cluster. This something is called Helm. + +A common scenario is having multiple Kubernetes clusters (prod, dev, staging). Instead of individually applying different YAMLs in each cluster, it makes more sense to create one Chart and install it in every cluster.
@@ -11724,7 +11728,7 @@ Bonus: extract the last word of each line Replace 'red' with 'green'
-#### System Design +## System Design
Explain what is a "Single point of failure" and give an example
diff --git a/exercises/kubernetes/pods_01.md b/exercises/kubernetes/pods_01.md new file mode 100644 index 000000000..16322c3bd --- /dev/null +++ b/exercises/kubernetes/pods_01.md @@ -0,0 +1,11 @@ +## Pods 01 + +#### Objective + +Learn how to create pods + +#### Instructions + +1. Choose a container image (e.g. redis, nginx, mongo, etc.) +2. Create a pod (in the default namespace) using the image you chose +3. Verify the pod is running diff --git a/exercises/kubernetes/services_01.md b/exercises/kubernetes/services_01.md new file mode 100644 index 000000000..f5715d8f4 --- /dev/null +++ b/exercises/kubernetes/services_01.md @@ -0,0 +1,11 @@ +## Services 01 + +#### Objective + +Learn how to create services + +#### Instructions + +1. Create a pod running ngnix +2. Create a service for the pod you've just created +3. Verify the app is reachable diff --git a/exercises/kubernetes/solutions/pods_01_solution.md b/exercises/kubernetes/solutions/pods_01_solution.md new file mode 100644 index 000000000..bea89ac55 --- /dev/null +++ b/exercises/kubernetes/solutions/pods_01_solution.md @@ -0,0 +1,6 @@ +## Pods 01 - Solution + +``` +kubectl run nginx --image=nginx --restart=Never +kubectl get pods +``` diff --git a/exercises/kubernetes/solutions/services_01_solution.md b/exercises/kubernetes/solutions/services_01_solution.md new file mode 100644 index 000000000..da6026762 --- /dev/null +++ b/exercises/kubernetes/solutions/services_01_solution.md @@ -0,0 +1,19 @@ +## Services 01 - Solution + +``` +kubectl run nginx --image=nginx --restart=Never --port=80 --labels="app=dev-nginx" + +cat << EOF > nginx-service.yaml +apiVersion: v1 +kind: Service +metadata: + name: nginx-service +spec: + selector: + app: dev-nginx + ports: + - protocol: TCP + port: 80 + targetPort: 9372 +EOF +``` diff --git a/images/system_design_notebook.png b/images/system_design_notebook.png new file mode 100644 index 0000000000000000000000000000000000000000..87056e11ac3852ecffcd8667269abf743545a505 GIT binary patch literal 15979 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 F{{nZ