Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
W tym artykule opisano praktyczne, skoncentrowane na środowisku produkcyjnym podejścia do migrowania istniejących obciążeń do Azure Kubernetes Service (AKS) i wydawania nowych wersji aplikacji w istniejącym klastrze usługi AKS z minimalnym lub zerowym przestojem.
Szybka odpowiedź: Na potrzeby migracji uruchom równolegle środowisko źródłowe i środowisko AKS oraz stopniowo przekierowuj ruch. W przypadku cyklicznego wdrażania nowej wersji aplikacji w jednym klastrze AKS należy zastosować aktualizację stopniową, wdrożenie kanarkowe lub wdrożenie blue-green w obrębie klastra z sondami gotowości, kontrolowanym przekierowywaniem ruchu, kryteriami observability i przetestowaną procedurą wycofania.
Krótki przewodnik: 5 kroków migracji AKS bez przestojów
- Wdróż docelowy klaster AKS, certyfikaty, sieci i monitorowanie.
- Wdróż aplikację z sondami gotowości i żywotności, ustawieniem PodDisruptionBudget oraz żądaniami zasobów.
- Synchronizuj dane za pomocą replikacji, migawek CSI lub Velero.
- Stopniowo przekierowuj ruch za pomocą względnych wag DNS w usłudze Traffic Manager lub dokładnie określonych procentowych udziałów żądań przy użyciu routingu opartego na zasobie Ingress lub siatce usług.
- Zweryfikuj progi SLO i wycofaj starą infrastrukturę, gdy kryteria stabilności zostaną spełnione.
Uczysz się, jak:
- Wdróż nową wersję aplikacji w istniejącym klastrze AKS bez zastępowania klastra.
- Porównaj strategie migracji Blue-Green, Canary i Rolling DNS.
- Uruchom listę kontrolną gotowości przed migracją przy użyciu poleceń specyficznych dla usługi AKS.
- Wykonaj pełną migrację klastra Blue-Green przy użyciu usługi AKS i Azure Traffic Manager.
- Migrowanie trwałych danych przy użyciu migawek CSI, Azure Files lub Velero.
- Przygotuj plan wycofania przed przełączeniem.
Porównanie strategii migracji
Użyj tego porównania, aby wybrać podejście do migracji, które odpowiada Twojej tolerancji ryzyka, dojrzałości w zakresie obserwowalności oraz wymaganiom dotyczącym wycofania zmian.
| Strategy | Wpływ ruchu | Szybkość wycofywania | Complexity | Funkcje usługi AKS i usługi Azure |
|---|---|---|---|---|
| Blue-Green (klaster lub przestrzeń nazw) | Minimalny, ponieważ ruch przełącza się tylko wtedy, gdy zielony jest w dobrej kondycji | Bardzo szybko, przełączając ruch z powrotem na niebieski | Średni, ponieważ wymaga zduplikowanych środowisk i routingu ruchu | Azure Traffic Manager, publiczne adresy IP modułu LoadBalancer, ruch przychodzący |
| Kanarkowe | Bardzo niskie, ponieważ ruch przesuwa się stopniowo | Szybko, zmniejszając wagę wersji kanarkowej lub zmniejszając liczbę podów kanarkowych | Średnio-wysoki, ponieważ wymaga podziału ruchu i możliwości obserwacji | Warstwa wejściowa (nginx lub Gateway API), siatka usług (Istio lub Linkerd), dodatki warstwy wejściowej AKS |
| Rotacyjny DNS (oparty na TTL) | Zależy od wartości TTL DNS; krótszy TTL zmniejsza wpływ | Średni, ponieważ pamięci podręczne DNS mogą opóźniać wycofywanie | Niska, ponieważ konfiguracja jest prosta, ale mniej precyzyjna | Azure DNS, rekordy DNS o niskim TTL, LoadBalancer lub Ingress |
Macierz podejmowania decyzji o obciążeniu
Użyj tej tabeli, jeśli potrzebujesz szybkiego zalecenia dotyczącego strategii według typu obciążenia.
| Typ obciążenia | Zalecana strategia | Dlaczego | Koszt i złożoność |
|---|---|---|---|
| Bezstanowy interfejs WWW/API | Canary, a następnie Blue-Green na potrzeby końcowego przełączenia | Stopniowe zmniejszanie ryzyka z szybkim wycofywaniem | Medium |
| Aplikacja stanowa oparta na bazie danych | Blue-Green i ścieżka danych replikacji i promowania | Najsilniejsza kontrola cofania zmian i przejrzysta ścieżka przywracania po awarii | High |
| Obciążenia z dużym obciążeniem plików | Blue-Green plus kopia/migawka Azure Files | Łatwiejsza walidacja parzystości danych przed przełączeniem | Średnio-wysoki |
| Długotrwałe zadania/procesy robocze | Stopniowe aktualizowanie lub okno obsługi z opróżnianiem kolejki | Mniejszy wpływ na użytkownika, prostszy routing | Nisko-średni |
Opcje narzędzi progresywnego dostarczania
- Ręczne routowanie z wagami (Traffic Manager plus ingress lub LoadBalancer): najlepsze, gdy zależy Ci na bezpośredniej kontroli operatora oraz prostych zależnościach.
- Routing w siatce usług (Istio lub Linkerd): najlepszy wybór, gdy potrzebujesz precyzyjnego routingu, mechanizmów ponawiania i kontroli zasad.
- Argo Rollouts lub Flagger: najlepszy wybór, gdy chcesz wdrożyć zautomatyzowane wdrażanie progresywne, analizę metryk i automatyczne wycofywanie zmian.
Użyj usługi Traffic Manager do globalnego równoważenia ruchu na poziomie DNS i połącz ją z Argo Rollouts lub Flagger, gdy potrzebujesz automatycznej analizy procesu wdrażania w klastrze.
Wydawanie aplikacji w istniejącym klastrze usługi AKS
Regularne wdrożenia aplikacji nie wymagają drugiego klastra ani przełączenia DNS. W przypadku aplikacji bezstanowej, która jest już uruchomiona w usłudze AKS, użyj rozwiązania Kubernetes Deployment z wieloma replikami i strategią RollingUpdate . Platforma Kubernetes tworzy zasobniki nowej wersji w tym samym klastrze, czeka na ich gotowość, a następnie stopniowo usuwa zasobniki starej wersji.
Poniższy przykład sprawia, że wszystkie istniejące repliki pozostają dostępne, podczas gdy Kubernetes uruchamia po jednym dodatkowym zasobniku:
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
spec:
replicas: 3
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 0
maxSurge: 1
minReadySeconds: 10
progressDeadlineSeconds: 600
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
terminationGracePeriodSeconds: 60
containers:
- name: myapp
image: myregistry.azurecr.io/myapp:v2
ports:
- containerPort: 8080
readinessProbe:
httpGet:
path: /healthz
port: 8080
periodSeconds: 5
failureThreshold: 3
livenessProbe:
httpGet:
path: /live
port: 8080
periodSeconds: 10
failureThreshold: 3
lifecycle:
preStop:
exec:
command: ["/bin/sh", "-c", "sleep 30"]
Upewnij się, że klaster ma wystarczające zasoby dla dodatkowego poda. Zastosuj manifest, monitoruj wdrożenie i sprawdź nowy obraz:
kubectl apply -f manifests/app-deployment.yaml
kubectl rollout status deployment/myapp --timeout=10m
kubectl get pods -l app=myapp -o custom-columns=NAME:.metadata.name,IMAGE:.spec.containers[0].image,READY:.status.containerStatuses[0].ready
W przypadku kolejnych wydań zaktualizuj obraz i monitoruj postęp wdrażania obiektu Deployment:
kubectl set image deployment/myapp myapp=myregistry.azurecr.io/myapp:v3
kubectl rollout status deployment/myapp --timeout=10m
Monitoruj wskaźnik błędów, latencję, gotowość podów i transakcje biznesowe podczas wdrożenia. Jeśli brama zakończy się niepowodzeniem, zatrzymaj lub cofnij wydanie:
kubectl rollout pause deployment/myapp
kubectl rollout undo deployment/myapp
kubectl rollout status deployment/myapp --timeout=10m
Zasobnik PodDisruptionBudget chroni repliki podczas dobrowolnych operacji eksmisji, takich jak opróżnianie węzłów, ale nie kontroluje Deployment sposobu zastępowania zasobników podczas wdrażania aplikacji. Użyj funkcji maxUnavailable i maxSurge , aby kontrolować dostępność wersji. W przypadku aplikacji, które wymagają procentowego podziału ruchu na poziomie żądań lub zautomatyzowanej analizy metryk, uruchom stabilne i canary wersje w tym samym klastrze i użyj kontrolera Ingress, siatki usług, Argo Rollouts lub Flagger do stopniowego przekierowywania ruchu.
Zanim rozpoczniesz
- Azure CLI w wersji 2.59.0 lub nowszej.
-
kubectlpołączony z Twoim klastrem źródłowym. - Uprawnienia usługi AKS do tworzenia klastrów, sieci i tożsamości oraz zarządzania nimi.
- Przetestowany punkt końcowy kondycji aplikacji, taki jak
/healthz. - Osoba odpowiedzialna za wycofanie oraz lista kontrolna wycofania zostały zatwierdzone przed przełączeniem ruchu.
- Plan redukcji wartości TTL DNS przygotowano co najmniej 24–48 godzin przed przełączeniem.
Wstępna konfiguracja TLS i certyfikatów
Skonfiguruj certyfikaty w środowisku zielonym przed przełączeniem ruchu. Jeśli bieżące środowisko zakończy protokół TLS, przed przecięciem wyeksportuj i zaimportuj certyfikaty do wpisów tajnych platformy Kubernetes (lub skonfiguruj menedżera certyfikatów).
# Example: create a TLS secret in the target namespace
kubectl create secret tls myapp-tls \
--cert ./tls.crt \
--key ./tls.key \
--namespace production
Jeśli używasz programu ACME (na przykład Let's Encrypt), przed rozpoczęciem migracji jednorazowej zakończ walidację domeny, aby uniknąć błędów protokołu HTTPS.
Lista kontrolna gotowości przed migracją
Uruchom te testy przed przeprowadzeniem migracji. Zapisz wszystkie eksporty w kontroli wersji lub bezpiecznym magazynie.
Eksportowanie zasobów platformy Kubernetes z klastra źródłowego
kubectl --context=current-prod-cluster get all --all-namespaces -o yaml > exports/all-namespaces-all-resources.yaml
kubectl --context=current-prod-cluster get deployments,statefulsets,daemonsets --all-namespaces -o yaml > exports/workloads.yaml
kubectl --context=current-prod-cluster get svc --all-namespaces -o yaml > exports/services.yaml
kubectl --context=current-prod-cluster get configmap,secret --all-namespaces -o yaml > exports/configs-secrets.yaml
kubectl --context=current-prod-cluster get pvc --all-namespaces -o yaml > exports/pvcs.yaml
kubectl --context=current-prod-cluster get ingress --all-namespaces -o yaml > exports/ingress.yaml
Ważna
Traktuj wyeksportowane manifesty sekretów jako dane wrażliwe. Przechowuj je tylko w bezpiecznych systemach.
Weryfikowanie wymagań wstępnych dotyczących subskrypcji, przydziałów i sieci
az account show --query "{name:name, id:id, tenantId:tenantId}" -o table
az configure --defaults location=eastus resource_group=rg-aks-migration
az vm list-usage --location eastus -o table
az network public-ip list --resource-group rg-aks-migration -o table
Weryfikacja wymagań dotyczących tożsamości i mechanizmu RBAC
az aks show --resource-group rg-aks-migration --name existing-aks --query aadProfile
az role assignment list --resource-group rg-aks-migration -o jsonc
az identity list --resource-group rg-aks-migration -o table
Przed kontynuowanie potwierdź następujące elementy:
- Grupy administracyjne klastra i model integracji Entra ID.
- Zakresy tożsamości zarządzanej i przypisania ról.
- Rejestrowanie, metryki i alerty włączone w środowisku docelowym.
Przewodniki dotyczące strategii
W kolejnych sekcjach przedstawiono jeden kompletny przykład wdrożenia Blue-Green oraz dwa krótsze schematy (Canary i Rolling DNS), które można dostosować do swojego obciążenia.
migracja klastra Blue-Green
W tym scenariuszu ruch produkcyjny obecnie jest obsługiwany ze starszego środowiska pod adresem app.example.com. Utworzysz nowy klaster usługi AKS (aks-green), wdrożysz obciążenie, zarejestrujesz zarówno stare, jak i zielone punkty końcowe w Azure Traffic Manager i stopniowo przesuwasz ruch.
Aby uzyskać podstawowe wskazówki dotyczące migracji, zobacz Omówienie migracji dla Azure Kubernetes Service (AKS).
1. Utwórz zielony klaster AKS
RG=rg-aks-migration
LOCATION=eastus
CLUSTER=aks-green
NODE_COUNT=3
az group create --name $RG --location $LOCATION
az aks create \
--resource-group $RG \
--name $CLUSTER \
--location $LOCATION \
--node-count $NODE_COUNT \
--enable-managed-identity \
--network-plugin azure \
--load-balancer-sku standard \
--generate-ssh-keys \
--enable-addons monitoring \
--attach-acr <yourACRName> \
--yes
Uzyskaj dane uwierzytelniające klastra
az aks get-credentials --resource-group $RG --name $CLUSTER --overwrite-existing
kubectl config use-context $CLUSTER
2. Wdróż obciążenie robocze z mechanizmami kontroli kondycji i zakłóceń
Utwórz plik manifests/app-deployment.yaml.
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
labels:
app: myapp
spec:
replicas: 3
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
version: green
spec:
terminationGracePeriodSeconds: 60
containers:
- name: myapp
image: myregistry.azurecr.io/myapp:green
resources:
requests:
cpu: 250m
memory: 256Mi
ports:
- containerPort: 8080
readinessProbe:
httpGet:
path: /healthz
port: 8080
initialDelaySeconds: 5
periodSeconds: 5
failureThreshold: 3
livenessProbe:
httpGet:
path: /live
port: 8080
initialDelaySeconds: 15
periodSeconds: 10
failureThreshold: 3
lifecycle:
preStop:
exec:
command: ["/bin/sh", "-c", "sleep 30"]
---
apiVersion: v1
kind: Service
metadata:
name: myapp-lb
labels:
app: myapp
spec:
type: LoadBalancer
selector:
app: myapp
ports:
- port: 80
targetPort: 8080
externalTrafficPolicy: Local
Żądania zasobów są przykładami. Dobierz wartości żądań CPU i pamięci na podstawie obserwowanego wykorzystania zasobów przez obciążenia robocze oraz wyników testów obciążeniowych, tak aby klaster docelowy odzwierciedlał sposób harmonogramowania i charakterystykę pojemnościową środowiska produkcyjnego.
externalTrafficPolicy: Local zachowuje źródłowy adres IP, ale może zmniejszyć liczbę punktów końcowych zaplecza na węzeł. W przypadku aplikacji korzystających z sesji trwałych (sticky sessions) przed migracją przenieś stan sesji do zewnętrznego magazynu (na przykład Azure Cache for Redis), aby uniknąć awarii związanych z przypisaniem sesji podczas przełączania ruchu.
Utwórz plik manifests/pdb.yaml.
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
name: myapp-pdb
spec:
minAvailable: 2
selector:
matchLabels:
app: myapp
Zastosuj zasoby i zweryfikuj wdrożenie:
kubectl apply -f manifests/app-deployment.yaml
kubectl apply -f manifests/pdb.yaml
kubectl rollout status deployment/myapp
kubectl get svc myapp-lb -o wide
3. Pobierz zielony punkt końcowy
kubectl get svc myapp-lb -o jsonpath='{.status.loadBalancer.ingress[0].ip}'
Użyj zwróconego adresu IP w następnych krokach.
4. Tworzenie profilu Azure Traffic Manager i punktów końcowych
TM_PROFILE=myapp-tm
az network traffic-manager profile create \
--name $TM_PROFILE \
--resource-group $RG \
--routing-method Weighted \
--unique-dns-name myapp-tm-$RANDOM \
--ttl 30 \
--protocol http \
--path /healthz \
--interval 30 \
--timeout 10
Dodaj stary punkt końcowy:
az network traffic-manager endpoint create \
--resource-group $RG \
--profile-name $TM_PROFILE \
--type externalEndpoints \
--name old-endpoint \
--target old.example.com \
--endpoint-status Enabled \
--weight 100
Dodaj zielony punkt końcowy:
az network traffic-manager endpoint create \
--resource-group $RG \
--profile-name $TM_PROFILE \
--type externalEndpoints \
--name green-endpoint \
--target <green-endpoint-ip> \
--endpoint-status Disabled \
--weight 0
Aby uzyskać szczegółowe informacje o poleceniach, zobacz az network traffic-manager profile i az network traffic-manager endpoint.
5. Stopniowo kieruj ruch do wersji green
Zacznij od niskiej wagi i obserwuj kondycję i opóźnienie.
az network traffic-manager endpoint update \
--resource-group $RG \
--profile-name $TM_PROFILE \
--name green-endpoint \
--set properties.endpointStatus=Enabled \
--weight 10
az network traffic-manager endpoint update \
--resource-group $RG \
--profile-name $TM_PROFILE \
--name old-endpoint \
--set properties.weight=90
Kontynuuj, stopniowo zmieniając względną grubość, na przykład z 50:50 na 10:90 dla „old” i „green”. Usługa Traffic Manager wybiera punkt końcowy dla każdego zapytania DNS na podstawie tych względnych wag; wagi nie gwarantują dokładnych wartości procentowych żądań. Odpowiedzi DNS są buforowane przez klientów i rekursywne resolwery, co może zniekształcać obserwowany rozkład. Utrzymuj każdy etap przez co najmniej czas życia profilu (TTL) oraz wystarczająco długo, aby zmierzyć reprezentatywny ruch aplikacyjny, zanim przejdziesz dalej. Użyj siatki ruchu przychodzącego lub usługi L7, jeśli potrzebujesz dokładnej dystrybucji poszczególnych żądań.
Kryteria przełączenia, punkty kontrolne monitorowania i plan wycofania zmian
Zdefiniuj jawne bramy przed każdym wzrostem ruchu.
Przykładowe bramy
- Wycofaj, jeśli błąd HTTP 5xx przekracza 1% przez 3 kolejne minuty.
- Wycofaj, jeśli opóźnienie p95 przekracza punkt odniesienia o ponad 200 ms przez 5 minut.
- Wstrzymaj wdrożenie, jeśli opóźnienie w replikacji bazy danych przekracza próg RPO.
- Wstrzymaj wdrażanie, jeśli liczba restartów poda gwałtownie wzrośnie powyżej normalnego poziomu bazowego.
Sekwencja przewijania do przodu
- Stopniowo zwiększaj udział ruchu.
- Zweryfikuj progi SLO i biznesowe testy dymne.
- Kontynuuj tylko wtedy, gdy wszystkie bramy przejdą na okres wstrzymania.
Sekwencja wycofywania
- Zainicjuj routing z powrotem do starego punktu końcowego. Klienci mogą nadal używać odpowiedzi DNS zapisanych w pamięci podręcznej do czasu wygaśnięcia ich TTL.
- Cofanie wdrożenia lub skalowanie na zielono do zera w razie potrzeby.
- Ponownie zweryfikuj starą kondycję środowiska i integralność danych.
# Restore old endpoint to 100
az network traffic-manager endpoint update \
--resource-group $RG \
--profile-name $TM_PROFILE \
--name old-endpoint \
--set properties.weight=100
# Set green endpoint to 0
az network traffic-manager endpoint update \
--resource-group $RG \
--profile-name $TM_PROFILE \
--name green-endpoint \
--set properties.weight=0
# Optional Kubernetes rollback options
kubectl rollout undo deployment/myapp
kubectl scale deployment myapp --replicas=0
6. Szybkie wycofywanie w razie potrzeby
Jeśli liczba błędów wzrasta lub progi SLO nie są spełniane:
- Ustaw wagę starego punktu końcowego z powrotem na
100, a zielonego na0. - Wstrzymaj dalsze wdrożenie i opcjonalnie zmniejsz liczbę zielonych podów.
kubectl scale deployment myapp --replicas=0
Migracja kanaryjna (krótki przewodnik)
Użyj kanarku, jeśli chcesz uzyskać kontrolę wydania przyrostowego z minimalną zduplikowaną infrastrukturą.
- Wdróż stabilne obciążenie i obciążenie kanarkowe.
- Kieruj niewielki procent ruchu do wersji kanaryjnej.
- Monitoruj kluczowe wskaźniki, a następnie zwiększaj skalę lub wycofuj zmiany.
Przykładowe adnotacje ruchu przychodzącego dla kanarku nginx:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: myapp-canary
annotations:
nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-weight: "10"
spec:
rules:
- host: app.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: myapp
port:
number: 80
Zwiększaj canary-weight stopniowo, o ile stan zdrowia pozostaje stabilny.
Migracja stopniowe DNS (krótki przewodnik)
Użyj stopniowego przełączania DNS, gdy przełączanie DNS jest podstawowym mechanizmem kontroli ruchu.
Ustaw TTL DNS na niską wartość co najmniej 24–48 godzin przed przełączeniem, aby wpisy w pamięci podręcznej mogły wygasnąć. Po ustabilizowaniu się sytuacji po migracji przywróć wyższy TTL, aby zmniejszyć liczbę zapytań i obciążenie resolverów.
- Obniż DNS TTL (na przykład do
30sekund). - Wdróż punkt końcowy usługi AKS.
- Zaktualizuj rekordy A/CNAME systemu DNS.
- Obserwuj propagację i kondycję.
Przykładowa aktualizacja rekordu A:
RG=rg-aks-migration
az network dns record-set a update \
--resource-group $RG \
--zone-name example.com \
--name app \
--set ttl=30
az network dns record-set a remove-record \
--resource-group $RG \
--zone-name example.com \
--record-set-name app \
--ipv4-address 13.78.1.2
az network dns record-set a add-record \
--resource-group $RG \
--zone-name example.com \
--record-set-name app \
--ipv4-address 52.160.1.100
Migracja danych dla woluminów trwałych
Migracja stanowa jest zwykle obszarem najwyższego ryzyka. Wybierz ścieżkę danych zgodną z wymaganiami dotyczącymi typu magazynu i spójności.
Strategie bazy danych
Wybierz wzorzec migracji bazy danych, który jest zgodny z wymaganiami dotyczącymi przestojów i spójności.
| Wzorzec | Zalety | Kompromisy | Typowe użycie |
|---|---|---|---|
| Zewnętrzna baza danych (udostępniona) | Najprostsza ścieżka migracji aplikacji, bez przełączenia bazy danych podczas przenoszenia aplikacji | Wspólny obszar oddziaływania, potencjalna współzależność wydajności | Istniejąca zarządzana baza danych PaaS udostępniona przez starą i nową aplikację |
| Powielaj i promuj | Kontrolowany punkt przecięcia i wycofywania | Narzut operacyjny związany z replikacją i promowaniem | Krytyczne stanowe obciążenia z rygorystycznym wskaźnikiem RPO |
| Podwójny zapis (tymczasowy) | Umożliwia przełączenie aplikacji przy niemal zerowym przestoju | Złożone wymagania dotyczące uzgadniania i idempotentności | Systemy sterowane zdarzeniami z dojrzałymi potokami danych |
W przypadku orkiestracji CDC i migracji należy ocenić Azure Database Migration Service i Debezium. Użyj zmian schematu typu expand -> migrate -> contract, aby zachować kompatybilność starych i nowych wersji aplikacji podczas przejścia.
migawki csi dysku Azure
Użyj migawek CSI dla woluminów blokowych, gdy są zainstalowane migawki CRD i kontroler migawki.
Przykład VolumeSnapshotClass:
apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshotClass
metadata:
name: csi-azuredisk-snapclass
driver: disk.csi.azure.com
deletionPolicy: Delete
Przykładowa migawka z istniejącego PVC:
apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshot
metadata:
name: mydata-snapshot
spec:
volumeSnapshotClassName: csi-azuredisk-snapclass
source:
persistentVolumeClaimName: mydata-pvc
Przykład przywracania PVC z migawki:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mydata-pvc-restored
spec:
storageClassName: managed-csi
dataSource:
name: mydata-snapshot
kind: VolumeSnapshot
apiGroup: snapshot.storage.k8s.io
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 100Gi
Ważna
Migawki są zwykle spójne po awarii, a nie spójne na poziomie aplikacji. W przypadku baz danych użyj replikacji lub tworzenia i odtwarzania kopii zapasowych z uwzględnieniem aplikacji.
Azure Files
W przypadku obciążeń opartych na plikach:
- Utwórz plany tworzenia migawek lub kopiowania dla źródłowych udziałów plików.
- Kopiowanie danych za pomocą narzędzi, takich jak AzCopy.
- Zaktualizuj konfigurację StorageClass i PVC dla udziału docelowego.
Przykładowy wzorzec kopiowania:
az storage share snapshot --account-name mystorage --name myshare
azcopy copy "https://<src>/myshare" "https://<dest>/myshare" --recursive
Tworzenie kopii zapasowych i przywracanie w Velero
Użyj usługi Velero do tworzenia kopii zapasowej i przywracania zasobów klastra, w tym danych PV skonfigurowanych za pomocą wtyczki Azure.
RG=rg-aks-migration
velero install \
--provider azure \
--bucket my-velero-backups \
--secret-file ./credentials-velero \
--backup-location-config resourceGroup=$RG,storageAccount=myvelerostorage,subscriptionId=<subscription-id>
velero backup create pre-migration-backup --include-namespaces my-namespace
velero restore create --from-backup pre-migration-backup
Zobacz dokumentację platformy Velero i Używanie migawek CSI dysków Azure z usługą AKS.
Obserwowanie i automatyczne wycofywanie
Instrumentuj te sygnały przed zmianą ruchu:
- Szybkość żądań HTTP i współczynnik powodzenia.
- Szybkość błędów HTTP 5xx.
- Opóźnienie żądań p95 i p99.
- Szybkość ponownego uruchamiania zasobnika i niepowodzenia gotowości.
- Obciążenie węzła i liczba oczekujących zasobników.
- Opóźnienie replikacji bazy danych.
- Głębokość kolejki dla obciążeń asynchronicznych.
Przykładowe warunki alertów w stylu PromQL:
# Rollback gate: 5xx error rate over 1%
sum(rate(http_requests_total{status=~"5.."}[3m]))
/
sum(rate(http_requests_total[3m])) > 0.01
# Rollback gate: p95 latency exceeds 200ms over baseline target
histogram_quantile(0.95, sum(rate(http_request_duration_seconds_bucket[5m])) by (le)) > 0.2
Powiąż alerty z kontrolerem wdrożenia (ręczną procedurą operacyjną, Argo Rollouts lub Flagger), tak aby niepowodzenia kontroli powodowały automatyczne wstrzymanie lub wycofanie.
Przepisy dotyczące testowania i walidacji
Ruch lustrzany
Kopiuj część ruchu produkcyjnego do środowiska zielonego bez zwracania użytkownikom końcowym odpowiedzi ze środowiska zielonego. Sprawdza to zachowanie pod realistycznym obciążeniem z niskim ryzykiem użytkownika.
Testy dymne
Uruchamiaj kontrole krytyczne dla działania firmy po każdym wzroście wagi, na przykład:
- Przepływ logowania
- Proces płatności lub finalizacji zakupu
- Ścieżka API do odczytu i zapisu
- Uzupełnianie zadania w tle
Testowanie obciążenia
Użyj narzędzi, takich jak k6, hey lub Azure Load Testing, aby zweryfikować wydajność i działanie automatycznego skalowania przed ostatecznym przełączeniem.
Flagi funkcjonalności
Użyj flag funkcjonalności, aby oddzielić wdrożenie od udostępnienia. Flagi funkcji mogą zapewnić drugą warstwę bezpieczeństwa, gdy trzeba wyłączyć ryzykowne ścieżki kodu bez ponownego wdrażania.
Lista kontrolna przełączenia produkcyjnego
- [ ] Potwierdź, że sondy gotowości i żywotności odzwierciedlają rzeczywistą gotowość do obsługi ruchu.
- [ ] Zweryfikować wartości
preStopiterminationGracePeriodSecondsprzy obciążeniu. - [ ] Sprawdź wartości PodDisruptionBudget na potrzeby aktualizacji i eksmisji.
- [ ] Potwierdź ustawienia skalowania automatycznego dla spodziewanych skoków ruchu migracji.
- [ ] Zweryfikuj kompleksowe kontrole kondycji za pośrednictwem punktu wejścia ruchu.
- [ ] Zweryfikuj dzienniki, metryki, alerty i testy syntetyczne przed przełączeniem.
- [ ] Potwierdź właściciela wycofania zmian, kryteria uruchomienia wycofania zmian oraz runbook wycofania zmian.
- [ ] Zweryfikuj reguły NSG, zapory i sondy kondycji dla nowych punktów końcowych.
- [ ] Zweryfikuj, czy zachowanie terminacji TLS i ustawienia mechanizmu CORS są zgodne ze starym środowiskiem.
- [ ] Zweryfikuj plan kosztów dla tymczasowego okresu nakładania się na niebiesko-zielony.
Lista kontrolna wycofywania
- Przenieś ruch do poprzedniego punktu końcowego (wagi w usłudze Traffic Manager lub wycofanie DNS).
- Wstrzymaj lub zmniejsz skalę zielonego wdrożenia.
- W razie potrzeby przywróć poprzednią konfigurację lub wpisy tajne.
- Przed wznowieniem normalnej pracy ponownie zweryfikuj stan starego środowiska.
Następne kroki
- Zapoznaj się z omówieniem migracji dla Azure Kubernetes Service (AKS).
- Zapoznaj się z strategiami uaktualniania środowiska produkcyjnego usługi AKS.
- Zapoznaj się z uaktualnieniami puli węzłów blue-green w usłudze AKS.
- Przejrzyj dokumentację Azure Traffic Manager.