K8S
1、项目总览
1.1、最终架构方案
1.2、IP分配规划
1.3、域名规划
1.4、CPU优化指南
1.5、云C部署指南
1.6、部署检查清单
1.7、快速参考手册
2.1、API-VIP高可用配置
2.2、Calico网络配置
2.3、存储方案配置
2.4、Ingress入口配置
2.5、安全加固配置
2.6、etcd优化配置
2.7、灾难恢复配置
2.8、公司网络配置
K8s部署
本文档使用 MrDoc 发布
-
+
首页
1.2、IP分配规划
# 内网IP分配规划 ## 🌐 网络拓扑总览 ``` ┌─────────────────────────────────────────────────────────────────────────┐ │ 公网层 (Internet) │ ├─────────────────────────────────────────────────────────────────────────┤ │ 云A: 172.93.107.95-104 (10 IPs) │ │ 云B: 172.93.107.136-145 (10 IPs) │ │ 云C: 199.127.62.90 + 104.243.47.223 + 45.126.208.x + 45.126.209.x │ └─────────────────────────────────────────────────────────────────────────┘ ↓ WireGuard VPN ┌─────────────────────────────────────────────────────────────────────────┐ │ WireGuard VPN层 (10.255.0.0/24) │ ├─────────────────────────────────────────────────────────────────────────┤ │ 云A: 10.255.0.1/24 云B: 10.255.0.2/24 云C: 10.255.0.3/24 │ │ 公司: 10.255.0.100/24 │ │ [云A ↔ 云B ↔ 云C: Full Mesh 0.5ms] │ │ [公司 → 云A: Hub-Spoke 180ms] │ └─────────────────────────────────────────────────────────────────────────┘ ↓ 虚拟桥接 ┌─────────────────────────────────────────────────────────────────────────┐ │ PVE宿主机层 │ ├─────────────────────────────────────────────────────────────────────────┤ │ 云端PVE: │ │ 云A PVE: 10.255.0.10 云B PVE: 10.255.0.20 云C PVE: 10.255.0.30│ │ │ │ 公司PVE (多网络): │ │ - 172.16.100.1 (K8s专用网段,vmbr0) │ │ - 10.255.0.100 (WireGuard VPN,wg0) │ │ - 192.168.72.0/24 (开发工作电脑,物理网络) │ │ - 172.16.72.0/21 (办公系统,物理网络) │ └─────────────────────────────────────────────────────────────────────────┘ ↓ VM虚拟化 ┌─────────────────────────────────────────────────────────────────────────┐ │ K8s VM层 │ ├─────────────────────────────────────────────────────────────────────────┤ │ Master节点 (云端): │ │ 10.255.0.101 (云A) 10.255.0.102 (云B) 10.255.0.103 (云C) │ │ VIP: 10.255.0.100 (HAProxy HA) │ │ │ │ Worker节点 (云端): │ │ 10.255.0.111-112 (云A) 10.255.0.113-114 (云B) 10.255.0.115-116 (云C)│ │ │ │ Worker节点 (公司): │ │ 172.16.100.10 (K8s专用网段) │ └─────────────────────────────────────────────────────────────────────────┘ ↓ K8s网络虚拟化 ┌─────────────────────────────────────────────────────────────────────────┐ │ K8s虚拟网络层 │ ├─────────────────────────────────────────────────────────────────────────┤ │ Pod网络: 172.16.0.0/12 (Calico VXLAN) │ │ - 云端节点: 172.16.0-15.0/24 │ │ - 公司节点: 172.16.101.0/24 │ │ │ │ Service网络: 10.96.0.0/12 (ClusterIP) │ │ - API Server: 10.96.0.1 │ │ - CoreDNS: 10.96.0.10 │ │ │ │ LoadBalancer网络: │ │ - 云端内网LB: 10.255.1.0/24 (MetalLB) │ │ - 公司内网LB: 172.16.100.100-200 (MetalLB) │ └─────────────────────────────────────────────────────────────────────────┘ 公司内网现有网段(物理网络): ├── 172.16.100.0/21 - K8s专用网段(2046 IPs,新规划) ├── 192.168.72.0/24 - 开发工作电脑(254 IPs,已占用) └── 172.16.72.0/21 - 办公系统(2046 IPs,已占用) ``` --- ## 📊 IP分配详细规划 ### 1. WireGuard VPN网络 (10.255.0.0/24) #### 1.1 WireGuard接口IP(核心互联) | 设备 | WireGuard接口 | IP地址 | 说明 | |------|--------------|--------|------| | **云A** | wg0 | 10.255.0.1/24 | WireGuard Hub节点 | | **云B** | wg0 | 10.255.0.2/24 | WireGuard Hub节点 | | **云C** | wg0 | 10.255.0.3/24 | WireGuard Hub节点 | | **公司** | wg0 | 10.255.0.100/24 | WireGuard边缘节点 | **路由关系:** ```bash # 云端全网状(Full Mesh) 云A ↔ 云B: 直连 云A ↔ 云C: 直连 云B ↔ 云C: 直连 # 公司为边缘节点(Hub-Spoke) 公司 → 云A: 直连 公司 → 云B: 通过云A中转 公司 → 云C: 通过云A中转 ``` --- #### 1.2 PVE宿主机管理IP | 宿主机 | 管理IP | 网络接口 | 用途 | 访问方式 | |--------|--------|---------|------|---------| | **云A PVE** | 10.255.0.10 | vmbr0 | PVE Web管理 | https://10.255.0.10:8006 | | **云B PVE** | 10.255.0.20 | vmbr0 | PVE Web管理 | https://10.255.0.20:8006 | | **云C PVE** | 10.255.0.30 | vmbr0 | PVE Web管理 | https://10.255.0.30:8006 | | **公司 PVE** | 172.16.100.1 | vmbr0 | PVE Web管理 | https://172.16.100.1:8006(K8s专用网段) | | **公司 PVE** | 10.255.0.100 | wg0 (WireGuard) | VPN远程管理 | https://10.255.0.100:8006(通过VPN) | **网络说明:** - 云端PVE通过WireGuard IP远程管理 - 公司PVE多网络: - 172.16.100.0/21(K8s专用网段,vmbr0桥接) - 10.255.0.0/24(WireGuard VPN,wg0接口) - 192.168.72.0/24(开发工作电脑,物理网络) - 172.16.72.0/21(办公系统,物理网络) --- ### 2. Kubernetes节点IP分配 (10.255.0.0/24) #### 2.1 Master节点(控制平面) | 节点名 | 所在位置 | IP地址 | PVE宿主机 | 用途 | SSH端口 | |--------|---------|--------|----------|------|---------| | **k8s-master-1** | 云A | 10.255.0.101 | 云A PVE | 主Master(etcd leader) | 22 | | **k8s-master-2** | 云B | 10.255.0.102 | 云B PVE | 备Master(etcd follower) | 22 | | **k8s-master-3** | 云C | 10.255.0.103 | 云C PVE | 备Master(etcd follower) | 22 | **Master节点配置:** ```yaml 规格: 16C/32G/200G 角色: control-plane,master 污点: node-role.kubernetes.io/control-plane:NoSchedule etcd: stacked模式(与Master同节点) ``` **Master HA VIP:** ``` VIP地址: 10.255.0.100 实现方式: HAProxy本地代理(每个节点) 解析域名: api.ktnet.cc → 10.255.0.100 ``` --- #### 2.2 Worker节点(工作负载) ##### 云端Worker(高性能) | 节点名 | 所在位置 | IP地址 | PVE宿主机 | 用途 | 资源 | |--------|---------|--------|----------|------|------| | **k8s-worker-1** | 云A | 10.255.0.111 | 云A PVE | 生产环境 | 24C/48G/400G | | **k8s-worker-2** | 云A | 10.255.0.112 | 云A PVE | 生产环境 | 24C/48G/400G | | **k8s-worker-3** | 云B | 10.255.0.113 | 云B PVE | 生产环境 | 24C/48G/400G | | **k8s-worker-4** | 云B | 10.255.0.114 | 云B PVE | 生产环境 | 24C/48G/400G | | **k8s-worker-5** | 云C | 10.255.0.115 | 云C PVE | 生产环境 | 24C/48G/400G | | **k8s-worker-6** | 云C | 10.255.0.116 | 云C PVE | 生产环境 | 24C/48G/400G | **标签示例:** ```bash kubectl label nodes k8s-worker-1 zone=cloud-a env=prod kubectl label nodes k8s-worker-3 zone=cloud-b env=prod kubectl label nodes k8s-worker-5 zone=cloud-c env=prod ``` ##### 边缘Worker(公司开发) | 节点名 | 所在位置 | IP地址 | PVE宿主机 | 用途 | 资源 | |--------|---------|--------|----------|------|------| | **k8s-worker-edge** | 公司 | 172.16.100.10 | 公司PVE | 开发/测试环境 | 48C/96G/1.8T | **特殊配置:** ```yaml 标签: node-role.kubernetes.io/edge: "" zone: on-prem env: dev 污点: node-role.kubernetes.io/edge:NoSchedule # 防止生产Pod调度 ``` --- ### 3. Kubernetes虚拟网络 #### 3.1 Service网络 (10.96.0.0/12) K8s Service ClusterIP地址池,由K8s自动分配。 **保留关键Service IP:** | Service名称 | Namespace | ClusterIP | 端口 | 说明 | |------------|-----------|-----------|------|------| | **kubernetes** | default | 10.96.0.1 | 443 | K8s API Server(自动) | | **kube-dns** | kube-system | 10.96.0.10 | 53/UDP | CoreDNS(手动指定) | | **metrics-server** | kube-system | 10.96.0.20 | 443 | 指标聚合 | | **kubernetes-dashboard** | kube-system | 10.96.50.100 | 443 | Web控制台 | | **argocd-server** | argocd | 10.96.50.101 | 443 | GitOps平台 | **DNS配置:** ```yaml # CoreDNS固定IP apiVersion: v1 kind: Service metadata: name: kube-dns namespace: kube-system spec: clusterIP: 10.96.0.10 ports: - name: dns port: 53 protocol: UDP - name: dns-tcp port: 53 protocol: TCP ``` --- #### 3.2 Pod网络 (172.16.0.0/12) Calico IPAM自动分配,按节点划分CIDR块。 **每节点Pod CIDR分配:** | 节点 | Pod CIDR | 可用IP数 | 说明 | |------|---------|---------|------| | k8s-master-1 | 172.16.0.0/24 | 254 | 系统Pod | | k8s-master-2 | 172.16.1.0/24 | 254 | 系统Pod | | k8s-master-3 | 172.16.2.0/24 | 254 | 系统Pod | | k8s-worker-1 | 172.16.10.0/24 | 254 | 业务Pod | | k8s-worker-2 | 172.16.11.0/24 | 254 | 业务Pod | | k8s-worker-3 | 172.16.12.0/24 | 254 | 业务Pod | | k8s-worker-4 | 172.16.13.0/24 | 254 | 业务Pod | | k8s-worker-5 | 172.16.14.0/24 | 254 | 业务Pod | | k8s-worker-6 | 172.16.15.0/24 | 254 | 业务Pod | | k8s-worker-edge | 172.16.100.0/24 | 254 | 开发Pod | **Calico配置:** ```yaml # 默认IPPool apiVersion: projectcalico.org/v3 kind: IPPool metadata: name: default-ipv4-ippool spec: cidr: 172.16.0.0/12 blockSize: 24 # 每节点/24 ipipMode: Never vxlanMode: CrossSubnet natOutgoing: true ``` --- #### 3.3 MetalLB内网LoadBalancer池 (10.255.1.0/24) 用于内网管理服务的LoadBalancer IP分配。 **IP池定义:** ```yaml apiVersion: metallb.io/v1beta1 kind: IPAddressPool metadata: name: internal-pool namespace: metallb-system spec: addresses: - 10.255.1.0-10.255.1.254 autoAssign: true --- apiVersion: metallb.io/v1beta1 kind: L2Advertisement metadata: name: internal-l2 namespace: metallb-system spec: ipAddressPools: - internal-pool ``` **预分配内网LoadBalancer IP:** | 服务 | Namespace | LoadBalancer IP | 端口 | 域名 | |------|-----------|----------------|------|------| | **harbor** | harbor-system | 10.255.1.10 | 443 | harbor.ktnet.cc | | **grafana** | monitoring | 10.255.1.11 | 443 | monitor.ktnet.cc | | **gitea** | gitea-system | 10.255.1.12 | 443 | git.ktnet.cc | | **kibana** | logging | 10.255.1.13 | 443 | logs.ktnet.cc | | **minio** | minio-system | 10.255.1.20 | 9001 | minio.ktnet.cc | | **alertmanager** | monitoring | 10.255.1.11 | 9093 | alert.ktnet.cc | --- ### 4. 公网IP分配规划 #### 4.1 云A公网IP池 (172.93.107.95-104,共10个) | IP地址 | 用途 | 绑定服务 | 环境 | 域名示例 | |--------|------|---------|------|---------| | 172.93.107.95 | 生产入口1 | Ingress-Nginx | Prod | ec.ktcloud.cc | | 172.93.107.96 | 生产入口2 | Ingress-Nginx | Prod | pay.ktcloud.cc | | 172.93.107.97 | 生产入口3 | Ingress-Nginx | Prod | user.ktcloud.cc | | 172.93.107.98 | 生产入口4 | API Gateway | Prod | api.ktcloud.cc | | 172.93.107.99 | 生产入口5 | WebSocket | Prod | ws.ktcloud.cc | | 172.93.107.100 | 生产数据库 | PostgreSQL HA | Prod | db-master.ktcloud.cc | | 172.93.107.101 | 生产Redis | Redis Cluster | Prod | redis.ktcloud.cc | | 172.93.107.109 | 灰度环境 | Ingress-Nginx | Gray | gray.ec.ktcloud.cc | | 172.93.107.103 | 备用1 | - | - | - | | 172.93.107.104 | 备用2 | - | - | - | #### 4.2 云B公网IP池 (172.93.107.136-145,共10个) | IP地址 | 用途 | 绑定服务 | 环境 | 域名示例 | |--------|------|---------|------|---------| | 172.93.107.136 | 灰度入口 | Ingress-Nginx | Gray | gray.pay.ktcloud.cc | | 172.93.107.137 | 测试入口 | Ingress-Nginx | Test | test.ec.ktcloud.cc | | 172.93.107.138 | 测试入口 | Ingress-Nginx | Test | test.pay.ktcloud.cc | | 172.93.107.139 | 生产备份 | MinIO Gateway | Prod | backup.ktcloud.cc | | 172.93.107.140 | 监控暴露(可选) | Grafana(公网) | - | public-monitor.ktcloud.cc | | 172.93.107.141-145 | 备用池 | - | - | 预留扩展 | #### 4.3 云C公网IP池 (已分配,共10个) | 序号 | IP地址 | 网关 | 用途 | 绑定服务 | 环境 | 域名示例 | |------|--------|------|------|---------|------|---------| | 1 | 199.127.62.90 | 199.127.62.1 | **PVE宿主机** | Proxmox Web | - | pve-c.ktnet.cc | | 2 | 104.243.47.223 | 104.243.47.1 | 测试环境入口 | Ingress-Nginx | Test | test.ktcloud.cc | | 3 | 45.126.208.32 | 45.126.208.1 | 测试API网关 | API Gateway | Test | test-api.ktcloud.cc | | 4 | 45.126.208.63 | 45.126.208.1 | 测试WebSocket | WebSocket | Test | test-ws.ktcloud.cc | | 5 | 45.126.208.170 | 45.126.208.1 | 灰度环境入口 | Ingress-Nginx | Gray | gray.ktcloud.cc | | 6 | 45.126.208.194 | 45.126.208.1 | 灰度API网关 | API Gateway | Gray | gray-api.ktcloud.cc | | 7 | 45.126.209.131 | 45.126.209.1 | 监控公网访问 | Grafana | - | monitor.ktcloud.cc | | 8 | 45.126.209.140 | 45.126.209.1 | 备用1 | - | - | - | | 9 | 45.126.209.141 | 45.126.209.1 | 备用2 | - | - | - | | 10 | 45.126.209.149 | 45.126.209.1 | 备用3 | - | - | - | **IP分配原则:** - ✅ **测试环境**:占用公网IP(外部测试人员访问) - ✅ **灰度环境**:占用公网IP(小范围用户验证) - ✅ **生产环境**:占用公网IP(云A/B) - ❌ **开发环境**:不占用公网IP,通过VPN内网访问 - ❌ **Harbor/Gitea**:不占用公网IP,通过VPN内网访问(管理工具) **注意**:云C IP地址来自多个不同网段,每个IP需单独配置路由 --- #### 4.4 内网服务访问方案(节省公网IP) **设计理念:** 开发、管理类服务不暴露公网,通过VPN内网访问,节省宝贵的公网IP资源 ##### 4.4.1 开发环境访问(内网) **部署位置:** 公司边缘节点(k8s-worker-edge)或云端Worker节点 **访问方式:** ``` 开发人员工作站 (192.168.72.0/24) ↓ 公司路由器 (VPN客户端) ↓ WireGuard VPN (10.255.0.100) ↓ K8s Ingress (内网LB: 10.255.1.x) ↓ 开发环境服务 ``` **域名配置:** ```yaml # 开发环境使用ktnet.cc内网域名 dev-web.ktnet.cc → 10.255.1.20 (内网LoadBalancer) dev-api.ktnet.cc → 10.255.1.21 dev-admin.ktnet.cc → 10.255.1.22 ``` **优势:** - ✅ 节省3-5个公网IP - ✅ 开发环境更安全(不暴露互联网) - ✅ 开发人员通过VPN访问(已有VPN连接) - ✅ 响应速度更快(内网直连) ##### 4.4.2 管理工具访问(内网) **Harbor镜像仓库:** ``` 域名: harbor.ktnet.cc 内网IP: 10.255.1.10 访问: 仅VPN内网访问 用途: Docker镜像存储和分发 ``` **Gitea代码仓库:** ``` 域名: git.ktnet.cc 内网IP: 10.255.1.12 访问: 仅VPN内网访问 用途: 轻量级Git代码仓库、Issue跟踪 ``` **Running CI/CD:** ``` 域名: running.ktnet.cc 内网IP: 10.255.1.16 访问: 仅VPN内网访问 用途: CI/CD流水线执行器 ``` **Grafana监控:** ``` 域名: monitor.ktnet.cc 内网IP: 10.255.1.11 访问: 主要VPN内网,可选公网(monitor.ktcloud.cc) 用途: 集群监控大屏 ``` **Kibana日志:** ``` 域名: logs.ktnet.cc 内网IP: 10.255.1.13 访问: 仅VPN内网访问 用途: 日志查询分析 ``` ##### 4.4.3 VPN接入配置 **方式1:开发人员工作站直接接入(推荐)** ```bash # 在开发人员Mac/Windows安装WireGuard客户端 # 配置文件示例 [Interface] PrivateKey = <开发人员私钥> Address = 10.255.0.201/24 DNS = 10.96.0.10 [Peer] PublicKey = <云A公钥> Endpoint = 185.150.190.216:51820 AllowedIPs = 10.255.0.0/24, 10.255.1.0/24, 172.16.100.0/21 PersistentKeepalive = 25 ``` **方式2:通过公司网关统一接入(现有方式)** ```bash # 开发人员工作站无需配置VPN # 公司路由器/防火墙配置WireGuard # 开发电脑流量自动转发到VPN ``` ##### 4.4.4 内网域名DNS配置 **CoreDNS配置(K8s内):** ```yaml apiVersion: v1 kind: ConfigMap metadata: name: coredns-custom namespace: kube-system data: ktnet.server: | ktnet.cc:53 { hosts { 10.255.1.10 harbor.ktnet.cc 10.255.1.11 monitor.ktnet.cc 10.255.1.12 ci.ktnet.cc 10.255.1.13 logs.ktnet.cc 10.255.1.20 dev-web.ktnet.cc 10.255.1.21 dev-api.ktnet.cc 10.255.1.22 dev-admin.ktnet.cc fallthrough } } ``` **或使用外部DNS(Cloudflare内网视图):** - 仅对VPN IP段返回内网地址 - 公网查询返回NXDOMAIN ##### 4.4.5 公网IP使用总结 **云A(10个IP):** - 生产环境:5-7个 - 备用:3-5个 **云B(10个IP):** - 灰度环境:2-3个 - 测试环境:2-3个 - 备用:4-6个 **云C(10个IP):** - 测试环境:3个(入口/API/WebSocket) - 灰度环境:2个(入口/API) - 监控公网访问:1个(可选) - 备用:3-4个 **总计使用:** 15-20个公网IP(实际业务) **总计备用:** 10-15个公网IP(预留扩展) **节省的IP:** - ❌ 开发环境(节省3-5个) - ❌ Harbor镜像仓库(节省1个) - ❌ Gitea/Running(节省1个) - ❌ 内网管理工具(节省2-3个) **合计节省:7-10个公网IP** 🎉 --- ### 5. 公司内网网段规划 #### 5.1 K8s专用网段 (172.16.100.0/21) **用途**:专门为公司K8s集群预留的网段,2046个可用IP | 设备/节点 | IP地址 | 用途 | 说明 | |----------|--------|------|------| | **PVE宿主机** | 172.16.100.1 | Proxmox管理 | K8s网段网关 | | **k8s-worker-edge** | 172.16.100.10 | K8s边缘节点 | 开发/测试环境 | | **内网LB池** | 172.16.100.100-200 | MetalLB公司池 | 100个LoadBalancer IP | | **预留扩展** | 172.16.100.201-107.255 | 未分配 | 未来扩展使用 | **Pod网络分配:** ``` k8s-worker-edge Pod CIDR: 172.16.101.0/24 (254个Pod IP) ``` --- #### 5.2 开发工作电脑网段 (192.168.72.0/24) **用途**:开发人员办公电脑(已占用,独立网段) | 设备 | IP地址 | 用途 | 说明 | |------|--------|------|------| | 网关 | 192.168.72.1 | 路由器 | 出口网关 | | 办公电脑池 | 192.168.72.100-200 | DHCP | 开发人员工作站 | **访问方式:** - 通过WireGuard VPN访问云端K8s集群 - 直接访问公司K8s节点(同机房) --- #### 5.3 办公系统网段 (172.16.72.0/21) **用途**:公司内部其他办公系统(已占用,独立网段) | 用途 | IP范围 | 说明 | |------|--------|------| | 办公系统 | 172.16.72.0-79.255 | OA、ERP等内部系统 | --- #### 5.4 网络互联与路由 **公司PVE路由配置:** ```bash # K8s专用网段 → WireGuard VPN → 云端集群 172.16.100.0/21 via 10.255.0.100 (本地WireGuard) ↓ 云端K8s集群 (10.255.0.0/24) # 开发工作电脑 → WireGuard VPN → 云端集群 192.168.72.0/24 via 公司PVE路由转发 ↓ WireGuard VPN (10.255.0.100) ↓ 云端K8s集群 # 办公系统访问K8s 172.16.72.0/21 via 公司PVE路由转发(按需开放) ``` **可访问资源:** ```bash # 从K8s专用网段 (172.16.100.0/21) 可访问: ✅ WireGuard VPN: 10.255.0.0/24 ✅ 云端K8s节点: 10.255.0.101-116 ✅ K8s Service: 10.96.0.0/12 ✅ K8s Pod: 172.16.0.0/12 ✅ 云端内网LB: 10.255.1.0/24 # 从开发工作电脑 (192.168.72.0/24) 通过VPN可访问: ✅ 云端K8s API: api.ktnet.cc (10.255.0.100:6443) ✅ 云端管理服务: harbor/monitor/ci等 ✅ 公司K8s节点: 172.16.100.10 (直连) ``` --- ## 🔧 配置示例 ### 1. WireGuard配置(云A) ```ini # /etc/wireguard/wg0.conf [Interface] Address = 10.255.0.1/24 ListenPort = 51820 PrivateKey = <云A私钥> # 云B peer [Peer] PublicKey = <云B公钥> Endpoint = 172.93.107.136:51820 AllowedIPs = 10.255.0.2/32, 172.16.12.0/24, 172.16.13.0/24 PersistentKeepalive = 25 # 云C peer [Peer] PublicKey = <云C公钥> Endpoint = <云C公网IP>:51820 AllowedIPs = 10.255.0.3/32, 172.16.14.0/24, 172.16.15.0/24 PersistentKeepalive = 25 # 公司 peer [Peer] PublicKey = <公司公钥> Endpoint = <公司公网IP>:51820 AllowedIPs = 10.255.0.100/32, 172.16.100.0/21, 172.16.101.0/24, 192.168.72.0/24, 172.16.72.0/21 PersistentKeepalive = 25 # 说明: # - 10.255.0.100/32: 公司WireGuard接口 # - 172.16.100.0/21: 公司K8s专用网段 # - 172.16.101.0/24: 公司边缘节点Pod网络 # - 192.168.72.0/24: 开发工作电脑 # - 172.16.72.0/21: 办公系统 ``` --- ### 2. PVE网络配置(云A) ```bash # /etc/network/interfaces auto lo iface lo inet loopback # 物理网卡(公网) auto eno1 iface eno1 inet static address 172.93.107.95/24 gateway 172.93.107.1 dns-nameservers 8.8.8.8 # VM桥接网卡 auto vmbr0 iface vmbr0 inet static address 10.255.0.10/24 bridge-ports none bridge-stp off bridge-fd 0 post-up iptables -t nat -A POSTROUTING -s 10.255.0.0/24 -o eno1 -j MASQUERADE post-down iptables -t nat -D POSTROUTING -s 10.255.0.0/24 -o eno1 -j MASQUERADE # WireGuard接口 auto wg0 iface wg0 inet static address 10.255.0.1/24 pre-up ip link add wg0 type wireguard pre-up wg setconf wg0 /etc/wireguard/wg0.conf post-up ip route add 10.255.0.0/24 dev wg0 post-up ip route add 172.16.0.0/12 dev wg0 post-down ip link del wg0 ``` --- ### 3. K8s节点网络配置(Master-1) ```yaml # /etc/netplan/00-installer-config.yaml network: version: 2 ethernets: ens18: addresses: - 10.255.0.101/24 routes: - to: default via: 10.255.0.10 # PVE网关 nameservers: addresses: - 10.96.0.10 # CoreDNS - 8.8.8.8 search: - ktnet.cc - cluster.local ``` --- ### 4. K8s边缘节点网络配置(公司Worker) ```yaml # /etc/netplan/00-installer-config.yaml network: version: 2 ethernets: ens18: addresses: - 172.16.100.10/21 # 公司K8s专用网段 routes: - to: default via: 172.16.100.1 # 公司PVE网关 - to: 10.255.0.0/24 via: 172.16.100.1 # VPN网段通过PVE路由 - to: 10.96.0.0/12 via: 172.16.100.1 # K8s Service网段 - to: 172.16.0.0/12 via: 172.16.100.1 # K8s Pod网段(云端) nameservers: addresses: - 10.96.0.10 # CoreDNS - 172.16.100.1 # 公司DNS search: - ktnet.cc - cluster.local ``` **公司PVE路由配置(/etc/network/interfaces):** ```bash # K8s专用网段桥接 auto vmbr0 iface vmbr0 inet static address 172.16.100.1/21 bridge-ports none bridge-stp off bridge-fd 0 # 转发到云端集群 post-up ip route add 10.255.0.0/24 dev wg0 post-up ip route add 10.96.0.0/12 dev wg0 post-up ip route add 172.16.0.0/12 dev wg0 # NAT访问公网 post-up iptables -t nat -A POSTROUTING -s 172.16.100.0/21 ! -d 172.16.0.0/8 -o eno1 -j MASQUERADE post-down iptables -t nat -D POSTROUTING -s 172.16.100.0/21 ! -d 172.16.0.0/8 -o eno1 -j MASQUERADE # WireGuard VPN接口 auto wg0 iface wg0 inet static address 10.255.0.100/24 pre-up ip link add wg0 type wireguard pre-up wg setconf wg0 /etc/wireguard/wg0.conf post-up ip route add 10.255.0.0/24 dev wg0 post-down ip link del wg0 ``` --- ### 5. CoreDNS Hosts配置 ```yaml apiVersion: v1 kind: ConfigMap metadata: name: coredns namespace: kube-system data: Corefile: | .:53 { errors health kubernetes cluster.local in-addr.arpa ip6.arpa { pods insecure fallthrough in-addr.arpa ip6.arpa } prometheus :9153 forward . /etc/resolv.conf cache 30 loop reload loadbalance } # ktnet.cc内网解析 ktnet.cc:53 { hosts { 10.255.0.100 api.ktnet.cc 10.255.1.10 harbor.ktnet.cc 10.255.1.11 monitor.ktnet.cc 10.255.1.11 alert.ktnet.cc 10.255.1.13 logs.ktnet.cc 10.255.1.12 ci.ktnet.cc 10.255.1.20 minio.ktnet.cc fallthrough } log } ``` --- ## 📋 部署检查清单 ### 网络连通性测试 ```bash # 1. WireGuard VPN互通测试 ping 10.255.0.1 # 云A ping 10.255.0.2 # 云B ping 10.255.0.3 # 云C ping 10.255.0.100 # 公司 # 2. K8s节点互通测试 for i in {101..103}; do ping -c 2 10.255.0.$i; done # Master节点 for i in {111..116}; do ping -c 2 10.255.0.$i; done # Worker节点 # 3. DNS解析测试 nslookup api.ktnet.cc 10.96.0.10 nslookup harbor.ktnet.cc 10.96.0.10 # 4. Service访问测试 curl -k https://10.255.0.100:6443/healthz # API Server curl -k https://10.255.1.10 # Harbor # 5. Pod网络测试 kubectl run test-pod --image=busybox --rm -it -- sh / # ping 172.16.10.5 # 跨节点Pod / # nslookup kubernetes.default.svc.cluster.local ``` --- ## 📊 IP地址统计 | 网络段 | 用途 | 地址范围 | 总数 | 已用 | 可用 | |--------|------|---------|------|------|------| | **10.255.0.0/24** | WireGuard + K8s节点 | 10.255.0.1-254 | 254 | 20 | 234 | | **10.255.1.0/24** | MetalLB内网池 | 10.255.1.1-254 | 254 | 10 | 244 | | **10.96.0.0/12** | Service ClusterIP | 10.96.0.1-10.111.255.254 | 1,048,576 | ~100 | ~104万 | | **172.16.0.0/12** | Pod网络 | 172.16.0.0-172.31.255.255 | 1,048,576 | ~10,000 | ~103万 | | **172.16.100.0/21** | 公司K8s专用网段 | 172.16.100.0-107.255 | 2,046 | 111 | 1,935 | | **192.168.72.0/24** | 公司开发工作电脑 | 192.168.72.1-254 | 254 | ~100 | ~154 | | **172.16.72.0/21** | 公司办公系统 | 172.16.72.0-79.255 | 2,046 | ~500 | ~1,546 | | **公网IP** | 业务暴露 | 3个IP池 | 30 | 15-20 | 10-15 | --- ## 💡 公网IP优化策略 ### 优化目标 **节省公网IP资源,将开发和管理类服务改为VPN内网访问** ### 优化前后对比 #### 原计划(浪费资源) | 服务类型 | 公网IP分配 | 问题 | |---------|-----------|------| | 生产环境 | ✅ 5-7个 | 合理 | | 灰度环境 | ✅ 3-4个 | 合理 | | 测试环境 | ✅ 3-5个 | 合理 | | **开发环境** | ✅ 3-5个 | ❌ 浪费 | | **Harbor镜像仓库** | ✅ 1个 | ❌ 浪费 | | **Gitea/Running** | ✅ 1个 | ❌ 浪费 | | **其他管理工具** | ✅ 2-3个 | ❌ 浪费 | | 备用 | 5-8个 | 合理 | | **总计使用** | **23-28个** | **过高** | #### 优化后(合理分配) | 服务类型 | 公网IP分配 | 访问方式 | |---------|-----------|---------| | 生产环境 | ✅ 5-7个 | 公网 | | 灰度环境 | ✅ 3-4个 | 公网 | | 测试环境 | ✅ 3-5个 | 公网 | | **开发环境** | ❌ 0个 | **VPN内网** | | **Harbor镜像仓库** | ❌ 0个 | **VPN内网** | | **Gitea/Running** | ❌ 0个 | **VPN内网** | | **其他管理工具** | ❌ 0个 | **VPN内网** | | 监控公网访问(可选) | ✅ 1个 | 公网(可选) | | 备用 | 10-15个 | - | | **总计使用** | **15-20个** | **合理** | #### 节省成果 🎉 | 项目 | 数量 | |------|------| | **节省公网IP** | **7-10个** | | **节省比例** | **30-40%** | | **总备用IP** | 增加到10-15个 | | **成本节约** | 显著(公网IP资源宝贵) | ### 内网服务访问架构 #### 1. 开发环境(内网) **域名:** dev-*.ktnet.cc **IP池:** 10.255.1.20-29(内网LoadBalancer) **访问流程:** ``` 开发人员工作站 (192.168.72.x) ↓ 公司路由器/VPN ↓ WireGuard VPN (10.255.0.100) ↓ K8s Ingress (10.255.1.x) ↓ 开发环境Pod ``` **域名示例:** - dev-web.ktnet.cc → 10.255.1.20 - dev-api.ktnet.cc → 10.255.1.21 - dev-admin.ktnet.cc → 10.255.1.22 #### 2. Harbor镜像仓库(内网) **域名:** harbor.ktnet.cc **内网IP:** 10.255.1.10 **访问:** 仅VPN内网访问 **配置示例:** ```bash # Docker配置 cat /etc/docker/daemon.json { "insecure-registries": ["harbor.ktnet.cc"], "registry-mirrors": ["https://harbor.ktnet.cc"] } # K8s ImagePullSecrets kubectl create secret docker-registry harbor-secret \ --docker-server=harbor.ktnet.cc \ --docker-username=admin \ --docker-password=password ``` #### 3. Gitea + Running(内网) **域名:** git.ktnet.cc **内网IP:** 10.255.1.12 **访问:** 仅VPN内网访问 **用途:** - Gitea:轻量级Git代码仓库 - Running:CI/CD流水线执行器 - Issue跟踪和项目管理 - Webhook集成 #### 4. Grafana监控(双模式) **内网域名:** monitor.ktnet.cc → 10.255.1.11 **公网域名(可选):** monitor.ktcloud.cc → 45.126.209.131 **推荐:** 主要使用内网访问,公网仅用于紧急查看 #### 5. 其他管理工具(内网) | 服务 | 域名 | 内网IP | 用途 | |------|------|--------|------| | Kibana | logs.ktnet.cc | 10.255.1.13 | 日志查询 | | Prometheus | prometheus.ktnet.cc | 10.255.1.14 | 监控数据源 | | AlertManager | alert.ktnet.cc | 10.255.1.15 | 告警管理 | | Running | running.ktnet.cc | 10.255.1.16 | CI/CD执行器 | ### VPN接入方式 **采用方案:通过公司网关统一接入** ✅ **适用场景:** 公司内网办公(所有开发人员) **架构说明:** ``` 开发人员工作站 (192.168.72.0/24) ↓ 公司路由器/防火墙 ↓ WireGuard VPN (10.255.0.100) ↓ 云端K8s集群 ``` **配置特点:** - ✅ 开发人员工作站无需单独配置VPN - ✅ 公司路由器/防火墙统一配置WireGuard连接 - ✅ 所有流量自动路由到VPN(对开发人员透明) - ✅ IT部门统一管理和监控 - ✅ 更高的安全性和可控性 **公司网关WireGuard配置:** ```ini # 公司路由器/防火墙上配置 [Interface] PrivateKey = <公司网关私钥> Address = 10.255.0.100/24 DNS = 10.96.0.10 [Peer] # 云A PublicKey = <云A公钥> Endpoint = 185.150.190.216:51820 AllowedIPs = 10.255.0.0/24, 10.255.1.0/24, 172.16.100.0/21 PersistentKeepalive = 25 [Peer] # 云B(可选,通过云A中转) PublicKey = <云B公钥> Endpoint = 104.194.9.56:51820 AllowedIPs = 10.255.0.2/32 PersistentKeepalive = 25 [Peer] # 云C(可选,通过云A中转) PublicKey = <云C公钥> Endpoint = 199.127.62.90:51820 AllowedIPs = 10.255.0.3/32 PersistentKeepalive = 25 ``` **路由配置:** ```bash # 在公司路由器上配置静态路由 # 将K8s相关网段路由到WireGuard接口 ip route add 10.255.0.0/24 dev wg0 ip route add 10.255.1.0/24 dev wg0 ip route add 172.16.0.0/12 dev wg0 ``` **优势总结:** - 🔒 统一安全控制点 - 📊 集中监控和审计 - 🚀 开发人员零配置 - 🔧 故障排查集中化 - 📈 易于扩展新用户 ### DNS配置方案 **采用方案:CoreDNS(K8s集群内)** ✅ **在K8s集群内配置:** ```yaml apiVersion: v1 kind: ConfigMap metadata: name: coredns-custom namespace: kube-system data: ktnet.server: | ktnet.cc:53 { hosts { # 管理工具 10.255.1.10 harbor.ktnet.cc 10.255.1.11 monitor.ktnet.cc 10.255.1.12 git.ktnet.cc 10.255.1.13 logs.ktnet.cc 10.255.1.14 prometheus.ktnet.cc 10.255.1.15 alert.ktnet.cc 10.255.1.16 running.ktnet.cc # 开发环境 10.255.1.20 dev-web.ktnet.cc 10.255.1.21 dev-api.ktnet.cc 10.255.1.22 dev-admin.ktnet.cc # PVE管理 10.255.0.10 pve-a.ktnet.cc 10.255.0.20 pve-b.ktnet.cc 10.255.0.30 pve-c.ktnet.cc fallthrough } } ``` **应用配置:** ```bash kubectl apply -f coredns-custom.yaml kubectl rollout restart deployment/coredns -n kube-system ``` **验证DNS解析:** ```bash # 在任意Pod内测试 kubectl run -it --rm dns-test --image=busybox --restart=Never -- nslookup harbor.ktnet.cc kubectl run -it --rm dns-test --image=busybox --restart=Never -- nslookup git.ktnet.cc ``` **公司工作站DNS配置:** - 配置DNS服务器指向公司路由器 - 公司路由器转发 *.ktnet.cc 查询到 K8s CoreDNS (10.96.0.10) - 或在公司路由器上配置 hosts 文件映射 ### 优势总结 #### 1. 资源节约 | 项目 | 节约 | |------|------| | 公网IP | 7-10个 | | IP成本 | 显著降低 | | 备用资源 | 增加50-100% | #### 2. 安全性提升 | 方面 | 改善 | |------|------| | 开发环境 | 不暴露公网,避免扫描攻击 | | Harbor | 镜像仓库安全,防止未授权访问 | | Gitea | 代码仓库保护 | | 管理工具 | 仅VPN可访问,权限控制更严格 | #### 3. 性能优化 | 场景 | 提升 | |------|------| | 内网访问 | 延迟更低(<1ms云端,~180ms公司) | | 带宽 | 无公网带宽限制 | | 稳定性 | 更可靠的内网连接 | #### 4. 管理简化 | 方面 | 简化 | |------|------| | IP管理 | 减少公网IP配置和维护 | | 防火墙规则 | 更少的公网暴露点 | | SSL证书 | 内网使用自签名证书,简化管理 | ### 注意事项 #### 1. VPN稳定性要求 - ⚠️ 开发和管理工具依赖VPN连接 - 建议配置VPN监控和告警 - 准备备用VPN方案(双线路) #### 2. 性能考虑 - 公司到云端延迟~180ms - 开发环境部署建议: - 性能要求高 → 部署在云端Worker - 数据本地化 → 部署在公司边缘节点 #### 3. 访问权限管理 - 制定VPN访问策略 - 区分开发人员权限 - 定期审计VPN使用 #### 4. 灾难恢复 - VPN故障时的应急方案 - 关键服务的临时公网暴露步骤 - 定期演练VPN故障恢复 --- ## 🔍 故障排查 ### 常见问题 **1. Pod无法访问外网** ```bash # 检查NAT配置 iptables -t nat -L POSTROUTING -n -v # 检查Calico natOutgoing kubectl get ippool default-ipv4-ippool -o yaml | grep natOutgoing # 应该为 true ``` **2. 跨节点Pod不通** ```bash # 检查WireGuard隧道 wg show # 检查路由 ip route | grep 172.16 # 检查Calico VXLAN ip -d link show vxlan.calico ``` **3. Service无法访问** ```bash # 检查kube-proxy模式 kubectl -n kube-system logs -l k8s-app=kube-proxy | grep "proxy mode" # 检查iptables规则 iptables -t nat -L KUBE-SERVICES -n | grep <service-name> ``` **4. LoadBalancer IP无法访问** ```bash # 检查MetalLB kubectl -n metallb-system get pods kubectl -n metallb-system logs -l app=metallb # 检查L2 ARP arping -I ens18 10.255.1.10 ``` --- ## 📌 重要说明:公司内网网段规划 ### 网段使用现状 本方案基于公司实际网络现状进行规划: **已占用网段(不可修改):** 1. **192.168.72.0/24** - 开发工作电脑专用 - 约100台开发人员工作站 - DHCP动态分配 - 通过WireGuard VPN访问云端K8s集群 2. **172.16.72.0/21** - 公司办公系统专用 - OA、ERP等内部办公系统 - 约500个已分配IP - 独立运行,与K8s隔离 **K8s专用网段(新规划):** 3. **172.16.100.0/21** - K8s专用网段 - 专门为K8s集群预留 - 2046个可用IP - 包含: - PVE宿主机:172.16.100.1 - K8s边缘节点:172.16.100.10 - 内网LoadBalancer池:172.16.100.100-200 - Pod网络:172.16.101.0/24 ### 网络隔离与安全 ``` 公司内网架构: 192.168.72.0/24 (开发工作电脑) ↓ 通过路由器 公司PVE (多接口) ├─→ 172.16.100.0/21 (K8s专用网段,vmbr0桥接) ├─→ 10.255.0.100 (WireGuard VPN,wg0) └─→ 172.16.72.0/21 (办公系统,物理网络) 隔离策略: ✅ K8s专用网段与开发电脑网段路由隔离 ✅ K8s专用网段与办公系统网段路由隔离 ✅ 仅通过WireGuard VPN访问云端集群 ✅ 防火墙控制跨网段访问 ``` ### 关键配置提醒 **公司PVE多网卡配置:** ```bash # vmbr0: K8s专用桥接网卡 - 172.16.100.1/21 (K8s VM使用) # eno1: 物理网卡1 - 192.168.72.x (连接开发工作电脑网段) # eno2: 物理网卡2(可选) - 172.16.72.x (连接办公系统网段) # wg0: WireGuard VPN - 10.255.0.100/24 (连接云端集群) ``` --- **版本:v1.1** **更新时间:2025-01-22** **修订内容:修正公司内网IP规划,使用172.16.100.0/21作为K8s专用网段** **配合文档:1.1、最终架构方案.md, 1.3、域名规划.md**
arise
2025年11月22日 09:49
转发文档
收藏文档
‹‹
‹
3
/ 17
›
››
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
PDF文档(打印)
分享
链接
类型
密码
更新密码