Skip to content

Run Minikube on EC2

When on ARM MAC or your desktop not powerful enough to run minikube, use this. You can install and run minikube on EC2 instance, enable Ingress controller to expose applications externally as well.

Pre-requisites

  • Create EC2 Instance with Ubuntu, and size t2 small minimum. Use SPOT instance to save cost.

Select Persistent Spot instance to re-use same spot instance. It allow stoop/start instance without losing data.

Install Docker

sudo apt update
sudo apt upgrade -y

sudo apt install -y apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) stable"

sudo apt update
sudo apt install -y docker-ce

sudo usermod -aG docker $USER
``

> Log out and log in again to apply the changes

## Verify Docker Installation

```bash
docker --version
docker run hello-world

Install Kubectl

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/

Install Minikube

curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube
minikube version
minikube start --driver=docker

Install k9s

curl -LO https://github.com/derailed/k9s/releases/latest/download/k9s_Linux_amd64.tar.gz
tar -xvf k9s_Linux_amd64.tar.gz
sudo mv k9s /usr/local/bin/

Enable ingress controller

minikube addons enable ingress

Aliases in profile

echo "
alias k='kubectl' 
alias dk='docker' 
alias kk='k9s' 
ghcr='gh auth token | helm registry login ghcr.io -u dennyvettom --password-stdin'
alias ecrpub='aws ecr-public get-login-password --region us-east-1 | helm registry login --username AWS --password-stdin public.ecr.aws'
alias ingress='kubectl port-forward -n ingress-nginx service/ingress-nginx-controller 8080:80 --address 0.0.0.0 > /dev/null 2>&1 &
alias argo='kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d'
"  >> ~/.bashrc

Deploy a test application

apiVersion: apps/v1
kind: Deployment
metadata:
  name: demo
spec:
  replicas: 1
  selector:
    matchLabels:
      app: demo
  template:
    metadata:
      labels:
        app: demo
    spec:
      containers:
      - name: demo
        image: nginx
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: demo-service
spec:
  selector:
    app: demo
  ports:
  - port: 80
    targetPort: 80
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: demo-ingress
spec:
  ingressClassName: nginx
  rules:
  - host: demo.vettom.online
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: demo-service
            port:
              number: 80

Add Helm and repo

curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-4
chmod 700 get_helm.sh
./get_helm.sh
rm -f get_helm.sh

helm repo add argocd https://argoproj.github.io/argo-helm

Install ArgoCD

# argo-values.yaml
global:
  domain: argo.vettom.online
server:
  extraArgs:
    - --insecure
  ingress:
    enabled: true
    host: argo.vettom.online
    path: /
    ingressClassName: nginx
    annotations:
      kubernetes.io/ingress.class: nginx
      cert-manager.io/cluster-issuer: letsencrypt-prod

Install ArgoCD

helm upgrade -i argocd -n argocd --create-namespace argocd/argo-cd --values argo-values.yaml