一、前言

Kubernetes利用iptables达成以下两个目的:

  • 对外暴露POD和服务(通过host port、cluster service、node external IP、external load balancer、node port)
  • 简单的负载均衡

在Kubernetes worker node的iptables的NAT表的prerouting和output 链表会出现如下规则作为kubernetes相关的数据包操作的入口:

  1. -A PREROUTING -m comment --comment "kube hostport portals" -m addrtype --dst-type LOCAL -j KUBE-HOSTPORTS
  2. -A PREROUTING -m comment --comment "kubernetes service portals" -j KUBE-SERVICES
  3. -A PREROUTING -m comment --comment "handle ClusterIPs; NOTE: this must be before the NodePort rules" -j KUBE-PORTALS-CONTAINER
  4. -A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER
  5. -A PREROUTING -m addrtype --dst-type LOCAL -m comment --comment "handle service NodePorts; NOTE: this must be the last rule in the chain" -j KUBE-NODEPORT-CONTAINER
  6. -A OUTPUT -m comment --comment "kube hostport portals" -m addrtype --dst-type LOCAL -j KUBE-HOSTPORTS
  7. -A OUTPUT -m comment --comment "kubernetes service portals" -j KUBE-SERVICES
  8. -A OUTPUT -m comment --comment "handle ClusterIPs; NOTE: this must be before the NodePort rules" -j KUBE-PORTALS-HOST
  9. -A OUTPUT ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER
  10. -A OUTPUT -m addrtype --dst-type LOCAL -m comment --comment "handle service NodePorts; NOTE: this must be the last rule in the chain" -j KUBE-NODEPORT-HOST

PREROUTING链表用来处理外部进来的数据包(包括来自外部网络的和来自本机container的)

规则1 用来向使用hostport的POD转发数据包 (用于IPTables模式)

规则2 用来向kubernetes服务(cluster service/nodeport service/load balancer service)转发数据包 (用于IPTables模式)

规则3 用来处理容器内向cluster service虚IP发出的请求 (用于kube-proxy模式)

规则5 用来处理容器向nodeport发出的请求 (用于kube-proxy模式)

OUTPUT链表用来处理发向外部的数据包(包括发到外部网络的和发到本机上container的)

规则6 用来处理主机向host port发出的请求 (用于IPTables模式)

规则7 用来处理主机向kubernetes service发出的请求 (用于IPTables模式)

规则8 用来处理主机向cluster service虚IP发出的请求 (用于kube-proxy模式)

规则10 用来处理主机向nodeport发出的请求 (用于kube-proxy模式)

kubernetes各种类型的服务对外暴露的顺序依次是hostport、cluster service、node external、loadbalancer service和nodeport service。

-A KUBE-SERVICES -d cluster_IP/32 -p tcp -m comment --comment "namespace/pod_name:port_name cluster IP" -m tcp --dport 80 -j KUBE-SVC-SSSSSS
-A KUBE-SERVICES -d node_external_IP/32 -p tcp -m comment --comment "namespace/pod_name:port_name external IP" -m tcp --dport 80 -j KUBE-MARK-MASQ
-A KUBE-SERVICES -d node_external_IP/32 -p tcp -m comment --comment "namespace/pod_name:port_name external IP" -m tcp --dport 80 -m physdev ! --physdev-is-in -m addrtype ! --src-type LOCAL -j KUBE-SVC-SSSSSS
-A KUBE-SERVICES -d node_external_IP/32 -p tcp -m comment --comment "namespace/pod_name:port_name external IP" -m tcp --dport 80 -m addrtype --dst-type LOCAL -j KUBE-SVC-SSSSSS
-A KUBE-SERVICES -d loadbalancer_IP/32 -p tcp -m comment --comment "namespace/pod_name:port_name loadbalancer IP" -m tcp --dport 80 -j KUBE-FW-SSSSSS-A KUBE-SERVICES -m comment --comment "kubernetes service nodeports; NOTE: this must be the last rule in this chain" -m addrtype --dst-type LOCAL -j KUBE-NODEPORTS

转载自https://blog.csdn.net/cloudvtech

二、cluster service如何使用iptables对外暴露POD服务

1. cluster service的入口是这个规则"-A [PREROUTING|OUTPUT] -m comment --comment "kubernetes service portals" -j KUBE-SERVICES",跳到KUBE-SERVICE chain

2. 这个KUBE-SERVICE chain由一些列满足如下规则的rule组成:

满足访问某个cluster_VIP和port的请求将会被倒入到rule KUBE-SVC-XXXXXX

-A KUBE-SERVICES -d cluster_VIP/32 -p tcp -m comment --comment "namespace/pod_name:port_name cluster IP" -m tcp --dport service_port -j KUBE-SVC-XXXXXX

3. KUBE-SVC-XXXXXX的组成如下:

-A KUBE-SVC-XXXXXX -m comment --comment "namespace/pod_name:port_name" -m statistic --mode random --probability 0.33332999982 -j KUBE-SEP-AAAAAA
-A KUBE-SVC-XXXXXX -m comment --comment "namespace/pod_name:port_name" -m statistic --mode random --probability 0.50000000000 -j KUBE-SEP-BBBBBB
-A KUBE-SVC-XXXXXX -m comment --comment "namespace/pod_name:port_name" -j KUBE-SEP-CCCCCC

会按照概率对所有后端的POD进行选择转发

4. KUBE-SEP-CCCCC的组成如下:

-A KUBE-SEP-CCCCCC -s POD_IP/32 -m comment --comment "namespace/pod_name:port_name" -j KUBE-MARK-MASQ-A KUBE-SEP-CCCCCC -p tcp -m comment --comment "namespace/pod_name:port_name" -m tcp -j DNAT --to-destination POD_IP:PORT

需要进行一次DNAT,把数据包定位到选定POD,然后经由路由进入远端或者本地的POD

转载自https://blog.csdn.net/cloudvtech

三、external load balancer serice如何使用iptables对外暴露POD服务

1. 经由external load balancer转发的外部请求会带有外部IP地址,这个地址会匹配如下规则:

-A KUBE-SERVICES -d loadbalancer_IP/32 -p tcp -m comment --comment "namespace/pod_name:port_name loadbalancer IP" -m tcp --dport 80 -j KUBE-FW-SSSSSS

2. KUBE-FW-SSSSSS组成如下:

-A KUBE-FW-SSSSSS -m comment --comment "namespace/pod_name:port_name loadbalancer IP" -j KUBE-XLB-KKKKKK
-A KUBE-FW-SSSSSS -m comment --comment "namespace/pod_name:port_name loadbalancer IP" -j KUBE-MARK-DROP

会jump到为external访问生成的load balance规则KUBE-XLB-KKKKKK

3.KUBE-XLB-KKKKKK由一系列概率选择规则组成:

-A KUBE-XLB-KKKKKK -m comment --comment "Balancing rule 0 for namespace/pod_name:port_name" -m statistic --mode random --probability 0.33332999982 -j KUBE-SEP-AAAAAA
-A KUBE-XLB-KKKKKK -m comment --comment "Balancing rule 1 for namespace/pod_name:port_name" -m statistic --mode random --probability 0.50000000000 -j KUBE-SEP-BBBBBB
-A KUBE-XLB-KKKKKK -m comment --comment "Balancing rule 2 for namespace/pod_name:port_name" -j KUBE-SEP-CCCCCC

将数据包导到具体的POD相关iptables规则

4. KUBE-SEP-CCCCC的组成如下:

-A KUBE-SEP-CCCCCC -s POD_IP/32 -m comment --comment "namespace/pod_name:port_name" -j KUBE-MARK-MASQ
-A KUBE-SEP-CCCCCC -p tcp -m comment --comment "namespace/pod_name:port_name" -m tcp -j DNAT --to-destination POD_IP:PORT

需要进行一次DNAT,把数据包定位到选定POD,然后经由路由进入远端或者本地的POD

转载自https://blog.csdn.net/cloudvtech

四、nodePort serice如何使用iptables对外暴露POD服务

1. KUBE-SERVICE chain的最末端将跳转到nodeport service对应的chain KUBE-NODEPORTS

-A KUBE-SERVICES -m comment --comment "kubernetes service nodeports; NOTE: this must be the last rule in this chain" -m addrtype --dst-type LOCAL -j KUBE-NODEPORTS
2. KUBE-NODEPORTS里面包含一系列不同的nodeport service对应的规则
例如:
-A KUBE-NODEPORTS -p tcp -m comment --comment "namespace/pod_name:port_name" -m tcp --dport 80 -j KUBE-XLB-KKKKKK

最后跳转到为外部访问生成的load balance规则。

3.KUBE-XLB-KKKKKK由一系列概率选择规则组成:
-A KUBE-XLB-KKKKKK -m comment --comment "Balancing rule 0 for namespace/pod_name:port_name" -m statistic --mode random --probability 0.33332999982 -j KUBE-SEP-AAAAAA
-A KUBE-XLB-KKKKKK -m comment --comment "Balancing rule 1 for namespace/pod_name:port_name" -m statistic --mode random --probability 0.50000000000 -j KUBE-SEP-BBBBBB
-A KUBE-XLB-KKKKKK -m comment --comment "Balancing rule 2 for namespace/pod_name:port_name" -j KUBE-SEP-CCCCCC

将数据包导到具体的POD相关iptables规则

4. KUBE-SEP-CCCCC的组成如下:

-A KUBE-SEP-CCCCCC -s POD_IP/32 -m comment --comment "namespace/pod_name:port_name" -j KUBE-MARK-MASQ
-A KUBE-SEP-CCCCCC -p tcp -m comment --comment "namespace/pod_name:port_name" -m tcp -j DNAT --to-destination POD_IP:PORT

需要进行一次DNAT,把数据包定位到选定POD,然后经由路由进入远端或者本地的POD

转载自https://blog.csdn.net/cloudvtech

kubernetes系列之一:Kubernetes如何利用iptables对外暴露service相关推荐

  1. 【Kubernetes 系列】Kubernetes 创建K8s集群项目

    作者:半身风雪 上一节:Kubernetes 概述 创建K8s集群项目 一.创建Minikube 二.创建Deployment 三.创建 Service 四.启用插件 五.删除集群 总结 一.创建Mi ...

  2. 【kubernetes系列】Kubernetes入门

    概述 Kubemetes是一个全新的基于容器技术的分布式架构领先方案,是谷歌严格保密十几年的秘密武器-Borg的一个开源版本.Borg是谷歌的一个久负盛名的内部使用的大规模集群管理系统,它基于容器技术 ...

  3. 【Kubernetes系列】Kubernetes组件介绍

    概述 kubernetes中文文档:https://kubernetes.io/zh/docs/home/ kubernetes中文社区:https://www.kubernetes.org.cn/d ...

  4. Kubernetes 系列(三):Kubernetes使用Traefik Ingress暴露服务

    一.Kubernetes 服务暴露介绍 从 kubernetes 1.2 版本开始,kubernetes提供了 Ingress 对象来实现对外暴露服务:到目前为止 kubernetes 总共有三种暴露 ...

  5. Kubernetes 系列之 kubeadm 搭建k8s集群

    Kubeadm 搭建k8s集群 注意:Kubernetes 系列 所采用的kuberntetes版本都是 1.15+ 1 Master 节点安装 1.1 系统环境配置 1.1.1 设置主机名称 hos ...

  6. 《Kubernetes与云原生应用》系列之Kubernetes的系统架构与设计理念

    http://www.infoq.com/cn/articles/kubernetes-and-cloud-native-applications-part01 <Kubernetes与云原生应 ...

  7. kubernetes系列二:概念梳理

    文章目录 一.资源对象管理 1.资源对象概述 (1)Pod (2)Replication Controller & RC (副本控制器) (3)Replica Set & RS (副本 ...

  8. Kubernetes系列之Helm介绍篇

    本次系列使用的所需部署包版本都使用的目前最新的或最新稳定版,安装包地址请到公众号内回复[K8s实战]获取 介绍 Helm 是 Deis 开发的一个用于 Kubernetes 应用的包管理工具,主要用来 ...

  9. Kubernetes系列之理解K8s Service的几种模式

    原文地址:Kubernetes系列之理解K8s Service的几种模式 今天给大家介绍下k8s的service的几种访问模式. 概述 我们知道pod的ip不是固定的,是根据所在宿主机的docker0 ...

最新文章

  1. C#:String.Format数字格式化输出
  2. python中time模块的时间戳和格式化日期_Python中的time模块与datetime模块
  3. openStack 手动部署文档
  4. Docker基础(3)——基础网络模型
  5. 物联网标准NB-IoT和LoRa,究竟谁能更胜一筹?
  6. sidirect 连接西门子_INTOUCH DASSIDirect3.0 DASSIDirect3.0驱动是西门子PLC与Intouch连接通讯的必备驱动程序 - 下载 - 搜珍网...
  7. 国内优秀的PHP后台管理系统(CMS)整理
  8. 施耐德 m340 编程手册_施耐德推出开放自动化平台,开启“软件驱动自动化”时代...
  9. vue使用jsMind思维导图类库
  10. 计算机软件著作权登记去哪查询,软件著作权在哪里查询
  11. 实习生快速入手项目php,2019.7最惨的三次面试经历-----百度PHP实习生面经
  12. 关于通过图注意神经网络处理多元时间序列的错误预测论文的讨论
  13. 如何用查看wifi密码
  14. 运维工程师主要做什么_网络工程师和网络运维工程师到底有什么不同?
  15. validation 分组校验注解大全及使用详解
  16. cocos shader 之 黑白滤镜
  17. Ubuntu安装配置谷歌拼音输入法
  18. R学习之统计实验(五)--赶火车问题(R语言编程)-----数模
  19. LEARNING GOAL-CONDITIONED VALUE FUNCTIONS WITH ONE-STEP PATH REWARDS RATHER THAN GOAL- REWARDS
  20. 【Medical physics】X线、CT和MRI的区别

热门文章

  1. 基于改进正弦余弦算法的函数寻优算法
  2. Celery分布式任务队列学习记录
  3. 京东微信、手机QQ引领社交化购物趋势
  4. 【物联网(IoT)开发】Arduino 简介
  5. arduino esp32 读福申甲醛传感器
  6. 2022-2027年中国酒店及酒店管理市场竞争态势及行业投资前景预测报告
  7. 如何实现转圈圈动画效果
  8. 金蝶K3 SQL报表系列-委外未勾稽明细表金蝶K3 SQL报表系列-委外未勾稽明细表
  9. excel自动填充脚本(awk)
  10. 我的Android进阶之旅------Android通过调用Webservice实现天气预报