MST

星途 面试题库

面试题:复杂Bash脚本在容器编排中的应用

在Kubernetes环境下,编写一个Bash脚本,实现对一组Pod的滚动升级,并在升级过程中进行健康检查。若健康检查失败,能够回滚到上一个版本。说明脚本的整体架构和关键实现步骤,并给出主要代码片段。
19.2万 热度难度
编程语言Bash

知识考点

AI 面试

面试题答案

一键面试

脚本整体架构

  1. 参数解析:获取需要升级的Pod所在的Deployment名称、新镜像版本等参数。
  2. 滚动升级:使用kubectl set image命令对Deployment进行镜像升级,触发滚动升级。
  3. 健康检查:在升级过程中,通过kubectl rollout status命令实时检查滚动升级状态,结合自定义的健康检查逻辑(例如检查Pod内服务端口是否可访问等)。
  4. 回滚处理:如果健康检查失败,使用kubectl rollout undo命令回滚到上一个版本。

关键实现步骤

  1. 初始化变量:定义Deployment名称、新镜像版本等变量。
  2. 执行滚动升级:使用kubectl set image deployment/${deployment_name} ${container_name}=${new_image}命令设置新镜像。
  3. 健康检查:通过循环结合kubectl rollout status检查升级状态,并添加自定义健康检查逻辑。
  4. 回滚操作:如果健康检查失败,执行kubectl rollout undo deployment/${deployment_name}

主要代码片段

#!/bin/bash

# 参数解析
if [ $# -ne 3 ]; then
    echo "Usage: $0 <deployment_name> <container_name> <new_image>"
    exit 1
fi

deployment_name=$1
container_name=$2
new_image=$3

# 执行滚动升级
kubectl set image deployment/${deployment_name} ${container_name}=${new_image}

# 健康检查并处理回滚
rollout_timeout=120
start_time=$(date +%s)
while true; do
    rollout_status=$(kubectl rollout status deployment/${deployment_name})
    if [[ $rollout_status == *"successfully rolled out"* ]]; then
        echo "Rollout successful"
        break
    elif (( $(date +%s) - start_time > rollout_timeout )); then
        echo "Rollout timeout, starting rollback"
        kubectl rollout undo deployment/${deployment_name}
        break
    else
        # 自定义健康检查,例如检查Pod内服务端口是否可访问
        pod_name=$(kubectl get pods -l app=${deployment_name} -o jsonpath='{.items[0].metadata.name}')
        if kubectl exec -it $pod_name -- curl -s http://localhost:8080 > /dev/null; then
            sleep 5
        else
            echo "Health check failed, starting rollback"
            kubectl rollout undo deployment/${deployment_name}
            break
        fi
    fi
done