#!/usr/bin/env bash
# ==============================================================================
# 脚本名称: check_ingress_routes.sh
# 功能描述: K8s 集群 Ingress 路由规则扫描与挂载状态巡检 (纯只读)
# 使用方式: ./check_ingress_routes.sh [namespace]
# ==============================================================================
set -o pipefail
NAMESPACE=${1:-"default"}
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
BLUE='\033[0;34m'
PLAIN='\033[0m'
echo -e "${BLUE}================================================================${PLAIN}"
echo -e "${BLUE} K8S Ingress 七层路由表自动诊断与巡检 ${PLAIN}"
echo -e "${BLUE}================================================================${PLAIN}"
echo -e "${YELLOW}[INFO] 正在扫描 Namespace: ${NAMESPACE}${PLAIN}\n"
# 1. 检查是否存在 Ingress 资源
INGRESS_LIST=$(kubectl get ingress -n "$NAMESPACE" -o jsonpath='{.items[*].metadata.name}' 2>/dev/null)
if [ -z "$INGRESS_LIST" ]; then
echo -e "${GREEN}[OK] 命名空间 ${NAMESPACE} 下暂无 Ingress 资源。${PLAIN}"
exit 0
fi
# 2. 遍历并解析 Ingress 配置
RISK_COUNT=0
for ing in $INGRESS_LIST; do
echo -e "${BLUE}----------------------------------------------------------------${PLAIN}"
echo -e " 路由资源名称: ${GREEN}${ing}${PLAIN}"
# 提取 IngressClass (兼容 spec.ingressClassName 与旧版 annotation)
ING_CLASS=$(kubectl get ingress "$ing" -n "$NAMESPACE" -o jsonpath='{.spec.ingressClassName}')
if [ -z "$ING_CLASS" ]; then
ING_CLASS=$(kubectl get ingress "$ing" -n "$NAMESPACE" -o jsonpath='{.metadata.annotations.kubernetes\.io/ingress\.class}')
fi
if [ -z "$ING_CLASS" ]; then
echo -e " -> ${RED}[WARN] 未声明 IngressClass!若集群无默认 Class,Controller 将忽略该规则。${PLAIN}"
((RISK_COUNT++))
else
echo -e " -> 关联网关类: ${ING_CLASS}"
fi
# 提取 Address (判断是否已被 Controller 成功接管加载)
ADDRESS=$(kubectl get ingress "$ing" -n "$NAMESPACE" -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
if [ -z "$ADDRESS" ]; then
ADDRESS=$(kubectl get ingress "$ing" -n "$NAMESPACE" -o jsonpath='{.status.loadBalancer.ingress[0].hostname}')
fi
if [ -n "$ADDRESS" ]; then
echo -e " -> 网关端点 : ${ADDRESS} ${GREEN}[已加载生效]${PLAIN}"
else
echo -e " -> 网关端点 : ${RED}Pending (尚未被 Controller 分配端点,访问易报 404)${PLAIN}"
((RISK_COUNT++))
fi
# 提取 Host 和 Path 规则
echo -e "\n -> [ 路由映射明细 ]"
kubectl get ingress "$ing" -n "$NAMESPACE" -o custom-columns="HOST:.spec.rules[*].host,PATH:.spec.rules[*].http.paths[*].path,BACKEND:.spec.rules[*].http.paths[*].backend.service.name" --no-headers | while read -r line; do
echo -e " ${YELLOW}${line}${PLAIN}"
done
done
echo -e "\n${BLUE}================================================================${PLAIN}"
if [ "$RISK_COUNT" -gt 0 ]; then
echo -e "${RED}[汇总] 发现 $RISK_COUNT 处潜在的 Ingress 配置异常 (未指定 Class 或未分配端点),请及时核查。${PLAIN}"
else
echo -e "${GREEN}[汇总] 巡检完毕,所有 Ingress 资源均已正常加载。请确保 Path 与后端服务实际接口路径一致。${PLAIN}"
fi
echo -e "${BLUE}================================================================${PLAIN}"