kubernetes in action读书笔记(五)Kubernetes的运行机理、Kubernetes网络原理

概述

本章翻读了一下,发现也只是介绍了基本的概念和流程,把k8s中涉及的一些控制面服务介绍了,没有讲太细,比如,kube-proxy具体如何去写iptable,kube-dns如何更新resolve.conf,controller创建pod后(写etcd),scheduler寻找node创建pod的代码级的过程,kubelet创建一个pod以及pod内容器的过程,weave-net/flannel与kube-proxy以及linux的veth、docker0、veth-pair的协同关系,都不是太细,所以看完后问题比较多,每个点都得再去查查才行。

K8S分为哪些部分

从运行态的角度看,kubernetes分为

  1. 控制面组件,类似kube-scheduler、api-servier、etcd
  2. 工作节点运行组件,类似kubelet、kube-proxy
  3. 附加组件,类似weave-net/flannel、ingress controller

用一张图表示:
在这里插入图片描述
这一张讲的内容基本上是把之前讲到的点从kubernetes调度/管理层面再强调了一下,比如:

  1. kube-proxy的实现原理,通过修改iptables来确保pod的可访问性
  2. 修改etcd的只有api-server,也说明了k8s的一个资源创建的过程
  3. weave/flannel的作用

以上的1/2,之前笔记有了,不再细讲,主要写下3吧。

Kubernetes的网络

抛开kubernetes,一次网络请求与应答应具备的基本要素包括:

  1. DHCP过程
  2. DNS过程(通过域名访问的话)
  3. 请求路由寻址过程

其实k8s的网路就是用来解决在k8s集群中这样的一次过程如何实现,由于k8s集群中的pod本身无状态,pod内还可能有多个容器,且pod间还要做到网络/资源的隔离,所有在实现一次请求的过程中要解决如何将一个pod看成一个独立的主机,pod的ip如何分配,谁来分配,如何确保唯一性。所以k8s通过CNI(Container Network Interface)来解决这个问题,weave/flannel都是CNI的一种,CNI用来为k8s集群在pod维度上提供一个虚拟的可用网络,为每个pod实现了虚拟路由的NAT,用来解决pod与pod之前网络ip唯一性、可达性的问题。

按照书上讲的内容,也只能理解到这里了,如下图:
在这里插入图片描述

由此可见,kube-dns解决的是问题2( DNS过程),确保一个k8s内对service的请求一定能对应到一个service的ip;kube-proxy解决的也是问题2,确保一个service与pod的对应关系;问题1/3都是通过CNI来解决的,相比于kube-proxy和kube-dns,CNI面对的问题更加底层一些,总结起来:

1. pod和pod访问性相关的,CNI
2. service的可访问性,pod如何访问service,kube-proxy/kube-dns

书里关于CNI具体的工作原理,包括CNI、网桥、veth-pair、docker0的关系,没有细讲,这部分我做一下补充,说明CNI是如何解决问题1/3的。

为解决1/3这两个问题,本质就是如何将一个pod作为一个逻辑上独立的主机在k8s集群里运行起来,和容器化技术一样,网络上的逻辑独立底层其实也是用到了linux的一些技术,这里提到:

1. 网桥(Bridge)
2. veth-pair

一个普通的linux机器上的进程,通过监听一个端口,接受主机的上来自eth0的数据,eth0本身是主机的一个网卡,主机进程对某个端口的监听,最终在底层会作用于对eht0的监听。如果我们不希望服务进程直接监听主机的eth0,可以创建一个Bridge,linux会为Bridge分配一个ip地址+ip地址段,此时服务进程监听的就是Bridge设备。docker为了实现主机上多个容器上网络隔离的同时,又能共享一个主机网络,就是通过网桥的方式来实现的,其本质目的,就是为每一个容器插上一个网卡,这里总共分几步:

1. 安装运行docker,创建默认的网桥docker0
2. 运行一个容器,infra初始化容器会为在容器内创建一个eth0,容器内进程使用这个虚拟的网卡
3. 运行一个容器,容器内部创建一个veth-pair,veth-pair是用来连接Bridge设备,一端是内部的eth0,一段是主机的docker0

由此,一个docker容器内的服务进程,就能通过内部的eth0+vethpair,连接到主机上的docker0,内部网络ip地址的分配,都是基于docker0的地址段进行分配的。这样就解决了容器在网络层面上的逻辑唯一/独立,容器和容器间的通信,都通过docker0来进行,而容器的ip地址,也都是通过docker0进行分配的,确保了在一个主机上的网络ip的唯一性。

了解网桥、vethpair、docker0之后,再看kubernete的CNI,CNI实际上就是在整个k8s集群层面完成上述的几个步骤,为每一个pod插上网线、分配ip

  1. 为pod插上网线:创建网桥cni0(不使用docker0),同时创建vethpair,连接pod内eth0和cni0
  2. 在全局维护cni0地址的分配,确保集群中两个pod的ip不会重复(这就是为什么我们不用docker0?docker0确保一台主机上的网络逻辑独立,集群间docker0无法保证?

基于上述对于kubernetes网络的描述,更新一下图。
在这里插入图片描述
参考这几篇的内容:
容器虚拟网卡与网桥docker0虚拟网卡的veth pair的配对
Kubernetes CNI网络插件
什么是CNI

其他关于Kubernetes的安全控制、pod安全隔离、pod安全策略、kubernetes用户/组的安全管理

这部分内容暂时没有用到,实际应用场景没有别的多,暂时没有细看,后续如果需要再做补充。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值