1. Pod引入
1.1 pod
⼀个pod是⼀组紧密相关的容器,它们总是⼀起运⾏在同⼀个⼯作节点上,以及同⼀个Linux命名空间中。每个pod就像⼀个独⽴的逻辑机器,拥有⾃⼰的IP、主机名、进程等,运⾏⼀个独⽴的应⽤程序。
每个pod都有⾃⼰的IP,并包含⼀个或多个容器,每个容器都运⾏⼀个应⽤进程。pod分布在不同的⼯作节点上。

1.2 为何不直接使⽤容器?
容器被设计为每个容器只运⾏⼀个进程(除⾮进程本⾝产⽣⼦进程)。如果在单个容器中运⾏多个不相关的进程,那么保持所有进程运⾏、管理它们的⽇志等将会是我们的责任。
不将多个进程聚集在⼀个单独的容器中,我们需要另⼀种更⾼级的结构来将容器绑定在⼀起,并将它们作为⼀个单元进⾏管理,这就是pod背后的根本原理。
由于⼀个pod中的所有容器都在相同的network和UTS命名空间下运⾏(在这⾥我们讨论的是Linux命名空间),所以它们都共享相同的主机名和⽹络接口。同样地,这些容器也都在相同的IPC命名空间下运⾏,因此能够通过IPC进⾏通信。
1.3 将应⽤分散到多个pod中
- pod也是扩缩容的基本单位,对于Kubernetes来说,它不能横向扩缩单个容器,只能扩缩整个pod。
- 容器不应该包含多个进程,pod也不应该包含多个并不需要运⾏在同⼀主机上的容器。
2. Pod 操作
2.1 操作
yaml 文件

创建
获取

查看日志
删除
2.2 端口转发
如果想要在不通过service的情况下与某个特定的pod进⾏通信(出于调试或其他原因),Kubernetes将允许我们配置端口转发到该pod。
在另⼀个终端中,通过运⾏在localhost:8888上的kubectl portforward代理,可以使⽤curl 命令向pod发送⼀个HTTP请求:

3. 标签管理
标签是⼀种简单却功能强⼤的Kubernetes特性,不仅可以组织 pod,也可以组织所有其他的Kubernetes资源。详细来讲,标签是可以附加到资源的任意键值对,⽤以选择具有该确切标签的资源(这是通过标签选择器完成的)。
3.1 创建指定标签
yaml 文件

查看

3.2 使⽤标签选择器列出pod

3.3 将pod调度到特定节点

我们只是在spec部分添加了⼀个nodeSelector字段。当我们创建该 pod时,调度器将只在包含标签gpu=true的节点中选择。
4. 命名空间
4.1 创建

4.2 管理命名空间中的对象
- 如果想要在刚创建的命名空间中创建资源,可以选择在metadata字段中添加⼀个namespace: custom-namespace属性。
- 也可以在使⽤kubectl create命令创建资源时指定命名空间:
4.3 命名空间提供的隔离
你可能会认为当不同的⽤户在不同的命名空间中部署pod时,这些pod应该彼此隔离,并且⽆法通信,但事实却并⾮如此。命名空间之间是否提供⽹络隔离取决于Kubernetes所使⽤的⽹络解决⽅案。
4.4 删除命名空间中的(⼏乎)所有资源
5. 参考资料
- 《k8s in action》