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://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
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 .