这是我参与2022首次更文挑战的第23天,活动详情查看:2022首次更文挑战」 之前了解了k8s到底是什么,接下来看看k8s的组成。
k8s的核心概念
一. Pod
pod,中文翻译过来叫豆荚,如下图。我们都知道豆荚,一个豆荚里面有很多豆子。豆荚就可以理解为pod,一个个的豆子就可以理解为容器。pod和容器的关系是一个pod里面可以有一个或者多个容器。Pod是k8s部署的最小单位。
那么pod中容器和容器之间有什么关系呢?
当server api将指令下发给kubelet的时候,kubelet会创建第一个容器,不管创建pod的目标是什么,第一个容器总是不变的,他就是pause。pause是第一个被创建的容器,它的作用有两个:
-
初始化网络栈
创建对应的veth,网络命名空间,网桥,这些都是初始化网络栈的时候完成的。
-
挂载网络卷
当我们需要 pod有一定的存储能力,这时就需要给pod挂载到对应的卷,这个卷是被谁挂载的呢?不是被应用容器挂载的,而是被pause挂载的。
初始化好pause,后续可以在pod中安装一个或多个容器。这些容器跟pause共享网络栈,共享数据卷。
比如,我们在pod中添加了3个容器,nginx,mysql,java应用程序。还可以更多,但最少要有一个container。这些容器共享pause的网络和数据卷。所以,在pod中的容器,容器名、端口号都不能重复,否则会报错。
提示:通常容器关联比较大的应用,放在一个pod中,在同一个pod中可以使用localhost进行访问
1.Pod的类型
1) 自主式Pod
自主式Pod是不被控制器管理的Pod. 这种Pod死亡以后, 不会被重新启动. 这个Pod死了以后, 副本数就达不到期望值了, 也不会有人去创建一个新的Pod来达到副本数的期望值.
在传统情况下, 我们运行一个容器, 每一个容器都是独立存在的, 每个容器都有自己的ip地址, 每个容器都有自己的挂载卷. 但在k8s移植的时候, 就不太容易了. 我们把一个没有在容器里运行的环境转移到或迁移到k8s的环境里, 就比较难迁移.比如:LAMP, 那么A和php之间有联系,我们把A和php分开了, 他俩个是不同的地址, 还要去配置反向代理, 比较费劲.
说的是什么意思呢? 有些组件应该在一起, 并且能互相见面, 也就是通过localhost能访问到. 但是, 使用标准的容器, 你没办法这样做, 除非你把两个进程封装在一个容器内部. K8S给我们建立了一个Pod, Pod是怎样实现的呢?
首先, 要定义一个Pod, 他会先启动第一个容器, 这个容器需要注意, 只要运行的Pod, 这个容器就会被启动. 这个容器叫pause
然后, 在Pod里定义了两个容器, 也可以是一个容器, 然后这两个Pod会共用PAUSE的网络栈和存储卷.
也就是说, 这两个容器没有自己独立的ip地址和存储卷, 或者说, 他们有的是PAUSE或者pod的ip地址. 这两个容器他们尾根隔离, 但是进程不隔离. 也就是说, 如果容器1运行的是php, 容器2运行的是nginx, nginx想要反向代理访问php, 只需要要写localhost:9000即可. 不需要写IP地址+端口映射. 原因是这两个容器共享的是PAUSE的网络栈.
这样就说明了, 在同一个Pod里, 容器之间的端口不能冲突.
下面一个要说明的是: 共享存储. 这里两个容器除了共享网络, 同时也共享存储卷.