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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容