275 lines
7.1 KiB
Bash
275 lines
7.1 KiB
Bash
#!/bin/bash
|
||
|
||
# Traefik部署测试脚本
|
||
# 用于测试Traefik在Nomad集群中的部署和功能
|
||
|
||
set -e
|
||
|
||
# 颜色定义
|
||
RED='\033[0;31m'
|
||
GREEN='\033[0;32m'
|
||
YELLOW='\033[1;33m'
|
||
NC='\033[0m' # No Color
|
||
|
||
# 日志函数
|
||
log_info() {
|
||
echo -e "${GREEN}[INFO]${NC} $1"
|
||
}
|
||
|
||
log_warn() {
|
||
echo -e "${YELLOW}[WARN]${NC} $1"
|
||
}
|
||
|
||
log_error() {
|
||
echo -e "${RED}[ERROR]${NC} $1"
|
||
}
|
||
|
||
# 检查Nomad集群状态
|
||
check_nomad_cluster() {
|
||
log_info "检查Nomad集群状态..."
|
||
|
||
# 使用我们之前创建的领导者发现脚本
|
||
if [ -f "/root/mgmt/scripts/nomad-leader-discovery.sh" ]; then
|
||
chmod +x /root/mgmt/scripts/nomad-leader-discovery.sh
|
||
LEADER_INFO=$(/root/mgmt/scripts/nomad-leader-discovery.sh -c 2>&1)
|
||
log_info "Nomad领导者信息: $LEADER_INFO"
|
||
else
|
||
log_warn "未找到Nomad领导者发现脚本,使用默认方式检查"
|
||
nomad server members 2>/dev/null || log_error "无法连接到Nomad集群"
|
||
fi
|
||
}
|
||
|
||
# 检查Consul集群状态
|
||
check_consul_cluster() {
|
||
log_info "检查Consul集群状态..."
|
||
|
||
consul members 2>/dev/null || log_error "无法连接到Consul集群"
|
||
|
||
# 检查Consul领导者
|
||
CONSUL_LEADER=$(curl -s http://127.0.0.1:8500/v1/status/leader)
|
||
if [ -n "$CONSUL_LEADER" ]; then
|
||
log_info "Consul领导者: $CONSUL_LEADER"
|
||
else
|
||
log_error "无法获取Consul领导者信息"
|
||
fi
|
||
}
|
||
|
||
# 部署Traefik
|
||
deploy_traefik() {
|
||
log_info "部署Traefik..."
|
||
|
||
# 检查作业文件是否存在
|
||
if [ ! -f "/root/mgmt/jobs/traefik.nomad" ]; then
|
||
log_error "Traefik作业文件不存在: /root/mgmt/jobs/traefik.nomad"
|
||
exit 1
|
||
fi
|
||
|
||
# 部署作业
|
||
nomad run /root/mgmt/jobs/traefik.nomad
|
||
|
||
# 等待部署完成
|
||
log_info "等待Traefik部署完成..."
|
||
sleep 10
|
||
|
||
# 检查作业状态
|
||
nomad status traefik
|
||
}
|
||
|
||
# 检查Traefik状态
|
||
check_traefik_status() {
|
||
log_info "检查Traefik状态..."
|
||
|
||
# 检查作业状态
|
||
JOB_STATUS=$(nomad job status traefik -json | jq -r '.Status')
|
||
if [ "$JOB_STATUS" == "running" ]; then
|
||
log_info "Traefik作业状态: $JOB_STATUS"
|
||
else
|
||
log_error "Traefik作业状态异常: $JOB_STATUS"
|
||
return 1
|
||
fi
|
||
|
||
# 检查分配状态
|
||
ALLOCATIONS=$(nomad job allocs traefik | tail -n +3 | head -n -1 | awk '{print $1}')
|
||
for alloc in $ALLOCATIONS; do
|
||
alloc_status=$(nomad alloc status $alloc -json | jq -r '.ClientStatus')
|
||
if [ "$alloc_status" == "running" ]; then
|
||
log_info "分配 $alloc 状态: $alloc_status"
|
||
else
|
||
log_error "分配 $alloc 状态异常: $alloc_status"
|
||
fi
|
||
done
|
||
|
||
# 检查服务注册
|
||
log_info "检查Consul中的服务注册..."
|
||
consul catalog services | grep traefik && log_info "Traefik服务已注册到Consul" || log_warn "Traefik服务未注册到Consul"
|
||
}
|
||
|
||
# 测试Traefik功能
|
||
test_traefik_functionality() {
|
||
log_info "测试Traefik功能..."
|
||
|
||
# 获取Traefik服务地址
|
||
TRAEFIK_ADDR=$(consul catalog service traefik | jq -r '.[0].ServiceAddress' 2>/dev/null)
|
||
if [ -z "$TRAEFIK_ADDR" ]; then
|
||
log_warn "无法从Consul获取Traefik地址,使用本地地址"
|
||
TRAEFIK_ADDR="127.0.0.1"
|
||
fi
|
||
|
||
# 测试API端点
|
||
log_info "测试Traefik API端点..."
|
||
if curl -s http://$TRAEFIK_ADDR:8080/ping > /dev/null; then
|
||
log_info "Traefik API端点响应正常"
|
||
else
|
||
log_error "Traefik API端点无响应"
|
||
fi
|
||
|
||
# 测试仪表板
|
||
log_info "测试Traefik仪表板..."
|
||
if curl -s http://$TRAEFIK_ADDR:8080/dashboard/ > /dev/null; then
|
||
log_info "Traefik仪表板可访问"
|
||
else
|
||
log_error "无法访问Traefik仪表板"
|
||
fi
|
||
|
||
# 测试HTTP入口点
|
||
log_info "测试HTTP入口点..."
|
||
if curl -s -I http://$TRAEFIK_ADDR:80 | grep -q "Location: https://"; then
|
||
log_info "HTTP到HTTPS重定向正常工作"
|
||
else
|
||
log_warn "HTTP到HTTPS重定向可能未正常工作"
|
||
fi
|
||
}
|
||
|
||
# 创建测试服务
|
||
create_test_service() {
|
||
log_info "创建测试服务..."
|
||
|
||
# 创建一个简单的测试服务作业文件
|
||
cat > /tmp/test-service.nomad << EOF
|
||
job "test-web" {
|
||
datacenters = ["dc1"]
|
||
type = "service"
|
||
|
||
group "web" {
|
||
count = 1
|
||
|
||
network {
|
||
port "http" {
|
||
to = 8080
|
||
}
|
||
}
|
||
|
||
task "nginx" {
|
||
driver = "podman"
|
||
|
||
config {
|
||
image = "nginx:alpine"
|
||
ports = ["http"]
|
||
}
|
||
|
||
resources {
|
||
cpu = 100
|
||
memory = 64
|
||
}
|
||
|
||
service {
|
||
name = "test-web"
|
||
port = "http"
|
||
tags = [
|
||
"traefik.enable=true",
|
||
"traefik.http.routers.test-web.rule=Host(`test-web.service.consul`)",
|
||
"traefik.http.routers.test-web.entrypoints=https"
|
||
]
|
||
|
||
check {
|
||
type = "http"
|
||
path = "/"
|
||
interval = "10s"
|
||
timeout = "2s"
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
EOF
|
||
|
||
# 部署测试服务
|
||
nomad run /tmp/test-service.nomad
|
||
|
||
# 等待服务启动
|
||
sleep 15
|
||
|
||
# 测试服务是否可通过Traefik访问
|
||
log_info "测试服务是否可通过Traefik访问..."
|
||
if curl -s -H "Host: test-web.service.consul" http://$TRAEFIK_ADDR:80 | grep -q "Welcome to nginx"; then
|
||
log_info "测试服务可通过Traefik正常访问"
|
||
else
|
||
log_error "无法通过Traefik访问测试服务"
|
||
fi
|
||
}
|
||
|
||
# 清理测试资源
|
||
cleanup_test_resources() {
|
||
log_info "清理测试资源..."
|
||
|
||
# 停止测试服务
|
||
nomad job stop test-web 2>/dev/null || true
|
||
nomad job purge test-web 2>/dev/null || true
|
||
|
||
# 停止Traefik
|
||
nomad job stop traefik 2>/dev/null || true
|
||
nomad job purge traefik 2>/dev/null || true
|
||
|
||
# 删除临时文件
|
||
rm -f /tmp/test-service.nomad
|
||
|
||
log_info "清理完成"
|
||
}
|
||
|
||
# 主函数
|
||
main() {
|
||
case "${1:-all}" in
|
||
"check")
|
||
check_nomad_cluster
|
||
check_consul_cluster
|
||
;;
|
||
"deploy")
|
||
deploy_traefik
|
||
;;
|
||
"status")
|
||
check_traefik_status
|
||
;;
|
||
"test")
|
||
test_traefik_functionality
|
||
;;
|
||
"test-service")
|
||
create_test_service
|
||
;;
|
||
"cleanup")
|
||
cleanup_test_resources
|
||
;;
|
||
"all")
|
||
check_nomad_cluster
|
||
check_consul_cluster
|
||
deploy_traefik
|
||
check_traefik_status
|
||
test_traefik_functionality
|
||
create_test_service
|
||
log_info "所有测试完成"
|
||
;;
|
||
*)
|
||
echo "用法: $0 {check|deploy|status|test|test-service|cleanup|all}"
|
||
echo " check - 检查集群状态"
|
||
echo " deploy - 部署Traefik"
|
||
echo " status - 检查Traefik状态"
|
||
echo " test - 测试Traefik功能"
|
||
echo " test-service - 创建并测试示例服务"
|
||
echo " cleanup - 清理测试资源"
|
||
echo " all - 执行所有步骤(默认)"
|
||
exit 1
|
||
;;
|
||
esac
|
||
}
|
||
|
||
# 执行主函数
|
||
main "$@" |