目录
如图:如果执行了删除pod 的指令,pod状态变更的同时在Endpoint中pod 的IP也会被删除
#必选,api版本
apiVersion: v1
#必选,定义什么就写什么,比如定义一个pod就写pod,要定义server就写server
kind: Pod
#必选,元数据
metadata:
#必选,pod名称
name: string
#pod的命名空间,如果不填,默认是default,或者使用-n 参数来指定命名空间
namespace: string
#对应kind,是pod的标签列表,可以填写多个labels
labels:
#对应kind,自定义标签列表,
- name: string
#对应kind,自定义注解列表,
annotations:
- name: string
#必选,pod中容器的详细定义
spec:
initContainers: # 初始化容器,在容器启动之前执行的一些初始化操作
- command:
- sh
- -c
- echo "初始化"
#必选,容器列表
containers:
#必选,容器名字
- name: string
#必选,容器的镜像名称
image: string
#拉取镜像的策略,Always:总是拉取镜像库的镜像,Never:使用本地镜像,IfNotPresent:本地有镜像就不拉取镜像库镜像,没有就拉取
imagePullPolicy: [Always | Never | IfNotPresent]
#容器的启动命令,如果不指定,则使用镜像打包时使用的启动命令
command: [string]
#容器的启动命令参数列表
args: [string]
#容器的工作目录
workingDir: string
# workingDir: /k8s/kubernetes/
#挂载到容器内部的存储卷配置
volumeMounts:
#引用pod定义的共享存储卷的名称,
- name: string
#存储卷在容器内挂在的绝对路径,赢小于512个字符
mountsPath: string
#是否为只读模式,默认是读写
readOnly: boolean
#容器需要暴露的端口号列表
ports:
#端口名称
- name: string
#容器需要监听的端口号
containerPort: int
hostPort: int
#端口协议,支持TCP和UDP 默认TCP
protocol: string
#容器运行前设置的环境变量列表
env:
#环境变量名称
- name: string
#值
value: string
#资源限制和请求设置
resource:
#资源限制设置
limits:
#cpu限制,单位为core数,将用于docker run --cpu-shares参数
cpu: string
#内存限制,单位为MiB、GiB等,将用于docker run --momory参数
memory: string
#资源请求设置
requests:
#cpu请求,容器启动的初始可用数量
cpu: string
#内存请求,容器启动的初始可用数量
memory: string
#对pod内各容器健康检查设置当探针无响应几次之后,系统将自动重启该容器,可以设置的方法包括:exec、httpGet、tcpSocket。对一个容器仅需设置一种方法
livenessProbe:
#执行容器命令检测方式
exec:
command: [string]
#httpGet检查方式
httpGet:
path: string # http服务器上的访问URL
port: string # 容器上要访问端口号或名称
host: string # 要连接的主机名,默认POD ip
scheme: string # 用于连接host的协议,默认HTTP
httpHeaders: # 自定义HTTP请求headers,HTTP允许重复headers
- name: string
values: string
tcpSocket: # 端口检测方式
port: 端口号
initialDelaySeconds: 60 #在容器启动后多少秒进行探测,单位为S
timeoutSeconds: 2 #探针执行检测请求后,等待响应的超时时间,默认1S,若超过该时间,则认为不健康,就会重启
periodSeconds: 5 #执行探测的时间间隔,默认 10 s 一次
successThreshold: 2 # 检查成功两次表示就绪
failureThreshold: 1 # 检查失败1次表示未就绪
Lifecycle:
postStart: # 容容器创建成功后,运行前的任务,用于资源部署、环境准备等 可以使exec、httpGet、TCPSocket
exec:
command:
- sh
- -c
- "mkdir /data/"
PreStop: #在容器被终止前的任务,用于优雅关闭应用程序、通知其他系统等等。
httpGet:
host: monitor.com
psth: /waring
port: 8080
scheme: HTTP
securityContext:
privileged: false
# restartPolicy pod的重启策略,默认为 Always。
1、Always:POD一旦终止运行,无论容器是如何终止的,kubelet都将重启它,
2、OnFailure:只有pod以非0退出码终止时,kubelet才会重启该容器,如果容器正常结束(退出码为0)则不会重启
3、Never :无论什么状态,都不会重启
restartPolicy: [Always | Never | OnFailure]
#设置NodeName表示将该Pod调度到指定到名称的node节点上
nodeName: k8s-node-2
#用于将pod调度到添加了指定标签的node节点上,指定node 节点,先打一个标签。
nodeSelector: object
hostname: k8s-node-1
imagePullSecrets:
- name: string
hostNetwork: false/true 默认为false
# dnsPolicy 设置pod的DNS策略:
1、default:继承Pod所在宿主机的域名解析设置
2、clusterFirst:优先是用kubernetes环境的DNS服务,
3、clusterFirstWithHostNet:适用于以hostNetwork模式运行的pod,此时hostNetwork 必须为true
4、None:忽略kubernetes集群的DNS配置,需要手工通过dnsConfig自定义DNS配置
dnsPolicy: default
Volumes: # 共享存储卷列表
- name: string #名称,
emptyDir: {} # 挂载目录
hostPath: #挂载本机目录
path: string
secret:
secretName: string
items:
- key:string
path: string
configMap:
name: string
items:
- key: string
path: string
kubelet explain 资源类型
# kubectl explain 资源类型 查看某种资源可以配置的一级属性
# kubectl explain 资源类型.属性 查看属性的子属性
[root@k8s-master-1 logs]# kubectl explain pod
[root@k8s-master-1 logs]# kubectl explain pod.metadata
1、Pending:挂起。我们在请求创建pod时,天剑不满足,调度没有完成,没有任何一个节点能满足调度条件,已经创建了但是没有适合它运行的节点叫做挂起。
2、Running:Pod内多有容器都已经被创建,且至少一个容器正处于运行状态,正在启动状态或者重启状态。
3、Succeeded:Pod中所有容器都执行成功后退出,并且没有处于重启的容器
4、Failed:Pod中所有容器都已退出,但是至少还有一个容器退出时为失败状态
5、Unknown:位置状态,所谓pod是什么状态是apiserver和运行在节点的kubelet进行通信获取状态信息的,如果节点之上的kubelet本身出故障,那么apiserver就连不上kubelet,得不到信息 了,就会看到Unknown。
????????在默认情况下,一个Pod在哪个Node节点上运行,是由Scheduler组件采用相应的算法计算出来的,这个过程是不受人工控制的。但是在实际使用中,这并不满足的需求,因为很多情况下,我们想控制某些Pod到达某些节点上,那么应该怎么做呢?这就要求了解kubernetes对Pod的调度规则,kubernetes提供了四大类调度方式:
????????StartupProbe:k8s1.16版本后新加的探测方式,用于判断容器内应用程序是否启动。如果配置了StartupProbe,就会先禁止其他的探测,直到他成功为止,成功后将不在进行探测。
????????LivenessProbe 存活性探针:用于探测容器是否运行,如果探测失败,kubelet 会根据配置的重启策略,进行相应的处理,若没有配置该探针,默认就是success
????????ReadinessProbe 就绪性探针:一般用于探测容器内的程序是否健康,它的返回值如果为success ,那么就代表这个容器已经完全启动,并且程序已经是可以接受流量的状态
区别:探测方式相同,只是对Pod的处置方式不同
????????readinessProbe:当检测到失败后,将POD的IP:PORT从对应的EndPoint列表中删除
????????LicenessProbe:当检测到失败后,将杀死容器并根据pod的重启策略来决定作出对应的措施
Exec:在容器内执行一个命令,如果返回值为0,则认为容器健康
TCPSocket:通过容器的IP地址和端口号执行TCP检查,如果是通的就认为容器健康,
HTTPGet:通过应用程序暴露的API地址来检测程序是否是正常的,如果状态码为200-400之间,则认为容器健康
探针检查参数配置:
initialDelaySeconds: 60 #在容器启动后多少秒进行探测,单位为S
timeoutSeconds: 2 #响应的超时时间,默认1S,若超过该时间,则认为不健康,就会重启
periodSeconds: 5 #执行探测的时间间隔,默认 10 s 一次
successThreshold: 2 # 检查成功2次表示就绪
failureThreshold: 1 # 检查失败1次表示未就绪
探针探测结果有以下值
Success:表示通过检测。
Failure:表示未通过检测。
Unknown:表示检测没有正常进行。
1.2 探针使用用例
(1)通过exec 方式做健康检查
apiVersion: v1
kind: Pod
metadata:
name: liveness-exec
labels:
app: liveness
spec:
containers:
- name: liveness
image: busybox
args: #创建测试探针探测的文件
- /bin/sh
- -c
- touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 600
livenessProbe:
initialDelaySeconds: 10 #延迟检测时间
periodSeconds: 5 #检测时间间隔
exec: #使用命令检查
command: #指令,类似于运行命令sh
- cat #sh 后的第一个内容,直到需要输入空格,变成下一行
- /tmp/healthy #由于不能输入空格,需要另外声明,结果为sh cat"空格"/tmp/healthy
解释:
????????容器在初始化后,执行(/bin/sh -c "touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 600")首先创建一个 /tmp/healthy 文件,然后执行睡眠命令,睡眠 30 秒,到时间后执行删除 /tmp/healthy 文件命令。而设置的存活探针检检测方式为执行 shell 命令,用 cat 命令输出 healthy 文件的内容,如果能成功执行这条命令一次(默认successThreshold:1),存活探针就认为探测成功,由于没有配置(failureThreshold、timeoutSeconds),所以执行(cat /tmp/healthy)并只等待1s,如果1s内执行后返回失败,探测失败。在前 30 秒内,由于文件存在,所以存活探针探测时执行 cat /tmp/healthy 命令成功执行。30 秒后 healthy 文件被删除,所以执行命令失败,Kubernetes 会根据 Pod 设置的重启策略来判断,是否重启 Pod。