如何配置Kubernetes Pod实现跨集群节点访问
跨Kubernetes集群访问Pod的解决方案
根因说明
Kubernetes默认的Pod IP属于集群内部容器网络(CNI)的地址段,仅在当前集群内部有对应的路由规则,第二个集群的节点未配置指向该Pod CIDR的路由,因此默认无法直接连通该Pod IP。
可行配置方案
方案1:通过NodePort Service暴露(无Pod侵入、通用性最高)
不需要修改Pod的核心运行逻辑,仅需做两处调整:
- 给现有Pod添加标签,用于Service匹配,修改后的Pod YAML如下:
apiVersion: v1 kind: Pod metadata: name: Serverpod # 新增标签段 labels: app: nginx-server spec: containers: - name: Nginx image: nginx:latest ports: - containerPort: 80 affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: kubernetes.io/hostname operator: In values: - Node1
- 新建NodePort类型的Service,绑定该Pod:
apiVersion: v1 kind: Service metadata: name: nginx-access spec: type: NodePort selector: app: nginx-server ports: - port: 80 targetPort: 80 # 可手动指定30000-32767范围内的端口,不填则自动分配 nodePort: 30080
配置完成后,第二个集群的节点可通过第一个集群任意节点的物理IP:30080访问Nginx服务。
方案2:配置跨集群路由(需要直接访问Pod IP时使用)
如果业务要求必须直接通过Pod IP 10.40.0.1访问,可按以下步骤配置:
- 确认第一个集群的Pod CIDR段(示例中为10.40.0.0/对应的子网掩码段)
- 在第二个集群的所有节点上添加静态路由,将目标地址为该CIDR段的流量下一跳指向第一个集群的CNI网关,或者Pod所在节点Node1的物理IP
- 确认两个集群的节点物理网络三层可达,防火墙未拦截ICMP、80端口的跨集群访问
方案3:hostNetwork配置优化(你之前尝试方案的修复方式)
你之前配置hostNetwork: true不符合预期,通常是两个原因导致:一是Node1的80端口被其他进程占用,Pod启动失败;二是Node1的防火墙或集群安全组拦截了80端口的跨集群访问。修复后配置如下:
apiVersion: v1 kind: Pod metadata: name: Serverpod spec: hostNetwork: true # 开启宿主机网络复用 dnsPolicy: ClusterFirstWithHostNet # 适配hostNetwork下的集群DNS解析 containers: - name: Nginx image: nginx:latest ports: - containerPort: 80 hostPort: 80 # 绑定宿主机80端口 affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: kubernetes.io/hostname operator: In values: - Node1
配置完成后确认Node1的80端口无占用、安全策略放通,第二个集群的节点可直接通过Node1的物理IP:80访问Nginx服务。
内容的提问来源于stack exchange,提问作者Mikri Solution
相关产品推荐
相关产品推荐

