资源清单与Pod

资源清单

简介

在k8s使用资源清单描述k8s中的对象,使用yaml或json来保存这些信息
资源清单中主要有四个必要的字段

1
2
3
4
apiVersion:
kind:
metadata:
spec:

解释:

来自https://kubernetes.io/zh/docs/concepts/overview/working-with-objects/kubernetes-objects/

  • apiVersion: 创建该对象所使用的 Kubernetes API 的版本
  • kind: 对象的类别
  • metadata: 帮助唯一性标识对象的一些数据,包括一个 name 字符串、UID 和可选的namespace
  • spec: 所期望的该对象的状态

Pod

Pod是什么?

Pod 的共享上下文包括一组 Linux 名字空间、控制组(cgroup)和可能一些其他的隔离 方面,即用来隔离 Docker 容器的技术。 在 Pod 的上下文中,每个独立的应用可能会进一步实施隔离。
就 Docker 概念的术语而言,Pod 类似于共享名字空间和文件系统卷的一组 Docker 容器。
简单来说,可以认为Pod代表一个虚拟主机

构建pod

对于pods

1
2
3
4
5
6
7
8
9
10
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
- name: container_name
image: image_source:version
# ports:
# - containerPort: 80

初始化容器

在spec下的数组字段initContainers的成员用于描述初始化容器,初始化容器在pod启动的时候会被按照顺序一次执行,要求钱一个容器正常退出(返回0)才可执行启动后一个容器,如果有任何一个初始化容器没有正常退出,即重新构建整个pod。

初始化容器不应该无限期运行,但是可以一直等待下去,以实现容器间的同步。

Probe

K8s提供了Probe(探针)用于辅助管理Pod中的容器

共有3种探测方式

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

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

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

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

  • Success(成功):容器通过了诊断。
  • Failure(失败):容器未通过诊断。
  • Unknown(未知):诊断失败,因此不会采取任何行动。
1
2
3
4
5
6
7
8
9
10
11
12
13
apiVersion: v1
kind: Pod
metadata:
name: demo
spec:
containers:
- name: demo_container
image: demo:v1
livenessProbe:
initialDelaySeconds: 5
timeoutSeconds: 1
tcpSocket:
port: 80

readinessProbe

就绪探针,在容器字段下的readinessProbe字段用于描述就绪探针。

因为在容器成功启动后并不能保证容器立即可用,因此在容器启动一段时间后检测容器是否启动成功,如果失败那么等待一段时间后再次检测,以防容器一启动便将其用于提供服务。

livenessProbe

容器下的livenessProbe成员用于描述存活探针。

存活探针用于检测容器是否存活,如果探测失败会杀死容器。因为如果用于服务的进程已经结束运行但容器并没有结束运行,会导致不能其正常提供服务。

startupProbe

检测容器是否已经启动,该探针与其他所有探针互斥(会禁用所有其他探针)

事件处理函数

事件处理函数(钩子),被配置在容器中,在容器中的进程启动前和结束前运行

demo来自为容器的生命周期事件设置处理函数 | Kubernetes

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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 > /usr/share/message"]
preStop:
exec:
command: ["/bin/sh","-c","nginx -s quit; while killall -0 nginx; do sleep 1; done"]

hook的类型

  • exec 执行命令
  • HTTP 发送HTTP报文

postStart

Kubernetes 在容器创建后立即发送 postStart 事件。 然而,postStart 处理函数的调用不保证早于容器的入口点(entrypoint) 的执行。postStart 处理函数与容器的代码是异步执行的,但 Kubernetes 的容器管理逻辑会一直阻塞等待 postStart 处理函数执行完毕。 只有 postStart 处理函数执行完毕,容器的状态才会变成 RUNNING。

preStop

Kubernetes 在容器结束前立即发送 preStop 事件。除非 Pod 宽限期限超时,Kubernetes 的容器管理逻辑 会一直阻塞等待 preStop 处理函数执行完毕。

文章目录
  1. 1. 资源清单
    1. 1.1. 简介
    2. 1.2. 解释:
  2. 2. Pod
    1. 2.1. Pod是什么?
    2. 2.2. 构建pod
    3. 2.3. 初始化容器
    4. 2.4. Probe
      1. 2.4.1. readinessProbe
      2. 2.4.2. livenessProbe
      3. 2.4.3. startupProbe
    5. 2.5. 事件处理函数
      1. 2.5.0.1. hook的类型
      2. 2.5.0.2. postStart
      3. 2.5.0.3. preStop
|