应用容器与pod资源
目录
一、Pod
K8s有很多技术概念,同时对应很多API对象,最重要的也是最基础的是微服务Pod。Pod是在K8s集群中运行部署应用或服务的最小单元,它是可以支持多容器的。Pod的设计理念是支持多个容器在一个Pod中共享网络地址和文件系统,可以通过进程间通信和文件共享这种简单高效的方式组合完成服务。Pod对多容器的支持是K8s最基础的设计理念。比如你运行一个操作系统发行版的软件仓库,一个Nginx容器用来发布软件,另一个容器专门用来从源仓库做同步,这两个容器的镜像不太可能是一个团队开发的,但是他们一块儿工作才能提供一个微服务;这种情况下,不同的团队各自开发构建自己的容器镜像,在部署的时候组合成一个微服务对外提供服务。这就是K8S中的POD。
Pod是K8s集群中所有业务类型的基础,可以看作运行在K8s集群中的小机器人,不同类型的业务就需要不同类型的小机器人去执行。目前K8s中的业务主要可以分为长期伺服型(long-running)、批处理型(batch)、节点后台支撑型(node-daemon)和有状态应用型(statefulapplication);分别对应的小机器人控制器为Deployment、Job、DaemonSet和StatefulSet。
1、Pod的声明周期
过程描述
1、启动包括初始化容器的任何容器之前先创建pause基础容器,它初始化Pod环境并为后续加入的容器提供共享的名称空间。
2、按顺序以串行的方式运行用户定义的各个初始化容器进行Pod环境初始化;任何一个初始化容器运行失败都将导致Pod创建失败,并按其restartPolicy的策略进行处理,默认为重启。
3、等待所有容器初始化成功完成后,启动业务容器,多容器Pod环境中,此步骤会并行启动所有业务容器。他们各自按其自定义展开其生命周期;容器启动的那一刻会同时运行业务容器上定义的PostStart钩子事件,该步骤失败将导致相关容器被重启。
4、运行容器启动健康状态监测(startupProbe),判断容器是否启动成功;该步骤失败,同样参照restartPolicy定义的策略进行处理;未定义时,默认状态为Success。
5、容器启动成功后,定期进行存活状态监测(liveness)和就绪状态监测(readiness);存活监测状态失败将导致容器重启,而就绪状态监测失败会是的该容器从其所属的Service对象的可用端点列表中移除。
6、终止Pod对象时,会想运行preStop钩子事件,并在宽限期(termiunationGracePeriodSeconds)结束后终止主容器,宽限期默认为30秒。
#简述
1、创建pod,并调度到合适节点
2、创建pause基础容器,提供共享名称空间
3、串行业务容器容器初始化
4、启动业务容器,启动那一刻会同时运行主容器上定义的Poststart钩子事件
5、健康状态监测,判断容器是否启动成功
6、持续存活状态监测、就绪状态监测
7、结束时,执行prestop钩子事件
8、终止容器
2、书写一个简单到的资源清单yaml
kind: Pod
apiVersion: v1
metadata:
name: testv1
spec:
containers:
- name: nginx
image: nginx
2.1、执行
# 部署
[root@k8s-master-01 k8s]# kubectl apply -f pod.yaml
pod/testv1 created
# 查看
[root@k8s-master-01 k8s]# kubectl get pods
NAME READY STATUS RESTARTS AGE
testv1 1/1 Running 0 35s
Pod名称 启动数量 运行状态 重启次数 启动时间
[root@k8s-master-01 k8s]# kubectl get pods -o wide # 查看更多参数
# 删除
[root@k8s-master-01 k8s]# kubectl delete -f pod.yaml
pod "testv1" deleted
3、Pod的容器重启策略(restartPolicy)
Pod 重启策略( RestartPolicy )应用于 Pod 内的所有容器,井且仅在 Pod 所处的 Node 上由 kubelet进行判断和重启操作。当某个容器异常退出或者健康检查失败时, kubelet 将根据 RestartPolicy 设置来进行相应的操作。Pod 的重启策略包括:Always、OnFailure 和 Never,默认值为 Always
# 查看命令
[root@k8s-master-01 k8s]# kubectl explain pod.spec
# 当Pod出现了问题时,Pod怎么解决。
Always :无论什么情况下退出,都重启
OnFailure :只有当非正常情况下退出时,才会重启
Never :无论什么情况下退出,都不重启
4、Pod中容器的拉取策略(imagePullPolicy)
容器的 imagePullPolicy 和镜像的标签会影响 kubelet 尝试拉取(下载)指定的镜像。
IfNotPresent : 当本地没有该镜像时,下载
Always :无论本地有没有该镜像,都去远程下载
Never :无论本地有没有该镜像,都不去远程下载
4.1、书写一个拉取策略yaml清单
kind: Pod # 必选,定义资源接口类型/角色。pod为容器资源
apiVersion: v1 # 必选,指定api接口资源版本
metadata: # 必选,定义资源的元数据信息
name: testv1 # 必选,定义资源名称,在同一个namespace中必须是唯一的
spec: # 必选,用于定义容器的详细信息
restartPolicy: OnFailure # 可选,容器状态检查
containers: # 必选,容器列表
- name: nginx # 必选,符合RFC 1035规范的容器名称
image: nginx # 必选,容器所用的镜像的地址
imagePullPolicy: IfNotPresent # 可选,容器状态检查
4.2、执行
# 删除清单
[root@k8s-master-01 k8s]# kubectl delete -f pod.yaml
pod "testv1" deleted
# 部署Pod
[root@k8s-master-01 k8s]# kubectl apply -f pod.yaml
pod/testv1 created
# 查看Pod
[root@k8s-master-01 k8s]# kubectl get pods
NAME READY STATUS RESTARTS AGE
testv1 1/1 Running 0 38s
5、静态Pod和动态Pod之间的区别
静态Pod:没有控制器
动态Pod:有控制器
6、Pod的回调钩子
PostStart :在容器创建后立即执行。但是,并不能保证钩子将在容器ENTRYPOINT之前运行,因为没有参数传递给处理程序。 主要用于资源部署、环境准备等。不过需要注意的是如果钩子花费时间过长以及于不能运行或者挂起,容器将不能达到Running状态。
容器启动后执行,注意由于是异步执行,它无法保证一定在ENTRYPOINT之后运行。如果失败,容器会被杀死,并根据RestartPolicy决定是否重启
PreStop :在容器终止前立即被调用。它是阻塞的,意味着它是同步的,所以它必须在删除容器的调用出发之前完成。主要用于优雅关闭应用程序、通知其他系统等。如果钩子在执行期间挂起,Pod阶段将停留在Running状态并且不会达到failed状态容器停止前执行,常用于资源清理。如果失败,容器同样也会被杀死
6.1、启动回调PostStart
# 当Pod中所有的容器创建完成之后,立即调用的命令。
[root@k8s-master-01 k8s]# kubectl explain pod.spec.containers.lifecycle 命令详解
# 回调处理程序的实现
容器可以通过实现和注册该回调的处理程序来访问该回调。 针对容器,有两种类型的回调处理程序可供实现:
1、Exec - 在容器的 cgroups 和名称空间中执行特定的命令(例如 pre-stop.sh)。 命令所消耗的资源计入容器的资源消耗。
2、HTTP - 对容器上的特定端点执行 HTTP 请求。
# 执行失败:如果启动回调钩子执行失败,容器无法进入正常启动状态。
exec : 执行命令
httpGet : 通过HTTP协议访问
tcpSocket : 通过Ping命令,探测端口
6.1.1、exec探测
# 编写pod
[root@k8s-master-01 k8s]# vim pod.yaml
kind: Pod
apiVersion: v1
metadata:
name: testv1
spec:
restartPolicy: OnFailure
containers:
- name: nginx
image: nginx:1.18
imagePullPolicy: IfNotPresent
lifecycle:
postStart:
exec:
command:
- "/bin/sh"
- "-c"
- "echo 'Hello World!' > /root/1.txt"
# 部署pod
[root@k8s-master-01 k8s]# kubectl apply -f pod.yaml
pod/testv1 created
# 查看
[root@k8s-master-01 k8s]# kubectl apply -f pod.yaml
pod/testv1 created
[root@k8s-master-01 k8s]# kubectl exec -it testv1 -- bash
root@testv1:/# cd
root@testv1:~# ls
1.txt
root@testv1:~# cat 1.txt
Hello World!
6.1.2 httpGet探测
# 编写pod
[root@k8s-master-01 k8s]# vim pod.yaml
kind: Pod
apiVersion: v1
metadata:
name: testv1
spec:
restartPolicy: OnFailure
containers:
- name: nginx
image: nginx:1.18
imagePullPolicy: IfNotPresent
lifecycle:
postStart:
httpGet:
port: 80
path: /
host: www.baidu.com
# 部署pod
[root@k8s-master-01 k8s]# kubectl apply -f pod.yaml
pod/testv1 created
# 查看
[root@k8s-master-01 k8s]# kubectl get pods
NAME READY STATUS RESTARTS AGE
testv1 1/1 Running 0 11s
6.1.3、tcpSocket探测
tcpSocket : 通过Ping命令,探测端口
kind: Pod
apiVersion: v1
metadata:
name: testv1
spec:
restartPolicy: OnFailure
containers:
- name: nginx
image: nginx:1.18
imagePullPolicy: IfNotPresent
lifecycle:
postStart:
tcpSocket:
port: 80
host: 106.13.81.75
6.2、就绪型检测
检测容器是否正常运行。
执行失败:如果就绪性检测执行失败,Pod会立即驱离出负载均衡。
exec : 执行命令
httpGet : 通过HTTP协议访问
tcpSocket : 通过Ping命令,探测端口
6.2.1、探测
httpGet : 通过HTTP协议访问
readinessProbe:
httpGet:
port: 80
path: /index
6.3、存活性检测
检测容器是否正常启动。
执行失败:如果存活性检测执行失败,Pod会按照一定时间周期不断重启,直至Pod正常启动。
exec : 执行命令
httpGet : 通过HTTP协议访问
tcpSocket : 通过Ping命令,探测端口
6.3.1、探测
exec : 执行命令
livenessProbe:
exec:
command:
- "/bin/sh"
- "-c"
- "cat /etc/hostss"
httpGet : 通过HTTP协议访问
livenessProbe:
httpGet:
port: 8080
path: /
tcpSocket : 通过Ping命令,探测端口
livenessProbe:
tcpSocket:
port: 80
6.4、结束回调
当Pod收到了销毁指令时,立即执行。
执行失败:如果结束回调执行失败,容器依然会终止。
exec : 执行命令
httpGet : 通过HTTP协议访问
tcpSocket : 通过Ping命令,探测端口
6.4.1 exec探测
kind: Pod
apiVersion: v1
metadata:
name: testv1
spec:
restartPolicy: OnFailure
containers:
- name: nginx
image: nginx:1.18
imagePullPolicy: IfNotPresent
lifecycle:
preStop:
exec:
command:
- "/bin/sh"
- "-c"
- "echo 'HelloWorld' > /root/2.txt"
二、Pod阶段
1、Pending(悬决):Pod 已被 Kubernetes 系统接受,但有一个或者多个容器尚未创建亦未运行。此阶段包括等待 Pod 被调度的时间和通过网络下载镜像的时间,
2、Running(运行中) Pod 已经绑定到了某个节点,Pod 中所有的容器都已被创建。至少有一个容器仍在运行,或者正处于启动或重启状态。
3、Succeeded(成功) Pod 中的所有容器都已成功终止,并且不会再重启。
4、Failed(失败) Pod 中的所有容器都已终止,并且至少有一个容器是因为失败终止。也就是说,容器以非 0 状态退出或者被系统终止。
5、Unknown(未知) 因为某些原因无法取得 Pod 的状态。这种情况通常是因为与 Pod 所在主机通信失败。
三、Pod的资源清单详解
apiVersion: v1 # 必选,指定api接口资源版本
kind: Pod # 必选,定义资源接口类型/角色。pod为容器资源
metadata: # 必选,定义资源的元数据信息
name: nginx # 必选,定义资源名称,在同一个namespace中必须是唯一的
namespace: web-testing # 可选,不指定默认为default,指定资源所在的命名空间
labels: # 可选,定义资源标签
- app: nginx
annotations: # 可选,注释列表
- app: nginx
spec: # 必选,用于定义容器的详细信息
containers: # 必选,容器列表
- name: nginx # 必选,符合RFC 1035规范的容器名称
image: nginx:v1 # 必选,容器所用的镜像的地址
imagePullPolicy: Always # 可选,镜像拉取策略
workingDir: /usr/share/nginx/html # 可选,容器的工作目录
volumeMounts: # 可选,存储卷配置
- name: webroot # 存储卷名称
mountPath: /usr/share/nginx/html # 挂载目录
readOnly: true # 只读
ports: # 可选,容器需要暴露的端口号列表
- name: http # 端口名称
containerPort: 80 # 端口号
protocol: TCP # 端口协议,默认TCP
env: # 可选,环境变量配置
- name: TZ # 变量名
value: Asia/Shanghai #变量
- name: LANG
value: en_US.utf8
resources: # 可选,资源限制和资源请求限制
limits: # 最大限制设置
cpu: 1000m
memory: 1024MiB
requests: # 启动所需的资源
cpu: 100m
memory: 512MiB
readinessProbe: # 可选,容器状态检查
httpGet: # 检测方式
path: / # 检查路径
port: 80 # 监控端口
timeoutSeconds: 2 # 超时时间
initialDelaySeconds: 60 # 初始化时间
livenessProbe: # 可选,监控状态检查
exec: # 检测方式
command:
- cat
- /health
httpGet: # 检测方式
path: /_health
port: 8080
httpHeaders:
- name: end-user
value: jason
tcpSocket: # 检测方式
port: 80
initialDelaySeconds: 60 # 初始化时间
timeoutSeconds: 2 # 超时时间
periodSeconds: 5 # 检测间隔
successThreshold: 2 # 检查成功为2次表示就绪
failureThreshold: 1 # 检测失败1次表示未就绪
securityContext: # 可选,限制容器不可信的行为
provoleged: false
restartPolicy: Always # 可选,默认为Always
nodeSelector: # 可选,指定Node节点
region: subnet7
imagePullSecrets: # 可选,拉取镜像使用的secret
- name: default-dockercfg-86258
hostNetwork: false # 可选,是否为主机模式,如是,会占用主机端口
volumes: # 共享存储卷列表
- name: webroot # 名称,与上述对应
emptyDir: {} # 共享卷类型,空
hostPath: # 共享卷类型,本机目录
path: /etc/hosts
secret: # 共享卷类型,secret模式,一般用于密码
secretName: default-token-tf2jp # 名称
defaultMode: 420 # 权限
configMap: # 一般用于配置文件
name: nginx-conf
defaultMode: 420
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步