Pod 资源结构

一个 Pod中 会运行一个或多个容器,实际上每一个 pod 都至少有两个容器,一个是 pod 根容器,一个是应用容器,应用容器都是建立在根容器之上,根容器上会绑定 ip 地址,应用容器里面只是提供了业务和开放了端口如果一个 pod 中有多个容器,他们其实都是共享的根容器的地址,至于每个容器开放的端口是谁先占用谁就先得到这个端口

pod 根容器也就引出了 k8s 的一个重要概念,之前容器运行在 docker 上,无法提供自愈这种机制,有了 k8s 容器建立在根容器之上,k8s 集群对 pod 根容器进行健康检查,当 pod 宕掉后,立马启动一个一模一样的容器保证业务的高可用,也就是自愈机制

我们也可以分析一下在 node 节点上执行 docker ps 命令可以看到启动的容器,可以观察到每一个nginx pod下面都有一个 POD 容器,这也就是说 nginx 容器是建立在 pod 容器之上的,pod 容器也就是根容器

Kubernetes 集群 Pod 资源结构定义及常用配置参数(四)_Pod

Pod 结构图 

POD 可以包含一个或多个容器,这些容器可以分为两种:

  • 用户所在的容器,数量可多可少
  • pause 容器,每个 pod 都会有个根容器, pause 根容器的作用主要在于评估 pod 的监控的状态,在根容器上设置 ip 地址,其他容器共享根容器上的地址,实现 pod 内部的网络通信

Kubernetes 集群 Pod 资源结构定义及常用配置参数(四)_Pod_02

Pod 资源常用定义参数

每一种资源配置都具有层次感,一层层往下配置 yaml 创建各种资源,有较多的参数,在工作中只需要记住常用的参数就可以,如果忘记了可以通过 explain 查询

apiVersion: v1			 #必选,版本号,例如v1
kind: Pod				#必选,资源类型,例如 Pod
metadata:				#必选,元数据
  name : string			 #必选,Pod名称
  namespace: string 		#Pod所属的命名空间,默认为" default"labels:
  labels:					#自定义标签列表
    - namd: string
spec:						#必选,Pod中容器的详细定义 
  containers: 				#必选,Pod中容器列表
  - name: string			#必选,容器名称
    image: string			#必选,容器的镜像名称
    imagePullPolicy: [ Always | Never |IfNotPresent ]		#获取镜像的策略
	command:[string] 				#容器的启动命令列表,如不指定,使用打包时使用的启动命令
    args: [string]					#容器的启动命令参数列表
    workingDir: string			     #容器的工作目录
    volumeMounts:					#挂载到容器内部的存储卷配置
	- name: string					#好用pod定义的共享存储卷的名称,需用volumes[ ]部分定义的的卷名
	  mountPath: string				#存储卷在容器内mount的绝对路径,应少于512字符
	  readonly: boolean				#是否为只读模式
    ports:						#需要暴露的端口库号列表
    - name: string				#端口的名称
	  containerPort: int		 #容器需要监听的端口号
	  hostPort: int					#容器所在主机需要监听的端口号,默认与Container相同
	  protocol: string				#端口协议,支持TCP和UDP,默认TCP 
	env:						#容器运行前需设置的环境变量列表
	- name: string				 #环境变量名称
 	  value: string				 #环境变量的值
 	resources:					 #资源限制和请求的设置
 	  limits:						#资源限制的设置
	  	cpu: string					#cpu的限制,单位为core数,将用于docker run --cpu-shares参数
		memory: string				#内存限制,单位可以为Mib/Gib,将用于docker run --memory参数
	  requests:						#资源请求的设置
	    cpu: string					#cpu请求,容器启动的初始可用数量
	    memory: string 				#内存请求,容器启动的初始可用数量
    lifecycle:						#生命周期钩子
	  postStart: 					#容器启动后立即执行此钩子,如果执行失败,会根据重启策略进行重启
	  preStop: 						#溶容器终止前执行此钩子,无论结果如何,容器都会终止
	livenessProbe: 					#对Pod内各容哭健唐检查的设署,当探测无响应几次后将自动重启该容器
	  exec:							#Pod容器内检查方式设置为exec方式
	    command: [string] 				#exec方式需要制定的命令或脚本
	    httpGet:							#对Pod某个容器健康检查方法设置为HttpGet,需要制定Path、port
		  path: string
		  port: number
		  host: string
		  scheme: string
		  HttpHeaders:
		  - name : string
			value: string
		tcpSocket: 							#对Pod内个容器健康检查方式设置为tcpSocket方式
		  port: number
		initialDelaySeconds: 0					#容器启动完成后首次探测的时间,单位为秒
		timeoutSeconds: 0						#对容器健康检查探测等待响应的超时时间,单位秒,默认1秒
		periodSeconds: 0						#对容器监控检查的定期探测时间设置,单位秒,黑认18秒一次
		successThreshold: 0
		failureThreshold: 0
		securityContext:
		  privileged: false
	restartPolicy: [Always  Never| OnFailure] 					#Pod的重启策略
	nodeName: <string>									#设置NodeName表示将该Pod调度到指定到名称的node节点上
	nodeSelector: obeject 							#设置NodeSelector表示将该Pod调度到包含这个label的node节点上
	imagePullSecrets:							#Pull镜像时使用的secret名称,以key: secretkey格式指定
	- name: string
     hostNetwork: false					#是否使用主机网络模式,默认为false,如果设置为true,表示使用宿主机网络
     volumes: 								#在该pod上定义共享存储卷列表
	 - name: string							#共享存储卷名称(volumes类型有很多种)
	 emptyDir: {}									#类型为emtyDir的存储卷,与Pod同生命周期的一个临时目录,为空值
	 hostPath: string						#类型为hostPath的存储卷,表示挂载Pod所在宿主机的目录
	   path: string						#Pod所在宿主机的目录,将被用于同期中mount的目录
	 secret:							#类型为secret的存储卷,挂载集群与定义的secret对象到容器内部
	   scretname: string
	   items :
	   - key : string
	     path: string
	   configMap:						#类型为configMap的存储卷,挂载预定义的configMap对象到容器内部
	     name: string
	     items:
	     - key: string
	       path: string

通过命令查看每种资源的可配置项

语法格式

kubectl命令可以查看每种资源的可配置项kubectl explain 资源类型 //查看资源配置的一级性,如果当前级别配置参数后面e 在 <>中是 string 就表示没有下一级配置参数,直接填写一个字符串即可,如果 <> 为 object 说明他还有下一级配置参数,可以通过资源类型.属性的方式查找

kubectl explain 资源类型.属性 //查看资源配置的二级属性也就是子属性

查看 pod 资源可配置项

查看 pod 资源的一级属性

[root@k8s-master ~]# kubectl explain pod
KIND:     Pod
VERSION:  v1						//编写yaml文件时第一行的版本号可以从这里进行查找
FIELDS:									//可配置的一级属性,基本所有资源都是如下五个,如果当前级别配置参数后面<>中是string就表示没有下一级配置参数,直接填写一个字符串即可,如果<>为object说明他还有下一级配置参数,可以通过资源类型.属性的方式查找
   apiVersion	<string>					//当前资源支持的版本
   kind	<string>						//控制器类型
   metadata	<Object>							//元数据
   spec	<Object>							//设置属性
   status	<Object>					//记录pod的状态,包括ip地址、创建时间等等,是自动增加的,不是手动写入的

Kubernetes 集群 Pod 资源结构定义及常用配置参数(四)_版本号_03

查看pod资源的二级属性

要想查当前配置参数的下一级属性,就要看当前配置参数 <> 中是不是 object,如果是 object 表示有下一级配置参数,如果为 string 表示没有下一级配置参数,只填写一个字符串就能完成这个参数的配置

查一下 metadata 所支持的二级属性

[root@k8s-master ~]# kubectl explain pod.metadata
KIND:     Pod
VERSION:  v1
RESOURCE: metadata <Object>

FIELDS:
   annotations	<map[string]string>
   clusterName	<string>
   creationTimestamp	<string>
   deletionGracePeriodSeconds	<integer>
   deletionTimestamp	<string>
   finalizers	<[]string>
   generateName	<string>
   generation	<integer>
   labels	<map[string]string>
   managedFields	<[]Object>
   name	<string>
   namespace	<string>
   ownerReferences	<[]Object>
   resourceVersion	<string>
   selfLink	<string>
   uid	<string>

Pod 资源常用配置参数

在 k8s 中基本所有资源的一级属性都是一样的

  1. apiVersion //版本,由 k8s 内部定义,版本号必须用 kubectl api-versions 查到的才可以使用。
  2. kind //控制器类型,由 k8s 内部定义,版本号必须用 kubectl apiresources 查到的才可以使用。
  3. metadata //元数据,主要是资源表示和说明,常用的有 name、namespace、labels
  4. spec //属性,配置中最重要的一部分,里面是对各种资源的详细描述
  5. status //状态信息,不需要配置,k8s 会自动生成

查看 k8s 支持的控制器版本号及控制器类型

列出所有支持控制器版本号
[root@k8s-master ~]# kubectl api-versions


列出所有控制器
[root@k8s-master ~]# kubectl api-resources