k8s概念-深入pod
回到目录
工作负载(workloads)
工作负载(workload)是在kubernetes集群中运行的应用程序。无论你的工作负载是单一服务还是多个一同工作的服务构成,在kubernetes中都可以使用pod来运行它
workloads分为pod与controllers
-
pod通过控制器实现应用的运行,如何伸缩,升级等
-
controllers 在集群中管理pod
-
pod与控制器之间通过label-selector相关联,是唯一的关联方式
官方文档https://kubernetes.io/zh-cn/docs/concepts/workloads/
一 pod介绍
官网文档 podhttps://kubernetes.io/zh-cn/docs/concepts/workloads/pods/
1.1 pod定义
-
Pod(豌豆荚) 是Kubernetes集群管理(创建、部署)与调度的最小计算单元,表示处于运行状态的一组容器。
-
Pod不是进程,而是容器运行的环境。
-
一个Pod可以封装一个容器或多个容器(主容器或sidecar边车容器)
-
一个pod内的多个容器之间共享部分命名空间,例如:Net Namespace,UTS Namespace,IPC Namespace及存储资源
-
用户pod默认会被调度运行在node节点之上(不运行在master节点上,但也有例外情况,污点和容忍)
-
pod内的IP不是固定的,集群外不能直接访问pod
1.2 pod分类
-
静态Pod 也称之为“无控制器管理的自主式pod”,直接由特定节点上的
kubelet
守护进程管理, 不需要API 服务器看到它们,尽管大多数 Pod 都是通过控制面(例如,Deployment) 来管理的,对于静态 Pod 而言,kubelet
直接监控每个 Pod,并在其失效时重启之。 -
控制器管理的pod 控制器可以控制pod的副本数,扩容与裁剪,版本更新与回滚等
1.3 查看pod命令
kubectl get pod # pod或pods,po都可以,不指定namespace,默认是名为default的namespace
kubectl get pod -n kube-system
1.4 pod的yaml资源清单格式
# yaml格式的pod定义文件完整内容:
apiVersion: v1 #必选,api版本号,例如v1
kind: Pod #必选,Pod
metadata: #必选,元数据name: string #必选,Pod名称namespace: string #Pod所属的命名空间,默认在default的namespacelabels: # 自定义标签name: string #自定义标签名字annotations: #自定义注释列表name: string
spec: #必选,Pod中容器的详细定义(期望)containers: #必选,Pod中容器列表- name: string #必选,容器名称image: string #必选,容器的镜像名称imagePullPolicy: [Always | Never | IfNotPresent] #获取镜像的策略 Alawys表示下载镜像 IfnotPresent表示优先使用本地镜像,否则下载镜像,Nerver表示仅使用本地镜像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,默认TCPenv: #容器运行前需设置的环境变量列表- 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 #内存清求,容器启动的初始可用数量livenessProbe: #对Pod内个容器健康检查的设置,当探测无响应几次后将自动重启该容器,检查方法有exec、httpGet和tcpSocket,对一个容器只需设置其中一种方法即可exec: #对Pod容器内检查方式设置为exec方式command: [string] #exec方式需要制定的命令或脚本httpGet: #对Pod内个容器健康检查方法设置为HttpGet,需要制定Path、portpath: stringport: numberhost: stringscheme: stringHttpHeaders:- name: stringvalue: stringtcpSocket: #对Pod内个容器健康检查方式设置为tcpSocket方式port: numberinitialDelaySeconds: 0 #容器启动完成后首次探测的时间,单位为秒timeoutSeconds: 0 #对容器健康检查探测等待响应的超时时间,单位秒,默认1秒periodSeconds: 0 #对容器监控检查的定期探测时间设置,单位秒,默认10秒一次successThreshold: 0failureThreshold: 0securityContext:privileged:falserestartPolicy: [Always | Never | OnFailure] # Pod的重启策略,Always表示一旦不管以何种方式终止运行,kubelet都将重启,OnFailure表示只有Pod以非0退出码退出才重启,Nerver表示不再重启该PodnodeSelector: obeject # 设置NodeSelector表示将该Pod调度到包含这个label的node上,以key:value的格式指定imagePullSecrets: #Pull镜像时使用的secret名称,以key:secretkey格式指定- name: stringhostNetwork: 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: stringpath: stringconfigMap: #类型为configMap的存储卷,挂载预定义的configMap对象到容器内部name: stringitems:- key: stringpath: string
YAML格式查找帮助方法回顾
kubectl explain namespace
[root@k8s-master ~]# kubectl explain namespace
KIND: Namespace
VERSION: v1DESCRIPTION:Namespace provides a scope for Names. Use of multiple namespaces isoptional.FIELDS:apiVersion <string>APIVersion defines the versioned schema of this representation of anobject. Servers should convert recognized schemas to the latest internalvalue, and may reject unrecognized values. More info:https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resourceskind <string>Kind is a string value representing the REST resource this objectrepresents. Servers may infer this from the endpoint the client submitsrequests to. Cannot be updated. In CamelCase. More info:https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kindsmetadata <Object>Standard object's metadata. More info:https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadataspec <Object>Spec defines the behavior of the Namespace. More info:https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-statusstatus <Object>Status describes the current status of a Namespace. More info:https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status
kubectl explain pod
root@k8s-master ~]# kubectl explain pod
KIND: Pod
VERSION: v1DESCRIPTION:Pod is a collection of containers that can run on a host. This resource iscreated by clients and scheduled onto hosts.FIELDS:apiVersion <string>APIVersion defines the versioned schema of this representation of anobject. Servers should convert recognized schemas to the latest internalvalue, and may reject unrecognized values. More info:https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resourceskind <string>Kind is a string value representing the REST resource this objectrepresents. Servers may infer this from the endpoint the client submitsrequests to. Cannot be updated. In CamelCase. More info:https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kindsmetadata <Object>Standard object's metadata. More info:https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadataspec <Object>Specification of the desired behavior of the pod. More info:https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-statusstatus <Object>Most recently observed status of the pod. This data may not be up to date.Populated by the system. Read-only. More info:https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status
二 pod创建
2.1 命令创建
2.1.1 创建
# kubectl run pod名 --image=镜像名
kubectl run nginx1 --image=nginx:1.15-alpine
2.1.2 验证
#查看默认命名空间的所有pod
kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx1 1/1 Running 0 41s
2.2 yaml创建pod
2.2.1 准备ymal文件
apiVersion: v1 # api版本
kind: Pod # 资源类型为Pod
metadata: name: pod-stress # 自定义pod的名称
spec:containers: # 定义pod里包含的容器- name: c1 # 自定义pod中的容器名image: polinux/stress # 启动容器的镜像名command: ["stress"] # 自定义启动容器时要执行的命令(类似dockerfile里的CMD)args: ["--vm", "1", "--vm-bytes", "150M", "--vm-hang", "1"] # 自定义启动容器执行命令的参数# polinux/stress这个镜像用于压力测试,在启动容器时传命令与参数就是相当于分配容器运行时需要的压力
2.2.2 创建
#kubectl apply -f yaml文件
kubectl apply -f pod1.yml
三 pod查看
3.1 查看基本信息
命令语法:
kubectl get pod
kubectl get po
kubectl get pods
[root@k8s-master1 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
pod-stress 1/1 Running 0 45s
3.2 查看详细信息
命令语法:
default命名空间:kubectl get pods -o wide
指定命名空间:kubectl get pods -o wide -n kube-system
[root@k8s-master1 ~]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod-stress 1/1 Running 0 71s 10.244.194.72 k8s-worker1 <none> <none>
3.3 查看指定pod的详细信息
命令语法:kubectl describe pod pod名称
[root@k8s-master1 ~]# kubectl describe pod pod-stress
......
Events:Type Reason Age From Message---- ------ ---- ---- -------Normal Scheduled 102s default-scheduler Successfully assigned default/pod-stress to k8s-worker1Normal Pulling 102s kubelet Pulling image "polinux/stress"Normal Pulled 83s kubelet Successfully pulled image "polinux/stress" in 18.944533343sNormal Created 83s kubelet Created container c1Normal Started 82s kubelet Started container c1
四 pod删除
4.1 单个pod删除
4.1.1 方式一:指定pod名称
命令语法: kubectl delete pod pod名称
[root@k8s-master1 ~]# kubectl delete pod pod-stress
pod "pod-stress" deleted
4.1.2 方式二:通过yaml文件
命令语法:kubectl delete -f pod创建的yaml文件
[root@k8s-master1 ~]# kubectl delete -f pod1.yml
4.2 多个pod删除
4.2.1 后接多个pod名
[root@k8s-master1 ~]# kubectl delete pod pod名1 pod名2 pod名3 ......
4.2.2 通过awk截取要删除的pod名称,然后管道给xargs
现获取pods,取第一列,并且行数大于1(取消列头name)
[root@k8s-master1 ~]# kubectl get pods |awk 'NR>1 {print $1}' |xargs kubectl delete pod
4.2.3 如果要删除的pod都在同一个非default的命名空间,则可直接删除命名空间
[root@k8s-master1 ~]# kubectl delete ns xxxx
五 镜像拉去策略
由imagePullPolicy参数控制
-
Always : 不管本地有没有镜像,都要从仓库中下载镜像
-
Never : 从来不从仓库下载镜像, 只用本地镜像,本地没有就算了
-
IfNotPresent: 如果本地存在就直接使用, 不存在才从仓库下载
默认的策略是:
-
当镜像标签版本是latest,默认策略就是Always
-
如果指定特定版本默认拉取策略就是IfNotPresent。
yaml例子
apiVersion: v1
kind: Pod
metadata:name: pod-stressnamespace: default
spec:containers:- name: c1image: polinux/stresscommand: ["stress"]args: ["--vm", "1", "--vm-bytes", "150M", "--vm-hang", "1"]imagePullPolicy: IfNotPresent # 增加了这一句
六 pod标签
为pod设置label,用于控制器通过label与pod关联
node的标签和pod标签区别
node的label用于pod调度到指定label的node节点
pod的label用于controller关联控制的pod
6.1 通过命令管理pod标签
6.1.1 查看
命令语法: kubectl get pods --show-labels
[root@k8s-master1 ~]# kubectl get pods --show-labels
NAME READY STATUS RESTARTS AGE LABELS
pod-stress 1/1 Running 0 7m25s <none>
6.1.2 加标签
命令语法:kubectl label pod pod名称 标签
[root@k8s-master1 ~]# kubectl label pod pod-stress region=huanai zone=A env=test bussiness=game
pod/pod-stress labeled[root@k8s-master1 ~]# kubectl get pods --show-labels
NAME READY STATUS RESTARTS AGE LABELS
pod-stress 1/1 Running 0 8m54s bussiness=game,env=test,region=huanai,zone=A
6.2.3 删除标签
命令语法:kubectl label pod pod名称 标签名-
[root@k8s-master1 ~]# kubectl label pod pod-stress region- zone- env- bussiness-
pod/pod-stress labeled[root@k8s-master1 ~]# kubectl get pods --show-labels
NAME READY STATUS RESTARTS AGE LABELS
pod-stress 1/1 Running 0 16m <none>
6.2.4 查找
方式一:等值关系查找
命令语法: kubectl get pods -l 标签名=标签值
-l
指定为标签
[root@k8s-master1 ~]# kubectl get pods -l zone=A
NAME READY STATUS RESTARTS AGE
pod-stress 1/1 Running 0 9m22s
方式二:集合关系查找
命令语法: kubectl get pods -l "标签名 in (标签值,标签值)
[root@k8s-master1 ~]# kubectl get pods -l "zone in (A,B,C)"
NAME READY STATUS RESTARTS AGE
pod-stress 1/1 Running 0 9m55s
6.2 通过yaml方式添加标签
在metadata中添加labels
apiVersion: v1
kind: Pod
metadata:name: pod-stressnamespace: defaultlabels:env: devapp: nginx # 直接在原来的yaml里加上多个标签
spec:containers:- name: c1image: polinux/stresscommand: ["stress"]args: ["--vm", "1", "--vm-bytes", "150M", "--vm-hang", "1"]imagePullPolicy: IfNotPresent
七 pod资源限制
spec.containers.resources中进行限制
包含对所占内存,cpu使用情况限制
spec:containers:- name: c1image: polinux/stressimagePullPolicy: IfNotPresentresources:limits:cpu: 0.5 #限制最多使用多少cpumemory: "200Mi" #限制最多使用内存200Mrequests:cpu: 0.1 #指定启动对小使用cpumemory: "100Mi" #指定启动时最小内存100M
注意
如果pod启动容器时由于对资源进行限制,没有达到启动要求,容器启动失败
-
如果启动策略时always,则会一直反复尝试重启
-
如果是OnFailures,只有当容器正常终止才重启
-
如果是Never,则不重启
七 对pod里的容器进行操作
命令 kubectl exec
7.1 直接用命令操作
格式为: kubectl exec pod名 -c 容器名 -- 命令
注意:
-
-c 容器名为可选项,如果是1个pod中1个容器,则不用指定;
-
如果是1个pod中多个容器,不指定默认为第1个。
[root@k8s-master1 ~]# kubectl exec pod-stress4 -c c2 -- touch /111[root@k8s-master1 ~]# kubectl exec pod-stress4 -c c2 -- ls /111
/111
不指定容器名,则默认为pod里的第1个容器
[root@k8s-master1 ~]# kubectl exec pod-stress4 -- touch /222
Defaulting container name to c1.
Use 'kubectl describe pod/pod-stress4 -n default' to see all of the containers in this pod.
7.2 与容器进行交互操作
命令格式kubectl exec -it pod名 -c 容器名 -- /bin/bash
和docker exec几乎一样
[root@k8s-master1 ~]# kubectl exec -it pod-stress4 -c c1 -- /bin/bash
bash-5.0# touch /333
bash-5.0# ls
222 bin etc lib mnt proc run srv tmp var
333 dev home media opt root sbin sys usr
bash-5.0# exit
exit
八 pod调度
8.1 pod调度过程
Step1
通过kubectl命令应用资源清单文件(yaml格式)向api server 发起一个create pod 请求Step2
api server接收到pod创建请求后,生成一个包含创建信息资源清单文件Step3
apiserver 将资源清单文件中信息写入etcd数据库Step4
Scheduler启动后会一直watch API Server,
获取 podSpec.NodeName为空的Pod,即判断pod.spec.Node == null?
若为null,表示这个Pod请求是新的,需要创建,
因此先进行调度计算(共计2步:1、过滤不满足条件的,2、选择优先级高的),
找到合适的node,然后将信息在etcd数据库中更新分配结果:pod.spec.Node = nodeA (设置一个具体的节点)Step5
kubelet 通过watch etcd数据库(即不停地看etcd中的记录),
发现有新的Node出现,如果这条记录中的Node与所在节点编号相同,
即这个Pod由scheduler分配给自己,
则调用node中的Container Runtime,进而创建container,
并将创建后的结果返回到给api server用于更新etcd数据库中数据状态。
8.2 pod调度到指定node节点中
我们为了实现容器主机资源平衡使用, 可以使用约束把pod调度到指定的node节点
spec.nodeName 通过nodeName调度pod到指定node上
spec.nodeSelector进行node标签匹配,调度到匹配上的node上
8.2.1 nodeName
apiVersion: v1
kind: Pod
metadata:name: pod-nodename
spec:nodeName: k8s-worker1 # 通过nodeName调度到k8s-worker1节点containers:- name: nginximage: nginx:1.15-alpine
8.2.2 nodeSelector
apiVersion: v1
kind: Pod
metadata:name: pod-nodeselect
spec:nodeSelector: # nodeSelector节点选择器bussiness: game # 指定调度到标签为bussiness=game的节点containers:- name: nginximage: nginx:1.15-alpine
九 pod的生命周期
有些pod(比如运行httpd服务),正常情况下会一直运行中,但如果手动删除它,此pod会终止
也有些pod(比如执行计算任务),任务计算完后就会自动终止
上面两种场景中,pod从创建到终止的过程就是pod的生命周期。
容器启动
-
pod中的容器在创建前,有初始化容器(init container)来进行初始化环境
-
初化完后,主容器(main container)开始启动
-
主容器启动后,有一个post start的操作(启动后的触发型操作,或者叫启动后钩子)
-
post start后,就开始做健康检查
-
第一个健康检查叫存活状态检查(liveness probe ),用来检查主容器存活状态的
-
第二个健康检查叫准备就绪检查(readiness probe),用来检查主容器是否启动就绪
-
容器终止
-
可以在容器终止前设置pre stop操作(终止前的触发型操作,或者叫终止前钩子)
-
当出现特殊情况不能正常销毁pod时,大概等待30秒会强制终止
-
终止容器后还可能会重启容器(视容器重启策略而定)。
9.1 探针
容器内应用的监测机制,根据不同的探针来判断容器应用当前的状态
9.1.1 探针类型
方式 | 说明 |
---|---|
Liveness Probe(存活状态探测) | 指示容器是否正在运行。如果存活态探测失败,则 kubelet 会杀死容器, 并且容器将根据其重启策略决定未来。如果容器不提供存活探针, 则默认状态为 Success 。 |
readiness Probe(就绪型探测) | 指示容器是否准备好为请求提供服务。如果就绪态探测失败, 端点控制器将从与 Pod 匹配的所有服务的端点列表中删除该 Pod 的 IP 地址。 初始延迟之前的就绪态的状态值默认为 Failure 。 如果容器不提供就绪态探针,则默认状态为 Success 。注:检查后不健康,将容器设置为Notready;如果使用service来访问,流量不会转发给此种状态的pod |
startup Probe | 指示容器中的应用是否已经启动。如果提供了启动探针,则所有其他探针都会被 禁用,直到此探针成功为止。如果启动探测失败,kubelet 将杀死容器,而容器依其 重启策略进行重启。 如果容器没有提供启动探测,则默认状态为 Success 。 |
9.1.2 探测方式
方式 | 说明 |
---|---|
Exec | 执行命令 |
HTTPGet | http请求某一个URL路径 |
TCP | tcp连接某一个端口 |
gRPC | 使用 gRPC 执行一个远程过程调用。 目标应该实现 gRPC健康检查。 如果响应的状态是 "SERVING",则认为诊断成功。 gRPC 探针是一个 alpha 特性,只有在你启用了 "GRPCContainerProbe" 特性门控时才能使用。 |
通用参数
initialDelaySeconds: 60 # 初始化时间
timeoutSeconds: 2 # 超时时间
periodSeconds: 5 # 监测间隔时间
successThreshold: 1 # 检查 1 次成功就表示成功
failureThreshold: 2 # 监测失败 2 次就表示失败
9.1.2.1 启动探针
当配置了 startupProbe 后,会先禁用其他探针,直到 startupProbe 成功后,其他探针才会继续。
作用:
由于有时候不能准确预估应用一定是多长时间启动成功,因此配置另外两种方式不方便配置初始化时长来检测
而配置了 statupProbe 后,只有在应用启动成功了,才会执行另外两种探针,可以更加方便的结合使用另外两种探针使用。
startupProbe:httpGet:path: /api/startupport: 80
9.1.2.1 存活探针
Spec.containers.livenessProbe
1 exec示例
apiVersion: v1
kind: Pod
metadata:name: liveness-execnamespace: default
spec:containers:- name: livenessimage: busyboximagePullPolicy: IfNotPresentargs:- /bin/sh- -c- touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 600livenessProbe: # 存活探针exec: # 命令方式command: # 命令- cat # 查看是否有这个目录- /tmp/healthyinitialDelaySeconds: 5 # pod启动延迟5秒后探测periodSeconds: 5 # 每5秒探测1次
查看pod日志
[root@k8s-master1 ~]# kubectl describe pod liveness-exec
......
Events:Type Reason Age From Message---- ------ ---- ---- -------Normal Scheduled 40s default-scheduler Successfully assigned default/liveness-exec to k8s-worker1Normal Pulled 38s kubelet Container image "busybox" already present on machineNormal Created 37s kubelet Created container livenessNormal Started 37s kubelet Started container livenessWarning Unhealthy 3s kubelet Liveness probe failed: cat: can't open '/tmp/healthy': No such file or directory看到40s前被调度以k8s-worker1节点,3s前健康检查出问题
2 httpGet示例
apiVersion: v1
kind: Pod
metadata:name: liveness-httpgetnamespace: default
spec:containers:- name: livenessimage: nginx:1.15-alpineimagePullPolicy: IfNotPresentports: # 指定容器端口,这一段不写也行,端口由镜像决定 - name: http # 自定义名称,不需要与下面的port: http对应containerPort: 80 # 类似dockerfile里的expose 80livenessProbe:httpGet: # 使用httpGet方式port: http # http协议,也可以直接写80端口path: /index.html # 探测家目录下的index.htmlinitialDelaySeconds: 3 # 延迟3秒开始探测periodSeconds: 5 # 每隔5s钟探测一次
3 tcp示例
apiVersion: v1
kind: Pod
metadata:name: liveness-tcpnamespace: default
spec:containers:- name: livenessimage: nginx:1.15-alpineimagePullPolicy: IfNotPresentports:- name: httpcontainerPort: 80livenessProbe:tcpSocket: # 使用tcp连接方式port: 80 # 连接80端口进行探测initialDelaySeconds: 3periodSeconds: 5
9.1.2.2 准备好探针
apiVersion: v1
kind: Pod
metadata:name: readiness-httpgetnamespace: default
spec:containers:- name: readinessimage: nginx:1.15-alpineimagePullPolicy: IfNotPresentports:- name: httpcontainerPort: 80readinessProbe: # 这里由liveness换成了readinesshttpGet:port: httppath: /index.htmlinitialDelaySeconds: 3periodSeconds: 5
9.2 生命周期
post-start:容器创建完成后执行的动作,不能保证该操作一定在容器的 command 之前执行,一般不使用
pre-stop:在容器停止前执行的动作
9.2.1 post-start
apiVersion: v1
kind: Pod
metadata:name: poststartnamespace: default
spec:containers:- name: poststartimage: nginx:1.15-alpineimagePullPolicy: IfNotPresentlifecycle: # 生命周期事件postStart: #容器创建完成后执行动作exec: # 可以是 exec / httpGet / tcpSocketcommand: ["mkdir","-p","/usr/share/nginx/html/haha"]
9.2.2 pre-stop
apiVersion: v1
kind: Pod
metadata:name: prestopnamespace: default
spec:containers:- name: prestopimage: nginx:1.15-alpineimagePullPolicy: IfNotPresentlifecycle: # 生命周期事件preStop: # preStopexec: # 可以是 exec / httpGet / tcpSocketcommand: ["/bin/sh","-c","sleep 60000000"] # 容器终止前sleep 60000000秒httpGet: # 发送一个 http 请求path: /port: 80
由于 k8s 默认给 pod 的停止宽限时间为 30s
如果我们停止操作会超过 30s 时,不要光设置 sleep 50,还要将 terminationGracePeriodSeconds: 30 也更新成更长的时间
否则 k8s 最多只会在这个时间的基础上再宽限几秒,不会真正等待 50s
9.3 pod退出流程
-
endpoint中删除该pod的ip
-
pod状态变成terminating状态
-
执行pre-stop的指令
9.4 pod的pre-stop应用
-
注册中心下线
-
数据清理
-
数据销毁
十 pod故障排除
状态 | 描述 |
---|---|
Pending(悬决) | Pod 已被 Kubernetes 系统接受,但有一个或者多个容器尚未创建亦未运行。此阶段包括等待 Pod 被调度的时间和通过网络下载镜像的时间。 |
Running(运行中) | pod已经绑定到一个节点,并且已经创建了所有容器。至少有一个容器正在运行中,或正在启动或重新启动。 |
completed(完成) | Pod中的所有容器都已成功终止,不会重新启动。 |
Failed(失败) | Pod的所有容器均已终止,且至少有一个容器已在故障中终止。也就是说,容器要么以非零状态退出,要么被系统终止。 |
Unknown(未知) | 由于某种原因apiserver无法获得Pod的状态,通常是由于Master与Pod所在主机kubelet通信时出错。 |
CrashLoopBackOff | 多见于CMD语句错误或者找不到container入口语句导致了快速退出,可以用kubectl logs 查看日志进行排错 |
查看pod具体日志
-
kubectl describe pod pod名 # 查看pod描述信息
-
kubectl logs pod [-c CONTAINER] # 查看pod的详细日志
-
kubectl exec POD [-c CONTAINER] --COMMAND [args...] # 进入pod查看
相关文章:

k8s概念-深入pod
回到目录 工作负载(workloads) 工作负载(workload)是在kubernetes集群中运行的应用程序。无论你的工作负载是单一服务还是多个一同工作的服务构成,在kubernetes中都可以使用pod来运行它 workloads分为pod与control…...

Web服务器实验案例
目录 关闭或放行防火墙和selinux 1 搭建静态网站 2 建立两个基于ip地址访问的网站 思路: 简单配置 编写httpd额外文件 3 建立两个基于不同端口访问的网站 思路 创建文件(与之前一致) 额外文件配置 4 基于虚拟目录和用户控制的web网…...

预警 项目经验BUG
文章目录 定时任务 定时任务 在方法上使用Scheduled注解 cron参数: cron是一个表达式,最多接收7个参数从左到右分别表示:秒 分 时 天 月 周 年参数以空格隔开,其中年不是必须参数,可以省略。示例:Schedule…...

基于RFID技术的猪舍门读卡器
随着科技的发展和普及,智能化管理在各个领域的应用越来越广泛。在畜牧业中,将RFID技术应用在养殖管理中的企业也越来越多,为养殖企业的智能化管理提供了有力的支持,本文将介绍RFID技术的猪舍门读卡器的应用。 一、RFID技术简介 …...

亚马逊店铺的回款周期是多久?
现如今,开亚马逊店铺可是一个技术活,一旦有一个环节,或者是一件事情没有做好,对整个亚马逊店铺过程中影响都是十分巨大的,不少亚马逊卖家就吃过这方面的亏。 很多亚马逊卖家就是吃亏在这些方面,现在要想开…...

剑指offer19.正则表达式
这道题我一看就有印象,我室友算法课设抽到这题,他当时有个bug让我帮他看一下,然后我就大概看了一下他的算法,他是用动态规划写的,用了一个二维数组,然后我就试着按照这个思路去写,想了一会还是没…...

Mac Navicat 16试用脚本
一、无限试用脚本如下 #!/bin/bash #/usr/libexec/PlistBuddy -c "print" ~/Library/Preferences/com.navicat.NavicatPremium.plist /usr/libexec/PlistBuddy -c "Delete :91F6C435D172C8163E0689D3DAD3F3E9" ~/Library/Preferences/com.navicat.Navica…...

什么是 webpack?
Webpack 介绍 什么是 webpack? :::tip 官方描述 webpack 是一个用于现代 JavaScript 应用程序的静态模块打包工具。当 webpack 处理应用程序时,它会在内部从一个或多个入口点构建一个 依赖图(dependency graph),然后将你项目中所需的每一个…...

#B. 费解的开关
题目描述 你玩过“拉灯”游戏吗?2525盏灯排成一个5x55x5的方形。每一个灯都有一个开关,游戏者可以改变它的状态。每一步,游戏者可以改变某一个灯的状态。游戏者改变一个灯的状态会产生连锁反应:和这个灯上下左右相邻的灯也要相应…...

Docker离线安装
Docker离线安装 一、安装步骤 1. 下载 Docker 二进制文件(离线安装包) 下载地址:https://download.docker.com/linux/static/stable/x86_64/ 注:本文使用 /x86_64/docker-18.06.1-ce.tgz,注意对应操作系统类型。 2.…...

React高阶学习(二)
目录 1. 基本概念和语法2. 组件化开发3. 状态管理4. 生命周期钩子5. 条件渲染6. 循环渲染7. 事件处理8. 组件间通信9. 动画效果10. 模块化开发 1. 基本概念和语法 React 是基于 JavaScript 的库,用于构建用户界面。它采用虚拟 DOM 技术,能够高效地渲染页…...

C语言中的字符串输入操作详解
C语言输入字符串详解 目录 介绍使用scanf_s输入字符串scanf_s的限制和问题解决输入空格的方法——使用gets_s函数gets_s函数的注意事项示例代码演示总结 1. 介绍 在C语言中,输入字符串是常见的操作。本篇博客将详细讨论在C语言中输入字符串的方法。我们将使用s…...

C高级 DAY1
1.思维导图 二、 网络配置 更新资源库 在线下载 卸载安装包 离线下载 离线安装包卸载 cat echo head tail 管道符 字体变色 find file grep cut 截取字符 chown ln硬链接 软链接 压缩、解压缩 打包并压缩,解压缩...

centos7 默认路由顺序调整(IPV4_ROUTE_METRIC)
1、问题说明 A服务器有两张网卡,A1对应公网,A2对应私网,公网访问时,访问异常,内网访问服务则显示正常。 问题判断:数据包从公网进来时,路由无需判断,但数据包出去时,有…...

STM32 DMA学习
DMA简称 DMA,Direct Memory Access,即直接存储器访问。DMA传输方式无需CPU直接控制传输,也没有中断处理方式那样保留现场和恢复现场的过程,通过硬件为RAM与I/O设备开辟一条直接传送数据的通路,能使CPU的效率大为提高。…...

32.利用fmincon 解决 最小费用问题(matlab程序)
1.简述 fmincon函数非线性约束下的最优化问题 fmincon函数,既是求最小约束非线性多变量函数 该函数被用于求如下函数的最小值 语法如下: x fmincon(fun,x0,A,b) x fmincon(fun,x0,A,b,Aeq,beq) x fmincon(fun,x0,A,b,Aeq,beq,lb,ub) x fmincon(fun,x0,A,b,Aeq…...

Delphi 开发的QR二维码生成工具,开箱即用
目录 一、基本功能: 二、使用说明: 三、操作演示gif 四、下载链接 在日常的开发中,经常需要将一个链接生成为二维码图片,特别是在进行支付开发的时候,因为我们支付后台获取了支付链接,需要变成二维码扫…...

Springboot使用AOP编程简介
AOP简介 AOP(面向切面编程)是一种编程范式,Spring AOP是基于代理模式的AOP框架,它通过动态代理实现切面的织入,更加轻量级和易于使用。 Joinpoint (连接点):类里面可以被增强的方法即为连接点。例如,想修…...

Android性能优化—卡顿分析与布局优化
一、什么是卡顿?或者说我们怎么感知APP卡顿? 这里面涉及到android UI渲染机制,我们先了解一下android UI是怎么渲染的,android的View到底是如何一步一步显示到屏幕上的? android系统渲染页面流程: 1&…...

【二分+滑动窗口优化DP】CF883 I
Problem - 883I - Codeforces 题意: 思路: 首先,要让最大值最小,很显然要二分 那么就相当于有了一个极差的限制,看能不能分组,每组至少m个元素 那么就是考虑分段DP,直接n^2很容易写 但是n …...

4.netty源码分析
1.pipeline调用handler的源码 //pipeline得到双向链表的头,next到尾部, 2.心跳源码 主要分析IdleStateHandler3个定时任务内部类 //考虑了网络传输慢导致出站慢的情况 //超时重新发送,然后关闭 ReadTimeoutHandler(继承IdleStateHandler 直接关闭连接)和WriteTimeoutHandler(继…...

性能优化点
Arts and Sciences - Computer Science | myUSF 索引3层(高度为3)一般对于数据库地址千万级别的表 大于2000万的数据进行分库分表存储 JVM整体结构及内存模型 JVM调优:主要为减少FULL GC的执行次数或者减少FULL GC执行时间 Spring Boot程序…...

leetcode301. 删除无效的括号(java)
删除无效的括号 leetcode301. 删除无效的括号题目描述暴力搜索 剪枝代码演示 回溯算法 leetcode301. 删除无效的括号 难度 困难 https://leetcode.cn/problems/remove-invalid-parentheses/description/ 题目描述 给你一个由若干括号和字母组成的字符串 s ,删除最小…...

快速制作美容行业预约小程序
随着科技的不断进步,移动互联网的快速发展,小程序成为了很多行业迅速发展的利器。对于美容行业来说,一款美容预约小程序不仅可以方便用户进行预约,还可以提升美容店铺的服务质量和管理效率。下面,我们来介绍一下如何快…...

Golang之路---03 面向对象——结构体
结构体 结构体定义 在之前学过的数据类型中,数组与切片,只能存储同一类型的变量。若要存储多个类型的变量,就需要用到结构体,它是将多个任意类型的变量组合在一起的聚合数据类型。 每个变量都成为该结构体的成员变量。 可以理…...

【网络编程】poll
主旨思想 用一个结构体记录文件描述符集合,并记录用户态状态和内核态状态 函数说明 概览 #include <poll.h> struct pollfd { int fd; /* 委托内核检测的文件描述符 */ short events; /* 委托内核检测文件描述符的什么事件 */ short revents; /* 文件描述…...

配置VS Code 使其支持vue项目断点调试
起因 每个应用,不论大小,都需要理解程序是如何运行失败的。当我们写的程序没有按照自己写的逻辑走的时候,我们就会逐步一一排查问题。在平常开发过程中我们可能会借助 console.log 来排查,但是现在我们可以借助 VS Code 断点来调试项目。 前…...

第一百零一回 如何在组件树之间共享数据
文章目录 概念介绍使用方法示例代码 我们在上一章回中介绍了"如何实现文件存储"相关的内容,本章回中将介绍 如何实现组件之间共享数据。闲话休提,让我们一起Talk Flutter吧。 概念介绍 数据共享是程序中常用的功能,本章回介绍如何…...

Golang进阶学习
Golang进阶学习 视频地址:https://www.bilibili.com/video/BV1Pg41187AS?p35 1、包 1.1、包的引入 使用包的原因: 我们不可能把所有函数放在同一个源文件中,可以分门别类的放在不同的文件中 解决同名问题,同一个文件中不可以…...

【Linux】常用的基本指令
👦个人主页:Weraphael ✍🏻作者简介:目前正在学习c和算法 ✈️专栏:Linux 🐋 希望大家多多支持,咱一起进步!😁 如果文章有啥瑕疵,希望大佬指点一二 如果文章对…...