Photo :Kubernetes

文 | Edison Zhou

本文已加入《.NET Core on K8S 学习与实践系列文章索引目录》,点击查看容器化相关文章,希望对你有所帮助!

Kubernetes网络模型

我们都知道Kubernetes作为容器编排引擎,它有一个强大又复杂的网络模型,也牵引出了Pod网络、Service网络、ClusterIP、NodePort、Ingress等多个概念。这里我们采用杨波老师(架构师杨波)模仿TCP/IP协议栈总结的一个K8S网络模型图来看看K8S的四个抽象层次,从而了解一下K8S的网络。本小节的文字主要引用自杨波老师关于K8S网络模型的文章及CloudMan的《每天5分钟玩转Kubernetes》一书。

  

K8S网络层次模型图 (From 波波老师)

  根据上图模型中展示的四个层次,从0到3,除了第0层,每一层都是构建于前一层之上。

  (1)第0层:节点主机互通互联

  主要保证K8S节点(物理或虚拟机)之间能够正常IP寻址和互通的网络,这个一般由底层(公有云或数据中心)网络基础设施支持,这里我们无需过多关心。

  (2)第1层:Pod虚拟机互联

  在一个Pod中可以运行一个或多个容器,且Pod中所有容器使用同一个网络namespace,即相同的IP和端口空间,可以直接用localhost通信,而且还可以共享存储(本质是通过将Volume挂载到Pod中的每个容器)。

Pod网络模型图 (From 波波老师)

  (3)第2层:服务发现和负载均衡

  在K8S集群中,Pod的IP并不是固定的,可能会频繁地销毁和创建实例,为了解决此问题,Service提供了访问Pod的抽象层。即无论后端Pod如何变化,Service都作为稳定的前端对外提供服务。此外,Service还提供了高可用和负载均衡的功能,它负责将请求转发给正确的Pod。

  

Service网络模型图 (From 波波老师)

  (4)第3层:外部流量接入

  K8s的Service网络只是一个集群内部网络,集群外部是无法直接访问的。为此,想要将应用暴露出去让公网能够访问,K8S提供了两种方式:

  ① NodePort:使Service通过Cluster节点的静态端口对外提供服务,外部可以通过 NodeIP:NodePort 来访问Service。

Node Port方式示意图 (From 波波老师)

  ② LoadBalancer:使Service利用Cloud Provider提供的Load Balancer对外提供服务,Cloud Provider负责将Load Balancer的流量导向Service。目前支持的Cloud Provider包括AWS、Azure、阿里云、腾讯云等。

Load Balancer方式示意图 (From 波波老师)

More:关于K8S网络的更多基本原理与讲解,强力推荐阅读波波老师的以下文章:

  • Kubernetes网络三部曲-Pod网络(From 杨波老师)

  • Kubernetes网络三部曲-Service网络(From 杨波老师)

  • Kubernetes网络三部曲-外部接入网络(From 杨波老师)

传说中的CNI规范

为了保证网络方案的标准化、扩展性和灵活性,K8S采用了CNIContainer Networking Interface)规范。CNI是一个Pod网络集成标准,简化了K8S和不同Pod网络实现技术的集成。CNI最大的优点就是支持多种容器runtime,而不仅仅是Docker。目前已经有多种支持K8S的网络方案,包括 Flannel、Calico、Canal等,它们都实现了CNI规范,因此无论我们选择哪种具体方案,它们的网络模型都是一致的。

CNI模型图

More:关于CNI的更多基本原理与讲解,推荐阅读陈Sir的文章《K8S网络详解:CNI与CNI网络模型》

Network Policy

关于Network Policy

  Network Policy是K8S的一种资源,它使K8S可以通过Label选择Pod,并指定其他Pod或外界如何与这些Pod通信。换句话说,当Pod被定义了Network Policy时,只有Policy允许的流量才能访问Pod(默认情况下,任何来源的流量都可以访问Pod,是没有限制的)即帮助K8S实现更为精细的流量控制,实现租户隔离机制。

  But,并不是所有K8S网络方案都支持Network Policy,比如Flannel就不支持,而Calico是支持的。

下面我们就来实践一下Network Policy,只要三步!

部署Canal

  想要部署Canal,需要切换网络方案,这里我们使用最简单粗暴的方式:重建当前K8S集群

kubeadm reset # 在每个节点上执行一次

  然后,重新对Master节点进行初始化:

kubeadm init \
--apiserver-advertise-address=192.168.2.100 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.13.3 \
--service-cidr=10.1.0.0/16 \
--pod-network-cidr=10.244.0.0/16

  在两个Node节点上执行以下命令重新加入集群:(注意这里的token请填写你的Master节点初始化后的输出结果)

kubeadm join 192.168.2.100:6443 --token ekqxk2.iiu5wx5bbnbdtxsw \
--discovery-token-ca-cert-hash \
sha256:c50bb83d04f64f4a714b745f04682b27768c1298f331e697419451f3550f2d05

  最后,通过以下命令部署Canal:(参考自K8S官方文档)

kubectl apply -f https://docs.projectcalico.org/v3.8/manifests/canal.yaml

  此时,再次令验证的集群结果如下:

  (1)集群节点状态

  

  (2)Pod状态

  

部署测试应用

这里通过一个httpd应用来演示Network Policy,该应用的yaml定义如下:

apiVersion: apps/v1
kind: Deployment
metadata:name: httpd
spec:replicas: 3selector:matchLabels:name: networkpolicy-demotemplate:metadata:labels:name: networkpolicy-demospec:containers:- name: httpdimage: httpd:latestports:- containerPort: 80imagePullPolicy: IfNotPresent---kind: Service
apiVersion: v1
metadata:name: httpd-svc
spec:type: NodePortports:- protocol: TCPnodePort: 31000port: 8080targetPort: 80selector:name: networkpolicy-demo

  通过kubectl将其部署到K8S集群:

kubectl apply -f httpd-demo.yaml

  这时候三个httpd Pod已经成功Running:

  

  由于定义的是NodePort方式暴露服务,这里我们在集群外部访问Service看看:

  

  由于当前并没有创建任何Network Policy,这里我们可以通过创建一个Pod应用(我们熟悉的busybox)来验证一下是否可以在K8S集群内部随意访问该httpd应用:

kubectl run busybox --rm -it --image=busybox /bin/sh

  

  

  从上图可以知道,它可以正常访问到Service,也可以正常ping到Pod节点。

部署Network Policy有效性

  现在我们创建一个Network Policy,其配置文件yaml如下:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:name: access-httpd
spec:podSelector:matchLabels:name: networkpolicy-demoingress:- from:- podSelector:matchLabels:access: "true"ports:- protocol: TCPport: 80

  该Network Policy定义了如下规则:

  (1)应用于所有 label 为 name : networkpolicy-demo 的Pod,这里即刚刚创建的三个httpd pod。

  (2)ingress中定义了只有 label 为 access : "true" 的Pod才能访问应用。

  (3)即使通过Policy也只能访问80端口

  通过kubectl将其应用到K8S集群中:

kubectl apply -f networkpolicy.yaml

  下面再次在busybox pod中验证Network Policy的有效性:

  

  

  从上图中可以看到,已经无法再成功访问Service,也无法再ping通三个Pod节点。

  这个时候,集群外也无法再通过NodePort访问到Service:

  

  如果想要让测试Pod(busybox)能访问到应用了Network Policy的httpd应用,我们可以对busybox pod加一个label("access=true")就可以:

kubectl run busybox --rm -it --image=busybox \
--labels="access=true" /bin/sh

  运行后的验证结果如下,可以访问到Service,但Ping却被禁止:

  

  但是,此时集群节点(k8s-master与两个node)与集群仍然无法访问到应用了Network Policy的httpd应用,如果想要让它们也访问到,则需要修改Network Policy做一个类似于开防火墙白名单的操作(注意下面的ipBlock配置):

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:name: access-httpd
spec:podSelector:matchLabels:name: networkpolicy-demoingress:- from:- podSelector:matchLabels:access: "true"- ipBlock:cidr: 192.168.2.0/24ports:- protocol: TCPport: 80

  再次应用到K8S集群后,再来通过集群外部的访问者浏览器试试:

  

  可以看到,已经可以正常访问啦!

小结

本文简单介绍了Kubernetes的4层网络模型、CNI 容器网络接口规范 和 Network Policy,并通过改造K8S集群的网络配置从Flannel到Canal来验证Network Policy的有效性。对于Kubernetes的网络模型的原理与介绍,强烈推荐阅读杨波老师的《Kubernetes网络三部曲》,它的传送门位于下方的参考资料列表中。

最后,码字不易,也希望各位看官看完觉得还行就在本文右下方顺手点个“在看”,就是对我最大的鼓励!

参考资料:

(1)CloudMan,《每天5分钟玩转Kubernetes》

(2)李振良,《一天入门Kubernets教程》

(3)马哥(马永亮),《Kubernetes快速入门》

(4)Liang,《K8S CNI网络最强对比》

(5)杨波,《K8S网络三部曲》

(6)陈Sir,《K8S网络详解:CNI与CNI网络模型》

往期精彩回顾

.NET Core on K8S学习与实践系列文章索引目录

熊逸《唐诗必修50讲》学习笔记系列文章索引目录

【重磅】2019 .NET China Conf 资料下载

2019 .NET Conf China - 路一直都在,社区会更好

阿里云MVP第十期全球发布—让天下没有难做的技术

基于Jenkins的开发测试全流程持续集成实践

基于Jenkins Pipeline的ASP.NET Core持续集成实践

恰童鞋骚年,风华也许不再正茂,但却仍想挥斥方遒

本公众号会长期关注和分享.NET Core,Microservice,Cloud Native,DevOps等技术内容文章,还会与你分享个人生活成长的点滴及各类好书的读书笔记,希望能对你有所帮助,一起成长!

长按订阅更多精彩▼

点个【在看】和更多人一起分享

ASP.NET Core on K8S深入学习(11)K8S网络知多少相关推荐

  1. ASP.NET Core 借助 Helm 部署应用至 K8S

    前言 玩K8S也有一段时间了,借助云服务提供商的K8S控制台,已经可以很方便的快速部署应用至K8S.通过简单的点击,可以一次性帮忙创建K8S 对象:Deployment.Service.Ingress ...

  2. ASP.NET Core MVC 源码学习:MVC 启动流程详解

    前言 在 上一篇 文章中,我们学习了 ASP.NET Core MVC 的路由模块,那么在本篇文章中,主要是对 ASP.NET Core MVC 启动流程的一个学习. ASP.NET Core 是新一 ...

  3. ASP.NET Core快速入门(第4章:ASP.NET Core HTTP介绍)--学习笔记

    点击蓝字关注我们 课程链接:http://video.jessetalk.cn/course/explore 良心课程,大家一起来学习哈! 任务22:课程介绍 1.HTTP 处理过程 2.WebHos ...

  4. ASP.NET Core MVC 源码学习:详解 Action 的匹配

    前言 在 上一篇 文章中,我们已经学习了 ASP.NET Core MVC 的启动流程,那么 MVC 在启动了之后,当请求到达过来的时候,它是怎么样处理的呢? 又是怎么样把我们的请求准确的传达到我们的 ...

  5. ASP.NET Core MVC 源码学习:Routing 路由

    前言 最近打算抽时间看一下 ASP.NET Core MVC 的源码,特此把自己学习到的内容记录下来,也算是做个笔记吧. 路由作为 MVC 的基本部分,所以在学习 MVC 的其他源码之前还是先学习一下 ...

  6. 【笔记目录1】【jessetalk 】ASP.NET Core快速入门_学习笔记汇总

    当前标签: ASP.NET Core快速入门 共2页: 1 2 下一页  任务50:Identity MVC:DbContextSeed初始化 GASA 2019-03-02 14:09 阅读:16 ...

  7. ASP.NET Core MVC上传、导入、导出知多少

    前言 本君已成夜猫子,本节我们来讲讲ASP.NET Core MVC中的上传,这两天在研究批量导入功能,本节顺便简单搞搞导入.导出,等博主弄妥当了再来和大家一并分享. .NET Core MVC上传 ...

  8. asp.net core微软官网学习

    https://docs.microsoft.com/zh-cn/aspnet/core/tutorials/razor-pages/razor-pages-start?view=aspnetcore ...

  9. ASP.NET Core on K8S深入学习(1)K8S基础知识与集群搭建

    在上一个小系列文章<ASP.NET Core on K8S学习初探>中,通过在Windows上通过Docker for Windows搭建了一个单节点的K8S环境,并初步尝试将ASP.NE ...

  10. ASP.NET Core on K8S深入学习(5)Rolling Update

    本篇已加入<.NET Core on K8S学习实践系列文章索引>,可以点击查看更多容器化技术相关系列文章. 01 - What is Rolling Update? 为了服务升级过程中提 ...

最新文章

  1. usaco Controlling Companies
  2. wap开发中取到真实的手机号码
  3. DevOps和容器:本地or云端,如何选择?
  4. java带参数的构造方法_崤云说 | JAVA面向对象
  5. Visual Studio 2019 正式发布
  6. Android 图片压缩、照片选择、裁剪,上传、一整套图片解决方案
  7. 转:HTTP请求(GET、POST和soap区别)和响应
  8. Active Directory边界
  9. 华为宣布方舟编译器将于8月31日
  10. 【九】注入框架RoboGuice使用:(Your First Injected Service and BroadcastReceiver)
  11. 需要掌握的flex知识点
  12. 第二届跨校大学生双创训练营任务方案开源1——任务介绍
  13. python初学者(四)---键值对
  14. 笔记1-fedora14初识及vmware-tool安装
  15. Linux接蓝牙音响无声音,win10蓝牙音箱没有声音怎么办_win10蓝牙音响连接成功没声音处理方法...
  16. 最新过浩方过VS魔兽1.24b全图工具发布
  17. Stroke:脑白质微结构完整性可预测脑卒中预后功能恢复情况
  18. 第八讲:期望最大化算法(EM algorithm)
  19. origin做双Y轴折线图的具体步骤
  20. Order-Preserving Encoding(OPE 保序加密)

热门文章

  1. JS动态添加span等标签
  2. 【Android笔记】如何创建列表视图3
  3. 如何在PowerPoint中制作打字机或命令行动画
  4. confd_confd + Nacos | 无代码侵入的配置变更管理
  5. 简单的单臂路由的配置实验 (思科)
  6. 媒体应用大数据,先解决三大难题
  7. Zabbix RCE with API JSON-RPC
  8. Centos-启动network报错RTNETLINK answers: File exists解决方法
  9. OpenSSL--Window生成证书实战
  10. 第十六周项目3-有相同数字?