Kubernetes(K8s)_02_Pod
Kubernetes(K8s)资源管理基础单位-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
更多推荐
所有评论(0)