pod 控制器 3
简单回顾
之前我们学习过的的 docker ,例如我们运行
docker run busybox echo "hello wrold"

他的实际内在逻辑是这个样子的

程序将指令推送给 docker
docker 会检查本地是否有 busybox 镜像,若没有则去 docker hub 上面拉取镜像,并下载到本机,再基于这个镜像创建一个 容器
在容器中运行指令 echo “hello wrold”
前面我们也知道了 每一个 pod 或者 docker 容器,都有自己独立的文件系统,进程,用户,主机名和网络接口
简单运行 pod
如果想简单运行一个 pod,我们可以这样做
kubectl run xmtkubia --image=xiaomotong888/xmtkubia --port=8080
xiaomotong888/xmtkubia 是 dockerhub 上面的具体公开的镜像

pod 中的容器运行位置
我们知道 pod 中可以运行 1 个容器或者多个容器,那么如果 1 个pod 中,运行多个容器,那么这些容器都会运行在同一个工作节点上面吗?

当一个 pod 中有多个容器的时候,这些容器一定总是运行在同一个工作节点上面的,一个 pod 绝对不会跨越多个工作节点
为什么是 一个 pod 里面跑多个容器,而不是一个容器里面跑多个进程?
在我们学习 docker 和 K8S 的过程中,有没有思考过,为什么需要引入 pod 这个概念,我们一个容器里面设计成跑多个进程不就好了吗?
实际上,容器是被设计成每个容器只能运行一个进程的,当然这个进程在程序中自动开辟的子进程是不包含在内的
如果我们单个容器中运行了多个不相关的进程,那么当同一个容器中别的进程崩溃的时候,便会影响到其他进程
多个进程跑在同一个容器中,如何区分进程在标准输出打印的信息呢,这会很麻烦
提出 pod 其实是一种解决方案
提出 pod 这种结构后,1 个 pod 可以和多个容器绑定在一起
1 个 pod 里面可以同时运行多个进程(即多个容器),并且这行进程能够享有几乎同样的环境
从外部看,这些进程好像是全部运行在单个容器中,实际上这些进程又相互保持一定的隔离
上面这里说到的 pod 中的容器相互间保持的着一定的隔离,而不是完全隔离
这里指的是隔离容器组,而不是单个容器,每个容器组内的容器是可以共享容器组的资源的
容器如何共享 ip 和 端口
同一个 pod 中的容器是运行在相同的 Network 命名空间中的,因此他们对于 ip 地址和端口空间是共享的
那么同一个 pod 下面的容器,配置 端口号的时候就需要注意,不能冲突,例如这样

在 K8S 中,所有的 pod 都是在同一个网络地址空间中,网络信息他们是共享的
如图,不同 pod 之间是可以通过 ip 直接访问的

看了以上 pod 的行为,有没有觉得 pod 的行为和实际的虚拟机或者物理机的行为有很多类似的地方,虚拟机里面跑的每一个进程,pod 里面也可以直接跑这些进程,只不过,pod 里面的每一个进程,都被一个容器包裹
所以啊, pod 可以看做是一个逻辑主机
实在的案例
一个应用程序,有前端应用服务器,和 后端的数据库,如果我们需要将这个程序放到 K8S 环境中,我们是启 1 个 pod 还是 2个 pod ?

在 K8S 中是推荐将上述的前端服务器和 后台数据库分开,分成 2 个 pod 去部署,原因有这些:
这样既能够充分利用多个节点的 CPU 和内存,还可以方便我们后续的扩容和缩容
在我们扩缩容的时候,基本单位也是 pod,K8S 中不能对单个容器进行扩缩容
如果将前端和后台都放到同一个pod 中,那么我们扩容或者缩容时候,那么相应的容器将会成倍的增加或减少
前端和后台的扩容缩容也会是完全不同的需求,并不能直接简单粗暴的干就完了
如果我们把上述的前端和后台这样来部署是不推荐的:
全部放到同一个 pod 的同一个 容器中
通一个 pod 中部署 2 个容器,分别部署前端和后台

推荐的做法是
在 2 个 pod 中分别开 1 个容器,各自部署 前端,后台程序

我们实际工作中面临是否需要在同一个 pod 中启多个容器的时候,我们可以思考一下这样的问题
这些容器放在一起运行是必须的吗?是否可以拆分放在不同的主机上运行
这些程序是代表一个整体?还是相互独立的
对于扩容和锁容,是需要一起进行,还是分别进行?
这些问题,咱们之后可以解决一下
今天就到这里,学习所得,若有偏差,还请斧正
欢迎点赞,关注,收藏
朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力

好了,本次就到这里
技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。
我是阿兵云原生,欢迎点赞关注收藏,下次见~