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
n0~3)F6;c%pR{ZjBZ-Wk^6gnD6n>8|@?!ctP ` in a terminal.
-
-## Exercise
-
-### Overview
-
-- Inspect existing Kubernetes manifest for a `deployment` object.
-- Apply the Quotes flask application using the `kubectl apply` command.
-- Access the application from the Internet
-
-### Step by step instructions
-
-
-Step by step
-
-**take the same bullet names as above and put them in to illustrate how far the student have gone**
-
-## Inspect existing Kubernetes manifest for a `deployment` object.
-
-
-We have prepared all the Kubernetes manifests that you need for the application to run.
-
-You can find the manifest in the folder called `quotes-flask`.
-
-- Open up the frontend manifest located at `quotes-flask/frontend-deployment.yaml`.
-
-Try to see if you can find information about:
-
-- The name of the deployment
-- The number of replicas
-- The image used for the container
-- The port the container listens on
-
-Do not worry if you don't understand everything yet, we will go through it in detail later in the course.
-
-## Apply the manifest using the `kubectl apply`.
-
-Use the `kubectl apply -f ` command to send the manifest with your desired state to Kubernetes:
-
-``` bash
-kubectl apply -f quotes-flask/
-```
-
-Expected output:
-
-```
-configmap/backend-config created
-deployment.apps/backend created
-service/backend created
-deployment.apps/frontend created
-service/frontend created
-configmap/postgres-config created
-deployment.apps/postgres created
-persistentvolumeclaim/postgres-pvc created
-secret/postgres-secret created
-service/postgres created
-```
-
-- You can verify that the deployment is created by running the `kubectl get deployments` command.
-
-``` bash
-kubectl get deployments
-```
-
-Expected output:
-
-```
-NAME READY UP-TO-DATE AVAILABLE AGE
-backend 1/1 1 1 27s
-frontend 1/1 1 1 27s
-postgres 1/1 1 1 27s
-```
-
-> :bulb: You might need to issue the command a couple of times, as it might take a few seconds for the deployment to be created and available.
-
-## Access the application from the Internet
-
-We are getting a little ahead of our exercises here, but to illustrate that we actually have
-a functioning application running in our cluster, let's try accessing it from a browser!
-
-First of, get the `service` called `frontend` and note down the NodePort, by finding the `PORT(S)` column and noting the number on the right side of the colon `:`
-
-> :bulb: A `service` is a networking abstraction that enables a lot of the neat networking features of Kubernetes.
-> We will cover `services` in detail in a later exercise, so just go with it for now :-)
-
-``` bash
-kubectl get service frontend
-```
-
-Expected output:
-
-```
-NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
-frontend NodePort 10.96.223.218 80:32458/TCP 12s
-```
-
-In this example, Kubernetes has chosen port `32458`, you will most likely get a different number.
-
-Finally, look up the IP address of a node in the cluster with:
-
-``` bash
-kubectl get nodes -o wide
-```
-
-> :bulb: The `-o wide` flag makes the output more verbose, i.e. to include the IPs
-
-Expected output:
-
-```
-NAME STATUS . . . INTERNAL-IP EXTERNAL-IP . . .
-node1 Ready . . . 10.123.0.8 35.240.20.246 . . .
-node2 Ready . . . 10.123.0.7 35.205.245.42 . . .
-```
-
-In the example your external IPs are either `35.240.20.246` or `35.205.245.42`.
-
-Since your `service` is of type `NodePort` it will be exposed on _all_ of the nodes. The service will be exposed on the port with the number you noted down above.
-
-Choose one of the `EXTERNAL-IP`'s, and point your web browser to the address: `:`.
-
-In this example, the address could be `35.240.20.246:32458`, or `35.205.245.42:32458`.
-
-You should see the application in the browser now!
-
-
-
-Congratulations! You have deployed your first application in Kubernetes!
-Easy, right :-)
-
-
-### Clean up
-
-To clean up, run the following command:
-
-```
-kubectl delete -f quotes-flask/
-```
-
-### Extra
-
-If you have more time, take a look at the YAML manifests that we used to deploy the application.
-They are in the `quotes-flask` folder.
-First take a look at the deployment manifest, and see if you can find the following information:
-
-- The name of the deployment
-- The number of replicas
-- The image used for the container
-
-Then take a look at the service manifest, and see if you can find the following information:
-
-- The name of the service
-- The port the service listens on
-
diff --git a/kubernetes-exercises/manifests.md b/kubernetes-exercises/manifests.md
deleted file mode 100644
index a336b1d..0000000
--- a/kubernetes-exercises/manifests.md
+++ /dev/null
@@ -1,133 +0,0 @@
-# Manifests
-
-## Learning Goals
-
-- Write your own declarative manifest to run a simple web application in a pod.
-
-## Introduction
-
-### Manifest files
-
-A [manifest][manifest_def] describes the `desired state` of an object that you want Kubernetes to manage.
-
-Manifests are described in `yaml` files and have the following general structure:
-
-```yaml
-apiVersion:
-kind:
-metadata:
- labels:
-spec:
-```
-
-[manifest_def]: https://kubernetes.io/docs/reference/glossary/?all=true#term-manifest
-
-
-:bulb: Extra: The general structure of a declarative manifest
-
-The general structure of a manifest is like the following. This is not only for pods, but for all Kubernetes resources.
-
-```yaml
-apiVersion: # Version of the API used for the kind/resource
-kind: # The kind/resource or "type" of the object
-metadata: # Metadata about the object
- name: # The name of the object (must be unique within this kind)
- labels: # Labels for the object (used for grouping, key-value pairs)
-spec:# The desired state of the object
- # The spec varies depending on the kind/resource
-```
-
-
-
-## Exercise
-
-### Overview
-
-- Write your own `pod` manifest.
-- Apply the `pod` manifest.
-- Verify the `pod` is created correctly.
-
-
-
-Step by step:
-
-
-### Write your own `pod` manifest.
-
-- Go into the `manifests/start` directory.
-- Open the `frontend-pod.yaml` file in a text editor.
-
-It looks like this:
-
-```yaml
-apiVersion:
-kind:
-metadata:
- name:
-spec:
- containers:
- - name:
- image:
- ports:
-```
-
-- Find the API version for the `pod` resource in the [Kubernetes API documentation][pod-api] and fill out the `apiVersion`
-
-[pod-api]: https://kubernetes.io/docs/reference/kubernetes-api/workload-resources/pod-v1/
-
-
-:bulb: Help me out!
-
-The API version for the `pod` resource is `v1`
-
-
-
-- the `kind` should be `Pod`
-- the `name` should be `frontend` for both the metadata and the spec
-- the `image` should be `ghcr.io/eficode-academy/quotes-flask-frontend:release`
-- the `containerPort` section should have `5000`
-
-
-:bulb: Help me out!
-
-The entire manifest should look like this:
-
-```yaml
-apiVersion: v1
-kind: Pod
-metadata:
- name: frontend
-spec:
- containers:
- - name: frontend
- image: ghcr.io/eficode-academy/quotes-flask-frontend:release
- ports:
- - containerPort: 5000
-```
-
-
-
-### Apply the `pod` manifest.
-
-Try to apply the manifest with `kubectl apply -f frontend-pod.yaml` command.
-
-### Verify the `pod` is created correctly.
-
-Check the status of the pod with `kubectl get pods` command.
-
-Expected output:
-
-```bash
-NAME READY STATUS RESTARTS AGE
-frontend 1/1 Running 0 1m
-```
-
-Congratulations! You have now learned how to make a manifest detailing our frontend pod, and applied it to the cluster.
-
-
-
-### Clean up
-
-Delete the pod with `kubectl delete pod frontend` command.
-
-Congratulations! You have now learned how to make a manifest detailing our frontend pod.
diff --git a/kubernetes-exercises/manifests/done/frontend-pod.yaml b/kubernetes-exercises/manifests/done/frontend-pod.yaml
deleted file mode 100644
index 9599318..0000000
--- a/kubernetes-exercises/manifests/done/frontend-pod.yaml
+++ /dev/null
@@ -1,10 +0,0 @@
-apiVersion: v1
-kind: Pod
-metadata:
- name: frontend
-spec:
- containers:
- - name: frontend
- image: ghcr.io/eficode-academy/quotes-flask-frontend:release
- ports:
- - containerPort: 5000
\ No newline at end of file
diff --git a/kubernetes-exercises/manifests/start/frontend-pod.yaml b/kubernetes-exercises/manifests/start/frontend-pod.yaml
deleted file mode 100644
index 5d2c367..0000000
--- a/kubernetes-exercises/manifests/start/frontend-pod.yaml
+++ /dev/null
@@ -1,10 +0,0 @@
-apiVersion:
-kind:
-metadata:
- name:
-spec:
- containers:
- - name:
- image:
- ports:
- - containerPort:
diff --git a/kubernetes-exercises/old/07-healthchecks.md b/kubernetes-exercises/old/07-healthchecks.md
deleted file mode 100644
index c567a6f..0000000
--- a/kubernetes-exercises/old/07-healthchecks.md
+++ /dev/null
@@ -1,79 +0,0 @@
-# Kubernetes health checks
-
-Health checks in Kubernetes are a mechanism to
-check if a pod is able to handle load. This status
-can be used by Kubernetes to avoid routing traffic
-to pods which are unhealthy, or automatically
-recreate unhealthy pods.
-
-Kubernetes has two built-in ways of making a
-health check on a pod:
-
-- _readiness probes_ that finds out if your pod is
- ready to receive traffic
-- _liveness probes_ that finds out if your pod is
- alive and well
-
-When we use `kubectl` to print the status of a
-pod, we receive information on the status of the
-pod.
-
-```
-NAME READY STATUS RESTARTS AGE
-probe-59cf4f5578-vwllc 1/1 Running 1 10m
-```
-
-In this example, "1/1" in the READY-column means
-shows the amount of containers in this pod which
-Kubernetes identified to be in the READY-state.
-
-The difference between a container being healthy
-or unhealthy, is vital. A container can be
-creating, failing or otherwise deployed but
-unavailable - and in this state Kubernetes will
-choose not to route traffic to the container if it
-deems it unhealthy.
-
-## Tasks
-
-Apply the deployment and service found in the
-`health-checks` folder:
-
-- `kubectl apply -f health-checks/probes.yaml `
-- `kubectl apply -f health-checks/probes-svc.yaml`
-- Try to access the service through the public IP
- of one of the nodes, just like we worked with in
- the
- [service discovery assignment](./02-service-discovery-and-loadbalancing.md).
-- Scale the deployment by changing the `replicas`
- amount to 2 in the `probes.yaml`
-- Again, access the application through your
- browser. Refresh the page multiple times such
- that you hit both of the instances
-- Execute a bash session in one of the instances
- `kubectl exec -ti probe-59cf4f5578-vwllc -- bash`
-- First, remove the file `/tmp/ready`, and monitor
- that the browser will eventually not route
- traffic to that pod.
-- Remove the file `/tmp/alive`, and observe that
- within a short while you will get kicked out of
- the container, as the pod is restarting.
-- Observe that the pod has now been restarted when
- you list the pods with `kubectl get pods`
-- Look at the logs:
- `kubectl describe pod probe-59cf4f5578-vwllc`
- and see the events that you have triggered
- through this exercise.
-
-Congratulations!
-
-You have now tried out both to pause traffic to a
-given pod when its readinessprobe is failing, and
-trigger a pod restart when the livelinessprobe is
-failing.
-
-## Clean up
-
-```
-kubectl delete -f health-checks
-```
diff --git a/kubernetes-exercises/old/exercise_setup/00-setup-kubectl-linux.md b/kubernetes-exercises/old/exercise_setup/00-setup-kubectl-linux.md
deleted file mode 100644
index 6ce3046..0000000
--- a/kubernetes-exercises/old/exercise_setup/00-setup-kubectl-linux.md
+++ /dev/null
@@ -1,109 +0,0 @@
-# Setup kubectl
-
-> NB: if you are in an instructor facilited training, please don't run the commands below,
-> as your machine will have already been configured with the proper access.
-
-It is assumed that you are provided with a kubernetes cluster by the instructor. Before you are able to do anything on the cluster, you need to be able to *talk* to this cluster from/using your computer. [kubectl](https://kubernetes.io/docs/tasks/tools/install-kubectl/) - short for Kubernetes Controller - is *the* command line tool to talk to a Kubernetes cluster. To get that on your computer follow the instructions for `kubectl` on this page:
-
-Kubectl is a *go* binary which allows you to execute commands on your cluster. Your cluster could be a single node VM, such as [minikube](https://github.com/kubernetes/minikube), or a set of VMs on your local computer or somewhere on a host in your data center, a bare-metal cluster, or a cluster provided by any of the cloud providers - as a service - such as GCP.
-
-**Note:** Due to restrictions with virtualization inside a virtual machine (nested virtualization), you cannot run minikube on cloud VMs. Minikube is a part of the Kubernetes open source project, with the single goal of getting a simple cluster up and running with just one virtual machine acting as node.
-
-For the remainder of this workshop, we assume you have a Kubernetes cluster on google cloud. For instructions on connecting to various types of Kubernetes cluster, check [this article](https://kubernetes.io/docs/tasks/tools/install-kubectl/#configure-kubectl)
-
-
-## Authenticate to your Google k8s cluster:
-To authenticate against your cluster, you will need a gmail account. Then, run:
-
-```shell
- # cluster connection via service account
-
- # Install the tools
-export CLOUD_SDK_REPO="cloud-sdk-$(lsb_release -c -s)"
-echo "deb http://packages.cloud.google.com/apt $CLOUD_SDK_REPO main" | sudo tee -a /etc/apt/sources.list.d/google-cloud-sdk.list
-curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
-sudo apt-get update && sudo apt-get install google-cloud-sdk
-
- # Create key file on your vm - the instructor will mail you the contents
-vi keyfile.json
-
- # authenticate with cloud
-gcloud auth activate-service-account --key-file keyfile.json
-
- # Get the cluster credentials for kubectl
-gcloud container clusters get-credentials training-cluster --zone europe-west1-b --project praqma-education
-```
-
-Google will do some magic under the hood, which does a few things:
-* Fetches certificates and tokens (secrets)
-* Puts them into the Kubernetes configuration file, located at /home/.kube/config
-
-## Verify configuration:
-You can verify this by looking at the config file:
-
-```shell
-kubectl config view
-```
-
-You should see something like this:
-
-```yaml
-apiVersion: v1
-clusters:
-- cluster:
- certificate-authority-data: REDACTED
- server: https://1.2.3.4
- name: gke_praqma-education_europe-west1-b_dcn-cluster-35
-contexts:
-- context:
- cluster: gke_praqma-education_europe-west1-b_dcn-cluster-35
- user: gke_praqma-education_europe-west1-b_dcn-cluster-35
- name: gke_praqma-education_europe-west1-b_dcn-cluster-35
-current-context: gke_praqma-education_europe-west1-b_dcn-cluster-35
-kind: Config
-preferences: {}
-users:
-- name: gke_praqma-education_europe-west1-b_dcn-cluster-35
- user:
- password: secret-password-ea4a2fb76dc9
- username: admin
-```
-
-
-Furthermore you should now have access to the google cloud cluster! Verify by looking at the nodes for the cluster:
-
-```shell
-kubectl get nodes
-```
-
-You should be able to see something similar to what is shown below:
-```shell
-$ kubectl get nodes
-NAME STATUS ROLES AGE VERSION
-ip-172-20-40-108.eu-central-1.compute.internal Ready master 1d v1.8.0
-ip-172-20-49-54.eu-central-1.compute.internal Ready node 1d v1.8.0
-ip-172-20-60-255.eu-central-1.compute.internal Ready node 1d v1.8.0
-```
-
-If you add the `-o wide` parameters to the above command, you will also see the public IP addresses of the nodes:
-
-```shell
-$ kubectl get nodes -o wide
-NAME STATUS ROLES AGE VERSION EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
-gke-dcn-cluster-35-default-pool-dacbcf6d-3918 Ready 17h v1.8.8-gke.0 35.205.22.139 Container-Optimized OS from Google 4.4.111+ docker://17.3.2
-gke-dcn-cluster-35-default-pool-dacbcf6d-c87z Ready 17h v1.8.8-gke.0 35.187.90.36 Container-Optimized OS from Google 4.4.111+ docker://17.3.2
-```
-
-**Note:** On Kubernetes clusters provided by a Kubernetes service provider, you will only see worker nodes as a result of executing the above command. On other clusters, you will see both master and worker nodes.
-
-```shell
-$ kubectl get nodes -o wide
-NAME STATUS ROLES AGE VERSION EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
-ip-172-20-40-108.eu-central-1.compute.internal Ready master 1d v1.8.0 1.2.3.4 Debian GNU/Linux 8 (jessie) 4.4.78-k8s docker://1.12.6
-ip-172-20-49-54.eu-central-1.compute.internal Ready node 1d v1.8.0 2.3.4.5 Debian GNU/Linux 8 (jessie) 4.4.78-k8s docker://1.12.6
-ip-172-20-60-255.eu-central-1.compute.internal Ready node 1d v1.8.0 5.6.7.8 Debian GNU/Linux 8 (jessie) 4.4.78-k8s docker://1.12.6
-```
-
-
-
-**Note:** Depending on the setup for this workshop, you may not be the only tenant on the cluster; you may be sharing it with the rest of the people around you in the course! So be careful!
diff --git a/kubernetes-exercises/old/exercise_setup/00-setup-namespace.md b/kubernetes-exercises/old/exercise_setup/00-setup-namespace.md
deleted file mode 100644
index 597ddae..0000000
--- a/kubernetes-exercises/old/exercise_setup/00-setup-namespace.md
+++ /dev/null
@@ -1,64 +0,0 @@
-# Setup Namespace
-
-> NB: If you are in an instructor facilitated training, the namespaces have already been configured,
-> but please read on, to get to know more about namespaces.
-
-Namespaces are the default way for kubernetes to separate resources.
- Namespaces do not share anything between them, which is important to know,
- and thus come in handy when you have multiple users on the same cluster,
- that you don't want stepping on each other's toes :)
-
-## 1.1 Create a namespace
-
-Namespaces are resources themselves, so they can be created like any other resource. Choose a name for your namespace, something unique so you don't clash with one of the other participants at the workshop.
-
-```shell
-$ kubectl create namespace my-namespace
-namespace "my-namespace" created
-```
-
-## 1.2 Scoping the kubectl command
-
-You want to target your own namespace instead of default one every time you use `kubectl`.
- You can run a command in a specific namespace by using the `-n, --namespace=''`-flag.
-
-The below commands do the same thing, because kubernetes commands will default to the default namespace:
-
-```shell
-kubectl get pods -n default
-kubectl get pods
-```
-
-## 1.3 Set your default namespace
-
-It gets tedious however to write this every time you want to select your own namespace,
- so it makes sense to set this as the default.
-
-To overwrite the default namespace for your current `context`, run:
-
-```shell
-$ kubectl config set-context $(kubectl config current-context) --namespace=my-namespace
-Context "" modified.
-```
-
-You can verify that you've updated your current `context` by running:
-
-```shell
-kubectl config get-contexts
-```
-
-Notice that the namespace column has the value of ``.
-
-Most errors you will get throughout the rest of the workshop will 99% be due to deploying into a namespace,
- where someone's already done the exercise before you; always ensure you're using your newly created namespace!
-
-## 1.4 More on Namespaces
-
-Namespaces are quite powerful. On a user level, it is also possible to limit namespaces and resources by users but this is a bit too involved for your first experience with Kubernetes.
- Therefore, please be aware that other people's namespaces are off limits for this workshop; even if you do have access ;)
-
-Kubernetes clusters come with a namespace called `default`, which in this case might contain some pods deployed previously by the trainers,
- and usually one called `kube-system` which will contain some of the kubernetes services running in the cluster.
-
-You might see later that the namespace is specified directly in the yaml files describing the resources.
- This makes it possible to have the resource created in the specific namespace without specifying the `-n` flag on creation.
diff --git a/kubernetes-exercises/old/exercise_setup/99-setup-kubectl-generic.md b/kubernetes-exercises/old/exercise_setup/99-setup-kubectl-generic.md
deleted file mode 100644
index 13acb6d..0000000
--- a/kubernetes-exercises/old/exercise_setup/99-setup-kubectl-generic.md
+++ /dev/null
@@ -1,201 +0,0 @@
-# Setup kubectl
-
-It is assumed that you are provided with a kubernetes cluster by the instructor. Before you are able to do anything on the cluster, you need to be able to *talk* to this cluster from/using your computer. [kubectl](https://kubernetes.io/docs/tasks/tools/install-kubectl/) - short for Kubernetes Controller - is *the* command line tool to talk to a Kubernetes cluster. To get that on your computer, you will need to follow instruction from [here](https://kubernetes.io/docs/tasks/tools/install-kubectl/). We have provided you simplified steps:
-
-## MAC OS:
-```shell
-brew install kubectl
-```
-
-OR
-
-```shell
-$ curl -LO https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/darwin/amd64/kubectl && chmod +x ./kubectl && sudo mv ./kubectl /usr/local/bin/kubectl
-```
-
-## Linux (RedHat/CentOS/Fedora):
-
-```shell
-curl -LO https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl && chmod +x ./kubectl && sudo mv ./kubectl /usr/local/bin/kubectl
-```
-
-OR
-
-```shell
-cat < /etc/yum.repos.d/kubernetes.repo
-[kubernetes]
-name=Kubernetes
-baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
-enabled=1
-gpgcheck=1
-repo_gpgcheck=1
-gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
-EOF
-yum install -y kubectl
-```
-
-## Debian/Ubuntu:
-```shell
-curl -LO https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl && chmod +x ./kubectl && sudo mv ./kubectl /usr/local/bin/kubectl
-```
-
-OR
-
-```shell
-sudo apt-get update && sudo apt-get install -y apt-transport-https
-curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
-sudo touch /etc/apt/sources.list.d/kubernetes.list
-echo "deb http://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee -a /etc/apt/sources.list.d/kubernetes.list
-sudo apt-get update
-sudo apt-get install -y kubectl
-```
-
-
-
-Kubectl is a *go* binary which allows you to execute commands on your cluster. Where, "your cluster" could be: a single node VM, such as [minikube](https://github.com/kubernetes/minikube), or a set of VMs on your local computer or somewhere on a host in your data center, a bare-metal cluster, or a cluster provided by any of the cloud providers - as a service - such as GCP.
-
-**Note:** Due to restrictions with virtualization inside a virtual machine (nested virtualization), you cannot run minikube on cloud VMs. Minikube is a part of the Kubernetes open source project, with the single goal of getting a simple cluster up and running with just one virtual machine acting as both master-node and worker-node.
-
-For the remainder of this workshop, we assume you have a Kubernetes cluster on google cloud.
-
-
-# Authenticate to your Google k8s cluster:
-In some workshops we provide a preconfigured **config** file, which you simply save as ~/.kube/config on your local computer, and you are golden.
-However, in other setups, you may need to actually authenticate to the cluster, and get a config file directly from GCP. Actually, the instructors may also need to use/do the following steps when they are setting up individual VMs for each student. Either way, the access to cluster can only be obtained after authenticating to google. To authenticate against your cluster, you will need google cloud SDK installed on your computer, and a gmail account. Assuming you already have a gmail account, we proceed to install google SDK on the local computer. To do that we have provided a summary of steps you need to perform. For more details, visit [this URL](https://cloud.google.com/sdk/install) .
-
-
-## MAC OS:
-
-```shell
-curl https://sdk.cloud.google.com | bash
-exec -l $SHELL
-gcloud init
-```
-
-## Linux (Debian/RedHat):
-```shell
-curl https://sdk.cloud.google.com | bash
-exec -l $SHELL
-gcloud init
-```
-
-OR
-
-## Linux (Debian/Unbuntu):
-```shell
-export CLOUD_SDK_REPO="cloud-sdk-$(lsb_release -c -s)"
-echo "deb http://packages.cloud.google.com/apt $CLOUD_SDK_REPO main" | sudo tee -a /etc/apt/sources.list.d/google-cloud-sdk.list
-curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
-sudo apt-get update && sudo apt-get install google-cloud-sdk
-gcloud init
-```
-
-
-## Linux (RedHat/CentOS/Fedora):
-```shell
-sudo tee -a /etc/yum.repos.d/google-cloud-sdk.repo << EOM
-[google-cloud-sdk]
-name=Google Cloud SDK
-baseurl=https://packages.cloud.google.com/yum/repos/cloud-sdk-el7-x86_64
-enabled=1
-gpgcheck=1
-repo_gpgcheck=1
-gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg
- https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
-EOM
-
-yum install google-cloud-sdk
-gcloud init
-```
-
-
-## Windows:
-Follow these instructions: [https://cloud.google.com/sdk/docs/downloads-interactive#windows](https://cloud.google.com/sdk/docs/downloads-interactive#windows)
-
-
-Then, run:
-```shell
- # cluster connection via service account
- # Create key file on your vm - the instructor will mail you the contents
-vi keyfile.json
-
- # authenticate with cloud
-gcloud auth activate-service-account --key-file keyfile.json
-
- # Get the cluster credentials for kubectl
-gcloud container clusters get-credentials cluster-london --zone europe-west1-b --project praqma-education
-```
-
-Google will do some magic under the hood, which does a few things:
-* Fetches certificates and tokens (secrets)
-* Puts them into the Kubernetes configuration file, located at ~/.kube/config
-
-## Verify configuration:
-You can verify this by looking at the config file using the following command:
-
-```shell
-kubectl config view
-```
-
-You should see something like this:
-
-```yaml
-apiVersion: v1
-clusters:
-- cluster:
- certificate-authority-data: REDACTED
- server: https://1.2.3.4
- name: gke_praqma-education_europe-west1-b_dcn-cluster-35
-contexts:
-- context:
- cluster: gke_praqma-education_europe-west1-b_dcn-cluster-35
- user: gke_praqma-education_europe-west1-b_dcn-cluster-35
- name: gke_praqma-education_europe-west1-b_dcn-cluster-35
-current-context: gke_praqma-education_europe-west1-b_dcn-cluster-35
-kind: Config
-preferences: {}
-users:
-- name: gke_praqma-education_europe-west1-b_dcn-cluster-35
- user:
- password: secret-password-ea4a2fb76dc9
- username: admin
-```
-
-
-You should now have access to the google cloud cluster! Verify by looking at the nodes for the cluster:
-
-```shell
-kubectl get nodes
-```
-
-You should be able to see something similar to what is shown below:
-```shell
-$ kubectl get nodes
-NAME STATUS ROLES AGE VERSION
-ip-172-20-40-108.eu-central-1.compute.internal Ready master 1d v1.8.0
-ip-172-20-49-54.eu-central-1.compute.internal Ready node 1d v1.8.0
-ip-172-20-60-255.eu-central-1.compute.internal Ready node 1d v1.8.0
-```
-
-If you add the `-o wide` parameters to the above command, you will also see the public IP addresses of the nodes:
-
-```shell
-$ kubectl get nodes -o wide
-NAME STATUS ROLES AGE VERSION EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
-gke-dcn-cluster-35-default-pool-dacbcf6d-3918 Ready 17h v1.8.8-gke.0 35.205.22.139 Container-Optimized OS from Google 4.4.111+ docker://17.3.2
-gke-dcn-cluster-35-default-pool-dacbcf6d-c87z Ready 17h v1.8.8-gke.0 35.187.90.36 Container-Optimized OS from Google 4.4.111+ docker://17.3.2
-```
-
-**Note:** On Kubernetes clusters provided by a Kubernetes service provider, you will only see worker nodes as a result of executing the above command. On other clusters, you will see both master and worker nodes.
-
-```shell
-$ kubectl get nodes -o wide
-NAME STATUS ROLES AGE VERSION EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
-ip-172-20-40-108.eu-central-1.compute.internal Ready master 1d v1.8.0 1.2.3.4 Debian GNU/Linux 8 (jessie) 4.4.78-k8s docker://1.12.6
-ip-172-20-49-54.eu-central-1.compute.internal Ready node 1d v1.8.0 2.3.4.5 Debian GNU/Linux 8 (jessie) 4.4.78-k8s docker://1.12.6
-ip-172-20-60-255.eu-central-1.compute.internal Ready node 1d v1.8.0 5.6.7.8 Debian GNU/Linux 8 (jessie) 4.4.78-k8s docker://1.12.6
-```
-
-
-
-**Note:** Depending on the setup for this workshop, you may not be the only tenant on the cluster; you may be sharing it with the rest of the people around you in the course! So be careful!
diff --git a/kubernetes-exercises/old/exercise_setup/beyond-this-course-setting-up-your-own.md b/kubernetes-exercises/old/exercise_setup/beyond-this-course-setting-up-your-own.md
deleted file mode 100644
index e179a54..0000000
--- a/kubernetes-exercises/old/exercise_setup/beyond-this-course-setting-up-your-own.md
+++ /dev/null
@@ -1,73 +0,0 @@
-# Setting up multiple nodes in a cluster
-We will be using a tool called [KubeAdm](https://kubernetes.io/docs/setup/independent/create-cluster-kubeadm/) to set up a multi node cluster.
-
-KubeAdm is built for setting up and provisioning a cluster on bare metal, especially when having to interact with existing environments set up by puppet, ansible and etc.
-
-For Microsoft Azure the [Azure Container Service (AKS)](https://docs.microsoft.com/en-us/azure/aks/intro-kubernetes) does this for you.
-
-Similarly on Google Cloud Platform there is the [Google Container Engine (GCE)](https://cloud.google.com/container-engine/).
-
-For Amazon Web Services [Elastic Kubernetes Service (EKS)](https://aws.amazon.com/eks/). Also [Kubernetes Operations (KOPS)](https://github.com/kubernetes/kops) is used quite often to have more control over the cluster.
-
-Going back to kubeadm, you will have to select a master and a given amount of nodes.
-
-Run ssh to get onto the master, and verify that kubeadm is there:
-```
-kubeadm --help
-```
-
-On the machine you have chosen as master, run:
-```
-sudo kubeadm init
-```
-
-This process takes about a minute or so, while the master sets up.
-
-Copy the kubeadm join command output in the terminal (similar to the one below) before continuing, as you will need it for the nodes to join.
-
-```
-kubeadm join --token 2731ee.bb0be06012dbac00 172.31.18.205:6443 --discovery-token-ca-cert-hash sha256:fe634423c08ba596351dffd610503b4311f7160efcd49e343de83949ff4df610
-```
-
-KubeAdm will tell you to copy some files for configurations, but in case you missed it run:
-
-```
-mkdir -p $HOME/.kube
-sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
-sudo chown $(id -u):$(id -g) $HOME/.kube/config
-```
-
-This will set up the configurations needed to allow the other machines to join the cluster.
-
-To allow the pods on each node to talk, we will need to apply a pod network. For this exercise the choice is on Weave Net, but other options are Calico, Canal, Flannel, Kube-Router and Romana.
-
-```
-export kubever=$(kubectl version | base64 | tr -d '\n')
-kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$kubever"
-```
-
-We can verify that the pod network is correctly installed by running :
-```
-kubectl get pods --all-namespaces
-```
-The relevant pod is kube-dns, which needs to have 3/3 running before continuing to join nodes to the cluster.
-
-Ssh to all nodes and run the kubeadm join command as root/sudo that you copied previously.
-
-```
-sudo kubeadm join --token 2731ee.bb0be06012dbac00 172.31.18.205:6443 --discovery-token-ca-cert-hash sha256:fe634423c08ba596351dffd610503b4311f7160efcd49e343de83949ff4df610
-```
-
-This should allow the node to join the cluster ! Be mindful that for this to work port 6443 has to be open on master.
-
-Now you can run commands on master by using kubectl!
-
-## Optionally, execute commands on cluster from another machine than master
-Optionally, having to ssh to master is not the best of things. This can be changed by handing over the config to another machine:
-
-```
-scp root@:/etc/kubernetes/admin.conf .
-kubectl --kubeconfig ./admin.conf get nodes
-```
-
-## Kubernetes yml
diff --git a/kubernetes-exercises/old/extras/08-ingress-gke.md b/kubernetes-exercises/old/extras/08-ingress-gke.md
deleted file mode 100644
index d6552fc..0000000
--- a/kubernetes-exercises/old/extras/08-ingress-gke.md
+++ /dev/null
@@ -1,118 +0,0 @@
-# Ingress on Google Cloud
-
-GoogleKubernetesEngine (GKE) does Ingress a bit differently. For reference, those brave of you who want to play with Minikube, I have two more you can do - [nginx](06-ingress-nginx.md) and [traefik](06-ingress-traefik.md).
-
-However because we are running things on GKE, we are going to focus on that today.
-
-An ingress is loosely translatable to DNS namespace, and makes it so that:
-
-- Traffic to port `80` (http) and port `443` (https) goes to ingress rules instead AND
-- A name call to (example) myapplication.example.local gets translated to an IP and then routed to a container.
-
-Create an Nginx deployment and service, exposing the service as a nodeport. If you need a hint as to how this is done, look at the [Pods and Deployments](01-pods-deployments.md) and [Service Discovery and Loadbalancing](02-service-discovery-and-loadbalancing) exercises.
-
-GKE automatically exposes NodePorts through a Loadbalancer, but the 'correct' way is the ingress rule, which will work on all infrastructure.
-
-## Creating an 'address' on Google Cloud
-
-> NB: To manipulate `address` on Google Cloud you need the `Compute Admin Network`-right or similar on your service account.
-> If you have trouble creating the `address` verify (or ask your trainer to verify) that your service account is configured properly.
-
-Google cloud need an address created. All the steps running gcloud commands, are unusual and can be disregarded for a normal Kubernetes setup outside of GKE.
-
-```shell
-$ gcloud compute addresses create --global --project praqma-education
-Created [https://www.googleapis.com/compute/v1/projects/praqma-education/global/addresses/].
-```
-
-You can see the allocated IP of the address you created by running the following command:
-
-```shell
-$ gcloud compute addresses describe --global --format='value(address)' --project praqma-education
-
-```
-
-## Using the created address in an ingress object
-
-Ingress' can be told by annotation where the source request came from. This is useful when going through multiple networks, as the ingress rule then understand things like sticky sessions and other networking things like SSL termination and so on.
-
-```yaml
-annotations:
- kubernetes.io/ingress.global-static-ip-name: "my-address-name"
-```
-
-The above only works for GKE, but an equivalent for nginx would look like this:
-
-```yaml
-annotations:
- kubernetes.io/ingress.class: "nginx"
- nginx.org/ssl-services: "my-service"
-```
-
-So lets put the following ingress spec into `ingress-file.yaml`:
-
-```yaml,k8s
-apiVersion: extensions/v1beta1
-kind: Ingress
-metadata:
- name: nginx
- annotations:
- kubernetes.io/ingress.global-static-ip-name: "my-address-name" # should match the name of the address you created before
-spec:
- backend:
- serviceName: nginx
- servicePort: 80
-```
-
-And create it!
-
-```shell
-$ kubectl apply -f ingress-file.yml
-ingress.extensions/nginx created
-```
-
-Find it in the Kubernetes cluster (hint: `.. get ing nginx`)
-
-The `ADDRESS` bit, should match the IP of the address you created before.
-
-## See your application on the internet
-
-You should be able to visit this address, and see the nginx homesite!
-> NB: if you get an error from Google,
-> try checking your ingress object with `kubectl describe ingress nginx`,
-> the `annotation` called `backends` needs to be `HEALTHY`, like below:
-> ```shell
-> Annotations:
-> ...
-> kubernetes.io/ingress.global-static-ip-name: my-address-name
-> ingress.kubernetes.io/backends: {"":"HEALTHY"}
-> ...
-> ```
-> if the `backend` is `UNKNOWN` and your `ingress.global-static-ip-name`
-> points correctly to the address you created before, don't fear,
-> Google Cloud Load Balancers needs a certain amount of successes on an endpoint,
-> before it starts serving traffic; the backend should become `HEALTHY` within a few minutes.
-
-## DNS Rules
-
-Normally you *COULD* add a dns rule, and say "I want nginx.local to route to this container" and it would look something like this:
-
-```yaml,k8s
-apiVersion: extensions/v1beta1
-kind: Ingress
-metadata:
- name: my-ingress
-spec:
- rules:
- - host: nginx.local
- http:
- paths:
- - path: /
- backend:
- serviceName: ingress-test
- servicePort: replaceport
-```
-
-Because GKE "makes ingress easy", these things need a DNS setup on GKE which we are not going to do. But this should give an impression of ingress.
-
-I thoroughly recommend looking at minikube and ingress, if you plan to use this more extensively.
diff --git a/kubernetes-exercises/old/extras/08-ingress-nginx.md b/kubernetes-exercises/old/extras/08-ingress-nginx.md
deleted file mode 100644
index d46a86c..0000000
--- a/kubernetes-exercises/old/extras/08-ingress-nginx.md
+++ /dev/null
@@ -1,74 +0,0 @@
-# Ingress
-If we look at Service as an endpoint, then the Kubernetes ingress object is a DNS.
-It takes care of things like load balancing traffic, terminating SSL and naming among other things.
-
-To enable an ingress object, we need an ingress controller. In this example we will be using [NGINX](https://www.nginx.com/). If you prefer [Træfik (optimized for Kubernetes) there is another exercise doing it with Træfik](./03-ingress-traefik.md).
-
-To get started with NGINX ingress, we (re)deploy an app of our choice:
-```shell
-kubectl create deployment ingress-test --image=
-kubectl scale deployment ingress-test --replicas=3
-kubectl expose deployment ingress-test --port=
-```
-
-The NGINX ingress controller requires a default backend which serves as a fallback for nginx in case a request fails.
-It will:
-- Serve a 404 page at /
-- Serve 200 on /healthz
-
-The [example deployment file for nginx-ingress-controller](ingress-nginx/nginx-backend/nginx-backend.yml) is taken from [kubernetes/ingress-nginx](https://github.com/kubernetes/ingress-nginx), as is the [service exposing the backend](ingress-nginx/nginx-backend/nginx-service.yml).
-
-Deploy by running:
-```shell
-kubectl create -f ingress-nginx/nginx-backend/.
-```
-
-We will need a certificate for NGINX, which has been prepared in [a script](ingress-nginx/self-signed-cert.sh). We will need to turn that into a secret.
-
-When prompted to put a "common name" in the certificate, write myapp.local (*important!*). This is going to be our host rule for our ingress later.
-
-```shell
-./ingress-nginx/self-signed-cert.sh
-kubectl create secret tls tls-certificate --key tls-key.key --cert tls-cert.crt
-kubectl create secret generic tls-dhparam --from-file=dhparam.pem
-```
-
-We then have to enable ingress, which is very simple:
-```
-minikube addons enable ingress
-```
-The reason it is not natively enabled, is because early versions of Kubernetes shipped without it.
-
-Enabling gave us:
-- A configmap
- * kubectl get configmap nginx-load-balancer-conf -n kube-system
- * This describes the nginx configuration
-- The nginx-ingress-controller
- * kubectl get rc nginx-ingress-controller -n kube-system
- * This enables us to do ingress
-- A service exposing default NGINX backend pod handling
- * kubectl get svc default-http-backend -n kube-system
- * This serves (together with the deployed yaml from earlier) the 404 and 200.
-
-
-Nginx can be accessed this way :
-```shell
-curl $(minikube service nginx-ingress --url)
-```
-
-Which will return 404 default backend.
-
-Go and modify [the yaml for your ingress](./ingress-nginx/ingress.yml) to reflect the correct service and deployment.
-
-Ingress works by using the DNS name, so we need to modify our hostfile to reflect the correct name (modify hosts file to include myapp.local pointing to the cluster):
-
-```shell
-echo "$(minikube ip) myapp.local" | sudo tee -a /etc/hosts
-```
-
-To make it work for your cluster, replace the minikube ip with a node ip.
-
-You can now access it on http://myapp.local, though you probably get a https error on the certificate because it was self signed.
-
-This concludes the exercise for ingress.
-
diff --git a/kubernetes-exercises/old/extras/08-ingress-traefik.md b/kubernetes-exercises/old/extras/08-ingress-traefik.md
deleted file mode 100644
index 9ed6337..0000000
--- a/kubernetes-exercises/old/extras/08-ingress-traefik.md
+++ /dev/null
@@ -1,340 +0,0 @@
-# Ingress - Traefik
-If we look at Service as an endpoint, then the Kubernetes ingress object is a DNS look-alike.
-It takes care of things like load balancing traffic, terminating SSL and naming among other things.
-
-To enable an ingress object, we need an ingress controller. In this example we will be using [Træfik](https://traefik.io/). If you prefer [NGINX there is another exercise doing it with NGINX](./05-ingress-nginx.md).
-
-
-
-## Related RBAC configuration:
-Create a file named traefik-rbac.yaml with the following contents. This will setup correct global cluster role binding.
-
-```yaml,k8s
-kind: ClusterRole
-apiVersion: rbac.authorization.k8s.io/v1beta1
-metadata:
- name: traefik-ingress-controller
-rules:
- - apiGroups:
- - ""
- resources:
- - services
- - endpoints
- - secrets
- verbs:
- - get
- - list
- - watch
- - apiGroups:
- - extensions
- resources:
- - ingresses
- verbs:
- - get
- - list
- - watch
----
-kind: ClusterRoleBinding
-apiVersion: rbac.authorization.k8s.io/v1beta1
-metadata:
- name: traefik-ingress-controller
-roleRef:
- apiGroup: rbac.authorization.k8s.io
- kind: ClusterRole
- name: traefik-ingress-controller
-subjects:
-- kind: ServiceAccount
- name: traefik-ingress-controller
- namespace: kube-system
-```
-
-Create the traefik RBAC configuration using:
-```shell
-kubectl create -f ingress-traefik/traefik-rbac.yaml
-```
-
-## Deploy Traefik:
-Create a file named traefik-deployment.yaml with the following contents.
-
-```yaml,k8s
-apiVersion: v1
-kind: ServiceAccount
-metadata:
- name: traefik-ingress-controller
- namespace: kube-system
----
-kind: Deployment
-apiVersion: apps/v1
-metadata:
- name: traefik-ingress-controller
- namespace: kube-system
- labels:
- k8s-app: traefik-ingress-lb
-spec:
- replicas: 1
- selector:
- matchLabels:
- k8s-app: traefik-ingress-lb
- template:
- metadata:
- labels:
- k8s-app: traefik-ingress-lb
- name: traefik-ingress-lb
- spec:
- serviceAccountName: traefik-ingress-controller
- terminationGracePeriodSeconds: 60
- containers:
- - image: traefik
- name: traefik-ingress-lb
- ports:
- - name: http
- containerPort: 80
- - name: admin
- containerPort: 8080
- args:
- - --api
- - --kubernetes
- - --logLevel=INFO
----
-kind: Service
-apiVersion: v1
-metadata:
- name: traefik-ingress-service
- namespace: kube-system
-spec:
- selector:
- k8s-app: traefik-ingress-lb
- ports:
- - protocol: TCP
- port: 80
- name: web
- - protocol: TCP
- port: 8080
- name: admin
- type: LoadBalancer
-```
-**Note: You can also use type: NodePort** in the Service section above.
-
-
-Create the objects defined in the traefik-deployment.yaml:
-```shell
-kubectl create -f ingress-traefik/traefik-deployment.yaml
-```
-
-
-## Create Ingress for Traefik Web-UI:
-Create a file traefik-webui-ingress.yaml with the following contents to create a Service and an Ingress that will expose the Traefik Web UI.
-```yaml,k8s
-apiVersion: v1
-kind: Service
-metadata:
- name: traefik-web-ui
- namespace: kube-system
-spec:
- selector:
- k8s-app: traefik-ingress-lb
- ports:
- - name: web
- port: 80
- targetPort: 8080
----
-apiVersion: extensions/v1beta1
-kind: Ingress
-metadata:
- name: traefik-web-ui
- namespace: kube-system
-spec:
- rules:
- - host: traefik-ui.example.com
- http:
- paths:
- - path: /
- backend:
- serviceName: traefik-web-ui
- servicePort: web
-```
-
-Create the objects:
-```shell
-kubectl create -f traefik-webui-ingress.yaml
-```
-
-
-You can check the public IP of the Traefik service, and on your local computer, edit the `/etc/hosts` file to set up name resolution for this IP as:
-
-```
-127.0.0.1 localhost localhost.localdomain
-35.240.21.22 traefik-ui.example.com www.example.com
-```
-
-OR. If you have a domain under your control, setup DNS accordingly. You can use any other DNS name for your setup other than example.com.
-
-Now visit the address `traefik-ui.example.com` , you should see a dashboard.
-
-![](ingress-traefik/traefik-dashboard.png)
-
-## Setup additional ingress for your application(s):
-It's time to setup an additional service for any of our application. For now, I will use a simple nginx web server. Create a file examplenginx-deployment.yaml with the following contents:
-
-```yaml,k8s
-apiVersion: apps/v1
-kind: Deployment
-metadata:
- name: nginx
- labels:
- app: nginx
-spec:
- replicas: 1
- selector:
- matchLabels:
- app: nginx
- template:
- metadata:
- labels:
- app: nginx
- spec:
- containers:
- - name: nginx
- image: nginx:1.7.9
- ports:
- - containerPort: 80
-
----
-
-apiVersion: v1
-kind: Service
-metadata:
- name: nginx
- labels:
- name: nginx
- app: nginx
-spec:
- ports:
- - port: 80
- selector:
- app: nginx
-
----
-
-apiVersion: extensions/v1beta1
-kind: Ingress
-metadata:
- namespace: default
- name: example-nginx-ingress
- labels:
- app: nginx
-spec:
- rules:
- - host: www.example.com
- http:
- paths:
- - path: /
- backend:
- serviceName: nginx
- servicePort: 80
-```
-
-Create the objects from the above file:
-
-```shell
-kubectl create -f ingress-traefik/example-nginx-deployment.yaml
-```
-
-
-If you visit the Traefik dashboard now, you should be able to see a new ingress pop up. Visit the web page `www.example.com` to verify that you can access the nginx web server.
-
-![](ingress-traefik/nginx-on-traefik-dashboard.png)
-
-
-Visiting www.example.com should show nginx webpage:
-
-```shell
-$ curl www.example.com
-
-
-
-Welcome to nginx!
-
-
-
-Welcome to nginx!
-If you see this page, the nginx web server is successfully installed and
-working. Further configuration is required.
-
-For online documentation and support please refer to
-nginx.org.
-Commercial support is available at
-nginx.com.
-
-Thank you for using nginx.
-
-
-```
-
-
-------------
-(Ignore anything below this line - for now)
-
-
-
-
-
-
-
-
-So, therefore we start with the ingress controller:
-```shell
-kubectl create -f ingress-traefik/traefik-ingress-controller.yml
-```
-
-Ingress has a nice little GUI which shows current ingress rules and settings in a cluster, which we can take advantage of to create an overview.
-
-Create the service:
-```shell
-kubectl create -f ingress-traefik/traefik-service.yml
-```
-... and the ingress rule:
-```shell
-kubectl create -f ingress-traefik/traefik-ingress.yml
-```
-
-Instead of going through the trouble of setting up a proper DNS, we can modify the host file - below is an example of doing this for minikube:
-```shell
-echo "$(minikube ip) traefik-ui.local" | sudo tee -a /etc/hosts
-```
-
-To make it work for your cluster, replace the minikube ip with a node ip.
-
-Which means you can access it like by clicking http://traefik-ui.local
-
-So the magic here is that:
-- You send a request which is translated to the node ip
-- The node looks up the incoming name record and finds it in an ingress.
-- The ingress rule says that traffic from traefik-ui.local needs to go to backend service 'traefik-web-ui' on port 80
- * kubectl get svc traefik-web-ui -n kube-system
-- The service then redirects to the container, in this case the ingress controller itself, on port 8080.
-
-Let's try with a different container. Deploy any given image and expose a service for it.
-
-```shell
-kubectl create deployment ingress-test --image=
-kubectl scale deployment ingress-test --replicas=3
-kubectl expose deployment ingress-test --port=
-```
-
-Then [go to the ingress] and modify the port (servicePort: replaceport), followed by:
-```shell
-kubectl create -f ingress-traefik/my-ingress.yml
-echo "$(minikube ip) myapp.local" | sudo tee -a /etc/hosts
-```
-
-Access it on http://myapp.local.
-
-This concludes the exercise for ingress.
-
diff --git a/kubernetes-exercises/old/extras/09-helm-package-manager.md b/kubernetes-exercises/old/extras/09-helm-package-manager.md
deleted file mode 100644
index 653325e..0000000
--- a/kubernetes-exercises/old/extras/09-helm-package-manager.md
+++ /dev/null
@@ -1,169 +0,0 @@
-# The Kubernetes package manager
-
-## Learning goal
-
-- Try the Helm cli to spin up a chart
-
-## Introduction
-
-[Enter Helm](https://github.com/helm/helm) - the
-answer to how to package multi-container
-applications, and how to easily install packages
-on Kubernetes.
-
-Helm helps you to:
-
-- Achieve a simple (one command) and repeatable
- deployment
-- Manage application dependency, using specific
- versions of other application and services
-- Manage multiple deployment configurations: test,
- staging, production and others
-- Execute post/pre deployment jobs during
- application deployment
-- Update/rollback and test application deployments
-
-## Using helm charts
-
-Helm uses a packaging format called charts. A
-Chart is a collection of files that describe k8s
-resources.
-
-
- More details
-Charts can be simple, describing something like a
-standalone web server but they can also be more
-complex, for example, a chart that represents a
-full web application stack included web servers,
-databases, proxies, etc.
-
-Instead of installing k8s resources manually via
-kubectl, we can use Helm to install pre-defined
-Charts faster, with less chance of typos or other
-operator errors.
-
-When you install Helm, it does not have a
-connection to any default repositories. This is
-because Helm wants to decouple the application to
-the repository in use.
-
-One of the largest Chart Repositories is the
-[BitNami Chart Repository](https://charts.bitnami.com/bitnami)
-is however going to be used in these exercises.
-
-The chart repository are very dynamic due to
-updates and new additions. To keep Helm's local
-list updated with all these changes, we need to
-occasionally run the
-[repository update](https://docs.helm.sh/helm/#helm-repo-update)
-command.
-
-
-
-## Exercise
-
-### Overview
-
-- Add a chart repository to your helm cli
-- Install Nginx chart
-- Access the Nginx load balanced service
-- Look at the status of the deployment with
- `helm ls`
-- Clean up the chart deployment
-
-### Step by step
-
-
- More details
-
-**Add a chart repository to your helm cli**
-
-To install the Bitnami Helm Repo and update Helm's
-local list of Charts, run:
-
-- `helm repo add bitnami https://charts.bitnami.com/bitnami`
-- `helm repo update`
-
-**Install Nginx Chart**
-
-To get something installed fasted and easy we have
-chosen the Nginx chart.
-
-- `helm install my-release bitnami/nginx`
-
-This command creates a release called `my-release`
-with the bitnami/nginx chart.
-
-The command will output information about your
-newly deployed mysql setup similar to this:
-
-```
-NAME: my-release
-LAST DEPLOYED: Tue Apr 20 12:46:10 2021
-NAMESPACE: user1
-STATUS: deployed
-REVISION: 1
-TEST SUITE: None
-NOTES:
-** Please be patient while the chart is being deployed **
-
-NGINX can be accessed through the following DNS name from within your cluster:
-
- my-release-nginx.user1.svc.cluster.local (port 80)
-
-To access NGINX from outside the cluster, follow the steps below:
-
-1. Get the NGINX URL by running these commands:
-
- NOTE: It may take a few minutes for the LoadBalancer IP to be available.
- Watch the status with: 'kubectl get svc --namespace user1 -w my-release-nginx'
-
- export SERVICE_PORT=$(kubectl get --namespace user1 -o jsonpath="{.spec.ports[0].port}" services my-release-nginx)
- export SERVICE_IP=$(kubectl get svc --namespace user1 my-release-nginx -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
- echo "http://${SERVICE_IP}:${SERVICE_PORT}"
-```
-
-**Access the Nginx load balanced service**
-
-Get the external IP and port with the following
-three commands.
-
-- `export SERVICE_PORT=$(kubectl get --namespace user1 -o jsonpath="{.spec.ports[0].port}" services my-release-nginx)`
-- `export SERVICE_IP=$(kubectl get svc --namespace user1 my-release-nginx -o jsonpath='{.status.loadBalancer.ingress[0].ip}')`
-- `echo "http://${SERVICE_IP}:${SERVICE_PORT}"`
-- Navigate your browser to the url printed out by
- the last command
-
-**Look at the status of the deployment with `helm`
-and `kubectl`**
-
-Running `helm ls` will show all current
-deployments.
-
-- Run `helm ls` and observe that you have a
- release named `my-release`
-- Run `kubectl get pods,deployments,svc` and look
- at a few of the kubernetes objects the release
- created.
-
-> :bulb: As said before Helm deals with the
-> concept of
-> [charts](https://github.com/kubernetes/charts)
-> for its deployment logic. bitnami/nginx was a
-> chart,
-> [found here](https://github.com/bitnami/charts/tree/master/bitnami/nginx)
-> that describes how helm should deploy it. It
-> interpolates values into the deployment, which
-> for nginx looks
-> [like this](https://github.com/bitnami/charts/blob/master/bitnami/nginx/templates/deployment.yaml).
-> The charts describe which values can be given
-> for overwriting default behavior, and there is
-> an active community around it.
-
-**Clean up the chart deployment**
-
-To remove the `my-release` release run:
-
-- `helm uninstall my-release`
-
-
diff --git a/kubernetes-exercises/old/extras/10-secrets-ssl-certs-in-nginx.md b/kubernetes-exercises/old/extras/10-secrets-ssl-certs-in-nginx.md
deleted file mode 100644
index 24a22d6..0000000
--- a/kubernetes-exercises/old/extras/10-secrets-ssl-certs-in-nginx.md
+++ /dev/null
@@ -1,51 +0,0 @@
-# Kubernetes secrets
-
-The objective of this exercise use SSL certs in nginx, using secrets.
-
-Generate self signed certs: (check support-files/ directory)
-```
-./generate-self-signed-certs.sh
-```
-This will create `tls.*` files.
-
-
-Create (tls type) secret for nginx:
-
-```
-kubectl create secret tls nginx-certs --cert=tls.crt --key=tls.key
-```
-
-Examine the secret you just created:
-```
-kubectl describe secret nginx-certs
-```
-
-```
-kubectl get secret nginx-certs -o yaml
-```
-
-
-Create configmap for nginx: (check support-files/ directory)
-```
-kubectl create configmap nginx-config --from-file=nginx-connectors.conf
-```
-
-Examine the configmap you just created:
-
-```
-kubectl describe configmap nginx-config
-```
-
-```
-kubectl get configmap nginx-config -o yaml
-```
-
-
-Create a nginx deployment with SSL support using the secret and config map you created in the previous steps (above): (check support-files/ directory)
-```
-kubectl create -f nginx-ssl.yaml
-```
-
-You should be able to see nginx running. Expose it as a service and curl it from your computer. You can also curl it through the multitool pod from within the cluster.
-
-
diff --git a/kubernetes-exercises/old/health-checks/probes-svc.yaml b/kubernetes-exercises/old/health-checks/probes-svc.yaml
deleted file mode 100644
index 8b87214..0000000
--- a/kubernetes-exercises/old/health-checks/probes-svc.yaml
+++ /dev/null
@@ -1,12 +0,0 @@
-apiVersion: v1
-kind: Service
-metadata:
- name: probe
-spec:
- ports:
- - port: 80
- protocol: TCP
- targetPort: 80
- selector:
- app: probe
- type: NodePort
diff --git a/kubernetes-exercises/old/health-checks/probes.yaml b/kubernetes-exercises/old/health-checks/probes.yaml
deleted file mode 100644
index 4c83090..0000000
--- a/kubernetes-exercises/old/health-checks/probes.yaml
+++ /dev/null
@@ -1,38 +0,0 @@
-apiVersion: apps/v1
-kind: Deployment
-metadata:
- name: probe
-spec:
- replicas: 1
- selector:
- matchLabels:
- app: probe
- template:
- metadata:
- labels:
- app: probe
- spec:
- containers:
- - name: probe
- image: ghcr.io/eficode-academy/network-multitool
- command: ['sh', '-c', 'touch /tmp/alive && touch /tmp/ready && /docker/entrypoint.sh /usr/sbin/nginx -g "daemon off;"']
- resources:
- limits:
- memory: "128Mi"
- cpu: "500m"
- ports:
- - containerPort: 80
- livenessProbe:
- exec:
- command:
- - cat
- - /tmp/alive
- initialDelaySeconds: 5
- periodSeconds: 5
- readinessProbe:
- exec:
- command:
- - cat
- - /tmp/ready
- initialDelaySeconds: 5
- periodSeconds: 5
diff --git a/kubernetes-exercises/old/ingress-gke/ingress.yml b/kubernetes-exercises/old/ingress-gke/ingress.yml
deleted file mode 100644
index d8b724d..0000000
--- a/kubernetes-exercises/old/ingress-gke/ingress.yml
+++ /dev/null
@@ -1,10 +0,0 @@
-apiVersion: extensions/v1beta1
-kind: Ingress
-metadata:
- name: nginx
- annotations:
- kubernetes.io/ingress.global-static-ip-name: "kubernetes-ingress"
-spec:
- backend:
- serviceName: nginx
- servicePort: 80
diff --git a/kubernetes-exercises/old/ingress-nginx/ingress.yml b/kubernetes-exercises/old/ingress-nginx/ingress.yml
deleted file mode 100644
index 67bc999..0000000
--- a/kubernetes-exercises/old/ingress-nginx/ingress.yml
+++ /dev/null
@@ -1,20 +0,0 @@
-apiVersion: extensions/v1beta1
-kind: Ingress
-metadata:
- name: my-first-ingress
- annotations:
- kubernetes.io/ingress.class: "nginx"
- nginx.org/ssl-services: "my-service"
-spec:
- tls:
- - hosts:
- - myapp.local
- secretName: tls-certificate
- rules:
- - host: myapp.local
- http:
- paths:
- - path: /
- backend:
- serviceName:
- servicePort:
\ No newline at end of file
diff --git a/kubernetes-exercises/old/ingress-nginx/nginx-backend/nginx-backend.yml b/kubernetes-exercises/old/ingress-nginx/nginx-backend/nginx-backend.yml
deleted file mode 100644
index 5c18c7f..0000000
--- a/kubernetes-exercises/old/ingress-nginx/nginx-backend/nginx-backend.yml
+++ /dev/null
@@ -1,37 +0,0 @@
-apiVersion: apps/v1
-kind: Deployment
-metadata:
- name: default-http-backend
-spec:
- replicas: 1
- selector:
- matchLabels:
- app: default-http-backend
- template:
- metadata:
- labels:
- app: default-http-backend
- spec:
- terminationGracePeriodSeconds: 60
- containers:
- - name: default-http-backend
- # Any image is permissable as long as:
- # 1. It serves a 404 page at /
- # 2. It serves 200 on a /healthz endpoint
- image: gcr.io/google_containers/defaultbackend:1.0
- livenessProbe:
- httpGet:
- path: /healthz
- port: 8080
- scheme: HTTP
- initialDelaySeconds: 30
- timeoutSeconds: 5
- ports:
- - containerPort: 8080
- resources:
- limits:
- cpu: 10m
- memory: 20Mi
- requests:
- cpu: 10m
- memory: 20Mi
diff --git a/kubernetes-exercises/old/ingress-nginx/nginx-backend/nginx-service.yml b/kubernetes-exercises/old/ingress-nginx/nginx-backend/nginx-service.yml
deleted file mode 100644
index 72a557b..0000000
--- a/kubernetes-exercises/old/ingress-nginx/nginx-backend/nginx-service.yml
+++ /dev/null
@@ -1,12 +0,0 @@
-kind: Service
-apiVersion: v1
-metadata:
- name: default-http-backend
-spec:
- selector:
- app: default-http-backend
- ports:
- - protocol: TCP
- port: 80
- targetPort: 8080
- type: NodePort
\ No newline at end of file
diff --git a/kubernetes-exercises/old/ingress-nginx/nginx-controller-svc.yml b/kubernetes-exercises/old/ingress-nginx/nginx-controller-svc.yml
deleted file mode 100644
index eb17bee..0000000
--- a/kubernetes-exercises/old/ingress-nginx/nginx-controller-svc.yml
+++ /dev/null
@@ -1,72 +0,0 @@
-apiVersion: apps/v1
-kind: Deployment
-metadata:
- name: nginx-ingress-controller
- labels:
- app: nginx-ingress-controller
-spec:
- replicas: 1
- revisionHistoryLimit: 3
- selector:
- matchLabels:
- app: nginx-ingress-controller
- template:
- metadata:
- labels:
- k8s-app: nginx-ingress-lb
- spec:
- containers:
- - args:
- - /nginx-ingress-controller
- - "--default-backend-service=$(POD_NAMESPACE)/default-http-backend"
- - "--default-ssl-certificate=$(POD_NAMESPACE)/tls-certificate"
- env:
- - name: POD_NAME
- valueFrom:
- fieldRef:
- fieldPath: metadata.name
- - name: POD_NAMESPACE
- valueFrom:
- fieldRef:
- fieldPath: metadata.namespace
- image: "gcr.io/google_containers/nginx-ingress-controller:0.9.0-beta.5"
- imagePullPolicy: Always
- livenessProbe:
- httpGet:
- path: /healthz
- port: 10254
- scheme: HTTP
- initialDelaySeconds: 10
- timeoutSeconds: 5
- name: nginx-ingress-controller
- ports:
- - containerPort: 80
- name: http
- protocol: TCP
- - containerPort: 443
- name: https
- protocol: TCP
- volumeMounts:
- - mountPath: /etc/nginx-ssl/dhparam
- name: tls-dhparam-vol
- terminationGracePeriodSeconds: 60
- volumes:
- - name: tls-dhparam-vol
- secret:
- secretName: tls-dhparam
----
-apiVersion: v1
-kind: Service
-metadata:
- name: nginx-ingress
-spec:
- type: LoadBalancer
- ports:
- - name: http
- port: 80
- targetPort: http
- - name: https
- port: 443
- targetPort: https
- selector:
- k8s-app: nginx-ingress-lb
\ No newline at end of file
diff --git a/kubernetes-exercises/old/ingress-nginx/self-signed-cert.sh b/kubernetes-exercises/old/ingress-nginx/self-signed-cert.sh
deleted file mode 100755
index 4425be1..0000000
--- a/kubernetes-exercises/old/ingress-nginx/self-signed-cert.sh
+++ /dev/null
@@ -1,2 +0,0 @@
-openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout tls-key.key -out tls-cert.crt
-curl https://ssl-config.mozilla.org/ffdhe2048.txt > dhparam.pem
diff --git a/kubernetes-exercises/old/ingress-traefik/README.md b/kubernetes-exercises/old/ingress-traefik/README.md
deleted file mode 100644
index 7a8fcb5..0000000
--- a/kubernetes-exercises/old/ingress-traefik/README.md
+++ /dev/null
@@ -1 +0,0 @@
-Follow: [https://github.com/traefik/traefik/blob/v1.7/docs/user-guide/kubernetes.md](https://github.com/traefik/traefik/blob/v1.7/docs/user-guide/kubernetes.md)
diff --git a/kubernetes-exercises/old/ingress-traefik/example-ingress.yaml b/kubernetes-exercises/old/ingress-traefik/example-ingress.yaml
deleted file mode 100644
index 8be7fb5..0000000
--- a/kubernetes-exercises/old/ingress-traefik/example-ingress.yaml
+++ /dev/null
@@ -1,56 +0,0 @@
-apiVersion: apps/v1
-kind: Deployment
-metadata:
- name: nginx
- labels:
- app: nginx
-spec:
- replicas: 1
- selector:
- matchLabels:
- app: nginx
- template:
- metadata:
- labels:
- app: nginx
- spec:
- containers:
- - name: nginx
- image: nginx:1.7.9
- ports:
- - containerPort: 80
-
----
-
-apiVersion: v1
-kind: Service
-metadata:
- name: nginx
- labels:
- name: nginx
- app: nginx
-spec:
- ports:
- - port: 80
- selector:
- app: nginx
-
----
-
-apiVersion: extensions/v1beta1
-kind: Ingress
-metadata:
- namespace: default
- name: example-nginx-ingress
- labels:
- app: nginx
-spec:
- rules:
- - host: www.example.com
- http:
- paths:
- - path: /
- backend:
- serviceName: nginx
- servicePort: 80
-
diff --git a/kubernetes-exercises/old/ingress-traefik/my-ingress.yml b/kubernetes-exercises/old/ingress-traefik/my-ingress.yml
deleted file mode 100644
index 158277a..0000000
--- a/kubernetes-exercises/old/ingress-traefik/my-ingress.yml
+++ /dev/null
@@ -1,13 +0,0 @@
-apiVersion: extensions/v1beta1
-kind: Ingress
-metadata:
- name: my-ingress
-spec:
- rules:
- - host: myapp.local
- http:
- paths:
- - path: /
- backend:
- serviceName: ingress-test
- servicePort: replaceport
\ No newline at end of file
diff --git a/kubernetes-exercises/old/ingress-traefik/nginx-on-traefik-dashboard.png b/kubernetes-exercises/old/ingress-traefik/nginx-on-traefik-dashboard.png
deleted file mode 100644
index 67e41cd6835df8b42aa803eca91ba16947348ddf..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 158126
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