Cập nhật Rolling Kubernetes với Helm2

Oct 01 2020

Tôi đang cố gắng thực hiện Cập nhật cuộn Kubernetes bằng Helm v2 ; tuy nhiên, tôi không thể.

Khi tôi thực hiện helm upgradetrên một hình ảnh Tomcat chậm , nhóm gốc sẽ bị phá hủy.

Tôi muốn tìm ra cách để đạt được thời gian chết bằng không bằng cách cập nhật từng bước các phiên bản Pods bằng các phiên bản mới và loại bỏ các phiên bản cũ.

Để chứng minh, tôi đã tạo một hình ảnh Tomcat Docker chậm mẫu và biểu đồ Helm .

Để cài đặt:

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

Bạn có thể theo dõi nhật ký bằng cách chạy kubectl logs -f slowtom-sf-0và khi đã sẵn sàng, bạn có thể truy cập ứng dụng trênhttp://localhost:30901

Nâng cấp:

(và đó là nơi tôi cần giúp đỡ)

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

Các upgrade.yamlgiống với initial.yamltập tin triển khai với ngoại lệ của số phiên bản thẻ.

Tại đây nhóm ban đầu bị phá hủy và nhóm mới bắt đầu. Trong khi đó, người dùng không thể truy cập ứng dụng trênhttp://localhost:30901

Xóa:

helm del slowtom --purge

Tài liệu tham khảo

Biểu đồ Helm cục bộ

Tải xuống biểu đồ hướng dẫn:

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

Cài đặt từ biểu đồ hướng dẫn cục bộ:

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

Nâng cấp từ biểu đồ quản lý địa phương:

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

Hình ảnh Docker

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"]

Nội dung biểu đồ Helm

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
---

Trả lời

2 superstator Oct 01 2020 at 22:49

Không giống như Deployment, StatefulSetkhông bắt đầu một nhóm mới trước khi phá hủy nhóm cũ trong quá trình cập nhật liên tục. Thay vào đó, kỳ vọng là bạn có nhiều nhóm và chúng sẽ được thay thế từng nhóm một. Vì bạn chỉ có 1 bản sao được cấu hình nên nó phải phá hủy nó trước. Tăng số lượng bản sao của bạn lên 2 hoặc nhiều hơn hoặc chuyển sang một Deploymentmẫu.

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