1. Create 2 VMs on AWS
export MY_ACCESS_KEY_ID=….
export MY_SECRET_ACCESS_KEY=……

docker-machine create --driver amazonec2 \
   --amazonec2-access-key $MY_ACCESS_KEY_ID \
   --amazonec2-secret-key $MY_SECRET_ACCESS_KEY \
   --amazonec2-region eu-central-1 \
   --amazonec2-instance-type m5.large \
   k8s-master

docker-machine create --driver amazonec2 \
   --amazonec2-access-key $MY_ACCESS_KEY_ID \
   --amazonec2-secret-key $MY_SECRET_ACCESS_KEY \
   --amazonec2-region eu-central-1 \
   --amazonec2-instance-type m5.large \
   k8s-node

2. Install k8s via kubeadm on master node 
docker-machine ssh k8s-master
sudo su -

sudo apt-get update && sudo apt-get install -y apt-transport-https curl

curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -

cat <<EOF | sudo tee /etc/apt/sources.list.d/kubernetes.list
deb https://apt.kubernetes.io/ kubernetes-xenial main
EOF
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl

kubeadm init

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

3. Install k8s via kubeadm on the worker node (join cluster)
docker-machine ssh k8s-node
sudo su -

sudo apt-get update && sudo apt-get install -y apt-transport-https curl

curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -

cat <<EOF | sudo tee /etc/apt/sources.list.d/kubernetes.list
deb https://apt.kubernetes.io/ kubernetes-xenial main
EOF
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl

kubeadm join 172.31.21.130:6443 --token [TOKEN….] --discovery-token-ca-cert-hash [SHA….]

4. Install network layer (weave)
docker-machine ssh k8s-master
kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"
kubectl get nodes

5. Install ingress controller
docker-machine ssh k8s-master
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v0.43.0/deploy/static/provider/baremetal/deploy.yaml

6. Create ALB
NGINX_NODE_PORT=$(kubectl get svc -n ingress-nginx ingress-nginx-controller -ojsonpath='{.spec.ports[?(@.name=="http")].nodePort}')
Add both k8s-master and k8s-node public IPs to ALB’s target group ($NGINX_NODE_PORT), set health checks /healthz

7. Create custom web app
kubectl create deploy web --image gcr.io/google-samples/hello-app:1.0 --port=8080
kubectl expose deploy web --target-port 8080

export DNS=webapp.k8s.maslick.tech

cat <<EOF | kubectl apply -f -
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: web
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
    - host: $DNS
      http:
        paths:
          - path: /
            backend:
              serviceName: web
              servicePort: 8080
EOF