Тема: Оркестрація контейнерів у Kubernetes.
Розгортання Kubernetes-кластера (локально або в хмарі); опис розгортання у YAML-маніфестах (Deployment, Service, ConfigMap); масштабування подів та налаштування Horizontal Pod Autoscaler; оновлення застосунку без простою (Rolling Update).
Мета: Набути практичні навички розгортання контейнеризованих застосунків у Kubernetes, роботи з YAML-маніфестами, масштабування та виконання оновлень без простою сервісу.
Технологічний стек:
kubectl:
# Linux
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl
# macOS (Homebrew)
brew install kubectl
# Windows (winget)
winget install Kubernetes.kubectl
Minikube:
# Linux
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube
# macOS
brew install minikube
# Windows (Chocolatey)
choco install minikube
# або winget:
winget install Kubernetes.minikube
Запуск кластера:
minikube start --driver=docker --cpus=2 --memory=2g
# Перевірка
kubectl cluster-info
kubectl get nodes
minikube dashboard # Відкриває веб-UI
Створіть файл deployment.yaml:
apiVersion: apps/v1
kind: Deployment
metadata:
name: lab07-app
labels:
app: lab07-app
spec:
replicas: 2
selector:
matchLabels:
app: lab07-app
template:
metadata:
labels:
app: lab07-app
spec:
containers:
- name: app
image: <your-dockerhub-username>/lab06-app:1.0 # Образ з Лаб. №6
# Або використайте готовий образ:
# image: nginx:1.25-alpine
ports:
- containerPort: 3000
env:
- name: APP_VERSION
value: "1.0.0"
resources:
requests:
memory: "64Mi"
cpu: "50m"
limits:
memory: "128Mi"
cpu: "200m"
readinessProbe:
httpGet:
path: /health
port: 3000
initialDelaySeconds: 5
periodSeconds: 10
Застосуйте маніфест:
kubectl apply -f deployment.yaml
# Слідкуйте за розгортанням
kubectl get pods -w
kubectl rollout status deployment/lab07-app
# Деталі Deployment
kubectl describe deployment lab07-app
Створіть service.yaml:
apiVersion: v1
kind: Service
metadata:
name: lab07-service
spec:
type: NodePort # або LoadBalancer у реальному хмарному кластері
selector:
app: lab07-app
ports:
- protocol: TCP
port: 80 # порт Service
targetPort: 3000 # порт контейнера
nodePort: 30080 # зовнішній порт вузла (30000–32767)
kubectl apply -f service.yaml
# Переглянути Services
kubectl get svc
# Відкрити застосунок через Minikube
minikube service lab07-service
# або через тунель:
kubectl port-forward svc/lab07-service 8080:80
# Відкрийте http://localhost:8080
# Pods
kubectl get pods
kubectl get pods -o wide # З IP та нодою
kubectl describe pod <pod-name>
kubectl logs <pod-name>
kubectl exec -it <pod-name> -- /bin/sh # Вхід у Pod
# Deployments
kubectl get deployments
kubectl get deploy lab07-app -o yaml # Повний YAML
# Services
kubectl get services
kubectl get all # Всі ресурси
# Збільшити кількість реплік до 4
kubectl scale deployment lab07-app --replicas=4
# Спостерігати за появою нових подів
kubectl get pods -w
# Зменшити до 1
kubectl scale deployment lab07-app --replicas=1
# Перевірити розподіл навантаження (кожен запит може йти до різного пода)
for i in {1..5}; do curl -s $(minikube service lab07-service --url) | grep Hostname; done
# Оновити образ на нову версію
kubectl set image deployment/lab07-app app=<username>/lab06-app:latest
# Або — відредагуйте deployment.yaml (змініть image tag) та:
kubectl apply -f deployment.yaml
# Слідкуйте за ходом оновлення
kubectl rollout status deployment/lab07-app
# Переглянути історію оновлень
kubectl rollout history deployment/lab07-app
# Відкат до попередньої версії (якщо щось пішло не так)
kubectl rollout undo deployment/lab07-app
Створіть configmap.yaml:
apiVersion: v1
kind: ConfigMap
metadata:
name: lab07-config
data:
APP_VERSION: "2.0.0"
LOG_LEVEL: "info"
WELCOME_MSG: "Hello from ConfigMap!"
Оновіть deployment.yaml для використання ConfigMap:
envFrom:
- configMapRef:
name: lab07-config
kubectl apply -f configmap.yaml
kubectl apply -f deployment.yaml
# Переконайтесь, що змінні передані в Pod
kubectl exec -it <pod-name> -- env | grep APP_VERSION
deployment.yaml та service.yamlkubectl get pods -o wide після розгортання (2 репліки)kubectl get pods до та після масштабування (1→4→1 репліки)kubectl rollout history deployment/lab07-applab07.md