#!/bin/bash

echo "=== Kubernetes 服务发现机制 ==="

echo "\n🔍 服务发现方式："
echo "\n1️⃣ 环境变量方式："
echo "  📋 自动注入："
echo "    - Kubernetes 自动为每个 Service 创建环境变量"
echo "    - 格式：<SERVICE_NAME>_SERVICE_HOST 和 <SERVICE_NAME>_SERVICE_PORT"
echo "    - 只对 Pod 创建时已存在的 Service 有效"
echo "  💡 示例："
echo "    WEB_SERVICE_HOST=10.96.1.100"
echo "    WEB_SERVICE_PORT=8080"
echo "    API_SERVICE_HOST=10.96.1.101"
echo "    API_SERVICE_PORT=3000"
echo "  ⚠️ 限制："
echo "    - 环境变量在 Pod 启动后不会更新"
echo "    - 变量名可能冲突"
echo "    - 不支持动态服务发现"

echo "\n2️⃣ DNS 服务发现（推荐）："
echo "  🌐 DNS 记录格式："
echo "    - 完整格式：<service>.<namespace>.svc.<cluster-domain>"
echo "    - 简化格式：<service>（同命名空间内）"
echo "    - 默认集群域：cluster.local"
echo "  ✅ 优势："
echo "    - 动态更新，实时生效"
echo "    - 支持跨命名空间访问"
echo "    - 标准 DNS 协议，兼容性好"
echo "    - 支持负载均衡"

echo "\n3️⃣ API 服务发现："
echo "  🔧 程序化访问："
echo "    - 通过 Kubernetes API 查询服务"
echo "    - 实时获取服务端点信息"
echo "    - 支持 Watch 机制监听变化"
echo "  💡 适用场景："
echo "    - 需要复杂路由逻辑的应用"
echo "    - 服务网格控制平面"
echo "    - 自定义负载均衡器"

echo "\n=== Service 类型详解 ==="
echo "\n🔧 Service 类型对比："
echo "\n📍 ClusterIP（默认）："
echo "  - 🎯 用途：集群内部访问"
echo "  - 🌐 网络：虚拟 IP，仅集群内可达"
echo "  - ⚖️ 负载均衡：自动分发到后端 Pod"
echo "  - 💡 场景：微服务间通信、内部 API"

echo "\n🚪 NodePort："
echo "  - 🎯 用途：通过节点端口对外暴露"
echo "  - 🌐 网络：每个节点上开放指定端口（30000-32767）"
echo "  - 🔗 访问：<NodeIP>:<NodePort>"
echo "  - 💡 场景：开发测试、简单外部访问"

echo "\n☁️ LoadBalancer："
echo "  - 🎯 用途：云环境的外部负载均衡"
echo "  - 🌐 网络：云提供商分配外部 IP"
echo "  - 🔄 特性：高可用、自动扩展"
echo "  - 💡 场景：生产环境、公网服务"

echo "\n🔗 ExternalName："
echo "  - 🎯 用途：映射到外部服务"
echo "  - 🌐 网络：DNS CNAME 记录"
echo "  - 🚫 代理：无代理，直接 DNS 解析"
echo "  - 💡 场景：外部数据库、第三方 API"

echo "\n=== DNS 解析示例 ==="
echo "\n🏗️ 假设集群中有以下服务："
echo "  - web-service（default 命名空间，端口 8080）"
echo "  - api-service（backend 命名空间，端口 3000）"
echo "  - db-service（database 命名空间，端口 5432）"
echo "  - redis-service（cache 命名空间，端口 6379）"

echo "\n📋 完整 DNS 记录："
echo "  web-service.default.svc.cluster.local     → 10.96.1.100:8080"
echo "  api-service.backend.svc.cluster.local     → 10.96.1.101:3000"
echo "  db-service.database.svc.cluster.local     → 10.96.1.102:5432"
echo "  redis-service.cache.svc.cluster.local     → 10.96.1.103:6379"

echo "\n🔍 在 default 命名空间的 Pod 中访问："
echo "  # 同命名空间服务（简化形式）"
echo "  curl http://web-service:8080/api/health"
echo "  "
echo "  # 跨命名空间服务（完整形式）"
echo "  curl http://api-service.backend:3000/users"
echo "  curl http://db-service.database:5432"
echo "  curl http://redis-service.cache:6379"

echo "\n🔍 在 backend 命名空间的 Pod 中访问："
echo "  # 同命名空间服务"
echo "  curl http://api-service:3000/status"
echo "  "
echo "  # 跨命名空间服务"
echo "  curl http://web-service.default:8080"
echo "  curl http://db-service.database:5432"

echo "\n=== 负载均衡机制 ==="
echo "\n⚖️ Service 自动负载均衡："
echo "  🔄 默认算法：轮询（Round Robin）"
echo "    - 请求均匀分发到所有健康的 Pod"
echo "    - 简单有效，适合无状态应用"
echo "  "
echo "  🔗 会话亲和性（Session Affinity）："
echo "    - ClientIP：基于客户端 IP 的会话保持"
echo "    - 确保同一客户端请求到达同一 Pod"
echo "    - 适合有状态会话的应用"
echo "  "
echo "  🎯 端点选择："
echo "    - 只向就绪（Ready）的 Pod 发送流量"
echo "    - 自动排除不健康的 Pod"
echo "    - 支持权重分配（通过 Ingress）"

echo "\n📊 负载均衡配置示例："
echo "apiVersion: v1"
echo "kind: Service"
echo "metadata:"
echo "  name: web-service"
echo "spec:"
echo "  selector:"
echo "    app: web"
echo "  ports:"
echo "  - port: 80"
echo "    targetPort: 8080"
echo "  sessionAffinity: ClientIP  # 启用会话亲和性"
echo "  sessionAffinityConfig:"
echo "    clientIP:"
echo "      timeoutSeconds: 3600    # 会话超时时间"

echo "\n=== 健康检查机制 ==="
echo "\n🏥 Kubernetes 健康检查类型："
echo "\n💓 Liveness Probe（存活性检查）："
echo "  - 🎯 目的：检测容器是否还在运行"
echo "  - 🔄 失败处理：重启容器"
echo "  - ⏰ 检查时机：容器启动后持续检查"
echo "  - 💡 场景：检测死锁、内存泄漏等问题"

echo "\n✅ Readiness Probe（就绪性检查）："
echo "  - 🎯 目的：检测容器是否准备好接收流量"
echo "  - 🔄 失败处理：从 Service 端点中移除"
echo "  - ⏰ 检查时机：容器启动后持续检查"
echo "  - 💡 场景：应用启动、依赖服务检查"

echo "\n🚀 Startup Probe（启动检查）："
echo "  - 🎯 目的：检测容器是否已成功启动"
echo "  - 🔄 失败处理：重启容器"
echo "  - ⏰ 检查时机：容器启动时，成功后停止"
echo "  - 💡 场景：慢启动应用、大型应用"

echo "\n🔧 健康检查方式："
echo "\n🌐 HTTP GET："
echo "  - 发送 HTTP GET 请求到指定路径"
echo "  - 2xx 或 3xx 状态码表示成功"
echo "  - 支持自定义 Headers"
echo "  - 示例：GET /health HTTP/1.1"

echo "\n🔌 TCP Socket："
echo "  - 尝试连接指定端口"
echo "  - 连接成功表示健康"
echo "  - 适用于非 HTTP 服务"
echo "  - 示例：连接 3306 端口（MySQL）"

echo "\n⚡ Exec："
echo "  - 在容器内执行指定命令"
echo "  - 退出码 0 表示成功"
echo "  - 灵活性最高"
echo "  - 示例：执行自定义健康检查脚本"

echo "\n📋 健康检查配置示例："
echo "livenessProbe:"
echo "  httpGet:"
echo "    path: /health"
echo "    port: 8080"
echo "  initialDelaySeconds: 30"
echo "  periodSeconds: 10"
echo "  timeoutSeconds: 5"
echo "  failureThreshold: 3"
echo ""
echo "readinessProbe:"
echo "  httpGet:"
echo "    path: /ready"
echo "    port: 8080"
echo "  initialDelaySeconds: 5"
echo "  periodSeconds: 5"

echo "\n=== 服务网格 ==="
echo "\n🕸️ 高级服务发现和通信管理："
echo "\n🌟 Istio："
echo "  - 🎯 特点：功能丰富的服务网格"
echo "  - 🔧 功能：流量管理、安全、可观测性"
echo "  - 💡 适用：大型微服务架构"
echo "  - 🔗 组件：Envoy Proxy、Pilot、Citadel"

echo "\n⚡ Linkerd："
echo "  - 🎯 特点：轻量级、易于使用"
echo "  - 🔧 功能：自动 mTLS、监控、负载均衡"
echo "  - 💡 适用：中小型应用"
echo "  - 🔗 组件：Linkerd Proxy、Controller"

echo "\n🏢 Consul Connect："
echo "  - 🎯 特点：HashiCorp 生态系统"
echo "  - 🔧 功能：服务发现、配置管理、安全"
echo "  - 💡 适用：混合云环境"
echo "  - 🔗 组件：Consul Agent、Envoy Proxy"

echo "\n☁️ AWS App Mesh："
echo "  - 🎯 特点：AWS 托管服务网格"
echo "  - 🔧 功能：与 AWS 服务深度集成"
echo "  - 💡 适用：AWS 云原生应用"
echo "  - 🔗 组件：Envoy Proxy、App Mesh Controller"

echo "\n🛠️ 服务网格核心功能："
echo "  🚦 流量管理："
echo "    - 智能路由和负载均衡"
echo "    - 金丝雀部署和蓝绿部署"
echo "    - 流量分割和镜像"
echo "    - 超时和重试策略"
echo "  "
echo "  🔐 安全策略："
echo "    - 自动 mTLS 加密"
echo "    - 身份验证和授权"
echo "    - 访问控制策略"
echo "    - 证书管理"
echo "  "
echo "  📊 可观测性："
echo "    - 分布式追踪"
echo "    - 指标收集和监控"
echo "    - 日志聚合"
echo "    - 服务拓扑可视化"
echo "  "
echo "  🔧 故障处理："
echo "    - 熔断器模式"
echo "    - 故障注入测试"
echo "    - 自动重试和超时"
echo "    - 降级策略"

echo "\n=== 实际演示 ==="
if command -v kubectl >/dev/null 2>&1; then
    echo "\n🔍 检查当前集群的服务发现："
    if kubectl cluster-info >/dev/null 2>&1; then
        echo "  ✅ 集群连接正常"
        
        echo "\n📋 当前服务列表："
        kubectl get services --all-namespaces -o wide 2>/dev/null | head -10 || echo "  无法获取服务列表"
        
        echo "\n🔍 DNS 服务状态："
        kubectl get pods -n kube-system -l k8s-app=kube-dns 2>/dev/null || \
        kubectl get pods -n kube-system -l k8s-app=coredns 2>/dev/null || \
        echo "  无法找到 DNS 服务 Pod"
        
        echo "\n🌐 测试 DNS 解析（如果有可用的 Pod）："
        test_pod=$(kubectl get pods -o name 2>/dev/null | grep -v Terminating | head -1 | cut -d'/' -f2)
        if [ -n "$test_pod" ]; then
            echo "  使用 Pod: $test_pod"
            echo "  测试 kubernetes 服务解析："
            kubectl exec $test_pod -- nslookup kubernetes.default.svc.cluster.local 2>/dev/null || \
            echo "    DNS 测试失败或 Pod 不支持 nslookup"
        else
            echo "  当前没有可用的 Pod 进行 DNS 测试"
        fi
        
        echo "\n📊 端点信息："
        kubectl get endpoints 2>/dev/null | head -5 || echo "  无法获取端点信息"
    else
        echo "  ❌ 无法连接到 Kubernetes 集群"
    fi
else
    echo "\n❌ kubectl 未安装，无法进行实际集群测试"
fi

echo "\n=== 最佳实践 ==="
echo "\n💡 服务发现最佳实践："
echo "  1. 🏷️ 使用有意义的服务名称"
echo "  2. 🔍 优先使用 DNS 服务发现"
echo "  3. 📋 为服务添加适当的标签和注解"
echo "  4. 🏥 配置合适的健康检查"
echo "  5. 📊 监控服务发现性能"
echo "  6. 🔒 实施适当的网络策略"

echo "\n🔧 故障排除技巧："
echo "  1. 检查服务选择器是否匹配 Pod 标签"
echo "  2. 验证端口配置是否正确"
echo "  3. 确认 DNS 服务正常运行"
echo "  4. 检查网络策略是否阻塞流量"
echo "  5. 验证健康检查配置"
echo "  6. 查看服务端点是否有效"

echo "\n✅ 服务发现演示完成！"
echo "\n🎯 关键要点："
echo "  - DNS 是推荐的服务发现方式"
echo "  - Service 提供稳定的访问端点"
echo "  - 健康检查确保流量只到达健康的 Pod"
echo "  - 服务网格提供高级流量管理功能"
echo "  - 选择合适的 Service 类型很重要"