MST
星途 面试题库

面试题:Bash脚本对容器编排工具集成及故障处理

假设使用Kubernetes作为容器编排工具,编写一个Bash脚本,实现通过Kubernetes API创建一个简单的Deployment和Service资源对象。Deployment运行3个副本的`my - app:v1`镜像。Service暴露Deployment,类型为NodePort,端口为30080。同时,脚本需要具备监控机制,当发现任何一个Pod处于非Running状态时,自动重启对应的Pod,并记录相关日志到`/var/log/k8s - my - app - monitor.log`。请详细阐述脚本思路并编写核心代码片段。
22.6万 热度难度
编程语言Bash

知识考点

AI 面试

面试题答案

一键面试

脚本思路

  1. 创建资源对象:使用 kubectl 命令通过 Kubernetes API 创建 Deployment 和 Service。kubectl create 命令可以直接根据指定的参数创建资源。
  2. 监控机制:使用 kubectl get pods 命令获取 Pod 状态,通过循环不断检查 Pod 状态。如果发现非 Running 状态的 Pod,则使用 kubectl delete pod 命令删除该 Pod,Kubernetes 会自动重新创建一个新的 Pod。同时,将相关操作记录到指定日志文件中。

核心代码片段

#!/bin/bash

# 创建 Deployment
kubectl create deployment my - app --image=my - app:v1 --replicas=3

# 创建 Service
kubectl expose deployment my - app --type=NodePort --port=30080

while true; do
    # 获取所有 Pod 状态
    POD_STATUS=$(kubectl get pods -l app=my - app -o jsonpath='{.items[*].status.phase}')
    IFS=' ' read -ra STATUS_ARRAY <<< "$POD_STATUS"
    for i in "${!STATUS_ARRAY[@]}"; do
        if [ "${STATUS_ARRAY[i]}" != "Running" ]; then
            POD_NAME=$(kubectl get pods -l app=my - app -o jsonpath='{.items['$i'].metadata.name}')
            echo "$(date) - Pod $POD_NAME is not running. Restarting..." >> /var/log/k8s - my - app - monitor.log
            kubectl delete pod $POD_NAME
        fi
    done
    sleep 10 # 每10秒检查一次
done