Pod介绍+网络通讯方式

在这里插入图片描述
试想两个容器 一个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通讯

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值