【问题标题】:Kubernetes Rolling Update with Helm2使用 Helm2 的 Kubernetes 滚动更新
【发布时间】:2021-01-17 07:01:28
【问题描述】:

我正在尝试使用Helm v2 执行Kubernetes Rolling Update;但是,我做不到。

当我对slow Tomcat image 执行helm upgrade 时,原来的 pod 被破坏了。

我想弄清楚如何通过使用新的 Pod 实例增量更新并耗尽旧的实例来实现零停机时间。

为了演示,我创建了一个示例slow Tomcat Docker image 和一个Helm chart

要安装:

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

您可以通过运行kubectl logs -f slowtom-sf-0 来跟踪日志,一旦准备好您就可以访问http://localhost:30901 上的应用程序

升级:

(这就是我需要帮助的地方)

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

upgrade.yamlinitial.yaml 部署文件相同,但标记版本号除外。

这里原来的 pod 被销毁了,新的 pod 开始了。同时,用户无法访问http://localhost:30901上的应用程序

删除:

helm del slowtom --purge

参考

局部 Helm 图表

下载舵图:

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

从本地 helm-chart 安装:

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

从本地 helm-chart 升级:

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

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

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

【问题讨论】:

  • 您能否编辑问题以包含您的 Kubernetes 清单 (templates/deployment.yaml) 的相关位?当部署规范的 pod 规范模板中的 image: 发生更改时,Kubernetes 应该自动处理此问题。
  • @DavidMaze 我添加了指向initial.yamlupgrade.yaml 部署文件的链接。除了标签/版本号之外,它们是相同的。
  • 您需要在问题中包含minimal reproducible example 作为文本;不在链接后面(一旦找到修复程序,您很可能会更新您的 GitHub 存储库)。
  • @DavidMaze 感谢您的反馈。我已经添加了必要的文件。
  • 你真的需要使用StatefulSet而不是Deployment吗?使用 vanilla 部署我从来没有遇到过问题,但 StatefulSet 是一个不同的野兽

标签: docker kubernetes updates kubernetes-helm helmfile


【解决方案1】:

Deployment 不同,StatefulSet 在滚动更新期间不会在销毁旧的 pod 之前启动新的 pod。相反,期望是您有多个 pod,它们将被一个一个替换。由于您只配置了 1 个副本,因此必须先将其销毁。将您的副本数增加到 2 个或更多,或者切换到 Deployment 模板。

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

【讨论】:

    【解决方案2】:

    我通过将Readiness or Startup Probes 添加到我的deployment.yaml 解决了这个问题

    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 }}
              readinessProbe:
                httpGet:
                  path: /
                  port: 8080
                initialDelaySeconds: 60
                periodSeconds: 30
                timeoutSeconds: 1
                failureThreshold: 3
    ---
    

    【讨论】:

      猜你喜欢
      • 2018-02-08
      • 2020-08-27
      • 1970-01-01
      • 1970-01-01
      • 2019-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多