Aplikacja podzielona jest na katalog "frontend" (React), "backend" (Express łączący się wewnątrz klastra z Mongo i Redisem) oraz "k8s" zawierający wszystkie pliki konfiguracyjne Kubernetesa. Aplikacja służy do dodawania i usuwania dowolnych komentarzy do bazy Mongo lub Redis. W Mongo dane są trwałe, a w Redisie ulotne. Frontend posiada trzy instancje, których ilość można zmniejszyć/zwiększyć według potrzeb, a Express i bazy danych po jednej.
Preliminaries
# Ensure ingress-nginx is running
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v0.46.0/deploy/static/provider/cloud/deploy.yaml
kubectl get pods -n ingress-nginx -l app.kubernetes.io/name=ingress-nginx
# Ensure kube-dns is running
kubectl get services kube-dns --namespace=kube-system
/k8s
kubectl apply -f .
# Create namespaces
kubectl create namespace development
kubectl create namespace production
# Create context
kubectl config set-context dev --namespace=development --cluster=docker-desktop --user=docker-desktop
kubectl config set-context prod --namespace=production --cluster=docker-desktop --user=docker-desktop
# Switch between context
kubectl config use-context dev
kubectl config use-context prod
# Check current context
kubectl config current-context
kubectl config get-contexts
Zespół deweloperski pracuje nad kolejnymi wersjami aplikacji (w kontekście "dev", żeby nie trzeba było przy każdej komendzie używać flagi --namespace), a każda kolejna wersja jest publikowana za pomocą następujących komend:
/backend
docker build -t backend .
docker tag backend szymonwilczewski/tc-backend:<wersja>
docker push szymonwilczewski/tc-backend:<wersja>
/frontend
docker build -t frontend .
docker tag frontend szymonwilczewski/tc-frontend:<wersja>
docker push szymonwilczewski/tc-frontend:<wersja>
Następnie zmieniany jest tag w deploymencie i po uruchomieniu nowego deploymentu zmiany są widoczne w namespace deweloperskim
/k8s
kubectl apply -f .
Gdy aplikacja jest już gotowa i działa stabilnie zespół deweloperski publikuje "pełną wersję" aplikacji (np. Dev-1.0) i można zmienić tag w deploymencie w namespace produkcyjnym i wprowadzić zmiany
/prod
kubectl config use-context prod
kubectl apply -f .
W razie potrzeby zmiany można w łatwy sposób cofnąć poprzez komendy:
# Rollout history
kubectl rollout history deployment frontend-deployment
# Change rollout version
kubectl rollout undo deployment frontend-deployment [--to-revision=0]