0%

k8s教程02-Pod使用和标签命名空间

1. Pod引入

1.1 pod

⼀个pod是⼀组紧密相关的容器,它们总是⼀起运⾏在同⼀个⼯作节点上,以及同⼀个Linux命名空间中。每个pod就像⼀个独⽴的逻辑机器,拥有⾃⼰的IP、主机名、进程等,运⾏⼀个独⽴的应⽤程序。

每个pod都有⾃⼰的IP,并包含⼀个或多个容器,每个容器都运⾏⼀个应⽤进程。pod分布在不同的⼯作节点上。

image-62

1.2 为何不直接使⽤容器?

  1. 容器被设计为每个容器只运⾏⼀个进程(除⾮进程本⾝产⽣⼦进程)。如果在单个容器中运⾏多个不相关的进程,那么保持所有进程运⾏、管理它们的⽇志等将会是我们的责任。

  2. 不将多个进程聚集在⼀个单独的容器中,我们需要另⼀种更⾼级的结构来将容器绑定在⼀起,并将它们作为⼀个单元进⾏管理,这就是pod背后的根本原理。

  3. 由于⼀个pod中的所有容器都在相同的network和UTS命名空间下运⾏(在这⾥我们讨论的是Linux命名空间),所以它们都共享相同的主机名和⽹络接口。同样地,这些容器也都在相同的IPC命名空间下运⾏,因此能够通过IPC进⾏通信。

1.3 将应⽤分散到多个pod中

  1. pod也是扩缩容的基本单位,对于Kubernetes来说,它不能横向扩缩单个容器,只能扩缩整个pod。
  2. 容器不应该包含多个进程,pod也不应该包含多个并不需要运⾏在同⼀主机上的容器。

2. Pod 操作

2.1 操作

yaml 文件

image-89

创建

qq040915-0

获取

image-96

查看日志

image-98

删除

qq295648-0

qq332194-0

2.2 端口转发

如果想要在不通过service的情况下与某个特定的pod进⾏通信(出于调试或其他原因),Kubernetes将允许我们配置端口转发到该pod。

qq167527-2

在另⼀个终端中,通过运⾏在localhost:8888上的kubectl portforward代理,可以使⽤curl 命令向pod发送⼀个HTTP请求:

qq167527-4

qq167527-3

3. 标签管理

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

3.1 创建指定标签

yaml 文件

qq498542-1

查看

qq498542-3

3.2 使⽤标签选择器列出pod

qq738879-0

3.3 将pod调度到特定节点

qq889739-0

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

4. 命名空间

4.1 创建

qq074912-0

qq117387-0

4.2 管理命名空间中的对象

  1. 如果想要在刚创建的命名空间中创建资源,可以选择在metadata字段中添加⼀个namespace: custom-namespace属性。
  2. 也可以在使⽤kubectl create命令创建资源时指定命名空间:
    qq117387-1

4.3 命名空间提供的隔离

你可能会认为当不同的⽤户在不同的命名空间中部署pod时,这些pod应该彼此隔离,并且⽆法通信,但事实却并⾮如此。命名空间之间是否提供⽹络隔离取决于Kubernetes所使⽤的⽹络解决⽅案。

4.4 删除命名空间中的(⼏乎)所有资源

qq462504-0

5. 参考资料

  • 《k8s in action》
给作者打赏,可以加首页微信,咨询作者相关问题!