Kubernetes(K8s)_02_Pod

@

Pod

Pod:存储1个或多个容器的结构

1)一个Pod就是一组紧密相关的容器,是Kubernetes的最小调度单位;

2)Pod内的容器工作在同一个Node节点上和同一个Linux命名空间下;

3)每个Pod拥有独立的IP、主机名和进程等系统资源;

4)Pod内的容器的主机名为Pod的主机名


如:一个Pod内的容器仅能运行在同一个节点上
在这里插入图片描述


Pod是种便于排错和管理的部署方式:

1)每个进程独占一个容器,多个相同的容器由Pod进行管理


如:节点、Pod和容器之间的关系
在这里插入图片描述


Pod内的所有容器共享相同的Linux命名空间,其包含

1)Network命名空间:同一Pod内的容器可共享相同的主机名、IP和端口;

2)UTS命名空间:同一Pod内的容器可共享相同的网络接口;

3)PID命名空间:同一Pod内的容器可得到其他容器内的进程信息;

4)IPC命名空间:同一Pod内的容器可能通过IPC进行通信

//默认为每个容器拥有独立的命令空间


Pod实现隔离容器组(每个容器组内的容器共享部分资源),但需注意:

1)同一Pod内的容器运行的进程不能使用同一端口;

2)同一Pod内的容器具有相同的loopback网络接口;


Kubernetes集群中的所有Pod共享一个网络空间,所以Pod之间可通过对方的IP实现相互访问(无论是否在一个节点上,均可)

如:Kubernetes集群中的Pod通信
在这里插入图片描述

创建Pod

创建Pod的流程:

1)编写YAML文件提交至Kubernetes REST API服务器;

2)调用create命令基于YAML文件生成Pod;


Kubernetes中资源的YAML文件主要由以下几个部分组成:

1)apiVersion:指定YAML中使用的Kubernetes API版本为;

2)kind:指定YAML描述的资源类型为;

3)metadata:指定元数据(名称、命名空间和标签等);

4)spec:指定相关配置


创建Pod的最简格式:

apiVersion: v1
kind: Pod
metadata:
  name: Pod名称
  labels:
标签名1: 标签值1
标签名N: 标签值N
spec:
  dnsPolicy: DNS策略
  containers:
  -  image: 容器基于的镜像
     name: 容器名称
     ports:
      -  name: 端口名称1
         containerPort: 容器监听的端口号1
         protocol: 监听的协议1
      -  name: 端口名称N
 containerPort: 容器监听的端口号N
         protocol: 监听的协议N

(1)DNS策略分为以下4种:

1)ClusterFirstWithHostNet

2)ClusterFirst

3)Default

4)None


如:创建Pod,并验证是否启动

1)编写YAML文件;
在这里插入图片描述
2)create命令生成Pod
在这里插入图片描述
3)查看Pod的容器日志,以验证是否启动
在这里插入图片描述

Pod管理容器

Pod在部署和管理容器时,应遵循以下3个标准:

(1)将多层应用分散到多个Pod中

1)以提高基础架构的利用率;

2)提高Kubernetes集群的容灾性


(2)基于扩缩容考虑而分隔容器

1)Pod是扩缩容的基本单位(Kubernetes不能扩缩单个容器);

2)避免在扩缩容时,生成/减少非指定的容器


(3)根据需求在Pod中使用多个容器

1)若单个应用由多个进程组成,则需将多个容器添加到同一Pod内;


如:前端进程和后端进程应由两个独立的Pod管理
在这里插入图片描述

Pod接受请求

port-forward命令:指定Pod端口映射的主机端口

指令格式:kubectl port-forward Pod名称 主机端口:Pod端口


如:续上,指定映射端口并访问

1)指定映射端口;
在这里插入图片描述
2)验证是否映射成功
在这里插入图片描述
3)访问后,显示出新的数据
在这里插入图片描述

标签

标签:用于编排和管理Kubernetes集群中资源的字段

1)标签可以附加到任何资源的任意键值对;

2)通过标签选择前可选择具有特定标签的资源;

3)一个资源可以拥有多个标签,但标签的值在该资源内是唯一的;


如:Pod添加标签的前后对比

1)添加标签前;
在这里插入图片描述
2)添加标签后
在这里插入图片描述
//实现每个管理访问集群时,能够通过标签快速了解系统结构和资源所承担应用

创建标签

创建标签格式(位于metadata字段下):

labels:
  标签名1: 标签值1
  标签名2: 标签值2
  标志名N: 标签值N

如:创建带有标签的Pod

1)编写YAML文件;
在这里插入图片描述
2)调用create命令生成Pod,并验证
在这里插入图片描述
3)单独查看ENV标签
在这里插入图片描述

修改标签

label命令:对现有的资源进行修改或添加标签

指令格式1(添加标签):kubectl label 资源类型 资源名称 标签名=标签值


指令格式2(修改标签):kubectl lable 资源类型 资源名称 标签名=标签值 --overwrite


如:在kubia-manual中添加“creation_method=manual”标签,修改kubia-manual-v2的env标签为debug
在这里插入图片描述

标签条件

标签条件:指定条件方式以选出含有特定标签的资源

1)条件方式1:标签名

说明:仅选包含指定标签名的资源


2)条件方式2:‘!标签名’

说明:仅选不包含指定标签名的资源


3)条件方式3:标签名=标签值

说明:仅选包含标签名,且标签值为指定值的资源


4)条件方式4:标签名!=标签值

说明:仅选包含标签名,且标签值不为指定值的资源


5)条件方式5:标签名 in (标签值1,标签值N)

说明:仅选包含标签名,且标签值为指定值1或指定值N的资源


6)条件方式6:标签名 notin (标签值1,标签值N)

说明:仅选包含标签名,且标签值不为指定值1或指定值N的资源


如:选出含有特定标签的Pod

1)列出含有creation_method标签,且标签值为manual的Pod
在这里插入图片描述
2)列出所有不包含env标签的Pod
在这里插入图片描述


标签条件可同时使用多个条件方式:

1)多个条件方式之间使用逗号分隔;

2)多个条件方式之间为“与运算”(都满足才可以)


如:选出标签creation_method的值为manual和含有env标签的Pod
在这里插入图片描述

Pod调度

Pod调度:通过Node标签和Node标签选择器完成Pod的调度

1)不能强制Pod调度到具体的Node节点

2)默认情况下,所有的Pod都随机的调度到Node节点上运行


Node标签选择器格式(位于spec字段下):

nodeSelector:
  条件方式1
  条件方式2
  条件方式N

如:通过创建含有的特殊标签的Node和Node标签选择器实现Pod调度

1)指定node2节点含有“gpu=true”标签,并验证;
在这里插入图片描述
2)编写具有Node标签选择器的Pod的YAML文件;
在这里插入图片描述
3)调用create命令生成Pod,并验证
在这里插入图片描述


Pod调度到指定节点:

1)每个节点均有“kubernetes.io/hostname=本节点主机名”标签;

2)将Node标签选择器配置为对应Node的kubernetes.io/hostname的值;

3)若指定的节点为离线状态,则该Pod为不可调度状态

注解

注解(注释):对Kubernetes集群中的资源作进一步说明的字段

1)注解可以附加到任何资源的任意键值对;

2)注解的数据不能超过256KB;

创建注解

创建注解格式(位于metadata字段下):

annotations:
  注解名1: “注解值1”
  注解名2: “注解值2”
  注解名N: “注解值N”

如:创建Pod,并添加注解

1)编写YAML文件;
在这里插入图片描述
2)调用create命令创建,并验证
在这里插入图片描述
//也可通过describe命令进行验证


annotate命令:在指定资源中添加/修改注解

指令格式1(添加注解):kubectl annotate 资源类型 资源名 注解


指令格式2(修改注解):kubectl annotate 资源类型 资源名 注解 --overwrite


如:续上,添加和修改kubia-manual-anno的注解

1)添加新的注解
在这里插入图片描述
2)修改注解
在这里插入图片描述

命名空间

Kubernetes命名空间:为资源提供作用域,以将资源分隔成独立且不重叠的组

1)相同资源可存储在多个命名空间中;

2)在命名空间下资源名具有唯一性(两个不同的命名空间可具有同名的资源);

3)通过同名的资源,可跨不同的命名空间调用相同的资源;


Kubernetes命名空间有3点须知:

1)全局且未被约束于单一命名空间的节点资源和命名空间无关;

2)命名空间之间不提供对正在运行的资源进行任何隔离操作;

3)命名空间之间是否具有网络隔离取决于Kubernetes集群所使用的网络方案;

4)在管理资源时若不指定命名空间,则操作默认在default命名空间执行


如:列出已有的命名空间

1)列出系统中所有命名空间资源
在这里插入图片描述
2)列出kube-system命名空间下的资源
在这里插入图片描述

//--namespace选项和-n选项效果相同

创建命名空间

创建命名空间格式:

apiVersion: v1
  kind: Namespace
  metadata:
    name:命名空间的名称

如:创建命名空间

1)编写YAML文件;
在这里插入图片描述
2)调用create命令生成命名空间,并验证
在这里插入图片描述


也可通过create命令直接创建命名空间

格式:kubectl create namespace 命名空间的名称


如:通过create命令直接创建命名空间
在这里插入图片描述

管理命名空间

向命名空间中添加资源有两种方式:

1)在资源的YAML文件中添加namespace字段(位于metadata字段下):

格式:namespace:命名空间的名称


如:将两个Pod加入custom-namespace命名空间

1)编写YAML文件;
在这里插入图片描述
2)调用create命令生成Pod,并验证
在这里插入图片描述

2)调用create命令生成资源时,同时指定其所属的命名空间


格式:-n 命名空间的名称

1)编写YAML文件;
在这里插入图片描述
2)调用create命令生成Pod,同时指定其所属的命名空间,并验证
在这里插入图片描述

删除Pod

删除Pod过程中,Kubernetes会终止该Pod的所有容器

1)Kubernetes会向该Pod所有容器发送SIGTERM信号,并等待30s;

2)若超过该事件还未关闭,则发送SIGKILL信号(强制关闭)

3)若删除的Pod由其他Pod控制器管理,可能出现删除后自动创建的情况


删除Pod可通过3种方式:

(1)通过Pod名删除

格式:kubectl delete pod Pod名称


如:删除名称为kubia-gpu的Pod
在这里插入图片描述
//若同时删除多个Pod,Pod之间使用空格分隔


(2)通过标签删除

格式:kubectl delete pod -l 条件方式

1)多个条件方式之间使用逗号分隔


如:删除含有“creation_method=manual和env=debug”标签的Pod
在这里插入图片描述
//在金丝雀发布时,可通过标签删除所有金丝雀Pod


(3)通过命名空间删除

格式:kubectl delete ns 命名空间的名称

1)删除命名空间,会删除该命名空间下的所有资源


如:删除custom_namespace命名空间
在这里插入图片描述
//可通过--all选项,删除当前所在的命名空间下的所有Pod


如:删除所有Pod
在这里插入图片描述

posted @ 2022-02-14 13:16  爱和可乐的w  阅读(140)  评论(0编辑  收藏  举报