Cloud Intelligence™Cloud Intelligence™

Cloud Intelligence™

Progressive Delivery meistern – mit Gateway API und Argo Rollouts

By Chimbu ChinnaduraiOct 2, 20246 min read

Diese Seite ist auch in English, Español, Français, Italiano, 日本語 und Português verfügbar.

Im heutigen Tempo der Softwareauslieferung gehören Innovation und Zuverlässigkeit untrennbar zusammen. Progressive Delivery erlaubt es Teams, Features sicher, schrittweise und kontrolliert auszurollen. Gerade in einer dynamischen Umgebung wie Kubernetes ist Progressive Delivery der Schlüssel, um Services stabil zu halten und gleichzeitig kontinuierlich Neues auf die Straße zu bringen.

Wer mit Tools wie Argo Rollouts arbeitet, weiß, wie souverän sich damit gestaffelte Deployments steuern lassen. Argo Rollouts können optional einen Traffic Provider einbinden, um den Traffic präzise und schrittweise zwischen Pods aufzuteilen.

Bis vor Kurzem war für jeden neuen Traffic Provider in Argo Rollouts dedizierter Code-Support nötig. Zwei aktuelle Entwicklungen machen diesen Aufwand inzwischen überflüssig.

  • Erstens: die Unterstützung von Traffic Plugins in Argo Rollouts ab Version 1.5.
  • Zweitens: die neue Kubernetes Gateway API, die feingranulare Kontrolle über das Traffic Routing bietet und neue Möglichkeiten für Service Mesh, Ingress und mehr eröffnet.

Mit der Gateway-API-Unterstützung in Argo Rollouts wird die Integration deutlich einfacher: Jeder Traffic Provider, der die Gateway API implementiert, funktioniert automatisch mit Argo Rollouts. Eine Übersicht bekannter Implementierungen finden Sie auf der Website der Gateway API.

In diesem Beitrag zeigen wir, wie Sie die Gateway API zusammen mit Argo Rollouts in der Google Kubernetes Engine für Progressive Delivery nutzen.

Voraussetzungen

Einschränkungen

  • Das Argo Rollouts Gateway API-Plugin unterstützt keine Blue/Green-Deployment-Strategie.
  • Diese Funktion steht in GCP nur für Envoy-basierte Application Load Balancer zur Verfügung. Classic Application Load Balancer und Network Load Balancer werden nicht direkt unterstützt.

Argo Rollouts Gateway API-Plugin bereitstellen

  • Wenden Sie das folgende Manifest auf den Cluster an, um eine ConfigMap zu erstellen. Verfügbare Versionen finden Sie auf der Releases-Seite; passen Sie die Architektur bei Bedarf an.
cat <<EOF | kubectl apply -f -
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: argo-rollouts-config # must be so name
  namespace: argo-rollouts # must be in this namespace
data:
  trafficRouterPlugins: |-
    - name: "argoproj-labs/gatewayAPI"
      location: "https://github.com/argoproj-labs/rollouts-plugin-trafficrouter-gatewayapi/releases/download/v0.3.0/gateway-api-plugin-linux-amd64"
EOF
  • Starten Sie den Argo-Rollouts-Pod neu – das Plugin wird beim Pod-Start heruntergeladen.

Beispielhaftes Pod-Log mit der Plugin-Installation

Gateway-Ressource bereitstellen

  • Eine Gateway-Ressource steht für eine Data Plane, die Traffic in Kubernetes routet. Je nach verwendeter GatewayClass kann ein Gateway sehr unterschiedliche Arten von Load Balancing und Routing abbilden.
  • Wenden Sie das folgende Manifest an, um einen globalen externen Application Load Balancer zu erstellen.
cat <<EOF | kubectl apply -f -
---
kind: Gateway
apiVersion: gateway.networking.k8s.io/v1beta1
metadata:
  name: argo-rollouts-demo-external-http
spec:
  gatewayClassName: gke-l7-global-external-managed
  listeners:
  - name: http
    protocol: HTTP
    port: 80
EOF

Beispielhafte Gateway-API-Ressource

Argo Rollouts das Bearbeiten von HTTP Routes erlauben

  • Wenden Sie das folgende Manifest an, damit Argo Rollouts HTTP-Routes-Ressourcen bearbeiten darf.
cat <<EOF | kubectl apply -f -
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: gateway-controller-role
  namespace: argo-rollouts
rules:
  - apiGroups:
      - gateway.networking.k8s.io
    resources:
      - httproutes
    verbs:
      - get
      - patch
      - update
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: gateway-admin
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: gateway-controller-role
subjects:
  - namespace: argo-rollouts
    kind: ServiceAccount
    name: argo-rollouts
EOF

HTTPRoute und Kubernetes-Services anlegen

  • Legen Sie eine Beispiel-HTTPRoute an und verbinden Sie sie mit der zuvor erstellten Gateway-Ressource.
cat <<EOF | kubectl apply -f -
---
kind: HTTPRoute
apiVersion: gateway.networking.k8s.io/v1beta1
metadata:
  name: argo-rollouts-demo-http-route
spec:
  parentRefs:
  - kind: Gateway
    name: argo-rollouts-demo-external-http
  hostnames:
  - "argo-rollouts-demo.example.com"
  rules:
    - backendRefs:
        - name: argo-rollouts-demo-stable-service
          port: 80
        - name: argo-rollouts-demo-canary-service
          port: 80
EOF
  • Legen Sie den Canary-Service an.
cat <<EOF | kubectl apply -f -
---
apiVersion: v1
kind: Service
metadata:
  name: argo-rollouts-demo-canary-service
spec:
  ports:
    - port: 80
      targetPort: http
      protocol: TCP
      name: http
  selector:
    app: argo-rollouts-demo
EOF
  • Legen Sie den Stable-Service an.
cat <<EOF | kubectl apply -f -
---
apiVersion: v1
kind: Service
metadata:
  name: argo-rollouts-demo-stable-service
spec:
  ports:
    - port: 80
      targetPort: http
      protocol: TCP
      name: http
  selector:
    app: argo-rollouts-demo
EOF

Externer Load Balancer mit Routing-Konfiguration

Canary Rollout anlegen

  • Ein Rollout ist eine Kubernetes Custom Resource und das Pendant zu einem Kubernetes-Deployment-Objekt. Es ersetzt ein Deployment, sobald erweiterte Deployment- oder Progressive-Delivery-Funktionen gefragt sind.
  • Sie können entweder ein neues Rollout anlegen oder bestehende Deployments in eine Rollout-Ressource überführen. Das Argo Rollouts Gateway API-Plugin unterstützt ausschließlich Canary Deployments. Alle verfügbaren Optionen finden Sie in der Rollout-Spezifikation.
  • Wenden Sie das folgende Manifest auf den Cluster an, warten Sie, bis die Anwendung bereit ist, und rufen Sie anschließend die Gateway-IP im Browser auf.

cat <<EOF | kubectl apply -f -
---
apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
  name: argo-rollouts-demo
  namespace: default
spec:
  replicas: 5
  strategy:
    canary:
      canaryService: argo-rollouts-demo-canary-service # canary service
      stableService: argo-rollouts-demo-stable-service # stable service
      trafficRouting:
        plugins:
          argoproj-labs/gatewayAPI:
            httpRoute: argo-rollouts-demo-http-route # httproute
            namespace: default
      steps:
      - setWeight: 50
      - pause: {}
      - setWeight: 100
      - pause: {}
  revisionHistoryLimit: 2
  selector:
    matchLabels:
      app: argo-rollouts-demo
  template:
    metadata:
      labels:
        app: argo-rollouts-demo
    spec:
      containers:
        - name: argo-rollouts-demo
          image: argoproj/rollouts-demo:blue
          ports:
            - name: http
              containerPort: 8080
              protocol: TCP
          resources:
            requests:
              memory: 32Mi
              cpu: 5m
EOF
  • Lassen Sie sich die HTTPRoute-Ressource ausgeben und prüfen Sie in den Logs des Argo-Rollouts-Pods, ob das Rollout erfolgreich ausgerollt wurde. Argo Rollouts passt den Weight-Wert in der HTTPRoute an, der anschließend mit dem Load Balancer synchronisiert wird.

Initiale Routing-Konfiguration des Load Balancers

Beispielhafte Antwort der Anwendung. Der benutzerdefinierte Host-Header wurde mit dem Chrome-Plugin ModHeader gesetzt.

Canary Deployment durchführen

  • Führen Sie folgenden Befehl aus, um das Image zu wechseln und damit ein neues Rollout anzustoßen.
kubectl argo rollouts set image argo-rollouts-demo argo-rollouts-demo=argoproj/rollouts-demo:yellow
  • Argo Rollouts erzeugt so viele Pods, wie für den jeweiligen Traffic-Anteil nötig sind. In diesem Fall werden 3 neue Pods gestartet, um die 50 % Traffic auf die neue Version abzudecken.
  • Mit folgendem Befehl verfolgen Sie den Fortschritt des Rollouts. Das Argo-Rollouts-kubectl-Plugin kann zudem ein lokales UI Dashboard bereitstellen, um Ihre Rollouts zu visualisieren.
kubectl argo rollouts get rollout rollouts-demo

Beispielhafter initialer Rollout-Status

  • Sehen Sie sich die HTTPRoute an und prüfen Sie, ob Argo Rollouts die Gewichtungen der Backend-Services angepasst hat.

Beispielhafte HTTPRoute

Routing-Regeln des Load Balancers

  • An diesem Punkt sollte jede Version 50 % der Anfragen erhalten. Im Browser lässt sich das direkt nachvollziehen.

Initiales Canary Rollout

  • Promoten Sie das Rollout mit folgendem Befehl, um den Traffic-Anteil auf die neue Version weiter zu erhöhen. Prüfen Sie anschließend die HTTPRoute und die Routing-Regeln des Load Balancers.
kubectl argo rollouts promote rollouts-demo
  • Führen Sie den Promote-Befehl ein zweites Mal aus, um das Rollout abzuschließen, und warten Sie, bis die Pods der alten Version entfernt sind. Sobald Sie das Rollout-Image erneut ändern, beginnt der Prozess von vorn.

Rollout-Status nach Abschluss

Aktualisierte Routing-Regeln des Load Balancers

Abgeschlossenes Canary Rollout

Unter dem Strich erweitert die Integration der Gateway API mit Argo Rollouts die Möglichkeiten von Progressive Delivery in Kubernetes erheblich. Die Kombination vereinfacht das Traffic Routing spürbar: Canary Deployments lassen sich leichter umsetzen, und der Traffic zwischen Versionen lässt sich präzise und kontrolliert steuern.

Wir hoffen, dieser Beitrag liefert Ihnen wertvolle Impulse. Wenn Sie tiefer einsteigen möchten oder an unseren Services interessiert sind, sprechen Sie uns gerne an. Sie erreichen uns hier.