#!/bin/bash

echo "=== 容器间通信方式 ==="

echo "\n🏠 1. 同一 Pod 内容器通信："
echo "  📡 网络特性："
echo "    - 共享 localhost 网络命名空间"
echo "    - 通过 127.0.0.1 或 localhost 通信"
echo "    - 共享网络接口和端口空间"
echo "    - 无需暴露端口到集群网络"
echo "  💾 存储特性："
echo "    - 共享存储卷（Volume）"
echo "    - 可以通过文件系统交换数据"
echo "    - 共享临时文件系统"
echo "  💡 典型场景："
echo "    - Web 服务器 + 日志收集器（sidecar 模式）"
echo "    - 应用容器 + 配置热重载容器"
echo "    - 主应用 + 监控代理"

echo "\n🌐 2. 不同 Pod 间通信："
echo "  📡 通信方式："
echo "    - 通过 Pod IP 直接通信（集群内）"
echo "    - 通过 Service 进行服务发现"
echo "    - 使用 DNS 名称解析"
echo "    - 通过 Ingress 控制器（HTTP/HTTPS）"
echo "  🔍 服务发现："
echo "    - Service 提供稳定的虚拟 IP"
echo "    - DNS 自动解析服务名"
echo "    - 环境变量注入服务信息"
echo "  💡 典型场景："
echo "    - 前端 Pod 调用后端 API Pod"
echo "    - 微服务间的 API 调用"
echo "    - 数据库客户端连接数据库 Pod"

echo "\n🌍 3. Pod 与外部服务通信："
echo "  🚪 访问方式："
echo "    - Service 的 ExternalName 类型"
echo "    - Ingress 控制器反向代理"
echo "    - 直接访问外部 IP 地址"
echo "    - 通过 NodePort 或 LoadBalancer"
echo "  🔐 安全考虑："
echo "    - 网络策略控制出站流量"
echo "    - TLS/SSL 加密通信"
echo "    - 服务网格（如 Istio）管理"
echo "  💡 典型场景："
echo "    - 访问外部数据库或缓存"
echo "    - 调用第三方 API 服务"
echo "    - 连接云服务（如对象存储）"

echo "\n=== 网络策略详解 ==="
echo "\n🛡️ NetworkPolicy 功能："
echo "  📥 入站规则（Ingress）："
echo "    - 控制哪些流量可以进入 Pod"
echo "    - 基于源 Pod、命名空间、IP 范围"
echo "    - 指定允许的端口和协议"
echo "    - 默认拒绝所有入站流量"
echo "  📤 出站规则（Egress）："
echo "    - 控制 Pod 可以访问哪些目标"
echo "    - 限制对外部服务的访问"
echo "    - 防止数据泄露和恶意访问"
echo "    - 默认允许所有出站流量"

echo "\n🏷️ 选择器机制："
echo "  - podSelector：基于 Pod 标签选择"
echo "  - namespaceSelector：基于命名空间标签"
echo "  - ipBlock：基于 IP 地址范围"
echo "  - 支持组合条件（AND/OR 逻辑）"

echo "\n📋 网络策略示例："
echo "\n# 只允许来自特定标签 Pod 的流量"
echo "apiVersion: networking.k8s.io/v1"
echo "kind: NetworkPolicy"
echo "metadata:"
echo "  name: allow-frontend"
echo "spec:"
echo "  podSelector:"
echo "    matchLabels:"
echo "      app: backend"
echo "  policyTypes:"
echo "  - Ingress"
echo "  ingress:"
echo "  - from:"
echo "    - podSelector:"
echo "        matchLabels:"
echo "          app: frontend"
echo "    ports:"
echo "    - protocol: TCP"
echo "      port: 8080"

echo "\n=== DNS 服务发现 ==="
echo "\n🔍 Kubernetes 内置 DNS："
echo "  📋 DNS 记录格式："
echo "    Service: <service-name>.<namespace>.svc.cluster.local"
echo "    Pod: <pod-ip>.<namespace>.pod.cluster.local"
echo "    Headless Service: <pod-name>.<service-name>.<namespace>.svc.cluster.local"

echo "\n🌐 DNS 解析示例："
echo "  web-service.default.svc.cluster.local     → 10.96.1.100"
echo "  db-service.production.svc.cluster.local   → 10.96.1.101"
echo "  api-service.staging.svc.cluster.local     → 10.96.1.102"
echo "  redis.cache.svc.cluster.local             → 10.96.1.103"

echo "\n📡 DNS 记录类型："
echo "  - A 记录：Service 的 ClusterIP"
echo "  - SRV 记录：端口和协议信息"
echo "  - CNAME 记录：ExternalName Service"
echo "  - PTR 记录：反向 DNS 查询"

echo "\n⚙️ DNS 配置："
echo "  - CoreDNS：默认 DNS 服务器"
echo "  - 自定义 DNS 策略"
echo "  - DNS 缓存和性能优化"
echo "  - 外部 DNS 集成"

echo "\n=== 服务类型详解 ==="
echo "\n🔧 Service 类型对比："
echo "\n1️⃣ ClusterIP（默认）："
echo "  - 仅集群内部访问"
echo "  - 虚拟 IP 地址"
echo "  - 负载均衡到后端 Pod"
echo "  - 适用于内部服务通信"

echo "\n2️⃣ NodePort："
echo "  - 在每个节点上开放端口"
echo "  - 端口范围：30000-32767"
echo "  - 外部可通过 <NodeIP>:<NodePort> 访问"
echo "  - 适用于开发和测试环境"

echo "\n3️⃣ LoadBalancer："
echo "  - 云提供商的负载均衡器"
echo "  - 自动分配外部 IP"
echo "  - 高可用和自动扩展"
echo "  - 适用于生产环境"

echo "\n4️⃣ ExternalName："
echo "  - DNS CNAME 记录"
echo "  - 映射到外部服务"
echo "  - 无代理，直接 DNS 解析"
echo "  - 适用于外部服务集成"

echo "\n=== 实际通信演示 ==="
if command -v kubectl >/dev/null 2>&1; then
    echo "\n🐳 检查 Kubernetes 集群连接："
    if kubectl cluster-info >/dev/null 2>&1; then
        echo "  ✅ 集群连接正常"
        
        echo "\n📋 当前集群服务："
        kubectl get services --all-namespaces 2>/dev/null | head -10 || echo "  无法获取服务列表"
        
        echo "\n🔍 DNS 测试（如果有运行的 Pod）："
        pod_name=$(kubectl get pods -o name 2>/dev/null | head -1 | cut -d'/' -f2)
        if [ -n "$pod_name" ]; then
            echo "  测试 Pod: $pod_name"
            echo "  DNS 解析测试："
            kubectl exec $pod_name -- nslookup kubernetes.default.svc.cluster.local 2>/dev/null || echo "  DNS 测试失败或 Pod 不支持 nslookup"
        else
            echo "  当前没有运行的 Pod 可用于测试"
        fi
    else
        echo "  ❌ 无法连接到 Kubernetes 集群"
    fi
else
    echo "\n❌ kubectl 未安装，无法进行实际集群测试"
fi

echo "\n=== 网络故障排除 ==="
echo "\n🔧 常用调试命令："
echo "  # 检查 Pod 网络"
echo "  kubectl get pods -o wide"
echo "  kubectl describe pod <pod-name>"
echo "  "
echo "  # 检查服务"
echo "  kubectl get services"
echo "  kubectl describe service <service-name>"
echo "  "
echo "  # 检查端点"
echo "  kubectl get endpoints"
echo "  "
echo "  # 网络策略"
echo "  kubectl get networkpolicies"
echo "  "
echo "  # DNS 调试"
echo "  kubectl exec <pod> -- nslookup <service-name>"
echo "  kubectl exec <pod> -- dig <service-name>"

echo "\n🚨 常见网络问题："
echo "  1. Pod 无法启动：检查镜像和资源限制"
echo "  2. 服务无法访问：检查标签选择器和端点"
echo "  3. DNS 解析失败：检查 CoreDNS 状态"
echo "  4. 网络策略阻塞：检查 NetworkPolicy 规则"
echo "  5. 跨节点通信问题：检查 CNI 插件状态"

echo "\n=== 最佳实践 ==="
echo "\n💡 网络设计建议："
echo "  1. 🏷️ 使用有意义的标签和选择器"
echo "  2. 🔒 实施最小权限网络策略"
echo "  3. 📊 监控网络性能和延迟"
echo "  4. 🔄 使用服务网格管理复杂通信"
echo "  5. 📝 文档化网络架构和策略"
echo "  6. 🧪 在非生产环境测试网络变更"

echo "\n🔐 安全建议："
echo "  1. 默认拒绝所有网络流量"
echo "  2. 只开放必要的端口和协议"
echo "  3. 使用 TLS 加密敏感通信"
echo "  4. 定期审查网络策略"
echo "  5. 监控异常网络活动"

echo "\n✅ 容器通信演示完成！"
echo "\n🎯 关键要点："
echo "  - Pod 内容器共享网络和存储"
echo "  - Service 提供稳定的服务发现"
echo "  - NetworkPolicy 控制网络访问"
echo "  - DNS 实现自动服务发现"
echo "  - 选择合适的 Service 类型"