Kubernetes中的 iptables 规则介绍

#作者:邓伟

文章目录

  • [一、Kubernetes 网络模型概述](#一、Kubernetes 网络模型概述)
  • [二、iptables 基础知识](#二、iptables 基础知识)
  • [三、Kubernetes 中的 iptables 应用](#三、Kubernetes 中的 iptables 应用)
  • [四、查看和调试 iptables 规则](#四、查看和调试 iptables 规则)
  • 五、总结

在 Kubernetes 集群中,iptables 是一个核心组件, 用于实现服务发现和网络策略。iptables 通过一系列规则来控制数据包在网络中的流向,确保集群内部的服务能够正确地路由到相应的 Pods。本文将深入探讨 Kubernetes 中 iptables 的工作原理、配置方式及其重要性。

一、Kubernetes 网络模型概述

在 Kubernetes 中,每个 Pod 都被分配了一个独立的 IP 地址,并且这些 Pod 可以直接相互通信,而不需要进行 NAT 转换。为了支持这一模型,Kubernetes 使用了多种网络插件(如 Calico、Flannel 等)来管理网络,同时利用 iptables 来实现服务发现和服务负载均衡。

如 calico架构图:

二、iptables 基础知识

iptables 是 Linux 内核提供的一个用户空间工具,用于设置、维护和检查 IP 包过滤规则表。它主要包括以下几条链:

a.INPUT:处理目标是本机的数据包。

b.OUTPUT:处理从本机发出的数据包。

c.FORWARD:处理需要经过本机转发的数据包。

d.PREROUTING:在路由之前处理数据包。

e.POSTROUTING:在路由之后处理数据包。

每条链都包含若干规则,当数据包到达时会依次匹配这些规则。如果某条规则匹配成功,则执行该规则指定的动作(如 ACCEPT、DROP、REDIRECT 等)。

如图:

三、Kubernetes 中的 iptables 应用

  1. Service 和 ClusterIP
    Kubernetes 中的 Service 提供了一种简单的方式来访问一组提供相同服务的 Pods。ClusterIP 类型的 Service 为后端 Pods 分配了一个虚拟 IP 地址(VIP),并使用 iptables 规则将流量导向实际的 Pods。

例如,假设有一个名为 my-service 的 Service,其 VIP 是 10.96.0.1,则会在节点上添加如下类似的 iptables 规则:

-A KUBE-SERVICES -d 10.96.0.1/32 -p tcp -m comment --comment "default/my-service: cluster IP" -m tcp --dport 80 -j KUBE-SVC-NWV5X2332I4OT4T3

这条规则表示所有发往 10.96.0.1:80 的 TCP 流量都会被重定向到 KUBE-SVC-NWV5X2332I4OT4T3 这个自定义链中进一步处理。实际场景如图:

  1. Endpoint 和 DNAT
    接下来,在对应的 KUBE-SVC-NWV5X2332I4OT4T3 链中,iptables 会根据权重随机选择一个 Endpoint(即具体的 Pod IP),并通过 DNAT(Destination Network Address Translation)将其转换为目标 Pod 的 IP 地址:

    -A KUBE-SVC-NWV5X2332I4OT4T3 -m statistic --mode random --probability 0.5000000000 -j KUBE-SEP-WNBA2IHDGP2BOBGZ
    -A KUBE-SVC-NWV5X2332I4OT4T3 -j KUBE-SEP-X3P2623AGDHZCBTG

这里,KUBE-SEP-WNBA2IHDGP2BOBGZ 和 KUBE-SEP-X3P2623AGDHZCBTG 分别代表两个不同的 Endpoint,iptables 会以 50% 的概率选择其中一个作为目标地址。

  1. NodePort 和 ExternalTrafficPolicy
    对于 NodePort 类型的 Service,除了上述 ClusterIP 的规则外,还会增加额外的规则以便从外部访问。此外,如果设置了 ExternalTrafficPolicy: Local,iptables 将只允许本地运行的 Pods 接收来自外部的流量,避免跨节点转发带来的性能损耗。

四、查看和调试 iptables 规则

你可以使用以下命令查看当前节点上的 iptables 规则:

iptables-save | grep KUBE

或者针对特定链进行查看:

iptables -t nat -L KUBE-SERVICES

若遇到问题,可以借助 tcpdump 等工具抓包分析,结合 iptables 日志(需开启相关选项)定位故障原因。

五、总结

iptables 在 Kubernetes 中扮演着至关重要的角色,它不仅实现了基本的服务发现功能,还支持复杂的网络策略控制。理解 iptables 的工作机制有助于我们更好地管理和优化 Kubernetes 集群的网络环境。随着 Kubernetes 不断演进,CNI 插件和其他网络解决方案也在不断改进,但 iptables 依然是理解和操作 Kubernetes 网络不可或缺的知识点。

相关推荐
Hellc00721 分钟前
Docker 部署 MongoDB 并持久化数据
mongodb·docker·容器
云上艺旅2 小时前
K8S学习之基础十五:k8s中Deployment扩容缩容
学习·docker·云原生·kubernetes·k8s
数据小小爬虫3 小时前
利用PHP爬虫获取17网(17zwd)商品详情:实战指南
开发语言·爬虫·php
颜淡慕潇5 小时前
【K8S系列】Kubernetes中查看日志常见问题&解决方案
后端·云原生·容器·kubernetes
三天不学习5 小时前
Windows 系统 Docker Desktop 入门教程:从零开始掌握容器化技术
运维·docker·容器
mumu-hn5 小时前
Docker基础篇——Ubuntu下Docker安装
运维·docker·容器
自律的蜗牛7 小时前
在 Docker 中安装并配置 MySQL
mysql·docker·容器
xy123068 小时前
Kubernetes (K8s) 集群部署指南:从环境准备到应用部署(脚本部署)
docker·kubernetes
蜜獾云8 小时前
redisinsight 默认端口改成5540了
linux·docker·容器·redisinsight
绘绘~10 小时前
K8s构建带有maven环境的jenkins镜像
kubernetes·jenkins·maven