试想两个容器 一个apache 一个php。在移植的时候很麻烦 因为在容器里面还需要映射。因此产生了pod。
Pod类型:
1.自主式Pod
2.控制器管理的Pod
1.自主式Pod
只要启动一个pod就会启动一个pause容器。再再次pod中启动两个容器。他们会共用pause的网络栈。存储卷 。
容器之间进程不隔离。直接访问端口即可。
也就是在一个pod里面容器之间的端口不能冲突。
存储也是共享的
2.控制器管理的pod
RS支持集合式的selector:
在创建pod的时候会打标签。比如app=apache version=v1
当想删除容器或者操作时,要操作app=apache,version=v1我要xxxx 但是RC不支持。
为什么要把RS和Deploment放一起?
回滚更新指的是pod1创建一个新版本然后kill旧版本。
但是rs不支持回滚更新 deploment本身是不支持创建容器的
所以使用在一起可以自动的回滚更新创建新容器。
Deployment创建之后会创建一个RS,RS是Deployment定义的。
Deployment创建pod
比如有一天需要更新镜像为v2版本
他会新建一个RS-1
新的Rs-1会启动v2版本的新容器然后退出v1版本的
还支持回滚。因为旧版的Rs不会删除。只会停用
回滚的时候会重新启用旧版本的RS
HPA
就是根据利用率平滑扩展
比如运行了一个RS,下面管理了两个Pod,再定义一个HPA对象,HPA是基于RS定义的。当CPU>80就进行扩展。就是会监控这些POD的资源利用率。当CPU>80,会新建pod.
高了会创建,低了会删除,但是删除后最少两个Pod
即只要你有需要,就会在每个pod上运行一个子进程,去帮我们做一些事情。daemonset就是一个比较好的选择。
job备份数据库。备份代码放在pod里面运行,再放在job里面执行。脚本就会正常执行把数据库备份出来。
再Linux也可运行。pod运行的可重复利用。一般来说脚本运行失败不可以重复执行,但是job判断脚本异常退出就会重新执行,并且还可以设置正常退出次数,比如正常退出两次才算成功。
服务发现:
pod必须是有联系的,比如由deployment创建的,或者是有同一组标签才可与service关联。
即service收集pod其实是通过标签选择到的。
service会有ip+端口供客户端访问
pod遵循RR
比如想要构建集群
缓存服务器squid
如果想要把上面的部署在k8s上
首先MySQL运行再一个pod,MySQL放在statefullset控制器中是可以的。但是集群化不方便。
首先把MySQL封装成pod,需要构建apache+fpm的集群,
因为apache都是相似的,所以创建一个控制器deployment指定副本数目为3.就会有三个不同的apache的pod存在。
squid同理 通过控制器控制
lvs靠集群本身调度。
pod失败后重新控制器维稳会启动新的pod,启动的ip会变
所以前端添加service 都去访问php-fpm的service
会绑定选择php-fpm的标签去绑定
所以squid里面写的是service-php-fpm的ip即可。
可以把mysql部署在statefullset里面,那么其名字不会变、
通过名称去对应到pod上 容器之间可以互相访问 扁平化的网络
php-fpm里面写mysql的ip是可以的
当然外部可通过service去访问squid,将service暴露在外面。
扁平的网络空间即所有pod都可通过对方的ip直接到达,只是pod认为,下面有很多的转换机制。
同一个pod中因为共享pause容器网络战,走的就是网络栈的lo.
ipatbels规则转换 现在已经加入了lvs的转发
flannel实现的原理:
真实node服务器会安装flanneld守护进程。进程启动会开启网桥flannel0,会专门收集docker0转发的数据包,docker0会分配ip到pod上。
如果同一主机不同pod访问其实就是通过docker0网桥。
因为在同一网桥下的两个子ip
难点:跨主机到达。
假设web2想把数据包发送给backend
因为不在同一网段。会把数据包给网关docker0,docker0会有钩子函数把数据包抓到flannel0,从etcd获取的路由表会判断路由到哪台机器。flanneld会对数据报文封装。
使用udp报文转发的 因为快
外部封装ip
转发过来 目标端口就是下面的flanneld,收到会拆封
转发转发到backend
其实就是数据包的封装和二次解封。
flanneld和etcd的关联
flanneld启动后会向etcd插入可以被分配的网段。
并且把网段和机器记录起来 防止该网段再被flannedl利用分配给其他的node节点。
就是因为flanneld维护的pod节点路由表 所以才知道真实的物理ip对应的容器的ip 也就是知道要把这个容器的数据包发送给哪个物理ip
外网service访问pod就借助nodeport的映射
真实的网络就是节点网络
pod和service都是虚拟网络即内部网络
pod都会在扁平网络通讯
想要访问service就访问service网络,然后service通过iptables或者lvs转换去svc的转换和pod通讯