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 发布
-
+
首页
2.8、公司网络配置
# 公司网络接入配置 ## 📖 说明 本文档提供公司内网节点接入云端K8s集群的完整配置方案。 ## 🎯 场景分析 ### 问题 - 公司是否有固定公网IP? - RouterOS是否在公网边界? - 办公网192.168.72.0/24与服务器网172.16.72.0/21如何隔离? ### 三种场景方案 | 场景 | 网络条件 | 复杂度 | 推荐方案 | |------|---------|--------|---------| | **场景A** | 固定公网IP | ⭐⭐ | WireGuard直连 | | **场景B** | 动态IP/DDNS | ⭐⭐⭐ | DDNS+主动连接 | | **场景C** | CGNAT无入站 | ⭐⭐⭐⭐ | FRP隧道/Tailscale | ## 📄 完整配置 ### 场景A:公司有固定公网IP(最理想) **网络拓扑:** ``` 互联网 <-> 公司路由器(固定IP) <-> 内部交换机 <-> PVE节点 + 办公网 ``` **WireGuard配置:** ```conf # 云侧配置 [Peer] # 公司节点 PublicKey = <corp-public-key> Endpoint = <公司固定公网IP>:51820 # 如 203.0.113.100:51820 AllowedIPs = 10.255.0.3/32, 172.16.72.0/21, 192.168.72.0/24, 172.16.100.0/21 PersistentKeepalive = 25 ``` **RouterOS配置:** ```routeros # WireGuard接口 /interface wireguard add name=wg-cloud-a listen-port=51820 private-key="<私钥>" add address=10.255.0.3/32 # WireGuard Peers /interface wireguard peers add interface=wg-cloud-a public-key="<云A公钥>" \ endpoint-address=185.150.190.216 endpoint-port=51820 \ allowed-address=10.255.0.1/32,10.25.72.0/21,10.16.72.0/21,10.96.0.0/12 \ persistent-keepalive=25s add interface=wg-cloud-a public-key="<云B公钥>" \ endpoint-address=104.194.9.56 endpoint-port=51820 \ allowed-address=10.255.0.2/32,10.26.72.0/21,10.17.72.0/21 \ persistent-keepalive=25s # 路由配置 /ip route add dst-address=10.16.72.0/21 gateway=wg-cloud-a comment="云A Pod网段" add dst-address=10.17.72.0/21 gateway=wg-cloud-a comment="云B Pod网段" add dst-address=10.96.0.0/12 gateway=wg-cloud-a comment="K8s Service网段" # 防火墙(办公网访问管理服务) /ip firewall filter add chain=forward src-address=192.168.72.0/24 dst-address=172.16.72.0/21 \ action=accept comment="办公网访问管理节点" add chain=forward src-address=192.168.72.0/24 dst-address=10.255.0.0/24 \ action=accept comment="办公网访问K8s管理" add chain=forward src-address=172.16.72.0/21 dst-address=10.255.0.0/24 \ action=accept comment="服务器访问WG" # NAT(公司节点访问公网) /ip firewall nat add chain=srcnat out-interface=<WAN接口> src-address=172.16.72.0/21 \ action=masquerade comment="服务器出公网NAT" ``` ### 场景B:公司无固定IP(动态拨号/CGNAT) **使用DDNS + 主动连接模式:** ```routeros # RouterOS DDNS脚本(Cloudflare) /system script add name=ddns-update source={ :local wanip [/ip address get [find interface="<WAN接口>"] address]; :local wanip [:pick $wanip 0 [:find $wanip "/"]]; /tool fetch mode=https url="https://api.cloudflare.com/client/v4/zones/<zone-id>/dns_records/<record-id>" \ http-method=put \ http-header-field="Authorization: Bearer <token>,Content-Type: application/json" \ http-data="{\"type\":\"A\",\"name\":\"corp-wg.ktnet.cc\",\"content\":\"$wanip\"}"; } /system scheduler add name=ddns-schedule interval=5m on-event=ddns-update ``` **云侧WireGuard配置改为域名:** ```conf [Peer] # 公司节点 PublicKey = <corp-public-key> Endpoint = corp-wg.ktnet.cc:51820 # 使用DDNS域名 AllowedIPs = 10.255.0.3/32, 172.16.72.0/21, 192.168.72.0/24, 172.16.100.0/21 PersistentKeepalive = 25 ``` **或使用"主动连接"模式:** ```conf # 云A配置(不设Endpoint,等公司主动连接) [Peer] # 公司节点 PublicKey = <corp-public-key> AllowedIPs = 10.255.0.3/32, 172.16.72.0/21, 192.168.72.0/24, 172.16.100.0/21 # 不设置Endpoint # 公司节点配置(设置Endpoint主动连接) [Peer] # 云A PublicKey = <cloud-a-public-key> Endpoint = 185.150.190.216:51820 # 主动连接云A AllowedIPs = 10.255.0.1/32, 10.25.72.0/21, 10.16.72.0/21 PersistentKeepalive = 25 ``` ### 场景C:公司在CGNAT后(无法接受入站连接) **方案1:使用FRP反向代理:** ```ini # frps.ini(云A节点 185.150.190.216) [common] bind_port = 7000 token = <强密码> ``` ```ini # frpc.ini(公司节点) [common] server_addr = 185.150.190.216 server_port = 7000 token = <强密码> [wg-tunnel] type = udp local_ip = 127.0.0.1 local_port = 51820 remote_port = 51820 ``` **方案2:使用Tailscale(更简单):** ```bash # 安装Tailscale(所有节点) curl -fsSL https://tailscale.com/install.sh | sh # 公司节点 tailscale up --advertise-routes=172.16.72.0/21,172.16.100.0/21 # 云侧节点 tailscale up --advertise-routes=10.16.72.0/21,10.17.72.0/21,10.96.0.0/12 # 在Tailscale管理后台批准路由 # 替换WireGuard IP为Tailscale IP(100.x.x.x) ``` ## 📄 办公网与管理网隔离方案 ### 方案A:RouterOS策略路由 ```routeros # 策略路由(办公网仅访问特定服务) /ip firewall mangle add chain=prerouting src-address=192.168.72.0/24 \ dst-address=10.255.0.10 action=mark-routing new-routing-mark=to-k8s \ comment="办公网访问K8s API" /ip route add dst-address=10.255.0.10/32 gateway=wg-cloud-a routing-mark=to-k8s ``` ### 方案B:部署堡垒机(跳板机) ```yaml apiVersion: apps/v1 kind: Deployment metadata: name: bastion namespace: kube-system spec: replicas: 1 selector: matchLabels: app: bastion template: metadata: labels: app: bastion spec: nodeSelector: topology.kubernetes.io/zone: corp containers: - name: bastion image: ubuntu:22.04 command: ["/usr/sbin/sshd", "-D"] ports: - containerPort: 22 --- apiVersion: v1 kind: Service metadata: name: bastion namespace: kube-system spec: type: ClusterIP clusterIP: 172.16.72.100 # 固定IP selector: app: bastion ports: - port: 22 targetPort: 22 ``` ```routeros # RouterOS配置DNAT /ip firewall nat add chain=dstnat src-address=192.168.72.0/24 \ dst-address=192.168.72.254 protocol=tcp dst-port=2222 \ action=dst-nat to-addresses=172.16.72.100 to-ports=22 \ comment="办公网SSH跳板机" # 运维人员访问: # ssh -J user@192.168.72.254:2222 user@<K8s节点IP> ``` ### 方案C:VPN分离访问(推荐) ```yaml # 部署OpenVPN服务端(公司内网节点) apiVersion: apps/v1 kind: Deployment metadata: name: openvpn-mgmt namespace: kube-system spec: replicas: 1 selector: matchLabels: app: openvpn-mgmt template: metadata: labels: app: openvpn-mgmt spec: nodeSelector: topology.kubernetes.io/zone: corp hostNetwork: true containers: - name: openvpn image: kylemanna/openvpn securityContext: capabilities: add: ["NET_ADMIN"] volumeMounts: - name: openvpn-data mountPath: /etc/openvpn volumes: - name: openvpn-data persistentVolumeClaim: claimName: openvpn-data ``` ```conf # OpenVPN配置(只推送管理网段) # /etc/openvpn/server.conf push "route 10.255.0.0 255.255.255.0" # K8s管理网段 push "route 172.16.72.0 255.255.248.0" # 管理节点 push "dhcp-option DNS 10.96.0.10" # CoreDNS ``` ## 📄 流量成本优化 ### 边缘Prometheus(本地聚合) ```yaml apiVersion: v1 kind: ConfigMap metadata: name: prometheus-corp namespace: monitoring spec: prometheus.yml: | global: scrape_interval: 30s # 降低采集频率 scrape_configs: - job_name: 'kubernetes-nodes' kubernetes_sd_configs: - role: node relabel_configs: - source_labels: [__meta_kubernetes_node_label_topology_kubernetes_io_zone] regex: corp action: keep # 只采集公司节点 remote_write: - url: http://prometheus-cloud.monitoring.svc:9090/api/v1/write queue_config: max_samples_per_send: 5000 # 批量发送 batch_send_deadline: 60s # 60秒发送一次 ``` ### 监控WireGuard流量 ```yaml apiVersion: monitoring.coreos.com/v1 kind: PrometheusRule metadata: name: wireguard-traffic-alert namespace: monitoring spec: groups: - name: wireguard rules: - alert: WireGuardHighTraffic expr: rate(node_network_transmit_bytes_total{device="wg0"}[5m]) > 10485760 # 10MB/s for: 10m annotations: summary: "WireGuard出口流量持续超过10MB/s,检查是否有异常传输" ``` ## ⚠️ 注意事项 - **网络条件评估**:部署前先评估公司网络条件,选择合适方案 - **安全隔离**:办公网和管理网必须隔离,避免安全风险 - **流量成本**:注意WireGuard流量消耗,合理配置监控采集频率 - **DDNS稳定性**:动态IP场景下需要稳定的DDNS服务 - **FRP/Tailscale**:CGNAT场景下推荐使用成熟的隧道方案 ## 📁 原始文件 原始YAML配置文件位于:`solutions/corp-network-solutions.yaml`(完整331行配置) ## 🔗 相关文档 - 架构方案:[1.1、最终架构方案.md](./1.1、最终架构方案.md) - 网络规划:[1.2、IP分配规划.md](./1.2、IP分配规划.md) - Calico配置:[2.2、Calico网络配置.md](./2.2、Calico网络配置.md) --- **更新时间:** 2025-01-22
arise
2025年11月22日 09:50
转发文档
收藏文档
‹‹
‹
16
/ 17
›
››
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
PDF文档(打印)
分享
链接
类型
密码
更新密码