编程语言   发布时间: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

    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资源

过程描述

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

#简述
1、创建pod,并调度到合适节点
2、创建pause基础容器,提供共享名称空间
3、串行业务容器容器初始化
4、启动业务容器,启动那一刻会同时运行主容器上定义的Poststart钩子事件
5、健康状态监测,判断容器是否启动成功
6、持续存活状态监测、就绪状态监测
7、结束时,执行prestop钩子事件
8、终止容器

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

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

2.1、执行

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

    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)

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

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

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

4.2、执行

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

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

6、Pod的回调钩子

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

6.1、启动回调PostStart

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

检测容器是否正常运行。

执行失败:如果就绪性检测执行失败,Pod会立即驱离出负载均衡。

exec		: 执行命令
httpGet		: 通过http协议访问
tcpSocket 	: 通过Ping命令,探测端口
6.2.1、探测
httpGet		: 通过http协议访问
          readinessProbe:
            httpGet:
              port: 80
              path: /index

6.3、存活性检测

检测容器是否正常启动。

执行失败:如果存活性检测执行失败,Pod会按照一定时间周期不断重启,直至Pod正常启动。

exec		: 执行命令
httpGet		: 通过http协议访问
tcpSocket 	: 通过Ping命令,探测端口
6.3.1、探测
exec		: 执行命令
          livenessProbe:
            exec:
              command:
                - "/bin/sh"
                - "-c"
                - "cat /etc/hostss"

httpGet		: 通过http协议访问
          livenessProbe:
            httpGet:
              port: 8080
              path: /

tcpSocket 	: 通过Ping命令,探测端口
          livenessProbe:
            tcpSocket:
              port: 80

6.4、结束回调

当Pod收到了销毁指令时,立即执行。

执行失败:如果结束回调执行失败,容器依然会终止。

exec		: 执行命令
httpGet		: 通过http协议访问
tcpSocket 	: 通过Ping命令,探测端口
6.4.1 exec探测
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阶段

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

三、Pod的资源清单详解

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
    readinessProbe: # 可选,容器状态检查
      httpGet:    # 检测方式
        path: /    # 检查路径
        port: 80    # 监控端口
      timeoutSeconds: 2    # 超时时间 
      initialDelaySeconds: 60    # 初始化时间
    livenessProbe:    # 可选,监控状态检查
      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,请注明来意。