关于kubernetes的RollingUpdate不会阻止网关超时

问题描述 投票:2回答:1

我关注了http://rahmonov.me/posts/zero-downtime-deployment-with-kubernetes/博客,创建了两个docker图像,index.html返回“应用版本1”和“应用版本2”。我想要实现的是零停机时间释放。我正在使用

kubectl apply -f mydeployment.yaml

里面有image: mynamespace/nodowntime-test:v1

将v1版本部署到k8s然后运行:

while True
    do
            printf "\n---------------------------------------------\n"
            curl "http://myhosthere"
            sleep 1s
    done

到目前为止一切正常。在短时间后curl返回'应用程序的第1版'。然后我用image: mynamespace/nodowntime-test:v2应用相同的k8s部署文件。好吧,它有效,但v1和v2之间有一个(总是一个)网关超时响应。所以它不是真的没有停机时间;这比没有RollingUpdate要好得多,但并不完美。

我正在使用RollingUpdate策略和readinessProbe:

---                              
apiVersion: apps/v1              
kind: Deployment                 
metadata:                        
  name: nodowntime-deployment    
spec:                            
  replicas: 1                    
  strategy:                      
    type: RollingUpdate          
    rollingUpdate:               
      maxUnavailable: 0          
      maxSurge: 1                
  selector:                      
    matchLabels:                 
      app: nodowntime-test       
  template:                      
    metadata:                    
      labels:                    
        app: nodowntime-test     
    spec:                        
      containers:                
      ...                        
        readinessProbe:          
          httpGet:               
            path: /              
            port: 80             
          initialDelaySeconds: 5 
          periodSeconds: 5       
          successThreshold: 5 

我可以做得更好吗?将所有这些与入口控制器同步是一个问题吗?我知道我可以通过使用minReadySeconds调整它,所以旧的和新的pod重叠一段时间,但它是唯一的解决方案吗?

kubernetes kubernetes-ingress traefik-ingress
1个回答
3
投票

我重新创建了上述实验,并通过启动以下三个同时进程将请求数量更改为接近每秒30个:

While True
    do
        curl -s https://<NodeIP>:<NodePort>/ -m 0.1 --connect-timeout 0.1 | grep Version || echo "fail"
done

编辑部署并多次更改映像版本后,在转换过程中根本没有丢包。我甚至抓住了两个图像同时处理请求的短暂时刻。

  Version 1 of my awesome app! Money is pouring in!
  Version 1 of my awesome app! Money is pouring in!
  Version 1 of my awesome app! Money is pouring in!
  Version 2 of my awesome app! More Money is pouring in!
  Version 1 of my awesome app! Money is pouring in!
  Version 1 of my awesome app! Money is pouring in!
  Version 2 of my awesome app! More Money is pouring in!
  Version 2 of my awesome app! More Money is pouring in!
  Version 2 of my awesome app! More Money is pouring in!

因此,如果您将请求直接发送给服务,它将按预期工作。

“Gateway Timeout”错误是Traefik代理的回复。它通过一组iptables规则打开到后端的TCP连接。 当您执行RollingUpdates时,iptables规则已更改,但Traefic不知道这一点,因此从Traefik的角度来看仍然认为连接是开放的。在第一次尝试通过不存在的iptables规则失败后,Traefik报告“网关超时”并关闭tcp连接。在下一次尝试时,它会通过新的iptables规则打开与后端的新连接,一切顺利。

它可以通过Qazxswpoi在Traefik中修复。

enabling retries

更新:

最后我们在没有使用traefik的'retry'功能的情况下解决了这个问题,这可能需要对所有服务进行幂等处理(无论如何都要好,但我们不能强迫所有项目都这样做)。您需要的是kubernetes在您的应用中实施的RollingUpdate策略+ ReadinessProbe配置和正常关闭。

© www.soinside.com 2019 - 2024. All rights reserved.