本文是Kubernetes网络系列的最后一部分,如果你还没看过前面部分,我建议你先花点时间读一下。
集群动力学

由于Kubernetes(更通用的说法是分布式系统)天生具有不断变化的特性,因此它的Pod(以及Pod的IP)总是在改变。变化的原因可以是针对不可预测的Pod或节点崩溃而进行的滚动升级和扩展。这使得Pod IP不能直接用于通信。
我们看一下Kubernetes Service,它是一个虚拟IP,并伴随着一组Pod IP作为Endpoint(通过标签选择器识别)。它们充当虚拟负载均衡器,其IP保持不变,而后端Pod IP可能会不断变化。
Kubernetes Srvice对象的标签选择器
整个虚拟IP的实现实际上是一组iptables(最新版本可以选择使用IPVS,但这是另一个讨论)规则,由Kubernetes组件kube-proxy管理。 这个名字现在实际上是误导性的。 它在v 1.0之前确实是一个代理,并且由于其实现是内核空间和用户空间之间的不断复制,它变得非常耗费资源并且速度较慢。 现在,它只是一个控制器,就像Kubernetes中的许多其它控制器一样,它watch api server的endpoint的更改并相应地更新iptables规则。
有了这些iptables规则,每当数据包发往Service IP时,它就进行DNAT(DNAT=目标网络地址转换)操作,这意味着目标IP从Service IP更改为其中一个Endpoint - Pod IP - 由iptables随机选择。这可确保负载均匀分布在后端Pod中。
iptables DNAT
当这个DNAT发生时,这个信息存储在conntrack中——它是Linux连接跟踪表(存储iptables已完成的5元组翻译:protocol,srcIP,srcPort,dstIP,dstPort)。 这样当请求回来时,它可以取消DNAT,这意味着将源IP从Pod IP更改为Service IP。 这样,客户端就不用关心后台如何处理数据包流。
conntrack表中的5元组实例
因此通过使用Kubernetes Service,我们可以使用相同的端口而不会发生任何冲突(因为我们可以将端口重新映射到Endpoint)。 这使服务发现变得非常容易。 我们可以使用内部DNS并对服务主机名进行硬编码。 我们甚至可以使用Kubernetes预设的服务主机和端口环境变量。
小建议:采取第二种方法,你可节省大量不必要的DNS调用!
出站流量

到目前为止我们讨论的Kubernetes Service是在一个集群内工作。但是,在大多数实际情况中,应用程序需要访问一些外部api /网站。
通常,节点可以同时具有私有IP和公共IP。对于互联网访问,这些公共和私有IP存在某种1:1的NAT,特别是在云环境中。
对于从节点到某些外部IP的普通通信,源IP从节点的专用IP更改为其出站数据包的公共IP,入站的响应数据包则刚好相反。但是,当Pod发出与外部IP的连接时,源IP是Pod IP,云提供商的NAT机制不知道该IP。因此它将丢弃具有除节点IP之外的源IP的数据包。
因此你可能也猜对了,我们将使用更多的iptables!这些规则也由kube-proxy添加,执行SNAT(源网络地址转换),即IP MASQUERADE。它告诉内核使用此数据包发出的网络接口的IP,代替源Pod IP。同时保留conntrack条目以进行反SNAT操作。
入站流量

到目前为止一切都很好。Pod可以互相交谈,也可以访问互联网。但我们仍然缺少关键部分 - 为用户请求流量提供服务。截至目前,有两种主要方法可以做到这一点:
NodePort /云负载均衡器(L4 - IP和端口)
将服务类型设置为NodePort将会为服务分配范围为30000-33000的nodePort。即使在特定节点上没有运行Pod,此nodePort也会在每个节点上打开。此NodePort上的入站流量将再次使用iptables发送到其中一个Pod(该Pod甚至可能在其它节点上!)。
云环境中的LoadBalancer服务类型将在所有节点之前创建云负载均衡器(例如ELB),命中相同的nodePort。
Ingress(L7 - HTTP / TCP)
许多不同的工具,如Nginx,Traefik,HAProxy等,保留了http主机名/路径和各自后端的映射。通常这是基于负载均衡器和nodePort的流量入口点,其优点是我们可以有一个入口处理所有服务的入站流量,而不需要多个nodePort和负载均衡器。
网络策略

可以把它想象为Pod的安全组/ ACL。 NetworkPolicy规则允许/拒绝跨Pod的流量。确切的实现取决于网络层/CNI,但大多数只使用iptables。
目前为止就这样了。 在前面的部分中,我们研究了Kubernetes网络的基础以及overlay网络的工作原理。 现在我们知道Service抽象是如何在一个动态集群内起作用并使服务发现变得非常容易。我们还介绍了出站和入站流量的工作原理以及网络策略如何对群集内的安全性起作用。
原文链接:https://itnext.io/an-illustrated-guide-to-kubernetes-networking-part-3-f35957784c8e
周末送福利,减肥神器

新的一年你选择长肉肉肉肉肉还是涨知识呢?DockOne.io为了不让小伙伴长肉肉,特意联合机械工业出版社华章赠送6本《Kubernetes进阶实战》,快来领书吧。
领书的两种姿势:

  1. 点赞数最多,万人迷的你赶紧留言并且请亲朋好友为你点赞吧,截至时间1月7日14:00,赞点数最多的三位朋友将获得本书;

  2. 最佳理由,留言让小编知道想要本书的理由,理由充分感人的3位朋友可获得本书,截至时间1月7日14:00。

本书有话说:

  1. 我,涵盖Kubernetes架构、部署、核心/自定义资源、扩缩容、存储卷、网络插件与策略、安全、调度策略、监控、日志等话题;

  2. 我,渐进式讲解,手把手示范,大量实操案例,随时动手验证;

  3. 我,由马哥教育CEO马哥(马永亮)打造,渐进式铺陈,适合入门与进阶。

没有获得的小伙伴,可以点击下面链接当当购书哦!
基于Kubernetes的DevOps实践培训

基于Kubernetes的DevOps实践培训将于2019年1月18日在上海开课,3天时间带你系统掌握Kubernetes本次培训包括:容器特性、镜像、网络;Kubernetes架构、核心组件、基本功能;Kubernetes设计理念、架构设计、基本功能、常用对象、设计原则;Kubernetes的数据库、运行时、网络、插件已经落地经验;微服务架构、组件、监控方案等,点击下方图片查看详情。

图解Kubernetes网络(周末福利!)相关推荐

  1. Kube-OVN:基于OVN的开源Kubernetes网络实践

    戳蓝字"CSDN云计算"关注我们哦! 技术头条:干货.简洁.多维全面.更多云计算精华知识尽在眼前,get要点.solve难题,统统不在话下! 今天,许多企业开始运行Kubernet ...

  2. 理解Kubernetes网络之Flannel网络

    理解Kubernetes网络之Flannel网络 第一次采用kube-up.sh脚本方式安装的Kubernetes cluster目前运行良好,master node上的组件状态也始终是"没 ...

  3. Kubernetes — 网络流量模型

    目录 文章目录 目录 Kubernetes Network 中的 IP 地址类型 Kubernetes 的网络流量模型 同 Pod 内部的 Containers 间的通信(Container 模式) ...

  4. Kubernetes网络一年发展动态与未来趋势

    Kubernetes网络模型 谈到Kubernetes的网络模型,就不能不提它著名的"单Pod单IP"模型,即每个Pod都有一个独立的IP,Pod内所有容器共享网络namespac ...

  5. 应用开发者必须了解的Kubernetes网络二三事

    Kubernetes网络基本的部署调度单元:Pod Kubernetes中的基本管理单元并非是一个容器,而是一个叫做pod的东西.我们认为部署了一个或多个容器的环境是一个pod单元.通常情况下,它们代 ...

  6. Kubernetes 网络概念及策略控制(叶磊)

    本文将主要分享以下 5 方面的内容: Kubernetes 基本网络模型: Netns 探秘: 主流网络方案简介: Network Policy 的用处: 思考时间. Kubernetes 基本网络模 ...

  7. 从零开始入门 K8s | Kubernetes 网络概念及策略控制

    作者 | 阿里巴巴高级技术专家 叶磊 一.Kubernetes 基本网络模型 本文来介绍一下 Kubernetes 对网络模型的一些想法.大家知道 Kubernetes 对于网络具体实现方案,没有什么 ...

  8. 盘点Kubernetes网络问题的4种解决方案

    由于在企业中部署私有云的场景会更普遍,所以在私有云中运行Kubernetes + Docker集群之前,就需要自己搭建符合Kubernetes要求的网络环境.现在的开源世界里,有很多开源组件可以帮助我 ...

  9. 云原生系列「二」Kubernetes网络详解

    前言 K8s是一个强大的平台,但它的网络比较复杂,涉及很多概念,例如Pod网络,Service网络,Cluster IPs,NodePort,LoadBalancer和Ingress等等,这么多概念足 ...

最新文章

  1. ios保存gif到相册_iOS相册中的GIF图片的读取与保存
  2. C语言指针和数组概述
  3. Filecoin Gas基础费率升至5.06 nanoFIL
  4. java正则表达式匹配`\`
  5. python生成条形码和二维码
  6. Fragstats运行内存不够或卡顿问题解决
  7. SI24R1兼容NRF24L01P DEMO板使用说明书
  8. Docker升级Wekan
  9. MaxCompute SQL引用第三方Base64JAR实现编解码
  10. oracle12c 兼容,12c(oracle12c兼容11g吗)
  11. Windows 下rsync同步数据报错7456
  12. 22 最近共同先祖(Lowest Common Ancestor of a Binary Tree)
  13. Pixhawk---sdlog2应用详解
  14. Frame skipped from debugging during step-in. VSCode调试无法定位其它库中代码的解决办法
  15. 在Ubuntu下从Python连接到Microsoft SQL Server数据库
  16. Mask Scoring Rcnn论文解读《Mask Scoring R-CNN》
  17. JQuery AutoComplete插件实现自动补全
  18. Android Studio强者之路-刘桂林-专题视频课程
  19. 【转】Yii2开源电商系统 fecshop
  20. 280049的时钟树

热门文章

  1. My97DatePicker设置
  2. 新iPhone不支持5G或致苹果进一步落后华为
  3. [算法设计与分析]第三章练习题:删除多余括号
  4. 〖Python零基础入门篇(63)〗 - 持久化学生信息库的完善
  5. ubuntu20.04无法输入中文解决了
  6. 在endnote中添加中文参考文献格式
  7. Java之数组的定义格式,【默认值规则】,Java内存划分5大区,面向对象类的基本定义和对象的使用,private和this关键字,类的构造方法,标准类的组成部分。
  8. 头歌MinMax算法和AlphaBeta算法
  9. Stream之JDK8-最全使用汇总V1.0.0
  10. 如何设置微软拼音状态条上的图标