K8S集群学习记录03
Pod概念
只要有pod,pod中的pause容器就会被创建启动;pause容器是pod的根容器,1.初始化网络栈、挂载网络卷,即pod内部的其他容器共用pause容器的网络栈和存储卷。2.启动一系列的应用容器,应用容器数量在一个以上,即需要启动一个主容器
在同一个pod中,容器之间的端口不能冲突
服务的分类:
- 有状态服务:例如:mysql、数据库类型
- 无状态服务:例如:http、web服务器、ftp服务器
- 中心化服务:
- 去中心化服务:
pod类型
创建模式
- 自主式pod(自己管理自己,出现问题自生自灭)
- 控制器管理pod(控制器管理,pod出问题控制器会处理)
控制器类型:
为无状态服务设计的控制器:
-
通用型:(目标:要求持续运行)
-
ReplicationController(RC):用来确保容器应用的副本数始终保持在用户定义的副本数(期望),即如果有容器异常退出,会自动创建新的pod来代替;而如果异常多出来的容器也会被回收。需要注意副本数(期望)的值只是一个范围,具体能够达到多少副本的数量与资源相挂钩。 (在新版本K8S中建议使用RS来代替RC) -
ReplicaSet(RS):与RC没有本质的不同,并且RS支持集合式的selector。RS虽好,但不支持滚动更新和回滚。 虽然RS可以单独使用,但一般还是建议使用Deployment来管理RS,这样就无需担心跟其他机制的不兼容问题。 -
Deployment(Deploy):支持滚动更新以及回滚。
-
特殊场景: 批处理任务:(目标:成功退出,返回码为0)
每个节点有且只有一个任务:
自动扩容缩
有状态服务的控制器
自定义控制器
通用型控制器无法满足时,需要自行通过官方的开发工具包进行kubernetes开发。
网络通讯方式
k8s的网络模型假定了所有pod都在一个可以直接连通的扁平的网络空间中,这在GCE(google computer Engine)里面是现成的网络模型,k8s已经假定这个网络存在了。
而在私有云里搭建k8s集群,需要自行实现这个网络假设,将不同节点上的Docker容器之间互相访问先打通,然后运行k8s。
即:没有扁平化的网络,k8s部署好后是未就绪的。
Flannel
Flannel是CoreOS团队针对k8s设计的一个网络规划服务,简单来书,它的功能是让集群中的不同节点主机创建的Docker容器都具有全集群唯一的虚拟网络IP地址(flannel与etcd的联动实现)。而且它还能在这些IP地址之间建立一个覆盖网络,通过覆盖网络将数据包原封不动的传递到目标容器内。
flannel底层原理:
简单来说,10.1.15.2想要发送数据包到10.1.20.3,
- 发送源(15.2)的数据包(包含源地址、目标地址)通过docker查询目标地址是否处于同一网段,不处于同一网段,则需要网关进行传递,而所有通过doker网关向外界通讯的报文都会被flannel0捕获;
- Flannel0管理Flanneld(flanneld实现了flannel0的接口),flanneld进程获取到数据包后,有且只有通过物理网络将报文进行传输,所以Flanneld通过查询etcd,匹配目标地址(10.1.20.3)所在网段对应的物理IP(192.169.66.12);
- Flanneld获取到目标地址所在网段的物理IP(192.169.66.12)后,将数据包进行二次封装,设定源地址为当前物理ip(192.168.66.11)、目标地址为通过查询得到的物理ip(192.169.66.12)、内容是需要传递的数据包,就如同一个快递被另一个快递包裹进行传递一样。通过物理网络将二次封装的数据包进行UDP传递(UDP网络通讯io有保障,但是在网络设施不佳、传输路径较长时UDP的传输并不稳定,但在当前环境下,缺点被掩盖(同机房));
- 二次封装的数据包到达物理目标地址(192.169.66.12)后,flanneld将二次封装的数据包拆封、将内部数据包传输到docker环境中广播,目标地址(10.1.20.3)进行接收。
|