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 网络不可或缺的知识点。

相关推荐
企鹅侠客10 小时前
使用k8s集群调度GPU
云原生·容器·kubernetes
❀͜͡傀儡师11 小时前
docker一键部署网页版Win11系统
运维·docker·容器
BrianGriffin11 小时前
asdf 安装的 PHP 上传文件大小限制
开发语言·php
zcz160712782112 小时前
k8s重新部署的配置过程
云原生·容器·kubernetes
IsPrisoner13 小时前
从 Docker 到 Kubernetes:一次“工程视角”的 K8s 核心概念深度梳理
docker·容器·kubernetes
liuxuzxx14 小时前
containerd的CPU过高的问题排查
容器·性能优化·kubernetes
看-清14 小时前
Docker离线安装部署xxl-job流程
运维·docker·容器
建群新人小猿14 小时前
陀螺匠企业助手-我的日程
android·大数据·运维·开发语言·容器
孤岛悬城15 小时前
47 Docker镜像编排
docker·容器·云计算
山风wind15 小时前
IP地址、子网掩码与网络连通性:从入门到精通
网络·tcp/ip·php