You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用CircleCI部署Docker至Kubernetes时Rollout超时失败的修复咨询

问题描述

使用CircleCI结合Kubernetes部署Docker镜像时,执行命令./bin/kubectl rollout status deployments/prj5-deploy --timeout=2700s约20分钟后出现两类错误:

  • CircleCI提示:Too long with no output (exceeded 40m0s): context deadline exceeded
  • Kubernetes返回:error: deployment "****-deploy" exceeded its progress deadline

相关配置文件如下:

部署脚本 deploy-application.yml

- name: "Deploy application"
  hosts: web[0]
  user: ubuntu
  gather_facts: false
  become: yes
  tasks:
    - name: build
      shell: "./bin/kubectl set image deployments/prj5-deploy prj5-app=shalltearbloodfallen01/prj5-deploy:master"
      args:
        chdir: $HOME  

    - name: if successful
      shell: "./bin/kubectl rollout status deployments/prj5-deploy --timeout=2700s"
      args:
        chdir: $HOME

Deployment配置 prj5-deploy.yml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: prj5-deploy
  labels:
    app: prj5-app
spec:
  paused: false
  replicas: 4
  selector:
    matchLabels:
      app: prj5-app
  strategy:
    type: RollingUpdate
    rollingUpdate:
        maxSurge: 0
        maxUnavailable: 1
  template:
    metadata:
      labels:
        app: prj5-app
    spec:
      containers:
        - name: prj5-app
          image: shalltearbloodfallen01/prj5-deploy
          ports:
            - containerPort: 80

CircleCI配置 config.yml

deploy-docker:
    docker:
      - image: python:3.7-alpine3.11
    steps:
      - checkout
      - add_ssh_keys:
          fingerprints: ["xxxxxxxxxxxxxxxxxxxxxxxxxx"]
      - attach_workspace:
          at: ~/
      - run:
          name: Install dependencies
          command: |
            apk add --update ansible
      - run:
          name: deploy image docker
          no_output_timeout: 40m
          command: |
            cd .circleci/ansible
            cat inventory.txt
            ansible-playbook -i inventory.txt deploy-application.yml
解决方案

1. 延长Kubernetes Deployment进度超时时间

Kubernetes默认Deployment进度超时为10分钟,部署20分钟未完成会触发超时。在Deployment的spec中添加progressDeadlineSeconds参数,延长超时窗口:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: prj5-deploy
  labels:
    app: prj5-app
spec:
  paused: false
  replicas: 4
  progressDeadlineSeconds: 3600  # 设置为1小时,根据实际需求调整
  selector:
    matchLabels:
      app: prj5-app
  # 其余配置保持不变

2. 优化滚动更新策略提速

当前maxSurge: 0+maxUnavailable:1的配置限制了每次仅能替换1个Pod,4个Pod需依次更新,速度极慢。调整参数允许并行更新:

rollingUpdate:
    maxSurge: 1  # 允许额外创建1个Pod,实现并行更新
    maxUnavailable: 1  # 最多允许1个Pod不可用,保证服务可用性

若集群资源充足,可进一步将maxSurge设为2,大幅缩短部署时间。

3. 解决CircleCI无输出超时问题

kubectl rollout status在部署过程中可能长时间无输出,触发CircleCI的no_output_timeout。修改命令定期输出状态,同时延长CircleCI超时时间:

修改Ansible中的rollout任务

- name: if successful
  shell: |
    ./bin/kubectl rollout status deployments/prj5-deploy --timeout=3600s &
    ROLLOUT_PID=$!
    # 每隔60秒输出一次进度提示,避免无输出超时
    while kill -0 $ROLLOUT_PID 2>/dev/null; do
      echo "Deployment in progress, waiting for pods to be ready..."
      sleep 60
    done
    wait $ROLLOUT_PID
  args:
    chdir: $HOME

延长CircleCI的无输出超时

- run:
    name: deploy image docker
    no_output_timeout: 60m  # 延长至1小时,匹配Deployment超时时间
    command: |
      cd .circleci/ansible
      cat inventory.txt
      ansible-playbook -i inventory.txt deploy-application.yml

4. 排查Pod启动慢的根源

部署耗时久的核心可能是Pod启动效率低,需针对性优化:

  • 精简Docker镜像:使用多阶段构建、Alpine等轻量基础镜像,减少镜像体积
  • 配置镜像缓存:使用私有镜像仓库或集群本地缓存,加快镜像拉取速度
  • 检查应用启动日志:确认是否存在数据库迁移、大量配置加载等耗时初始化步骤
  • 添加就绪/存活探针:配置readinessProbe和livenessProbe,让Kubernetes准确判断Pod状态,避免无效等待

内容的提问来源于stack exchange,提问作者alex

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 15:27:44