前言
探讨一些k8s内比较容易误解或难以理解的资源
探究
service与network
在一开始学习k8s时,我对k8s中的service的初印象就是docker中的network,因为k8s与dockerfile有某些相同点,但是仔细深入学习,就会发现,两种无论是从使用还是其本身的功能来说,都是不同的,唯一相同的功能就是允许容器使用名称进行访问。
功能(负载均衡vs网桥连接容器)
services,简称svc,作用类似于负载均衡,拥有自己的IP,访问该IP就等同于访问其管理的所有的容器(一对多的关系),负载均衡会把访问按一定算法分配给其管理的任意容器,所以为了使用其类似docker中的network的功能,能够使用svc名称进行访问。
这里就能看出与network的不同之处,network并没有负载均衡的功能而是仅仅用于连接不同容器的一个中间资源,并且可以通过network访问主机。
范围(跨节点与单节点)
对于k8s集群来说,svc是可以对任意节点的pod使用的,也就是说svc发范围是k8s的任意节点。
docker本身只能在单节点运行,所以network也是没有跨节点的功能的。
关联方式(自动发现与指定)
svc是通过label选择关联pod的,并不需要在pod内指定是哪个svc,只要有svc选择的labels就行。
network必须必须要在创建容器时(dockerfile也行)显式指定。
暴露策略
svc的暴露策略
NodePort:基于ClusterIP,监听k8s所有节点的某个端口(允许外部访问指定端口)
LoadBalancer:云平台负载均衡,自动分配IP(需要接入云平台负载均衡例如阿里云SLB)
ClusterIP:仅K8S集群内部可访问
ExternalName:将K8S集群外部的服务映射为一个svc服务(其实就是转发到指定域名)
network的暴露策略
network在docker中只有一种情况就是bridge(container不算),在容器与主机间搭建网桥连通容器与主机,具体映射端口由容器本身指定。
总结
虽然service与network工作环境不同,实际内容也不一样,但是刚学习容易搞混
经过比较,可以发现service与network是完全不同的东西,但是有一点是相同的,那么就是使用名称(docker中是容器名,k8s中是svc名)访问防止容器重启导致IP变化无法访问。
pause与CNI
在刚开始学习k8s的时候,我不是特别关注pause,但是一旦学到CNI,在加上后面的svc,就开始混乱了,我甚至认为pause就是CNI的实现,svc充当整个pod的"网卡",但是深入学习就发现是错误的
pause是每个pod都会有的一个容器(有且只有一个),她负责创建网络空间(可以理解为网卡),并且该pod的所有容器都会加入这个网络空间,加入这个网络空间的容器可用通过localhost通信,就像是部署在同一个主机上一样(从使用上看,pause就跟pod的网卡差不多)。
pause一直处于暂停状态,pause在pod内负责维护所有容器。
为什么需要pause创建网络空间?因为一旦网络空间所属的容器挂了,整个网络空间就挂了导致pod的网络中断,pod失联,必须保证网络空间在pod的生命周期内可用,所以使用pause创建网络空间,并且当 pod 被删除时,Kubelet 先终止 pause 容器,pause会自动清理pod内的容器(这就是真实删除pod的流程)。
CNI的作用就是给这个网络空间配置IP并且配置路由规则,使pod内的容器可以访问外网和其他pod,没有CNI,pod之间,pod与外网无法进行通信。
总结
k8s有许多概念较难理解,学习成本不低,甚至我第一次搭建k8s就花了整整一天的时间,k8s是我觉得在短期内基本不会有什么成效,需要长时间的积累