Kubernetes Rolling Update mit Helm2

Oct 01 2020

Ich versuche, ein Kubernetes Rolling Update mit Helm v2 durchzuführen . Ich kann es jedoch nicht.

Wenn ich helm upgradeein langsames Tomcat-Bild ausführe , wird der ursprüngliche Pod zerstört.

Ich möchte herausfinden, wie Sie Ausfallzeiten von Null erreichen, indem Sie Pods-Instanzen schrittweise mit neuen aktualisieren und alte entleeren.

Zur Demonstration habe ich ein Beispiel für ein langsames Tomcat Docker-Bild und ein Helmdiagramm erstellt .

Installieren:

helm install https://github.com/h-q/slowtom/raw/master/docs/slowtom.tgz --name slowtom \
     -f https://github.com/h-q/slowtom/raw/master/docs/slowtom/environments/initial.yaml

Sie können den Protokollen folgen, indem Sie sie ausführen kubectl logs -f slowtom-sf-0. Sobald Sie fertig sind, können Sie auf die Anwendung zugreifenhttp://localhost:30901

Upgraden:

(und dort brauche ich Hilfe)

helm upgrade slowtom https://github.com/h-q/slowtom/raw/master/docs/slowtom.tgz \
     -f https://github.com/h-q/slowtom/raw/master/docs/slowtom/environments/upgrade.yaml

Die upgrade.yamlist initial.yamlmit Ausnahme der Tag-Versionsnummer identisch mit der Bereitstellungsdatei.

Hier wird die ursprüngliche Kapsel zerstört und die neue beginnt. In der Zwischenzeit können Benutzer nicht auf die Anwendung zugreifenhttp://localhost:30901

Löschen:

helm del slowtom --purge

Referenz

Lokale Helmkarte

Helmkarte herunterladen:

curl -LO https://github.com/h-q/slowtom/raw/master/docs/slowtom.tgz
tar vxfz ./slowtom.tgz

Installation von der lokalen Helmkarte:

helm install --debug ./slowtom --name slowtom -f ./slowtom/environments/initial.yaml

Upgrade von der lokalen Helmkarte:

helm upgrade --debug slowtom ./slowtom -f ./slowtom/environments/upgrade.yaml

Docker Image

Dockerfile

FROM tomcat:8.5-jdk8-corretto

RUN mkdir /usr/local/tomcat/webapps/ROOT && \
    echo '<html><head><title>Slow Tomcat</title></head><body><h1>Slow Tomcat Now Ready</h1></body></html>' >> /usr/local/tomcat/webapps/ROOT/index.html

RUN echo '#!/usr/bin/env bash' >> /usr/local/tomcat/bin/slowcatalina.sh && \
    echo 'x=2' >> /usr/local/tomcat/bin/slowcatalina.sh && \
    echo 'secs=$(($x * 60))' >> /usr/local/tomcat/bin/slowcatalina.sh && \
    echo 'while [ $secs -gt 0 ]; do' >> /usr/local/tomcat/bin/slowcatalina.sh && \ echo ' >&2 echo -e "Blast off in $secs\033[0K\r"' >> /usr/local/tomcat/bin/slowcatalina.sh && \
    echo '   sleep 1' >> /usr/local/tomcat/bin/slowcatalina.sh && \
    echo '   : $((secs--))' >> /usr/local/tomcat/bin/slowcatalina.sh && \
    echo 'done' >> /usr/local/tomcat/bin/slowcatalina.sh && \
    echo '>&2 echo "slow cataline done. will now start real catalina"' >> /usr/local/tomcat/bin/slowcatalina.sh && \
    echo 'exec catalina.sh run' >> /usr/local/tomcat/bin/slowcatalina.sh && \
    chmod +x /usr/local/tomcat/bin/slowcatalina.sh 

ENTRYPOINT ["/usr/local/tomcat/bin/slowcatalina.sh"]

Inhalt der Helmkarte

slowtom/Chart.yaml

apiVersion: v1
description: slow-tomcat Helm chart for Kubernetes
name: slowtom
version: 1.1.2  # whatever

slowtom/values.yaml

# Do not use this file, but ones from environmments folder

slowtom/environments/initial.yaml

# Storefront
slowtom_sf:
  name: "slowtom-sf"
  hasHealthcheck: "true"
  isResilient: "false"
  replicaCount: 2
  aspect_values:
    - name: y_aspect
      value: "storefront"

image:
  repository: hqasem/slow-tomcat
  pullPolicy: IfNotPresent
  tag: 1
env:
  - name: y_env
    value: whatever

slowtom/environments/upgrade.yaml

# Storefront
slowtom_sf:
  name: "slowtom-sf"
  hasHealthcheck: "true"
  isResilient: "false"
  replicaCount: 2
  aspect_values:
    - name: y_aspect
      value: "storefront"

image:
  repository: hqasem/slow-tomcat
  pullPolicy: IfNotPresent
  tag: 2
env:
  - name: y_env
    value: whatever

slowtom/templates/deployment.yaml

---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: {{ .Values.slowtom_sf.name }} 
  labels:
    chart: "{{ .Chart.Name | trunc 63 }}"
    chartVersion: "{{ .Chart.Version | trunc 63 }}" 
    visualize: "true" 
    app: {{ .Values.slowtom_sf.name }} 
spec:
  replicas: {{ .Values.slowtom_sf.replicaCount }} 
  selector: 
    matchLabels:
      app: {{ .Values.slowtom_sf.name }}
  template:
    metadata:
      labels:
        app: {{ .Values.slowtom_sf.name }}
        visualize: "true" 
    spec:
      dnsPolicy: ClusterFirstWithHostNet
      containers: 
        - name: {{ .Values.slowtom_sf.name }} 
          image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
          imagePullPolicy: {{ .Values.image.pullPolicy }}
          command: ["/usr/local/tomcat/bin/slowcatalina.sh"]
          args: ["whatever"]
          env:
{{ toYaml .Values.env | indent 12 }}
{{ toYaml .Values.slowtom_sf.aspect_values | indent 12 }}
          resources: 
{{ toYaml .Values.resources | indent 12 }}
---

slowtom/templates/service.yaml

kind: Service
apiVersion: v1
metadata:
  name: {{.Values.slowtom_sf.name}} 
  labels:
    chart: "{{ .Chart.Name | trunc 63 }}"
    chartVersion: "{{ .Chart.Version | trunc 63 }}"
    app: {{.Values.slowtom_sf.name}}
    visualize: "true" 
    hasHealthcheck: "{{ .Values.slowtom_sf.hasHealthcheck }}" 
    isResilient: "{{ .Values.slowtom_sf.isResilient }}"
spec:
  type: NodePort
  selector:
    app: {{.Values.slowtom_sf.name}}
  sessionAffinity: ClientIP
  ports:
    - protocol: TCP
      port: 8080
      targetPort: 8080
      name: http
      nodePort: 30901
---

Antworten

2 superstator Oct 01 2020 at 22:49

Im Gegensatz dazu Deploymentwird StatefulSetkein neuer Pod gestartet, bevor der alte während eines fortlaufenden Updates zerstört wird. Stattdessen wird erwartet, dass Sie mehrere Pods haben, die einzeln ersetzt werden. Da Sie nur 1 Replikat konfiguriert haben, muss es zuerst zerstört werden. Erhöhen Sie entweder die Anzahl Ihrer Replikate auf 2 oder mehr oder wechseln Sie zu einer DeploymentVorlage.

https://kubernetes.io/docs/tutorials/stateful-application/basic-stateful-set/#rolling-update