当前位置: 首页>后端>正文

五、k8s资源清单与容器生命周期

1、集群资源分类

名称空间级别:名称空间(Namespace)是用于隔离和组织资源的一种机制。每个资源都属于一个特定的名称空间,并且可以通过名称空间来对资源进行分组和管理。

. 工作负载型资源:pod 、各种控制器

. 服务发现及负载型资源:Service、Ingress

. 配置与存储型资源:Volume、CSI

. 特殊类型的存储卷:ConfigMap、Secret、DownwardAPI

集群级别:有一些资源是在整个集群范围内创建和管理的,而不是在特定的名称空间中。可以被多个名称空间中的资源共享和使用。通过集群级别资源,可以管理和配置整个集群的行为和属性。

. Node(节点):Node 是 Kubernetes 集群中的工作节点,它可以运行容器化的应用程序。Node 代表集群中的物理或虚拟机器,并提供计算和存储资源。

.??Namespace(名称空间):虽然名称空间通常是在特定的名称空间级别创建和管理的,但集群级别也有一个默认的名称空间(default),用于存放没有明确指定名称空间的资源。

.?Cluster(集群):Cluster 是整个 Kubernetes 系统的顶层概念,它由一组相互连接的节点组成。Cluster 用于管理和协调集群中的各种资源。

.?StorageClass(存储类):StorageClass 定义了用于创建 PersistentVolume 的存储配置。它描述了存储系统的属性和参数,并允许在集群级别定义不同的存储类。

.?ClusterRole(集群角色)和 ClusterRoleBinding(集群角色绑定):ClusterRole 定义了一组权限,可以在整个集群范围内使用。ClusterRoleBinding 将 ClusterRole 授予用户、组或服务账户,以控制其对集群级别资源的访问权限。

.?CustomResourceDefinition(自定义资源定义):CustomResourceDefinition 允许用户定义自己的自定义资源类型,这些资源类型可以在整个集群范围内使用。

元数据类型:根据指标进行对应操作。如:HPA、PodTemplate、LimitRange

2、YAML文件

https://www.jianshu.com/p/a2df63b7a901?v=1702538513542

3、pod生命周期

五、k8s资源清单与容器生命周期,第1张

4、InitC

(1)说明

InitC容器与普通容器非常像,除了如下两点:

(1)Init容器总是运行到成功为止;即如果没有启动成功,k8s会不断重启该pod(除非pod对应的restarPolicy为Never,它不会重启)

(2)每个Init容器必须在下一个Inti容器启动之前完成

(2)? 测试如下

apiVersion: v1

kind: Pod

metadata:

? name: myapp-pod

? labels:

? ? app: myapp

spec:

? containers:

? ? ? - name: myapp-container

? ? ? image: busybox

? ? command: ['sh','-c','echo The app is running! && sleep 3600']

? initContainers:

? ? ? - name: init-myservice

? ? ? image: busybox

? ? command: ['sh','-c',' until nslookup myservice; do echo waiting for myservice; sleep 2;done;']

? ? -name: init-mydb

? ? image: busybox

? command: ['sh','-c','until nslookup mydb; do echo waiting for mydb; sleep 2; done;']

kind: Service

apiVersion: v1

metadata:

? ? name: myservice

spec:

? ports:

? - protocol: TCP

? ? ? ? port: 80

? ? targetPort: 9376

---

kind: Service

apiVersion: v1

metadata:

? ? name: mydb

spec:

? ports:

? ? -protocol: TCP

? ? ? ? port: 80

? ? targetPort: 9377

kubectl?create -f??myservice.yaml? ?# 以yaml形式创建service

kubectl?create -f??mydb.yaml? ?# 以yaml形式创建service

kubectl?create -f??init-pod.yaml? ?# 以yaml形式创建Pod

kubectl? get pod -n kube-system #获取位于?kube-system?命名空间中的 Pod 列表

kubectl describe pod myapp-pod #查看myapp-pod信息(名称、运行状态、事件等)

kubectl log myapp-pod -c test? ?#查看myapp-pod中容器为test 的日志(只有一个容器,无需-c)

(3)特殊说明

1、在Pod启动过程中,Init容器会按顺序在网络和数据卷初始化之后启动。每个容器必须在下一个容器启动之前成功退出;

2、如果由于运行时或失败退出,将导致容器启动失败,它会根据Pod的restartPolicy指定的策略进行重试。然而,如果Pod的 restartPolicy 设置为 Always,Init 容器失败时会使用 RestartPolicy策略

3、在所有的Init容器没有成功之前,Pod将不会变成Ready状态。Init容器的端口将不会在 Service中进行聚集。 正在初始化中的Pod处于Pending状态,但应该会将Initializing状态设置为 true

4、如果Pod重启,所有Init容器必须重新执行

5、对Init容器spec的修改被限制在容器image字段,修改其他字段都不会生效。更改Init容器的 image字段,等价于重启该Pod;

6、Init容器具有应用容器的所有字段。除了readinessProbe,因为Init容器无法定义不同于完成(completion)的就绪(readiness)之外的其他状态。这会在验证过程中强制执行。readinessProbe?用于确定容器是否已准备好接收流量,而 Init 容器的主要目的是在应用容器启动之前执行一些初始化任务,因此没有必要进行 readiness 探针的检测。

7、在Pod中的每个app和Init容器的名称必须唯一;与任何其它容器共享同一个名称,会在验证时抛出错误

5、探针

init C 有一个很明显的缺点就是,如果init C 容器去探测某个容器(主容器依赖的容器)已经启动,等待init C容器结束之后,主容器再去访问该依赖容器,此时那个依赖容器挂了,就出现问题了,这个时候就需要探针来完成。探针可以通过主容器访问依赖容器,即在主容器内对依赖容器进行访问,比较合理。

探针是由kubelet对容器执行的定期诊断。要执行诊断,kubelet调用由容器实现的 Handler。

有三种类型的处理程序:

ExecAction: 在容器内执行指定命令。如果命令退出时返回码为0则认为诊断成功。

TCPSocketAction: 对指定端口上的容器的IP地址进行TCP检查。如果端口打开,则诊断被认为是成功的。

HTTPGetAction: 对指定的端口和路径上的容器的IP地址执行 HTTP Get 请求。如果响应的状态码大于等于200且小于400,则诊断被认为是成功的

每次探测都将获得以下三种结果之一:

成功:容器通过了诊断。

失败:容器未通过诊断。

未知:诊断失败,因此不会采取任何行动

如下有两种探针

livenessProbe:存活检测,不存活,直接重启pod

readlinessProbe:就绪检测,不就绪,不将pod状态改为ready

(1)readinessProbe; (就绪探测)?

readinessProbe; (就绪探测) 指示容器是否准备好服务请求。如果就绪探测失败,端点控制器将从与Pod 匹配的所有Service的端点中删除该Pod的IP地址。初始延迟之前的就绪状态默认为Failure。如果容器不提供就绪探针,则默认状态为 Success。

如下:容器在启动时,1s后进行就绪检测,检测index1.html是否存在,不存在,3s后再检测,有的话,状态改为ready

apiVersion: v1

kind: Pod

metadata:

? name: readiness-httpget-pod

? namespace: default

spec:

? containers:

? ? - name: readiness-httpget-container

? ? image: wangyanglinux/myapp:v1

? ? imagePullPolicy: IfNotPresent

?readinessProbe:

?httpGet:

? ? ? ? ? port: 80

? ? ? ? ? path: /index1.html

? ? ? ? initialDelaySeconds: 1? ? ##容器启动后等待 1 秒后开始执行第一次探测。

? ? ? ? periodSeconds: 3? ? ??##每隔 3 秒执行一次探测。

创建完之后,比如 readiness-httpget-pod没同时出现read和running,则说明存在问题。

这里用到一个命令 ,进入pod的内的某个容器内查看明细

kubectlexecpod名 -c 容器 -it -- /bin/sh

五、k8s资源清单与容器生命周期,第2张

(2)?livenessProbe:(存活探测)

livenessProbe:(存活探测) 指示容器是否正在运行。如果存活探测失败,则kubelet会杀死容器,并且容器将受到其重启策略的影响。如果容器不提供存活探针,则默认状态为 Success。

如下:这个存活探针,在容器启动后的第一秒开始,每隔 3 秒执行一次探测命令?test -e /tmp/live,如果?/tmp/live?文件存在,探测成功,容器被认为是存活的;如果文件不存在,探测失败,容器被认为出现了故障。

apiVersion: v1

kind: Pod

metadata:

? ? name: liveness-exec-pod

? ? namespace: default

spec:

? containers:

? - name: liveness-exec-container

? ? image: hub.atguigu.com/library/busybox

? ? imagePullPolicy: IfNotPresent

? ? command: ["/bin/sh","-c","touch /tmp/live; sleep 60; rm - rf /tmp/live; sleep 3600"]? ? ? ? ##容器启动时执行的命令,其中包括创建?/tmp/live?文件、等待 60 秒、删除?/tmp/live?文件、再等待 3600 秒。

?livenessProbe:

? ? ? exec:

? ? ? ? command: ["test","-e","/tmp/live"]? ? ?##探测命令,用于检测?/tmp/live?文件是否存在。

? ? ? initialDelaySeconds: 1? ? ##容器启动后等待 1 秒后开始执行第一次探测。

? ? ? periodSeconds: 3? ?##每隔 3 秒执行一次探测。

如下:这个存活探针,在容器启动后的第一秒开始,每隔 3 秒发送一个 HTTP GET 请求到容器的 "http" 端口的 "/index.html" 路径。如果探测请求返回成功的状态码(2xx 或 3xx),探测成功,容器被认为是存活的;如果返回失败的状态码(4xx 或 5xx)或超时,探测失败,容器被认为出现了故障。

apiVersion: v1

kind: Pod

metadata:

? name: liveness-httpget-pod

? namespace: default

spec:

? containers:

? ? - name: liveness-httpget-container

? ? image: wangyanglinux/myapp:v1

? ? imagePullPolicy: IfNotPresent

? ? ports:? #定义容器暴露的端口列表。

? ? ? - name: http

? ? ? ? containerPort: 80

?????livenessProbe:

?????????httpGet:

? ? ? ? ? ????port: http? ?##指定探测请求发送到容器暴露的名为 "http" 的端口。改为80亦可

? ? ? ? ????? path: /index1.html

? ? ? ????initialDelaySeconds: 1

? ? ? ????periodSeconds: 3

? ? ????? timeoutSeconds: 10? ? ##探测请求的超时时间为 10 秒。

apiVersion: v1

kind: Pod

metadata:

? name: probe-tcp

? namespace: default

spec:

? containers:

? - name : nginx

? ? image: myapp:v1

?livenessProbe:

? ? ? ? initialDelaySeconds: 5

? ? ? ? timeoutSeconds: 1

?tcpSocket:

? ? ? ? ? ? port : 80

? ? periodSeconds: 3

6、stop 、start

Pod hook(钩子) 是由Kubernetes 管理的kubelet 发起的,当容器中的进程启动前或者容器中的进程终止之前运行,这是包含在容器的生命周期之中。可以同时为pod 中的所有容器都配置 hook

Hook的类型包括两种:

exec : 执行一段命令

HTTP: 发送HTTP请求

apiVersion: v1

kind: Pod

metadata:

? name: lifecycle-demo

spec:

? containers:

? ? ? - name: lifecycle-demo-container

? ? ? image: nginx

? ? ? lifecycle:

?postStart:? ? ? ? ? ? ? ? ? ? ? ? ? #在容器启动后执行的钩子。

? ? ? ? ? ? exec:

? ? ? ? ? ? ? command: ["/bin/sh","-c","echo Hello from the postStart handler"]

?preStop:? ? ? ? ? ? ? ? ? ? ? ? ? ? #在容器终止之前执行的钩子。

? ? ? ? ? ? exec:

? ? ? ? ? ? ? command: ["/bin/sh","-c","echo Hello from the preStop handler"]

?Pod 中PodStatus的phase 可能存在的值

1、挂起(Pending): Pod已被Kubernetes系统接受,但有一个或者多个容器镜像尚未创建。等待时间包括调度Pod的时间和通过网络下载镜像的时间,这可能需要花点时间

2、运行中(Running):该Pod已经绑定到了一个节点上,Pod中所有的容器都已被创建至少有一个容器正在运行,或者正处于启动或重启状态

3、成功(Succeeded):Pod中的所有容器都被成功终止,并且不会再重启

4、失败(Failed):Pod中的所有容器都已终止了,并且至少有一个容器是因为失败终止。也就是说,容器以非0状态退出或者被系统终止


https://www.xamrdz.com/backend/3g81933980.html

相关文章: