Kubernetes 滚动更新策略在实时流量中不提供零停机时间

Kubernetes 滚动更新策略在实时流量中不提供零停机时间,kubernetes,devops,kubernetes-deployment,downtime,rolling-updates,Kubernetes,Devops,Kubernetes Deployment,Downtime,Rolling Updates,我使用以下两个命令使用滚动更新策略进行部署: kubectl patch deployment.apps/<deployment-name> -n <namespace> -p '{\"spec\":{\"template\":{\"metadata\":{\"labels\":{\"date\":\"`date +'%s'`\"}}}}}' kubectl apply -f ./kube.deploy.yml -n <namespace> kubectl

我使用以下两个命令使用滚动更新策略进行部署:

kubectl patch deployment.apps/<deployment-name> -n <namespace> -p '{\"spec\":{\"template\":{\"metadata\":{\"labels\":{\"date\":\"`date +'%s'`\"}}}}}' 
kubectl apply -f ./kube.deploy.yml -n <namespace>
kubectl apply -f ./kube_service.yml -n <namespace>
我尝试更改
maxsupge
maxunavailable
参数以及不同的
initialdelayseconds
参数。此外,我尝试给出
livelinessprobe
参数

 livenessprobe:
            tcpSocket:
              port: 8080
            initialDelaySeconds: 15
            periodSeconds: 20  
,但都不管用。
它给出了连接错误,表明某些pod已关闭,因此存在停机时间。

首先,您需要确保yaml文件正确,并且所有缩进都已就位。之后,您需要设置正确的值,以实现零停机更新。下面的示例显示了正确定义的
RollingUpdate
s:

spec:
  replicas: 2
  strategy:
   type: RollingUpdate
   rollingUpdate:
     maxSurge: 1
     maxUnavailable: 0
在本例中,在所需的2个Pod数之上会有一个额外的Pod(
maxsupage:1
),可用的Pod数不能低于该数字(
maxUnavailable:0

选择此配置,Kubernetes将旋转一个额外的吊舱,然后停止一个“旧”吊舱。如果有另一个节点可用于部署此Pod,则系统将能够在部署期间处理相同的工作负载。如果没有,Pod将部署在已经使用的节点上,代价是来自同一节点上托管的其他Pod的资源

您也可以尝试以下方法:

spec:
  replicas: 2
  strategy:
   type: RollingUpdate
   rollingUpdate:
     maxSurge: 0
     maxUnavailable: 1
在上面的示例中,将不会有额外的Pod(
maxsupage:0
),并且一次只能有一个Pod不可用(
maxUnavailable:1

在这种情况下,Kubernetes将首先停止一个吊舱,然后再启动一个新的吊舱。这样做的好处是,基础架构不需要扩展,但最大工作负载将减少

如果选择使用
maxsupge
maxUnavailable
的百分比值,则需要记住:

  • maxsupge
    -绝对数通过四舍五入从百分比计算得出

  • maxUnavailable
    -绝对数通过四舍五入从百分比计算得出

正确定义
RollingUpdate
后,您还必须确保应用程序提供由Kubernetes查询的端点,这些端点返回应用程序的状态。下面是一个
/greeting
端点,当它准备好处理请求时返回HTTP 200状态,当它不准备处理请求时返回HTTP 500状态:

readinessProbe:
  httpGet:
    path: /greeting
    port: 8080
  initialDelaySeconds: 5
  periodSeconds: 5
  successThreshold: 1
  timeoutSeconds: 1
  • initialDelaySeconds
    完成第一次准备就绪检查前的时间(秒)

  • periodSeconds
    -第一次就绪检查后两次就绪检查之间的时间(以秒为单位)

  • successThreshold
    -探测器失败后被视为成功的最小连续成功次数。默认值为1。必须为1才能获得活力。最小值为1

  • timeoutSeconds
    -探测器超时后的秒数。默认为1秒。最小值为1

我已经成功地测试了上述场景


如果有帮助,请告诉我。

首先,您需要确保您的yaml文件是正确的,所有缩进都已到位。之后,您需要设置正确的值,以实现零停机更新。下面的示例显示了正确定义的
RollingUpdate
s:

spec:
  replicas: 2
  strategy:
   type: RollingUpdate
   rollingUpdate:
     maxSurge: 1
     maxUnavailable: 0
在本例中,在所需的2个Pod数之上会有一个额外的Pod(
maxsupage:1
),可用的Pod数不能低于该数字(
maxUnavailable:0

选择此配置,Kubernetes将旋转一个额外的吊舱,然后停止一个“旧”吊舱。如果有另一个节点可用于部署此Pod,则系统将能够在部署期间处理相同的工作负载。如果没有,Pod将部署在已经使用的节点上,代价是来自同一节点上托管的其他Pod的资源

您也可以尝试以下方法:

spec:
  replicas: 2
  strategy:
   type: RollingUpdate
   rollingUpdate:
     maxSurge: 0
     maxUnavailable: 1
在上面的示例中,将不会有额外的Pod(
maxsupage:0
),并且一次只能有一个Pod不可用(
maxUnavailable:1

在这种情况下,Kubernetes将首先停止一个吊舱,然后再启动一个新的吊舱。这样做的好处是,基础架构不需要扩展,但最大工作负载将减少

如果选择使用
maxsupge
maxUnavailable
的百分比值,则需要记住:

  • maxsupge
    -绝对数通过四舍五入从百分比计算得出

  • maxUnavailable
    -绝对数通过四舍五入从百分比计算得出

正确定义
RollingUpdate
后,您还必须确保应用程序提供由Kubernetes查询的端点,这些端点返回应用程序的状态。下面是一个
/greeting
端点,当它准备好处理请求时返回HTTP 200状态,当它不准备处理请求时返回HTTP 500状态:

readinessProbe:
  httpGet:
    path: /greeting
    port: 8080
  initialDelaySeconds: 5
  periodSeconds: 5
  successThreshold: 1
  timeoutSeconds: 1
  • initialDelaySeconds
    完成第一次准备就绪检查前的时间(秒)

  • periodSeconds
    -第一次就绪检查后两次就绪检查之间的时间(以秒为单位)

  • successThreshold
    -探测器失败后被视为成功的最小连续成功次数。默认值为1。必须为1才能获得活力。最小值为1

  • timeoutSeconds
    -探测器超时后的秒数。默认为1秒。最小值为1

我已经成功地测试了上述场景


请让我知道这是否有帮助。

您是否可以将yaml的一部分与
策略:type:RollingUpdate
共享(或整个部署)?我看到你提供了关于它的信息