k8s的service网络模型

概述

在 k8s 中我们暴露服务通常需要借助Service来实现,当我们创建了service后,可以看到会分配一个ClusterIP ,本文主要是一个示例介绍ClusterIP 的网络原理 。
这个示例中会创建一个svc , 然后深入的跟踪一下这个svc的网络实现。ClusterIP是通过kube-proxy来维护的,在示例中 kube-proxy 是使用的iptables ,这个方便后续实验观察。

创建service并验证

  1. 创建一个nginx的deployment

    # 创建 deployment
    kubectl create deploy nginx-deploy  --image=nginx
    # 将deployment 扩展为3副本
    kubectl scale deploy nginx-deploy --replicas=3
    

    在这里插入图片描述

  2. 将deployment 暴露成服务

    kubectl expose deploy nginx-deploy --name=nginx-svc  --port=80 --type=NodePort
    

    k8s的service网络模型_第1张图片3. 测试service的连通性
    本地通过nodeport访问nginx ,可以看到已经成功访问到了
    在这里插入图片描述

分析iptable的nat表

ClusterIP 本质上就是一个SNAT , 我们可以根据iptables的nat表来观察。
首先打印nat表

# 查看nat表
iptables -t nat -L -n

nat表的OUTPUT 链

安装k8s后,nat表输出内容比较多,我这里做了一下简化,删除了一些无关的规则,方便观察
如下是nat表的OUTPUT 链
k8s的service网络模型_第2张图片
从图中可以看到nat的规则是将 目标ip为10.254.68.237 按照权重的方式以 DNAT 方式转换为10.200.1.8 、 10.200.1.9 、10.200.2.5 ,
这里的权重设置为 0.33 、 0.5 、 1 的方式,这里是指 先以0.33的概率 然后以 (1-0.33)* 0.5 概率,如果前两条都没匹配上,最后使用 100%概率走第三条链。
上图中还有一个KUBE-MARK-MASQ 链,这个链的作用就是做一个标记mark,在后面会用到。

nat表的 POSTROUTING 链

然后在看一下nat表的 POSTROUTING 链 ,这里也是做了一下简化,只保留相关规则
k8s的service网络模型_第3张图片
从这里就可以看出规则链第一条就是用来匹配OUTPUT链打的标记,匹配到了之后执行 MASQUERADE 进行自动化的snat

你可能感兴趣的:(k8s,kubernetes,k8s,service,nat)