Kubernetes Hands-On - Deploy Microservices to the AWS Cloud

Docker swarm is Docker's built in orchestration tool.

Manifest == yaml file.

kubectl == controller program for k8s

install kubectl: https://kubernetes.io/docs/tasks/tools/install-kubectl-macos

curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/darwin/amd64/kubectl"

curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/darwin/amd64/kubectl.sha256"

echo "$(<kubectl.sha256) kubectl" | shasum -a 256 --check

chmod +x ./kubectl

sudo mv ./kubectl /usr/local/bin/kubectl

sudo chown root: /usr/local/bin/kubectl

kubectl version --client

kubectl

install minikube

curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-darwin-amd64

sudo install minikube-darwin-amd64 /usr/local/bin/minikube

minikube start # Downloads files on the first time

docker image == definition of container (environmental variables, etc. as a binary file)

install docker: https://docs.docker.com/desktop/mac/install/

docker image ls

You can see images in your minikube

minikube docker-env

eval $(minikube -p minikube docker-env)

docker image ls

Running Containers from DockerHub

https://hub.docker.com/r/richardchesterwood/k8s-fleetman-webapp-angular

https://hub.docker.com/r/richardchesterwood/k8s-fleetman-webapp-angular/tags?page=1&ordering=last_updated

https://github.com/DickChesterwood/k8s-fleetman

https://github.com/DickChesterwood/k8s-fleetman/tree/master/k8s-fleetman-webapp-angular

minikube start

eval $(minikube -p minikube docker-env)

docker image ls # should see k8s stuff

docker image pull richardchesterwood/k8s-fleetman-webapp-angular:release0-5

docker container run -p 80:80 -d richardchesterwood/k8s-fleetman-webapp-angular:release0-5

Left is expose to outside world | right is port internally

docker container ls

Docker is running on the Daemon inside a virtual machine (minikube)

Find IP address of minikube host

minikube ip

go to that link at add :80

docker container stop 488 (first three characters of container_id)

docker container rm 488

Pods

https://kubernetes.io/docs/concepts/workloads/pods/

A pod is a wrapper for a container. Can have more than one container in a pod. A unit of deployment.

Create a pod for a docker image

https://kubernetes.io/docs/reference/kubernetes-api/workload-resources/pod-v1/

https://kubernetes.io/docs/concepts/workloads/pods/#pod-templates

https://kubernetes.io/docs/tutorials/kubernetes-basics/create-cluster/cluster-interactive/

example:

apiVersion: v1

kind: Pod

metadata:

name: pod-example

spec:

containers:

- name: ubuntu

image: ubuntu:trusty

command: ["echo"]

args: ["Hello World"]


minikube status

first-pod.yml:

apiVersion: v1

kind: Pod

metadata:

name: webapp

labels:

app: webapp

release: "0"

spec:

containers:

- name: webapp

image: richardchesterwood/k8s-fleetman-webapp-angular:release0


---

apiVersion: v1

kind: Pod

metadata:

name: webapp-release-0-5

labels:

app: webapp

release: "0-5"

spec:

containers:

- name: webapp

image: richardchesterwood/k8s-fleetman-webapp-angular:release0-5


Everything defined in k8s cluster:

kubectl get all

Deploy a pod to the cluster:

kubectl apply -f first-pod.yml

pods are not visible outside the cluster

kubectl describe pod webapp

connect to the pod and execute command against pod:

kubectl exec webapp -- ls

kubectl -it exec webapp -- sh

ls

wget http://localhost:80

cat index.html

exit

Services

https://kubernetes.io/docs/concepts/services-networking/

https://kubernetes.io/docs/concepts/services-networking/service/

IP address and fixed stable port

Pod can have label KEY: VALUE pair

Service has selector KEY: VALUE pair

kubectl get all

kubectl describe pod webapp

apiVersion: v1

kind: Service

metadata:

# Ensure unique

name: service-example

spec:

ports:

- name: http

port: 80

targetPort: 80

selector:

app: nginx

type: LoadBalancer # Advanced option

# ClusterIP # internal service

# NodePort # ports > 30000

webapp-service.yml:

apiVersion: v1

kind: Service

metadata:

name: fleetman-webapp

spec:

# This defines which pods are going to be represente by the service

# This service becomes a network endpoint for either other services

# or maybe external users to connect to (eg browser)

selector:

app: webapp

release: "0"

ports:

- name: http

port: 80

nodePort: 30080 # ports > 30000

type: NodePort # internal service


kubectl apply -f webapp-service.yml

kubectl get all

minikube ip

Still can't get to the IP

Fix label in first-pod.yml:

kubectl apply -f webapp-service.yml

kubectl apply -f first-pod.yml

add release label and selector. Add another pod with new release. No downtime. Add to same pod file

kubectl apply -f webapp-service.yml

kubectl apply -f first-pod.yml

kubectl describe svc fleetman-webapp

switch selector to 0-5. chrome was caching webpage so opened in firefox and saw new webpage.

kubectl get po --show-labels

kubectl get po --show-labels -l release=0

Exercise: Deploy ActiveMQ as a Pod and Service

https://hub.docker.com/layers/richardchesterwood/k8s-fleetman-queue/release1/images/sha256-b006441c389a6117faa5106835950a84c897048cc11c7b2e469a1b0a03d0f420?context=explore

deploy image. port 8161 is admin console. username admin password admin. Expose browser to 30010.

mv first-pod.yml to pods.yml. mv webapp-service.yml to servies.yml

kubectl apply -f .

ReplicaSets