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
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