五、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生命周期

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

(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状态退出或者被系统终止

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容