编程语言   发布时间:2022-06-27  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了day03 应用容器与pod资源大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

day03 应用容器与pod资源

目录
  • day03 应用容器与pod资源
    • 一、Pod
      • 1、Pod的声明周期
      • 2、书写一个简单到的资源清单yaml
        • 2.1、执行
      • 3、Pod的容器重启策略(restartPolicy)
      • 4、Pod中容器的拉取策略(imagePullPolicy)
        • 4.1、书写一个拉取策略yaml清单
        • 4.2、执行
      • 5、静态Pod和动态Pod之间的区别
      • 6、Pod的回调钩子
        • 6.1、启动回调PostStart
          • 6.1.1、exec探测
          • 6.1.2 httpGet探测
          • 6.1.3、tcpSocket探测
        • 6.2、就绪型检测
          • 6.2.1、探测
        • 6.3、存活性检测
          • 6.3.1、探测
        • 6.4、结束回调
          • 6.4.1 exec探测
    • 二、Pod阶段
    • 三、Pod的资源清单详解

一、Pod

@H_944_78@ 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的声明周期

day03 应用容器与pod资源

过程描述

@H_944_78@1、启动包括初始化容器的任何容器之前先创建pause基础容器,它初始化Pod环境并为后续加入的容器提供共享的名称空间。 2、按顺序以串行的方式运行用户定义的各个初始化容器进行Pod环境初始化;任何一个初始化容器运行失败都将导致Pod创建失败,并按其restartPolicy的策略进行处理,默认为重启。 3、等待所有容器初始化成功完成后,启动业务容器,多容器Pod环境中,此步骤会并行启动所有业务容器。他们各自按其自定义展开其生命周期;容器启动的那一刻会同时运行业务容器上定义的PostStart钩子事件,该步骤失败将导致相关容器被重启。 4、运行容器启动健康状态监测(startupProbe),判断容器是否启动成功;该步骤失败,同样参照restartPolicy定义的策略进行处理;未定义时,默认状态为success。 5、容器启动成功后,定期进行存活状态监测(live@R_489_11335@s)和就绪状态监测(readi@R_489_11335@s);存活监测状态失败将导致容器重启,而就绪状态监测失败会是的该容器从其所属的service对象的可用端点列表中移除。 6、终止Pod对象时,会想运行preStop钩子事件,并在宽限期(termiunationGracePeriodSeconds)结束后终止主容器,宽限期默认为30秒。 #简述 1、创建pod,并调度到合适节点 2、创建pause基础容器,提供共享名称空间 3、串行业务容器容器初始化 4、启动业务容器,启动那一刻会同时运行主容器上定义的Poststart钩子事件 5、健康状态监测,判断容器是否启动成功 6、持续存活状态监测、就绪状态监测 7、结束时,执行prestop钩子事件 8、终止容器

2、书写一个简单到的资源清单yaml

@H_944_78@kind: Pod apiVersion: v1 metadata: name: testv1 spec: containers: - name: nginx image: nginx

2.1、执行

@H_944_78@# 部署 [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)

@H_944_78@ 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)

@H_944_78@容器的 imagePullPolicy 和镜像的标签会影响 kubelet 尝试拉取(下载)指定的镜像。 IfNotPresent : 当本地没有该镜像时,下载 Always :无论本地有没有该镜像,都去远程下载 Never :无论本地有没有该镜像,都不去远程下载

4.1、书写一个拉取策略yaml清单

@H_944_78@kind: Pod # 必选,定义资源接口类型/角色。pod为容器资源 apiVersion: v1 # 必选,指定api接口资源版本 metadata: # 必选,定义资源的元数据信息 name: testv1 # 必选,定义资源名称,在同一个namespace中必须是唯一的 spec: # 必选,用于定义容器的详细信息 restartPolicy: OnFailure # 可选,容器状态检查 containers: # 必选,容器列表 - name: nginx # 必选,符合RFC 1035规范的容器名称 image: nginx # 必选,容器所用的镜像的地址 imagePullPolicy: IfNotPresent # 可选,容器状态检查

4.2、执行

@H_944_78@# 删除清单 [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之间的区别

@H_944_78@静态Pod:没有控制器 动态Pod:有控制器

6、Pod的回调钩子

@H_944_78@ PostStart :在容器创建后立即执行。但是,并不能保证钩子将在容器ENTRYPOINT之前运行,因为没有参数传递给处理程序。 主要用于资源部署、环境准备等。不过需要注意的是如果钩子花费时间过长以及于不能运行或者挂起,容器将不能达到Running状态。 容器启动后执行,注意由于是异步执行,它无法保证一定在ENTRYPOINT之后运行。如果失败,容器会被杀死,并根据RestartPolicy决定是否重启 PreStop :在容器终止前立即被调用。它是阻塞的,意味着它是同步的,所以它必须在删除容器的调用出发之前完成。主要用于优雅关闭应用程序、通知其他系统等。如果钩子在执行期间挂起,Pod阶段将停留在Running状态并且不会达到failed状态容器停止前执行,常用于资源清理。如果失败,容器同样也会被杀死

6.1、启动回调PostStart

@H_944_78@# 当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探测
@H_944_78@# 编写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探测
@H_944_78@# 编写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探测
@H_944_78@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、就绪型检测

@H_944_78@检测容器是否正常运行。 执行失败:如果就绪性检测执行失败,Pod会立即驱离出负载均衡。 exec : 执行命令 httpGet : 通过http协议访问 tcpSocket : 通过Ping命令,探测端口
6.2.1、探测
@H_944_78@httpGet : 通过http协议访问 readi@R_489_11335@sProbe: httpGet: port: 80 path: /index

6.3、存活性检测

@H_944_78@检测容器是否正常启动。 执行失败:如果存活性检测执行失败,Pod会按照一定时间周期不断重启,直至Pod正常启动。 exec : 执行命令 httpGet : 通过http协议访问 tcpSocket : 通过Ping命令,探测端口
6.3.1、探测
@H_944_78@exec : 执行命令 live@R_489_11335@sProbe: exec: command: - "/bin/sh" - "-c" - "cat /etc/hostss" httpGet : 通过http协议访问 live@R_489_11335@sProbe: httpGet: port: 8080 path: / tcpSocket : 通过Ping命令,探测端口 live@R_489_11335@sProbe: tcpSocket: port: 80

6.4、结束回调

@H_944_78@当Pod收到了销毁指令时,立即执行。 执行失败:如果结束回调执行失败,容器依然会终止。 exec : 执行命令 httpGet : 通过http协议访问 tcpSocket : 通过Ping命令,探测端口
6.4.1 exec探测
@H_944_78@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阶段

@H_944_78@ 1、Pending(悬决):Pod 已被 Kubernetes 系统接受,但有一个或者多个容器尚未创建亦未运行。此阶段包括等待 Pod 被调度的时间和通过网络下载镜像的时间, 2、Running(运行中) Pod 已经绑定到了某个节点,Pod 中所有的容器都已被创建。至少有一个容器仍在运行,或者正处于启动或重启状态。 3、Succeeded(成功) Pod 中的所有容器都已成功终止,并且不会再重启。 4、Failed(失败) Pod 中的所有容器都已终止,并且至少有一个容器是因为失败终止。也就是说,容器以非 0 状态退出或者被系统终止。 5、Unknown(未知) 因为某些原因无法取得 Pod 的状态。这种情况通常是因为与 Pod 所在主机通信失败。

三、Pod的资源清单详解

@H_944_78@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 readi@R_489_11335@sProbe: # 可选,容器状态检查 httpGet: # 检测方式 path: / # 检查路径 port: 80 # 监控端口 timeoutSeconds: 2 # 超时时间 initialDelaySeconds: 60 # 初始化时间 live@R_489_11335@sProbe: # 可选,监控状态检查 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

大佬总结

以上是大佬教程为你收集整理的day03 应用容器与pod资源全部内容,希望文章能够帮你解决day03 应用容器与pod资源所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。