【云原生】kubernetes深入理解Pod对象:基本管理

这篇具有很好参考价值的文章主要介绍了【云原生】kubernetes深入理解Pod对象:基本管理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

pod restarts,#  Kubernetes,docker,kubernetes,容器,livenessProbe,InitContainers

目录

一、Pod 基本概念

二、pod 常用命令

三、Pod 资源共享实现机制

3.1 共享网络

3.2 共享存储

四、Pod 状态管理

五、重启策略和健康检查

5.1 基本概念

5.1.1 重启策略

5.1.2 健康检查有以下三种类型:

5.1.3 支持以下三种检查方法:

5.2 示例讲解

5.2.1 就绪健康检查示例

六、Pod环境变量注入

6.1 变量定义方式

6.2 Pod属性中获取

6.3 ConfigMap获取

七、Init Container

7.1 概念

7.2 应用场景

7.3 使用 Init 容器示例


一、Pod 基本概念


Pod 是可以在 Kubernetes 中创建和管理的、最小的可部署的计算单元。

Pod (就像在鲸鱼荚或者豌豆荚中)是一组(一个或多个) 容器; 这些容器共享存储、网络、以及怎样运行这些容器的声明。

Pod 特点

        • 一个Pod可以理解为是一个应用实例,提供服务

        • Pod中容器始终部署在一个Node上

        • Pod中容器共享网络、存储资源

        • Kubernetes直接管理Pod,而不是容器

pod restarts,#  Kubernetes,docker,kubernetes,容器,livenessProbe,InitContainers

       Pod 的共享上下文包括一组 Linux 名字空间、控制组(cgroup)和可能一些其他的隔离 ,即用来隔离 Docker 容器的技术。 在 Pod 的上下文中,每个独立的应用可能会进一步实施隔离。

就 Docker 概念的术语而言,Pod 类似于共享命令空间和文件系统卷的一组 Docker 容器。


二、pod 常用命令


创建Pod:
kubectl apply -f	pod.yaml

或者使用命令 kubectl run nginx --image=nginx 

查看Pod:
kubectl get pods
kubectl describe pod <Pod名称> 

查看日志:
kubectl logs <Pod名称>	[-c CONTAINER] 
kubectl logs <Pod名称>	[-c CONTAINER] -f 

进入容器终端:
kubectl exec <Pod名称> [-c CONTAINER] -- bash 

删除Pod:
kubectl delete <Pod名称>

三、Pod 资源共享实现机制


3.1 共享网络


将业务容器网络加入到“负责网络的容器”实现网络共享

pod restarts,#  Kubernetes,docker,kubernetes,容器,livenessProbe,InitContainers

 在一个pod 中运行两个容器,两个容器之间网络是互通的。

apiVersion: v1
kind: Pod
metadata:
  labels:
    app: test
  name: pod-net-test
  namespace: default
spec:
  containers:
  - image: busybox
    name: test01
    command: ["/bin/sh","-c","sleep 360000"]
  - image: nginx:1.17
    name: web

 进入 web容器中在 index.html 页面中输入 “hello world” ,我们再从 test01 容器中下载 访问

pod restarts,#  Kubernetes,docker,kubernetes,容器,livenessProbe,InitContainers

3.2 共享存储


一个pod中的容器通过数据卷共享数据。

pod restarts,#  Kubernetes,docker,kubernetes,容器,livenessProbe,InitContainers

       通过在 web容器 /data 文件夹下创建一个文件 可以在容器 test 中查看 ,从而可以得出 pod 中容器中的部分数据是共享的。

apiVersion: v1
kind: Pod
metadata:
  labels:
    app: test
  name: pod-volume-test 
  namespace: default
spec:
  containers:
  - image: busybox 
    name: test
    command: ["/bin/sh","-c","sleep 360000"]
    volumeMounts:
    - name: log
      mountPath: /data
  - image: nginx
    name: web
    volumeMounts:
    - name: log
      mountPath: /data

  volumes:
  - name: log
    emptyDir: {}

        在web容器中的 /data 文件夹下创建 index.html 文件,我们可以看到 在test容器中可以 查看到 index.html文件。

pod restarts,#  Kubernetes,docker,kubernetes,容器,livenessProbe,InitContainers


四、Pod 状态管理


Pod 一共有 5 种状态,这个状态反映在 Pod 的 status 属性中

  • Pending:这个状态意味着,Pod 的 YAML 文件已经提交给了 Kubernetes,API 对象已经被创建并保存在 Etcd 当中。但是这个 Pod 还没有被调度成功,最常见的原因比如 Pod 中某个容器启动不成功
  • Running:这个状态下,Pod 已经调度成功。也就是它包含的容器都已经创建成功,并且至少有一个正在运行中
  • Succeeded:这个状态意味着,Pod 里的所有容器都正常运行成功并退出了。这种情况在运行一次性任务时最为常见
  • Failed:这个状态下,Pod 里至少有一个容器以不正常的状态退出。这个状态出现时,你得想办法 Debug 这个容器,比如查看 Pod 的事件和日志。
  • Unknown:这是一个异常状态,意味着 Pod 的状态不能集群检测到,这很有可能是主从节点(Master 和 Kubelet)间的通信出现了问题。

五、重启策略和健康检查


5.1 基本概念


5.1.1 重启策略

• Always:当容器终止退出后,总是重启容器,默认策略。

• OnFailure:当容器异常退出(退出状态码非0)时,才重启容器。

• Never:当容器终止退出,从不重启容器。

5.1.2 健康检查有以下三种类型:

livenessProbe(存活检查):如果检查失败,将杀死容器,根据Pod 的restartPolicy来操作。

readinessProbe(就绪检查):如果检查失败,Kubernetes会把Pod从service endpoints中剔除。

startupProbe(启动检查):指示容器中的应用是否已经启动。如果提供了启动探针(startup probe),则禁用所有其他探针,直到它成功为止。如果启动探针失败,kubelet 将杀死容器,容器服从其重启策略进行重启。如果容器没有提供启动探针,则默认状态为成功Success。

5.1.3 支持以下三种检查方法:

• httpGet:发送HTTP请求,返回200-400范围状态码为成功。

• exec:执行Shell命令返回状态码是0为成功。

• tcpSocket:发起TCP Socket建立成功。

pod restarts,#  Kubernetes,docker,kubernetes,容器,livenessProbe,InitContainers

5.2 示例讲解


官网示例:

Configure Liveness, Readiness and Startup Probes | Kubernetes

5.2.1 就绪健康检查示例

运行一个 pod 在容器中 /tmp/healthy 目录下创建文件并 删除 ,存活检查 检查 此路径是否存在。

apiVersion: v1
kind: Pod
metadata:
  labels:
    test: liveness
  name: pod-check 
spec:
  containers:
  - name: liveness
    image: busybox
    args:
    - /bin/sh
    - -c
    - touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 600
    livenessProbe:    # 存活检查
      exec:
        command:
        - cat
        - /tmp/healthy
      initialDelaySeconds: 5
      periodSeconds: 5
    readinessProbe:   # 就绪检查
      exec:
        command:
        - cat
        - /tmp/healthy
      initialDelaySeconds: 5
      periodSeconds: 5

###  Pod 健康检查示例
kubectl apply -f pod-healthy-check.yaml
### 查看pod的详细信息
kubectl describe pod  pod-check
### 暴露服务端口
kubectl expose pod pod-check --port=80 --target-port=80

           存活检查生效,可以看到 pod 的restarts 次数已经增加了 一次。

pod restarts,#  Kubernetes,docker,kubernetes,容器,livenessProbe,InitContainers

            就绪检查失败, K8s会把Pod从service endpoints中剔除, 从而失去此 service 。

pod restarts,#  Kubernetes,docker,kubernetes,容器,livenessProbe,InitContainers


六、Pod环境变量注入


6.1 变量定义方式


  • 自定义变量值
  • 变量值从Pod属性中获取
  • 变量值从Sectet、ConfigMap获取

官方示例地址:通过环境变量将 Pod 信息呈现给容器 | Kubernetes

6.2 Pod属性中获取


apiVersion: v1
kind: Pod
metadata:
  name: pod-env-vars
spec:
  containers:
    - name: test
      image: busybox
      command: [ "sh", "-c", "sleep 36000"]
      env:
        - name: MY_NODE_NAME
          valueFrom:
            fieldRef:
              fieldPath: spec.nodeName
        - name: MY_POD_NAME
          valueFrom:
            fieldRef:
              fieldPath: metadata.name
        - name: MY_POD_NAMESPACE
          valueFrom:
            fieldRef:
              fieldPath: metadata.namespace
        - name: MY_POD_IP
          valueFrom:
            fieldRef:
              fieldPath: status.podIP
        - name: MY_POD_SERVICE_ACCOUNT
          valueFrom:
            fieldRef:
              fieldPath: spec.serviceAccountName
        - name: Hello
          value: "helle Kubernetes!"
  restartPolicy: Never

           进入容器 查看Pod 信息,我们使用echo $可以输出结果

pod restarts,#  Kubernetes,docker,kubernetes,容器,livenessProbe,InitContainers

6.3 ConfigMap获取


官网示例地址: ConfigMap | Kubernetes

       ConfigMap 是一种 API 对象,用来将非机密性的数据保存到键值对中。使用时, Pods 可以将其用作环境变量、命令行参数或者存储卷中的配置文件。

       使用 ConfigMap 来将你的配置数据和应用程序代码分开。ConfigMap 在设计上不是用来保存大量数据的。在 ConfigMap 中保存的数据不可超过 1 MiB。如果你需要保存超出此尺寸限制的数据,你可能希望考虑挂载存储卷 或者使用独立的数据库或者文件服务。

congfigMap.yaml 

apiVersion: v1
kind: ConfigMap
metadata:
  name: game-demo
data:  
  # 类属性键:每一个键都映射到一个值
  player_initial_lives: "3"
  ui_properties_file_name: "user-interface.properties"
  
  game.properties: |
    enemy.types=aliens,monsters
    player.maximum-lives=5    
  user-interface.properties: |
    color.good=purple
    color.bad=yellow
    allow.textmode=true  

 pod-configMap.yaml

apiVersion: v1
kind: Pod
metadata:
  name: configmap-demo-pod
spec:
  containers:
    - name: demo
      image: alpine
      command: ["sleep", "3600"]
      env:
        - name: PLAYER_INITIAL_LIVES # 请注意这里和 ConfigMap 中的键名是不一样的
          valueFrom:
            configMapKeyRef:
              name: game-demo           # 这个值来自 ConfigMap
              key: player_initial_lives # 需要取值的键
        - name: UI_PROPERTIES_FILE_NAME
          valueFrom:
            configMapKeyRef:
              name: game-demo
              key: ui_properties_file_name
      volumeMounts:
      - name: config
        mountPath: "/config"
        readOnly: true
  volumes:
    - name: config
      configMap:
        name: game-demo
        items:
        - key: "game.properties"
          path: "game.properties"
        - key: "user-interface.properties"
          path: "user-interface.properties"

创建Pod 

kubectl apply -f  configMap.yaml
kubectl apply   -f  pod-configMap.yaml

configmap-demo-pod运行, 进入容器可以看到 挂载目录成功。

pod restarts,#  Kubernetes,docker,kubernetes,容器,livenessProbe,InitContainers


七、Init Container


7.1 概念


Init Container:顾名思义,用于初始化工作,执行完就结束,可以理解为一次性任务。

• 支持大部分应用容器配置,但不支持健康检查

• 优先应用容器执行

7.2 应用场景


• 环境检查:例如确保应用容器依赖的服务启动后再启动应用容器

• 初始化配置:例如给应用容器准备配置文件,工具安装和安装脚本运行。

7.3 使用 Init 容器示例


       部署一个web网站,网站程序没有打到镜像中,而是希望从代码仓库中动态拉取放到应用容器中。下面的例子定义了一个具有 一 个 Init 容器的简单 Pod。 等待 index下载成功 。 一旦这 Init容器 启动完成,Pod 将启动 spec 节中的应用容器。

apiVersion: v1
kind: Pod
metadata:
  name: init-demo
spec:
  initContainers:
  - name: download
    image: busybox
    command: ['wget','-O', '/opt/index.html','http://www.ctnrs.com']
    volumeMounts:
    - name: wwwroot
      mountPath: "/opt"
  containers:
  - name: nginx
    image: nginx
    ports:
    - containerPort: 80
    volumeMounts:
    - name: wwwroot
      mountPath: /usr/share/nginx/html
  volumes:
  - name: wwwroot
    emptyDir: {}

       从pod 的状态中我们可以看到 InitContainer 中的执行状态处于 Init 

pod restarts,#  Kubernetes,docker,kubernetes,容器,livenessProbe,InitContainers

            init-demo 已处于运行之中

pod restarts,#  Kubernetes,docker,kubernetes,容器,livenessProbe,InitContainers

因此,Pod中会有这几种类型的容器:

Infrastructure Container:基础容器,维护整个Pod网络空间

InitContainers:初始化容器,先于业务容器开始执行

Containers:业务容器,并行启动

------------------------ 感谢点赞!--------------------------------

pod restarts,#  Kubernetes,docker,kubernetes,容器,livenessProbe,InitContainers文章来源地址https://www.toymoban.com/news/detail-722907.html

到了这里,关于【云原生】kubernetes深入理解Pod对象:基本管理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【探索 Kubernetes|作业管理篇 系列 8】探究 Pod 的 API 对象属性级别与重要字段用法

    大家好,我是秋意零。 本专栏上一篇中,我们介绍了 Pod 的核心思想以及 Pod 的工作原理。今天我们还是探讨 Pod ,聊一聊 Pod 的基本概念。 👿 简介 🏠 个人主页 : 秋意零 🧑 个人介绍 :在校期间参与众多云计算相关比赛,如:🌟 “省赛”、“国赛” ,并斩获多项奖项荣

    2024年02月08日
    浏览(49)
  • 云原生Kubernetes:pod基础

    目录 一、理论 1.pod 2.pod容器分类 3.镜像拉取策略 4.pod 的重启策略 二、实验 1.Pod容器的分类 2.镜像拉取策略 三、问题 1.apiVersion 报错 2.pod v1版本资源未注册 3.格式错误 4.取行显示指定pod信息 四、总结 (1)  概念  Pod是kubernetes中最小的资源管理组件,Pod也是最小化运行容器化应

    2024年02月09日
    浏览(46)
  • 【云原生】Kubernetes之 Pod hook(钩子)

    Pod hook(钩子)是由 Kubernetes 管理的 kubelet 发起的,当容器中的进程启动前或者容器中的进程终止之前运行,这是包含在容器的生命周期之中。可以同时为 Pod 中的所有容器都配置 hook。 Hook 的类型包括两种: exec:执行一段命令 HTTP:发送 HTTP 请求 示例如下: 说明: postStar

    2024年02月15日
    浏览(35)
  • 【云原生|Kubernetes】08-Pod中的Init容器

    Init 容器是一种特殊容器,在 Pod内的应用容器启动之前运行。Init 容器可以包括一些应用镜像中不存在的实用工具和安装脚本。 你可以在 Pod 的spec中与用来描述应用容器的 containers 数组平行的位置指定 Init 容器。 Init 容器的状态在 status.initContainerStatuses 字段中以容器状态数组

    2024年02月09日
    浏览(54)
  • 在CSDN学Golang云原生(Kubernetes Pod)

    在 Kubernetes 中,Pod 是最小的可部署单元,它包含一个或多个容器。使用 Golang 来定义和操作 Pod 时,需要使用 kubernetes/client-go 包提供的 API。 以下是 Golang 定义和基本用法 Pod 的示例: 安装 kubernetes/client-go 包 在 Golang 环境中安装 kubernetes/client-go 包,该包提供了访问 Kubernetes

    2024年02月15日
    浏览(41)
  • 【云原生|Kubernetes】05-Pod的存储卷(Volume)

    Volume 是Pod 中能够被多个容器访问的共享目录。 Kubernetes 中的Volume 概念、用 途和目的与 Docke 中的 Vo lume 比较类似,但二者不能等价, 首先 Kubernetes 中的Volume 被定义在 Pod上 ,被一个 Pod 里的多个容器挂载到具体的文件目录 ;其次, Kubernete 中的 Volume与 Pod 的生命周期相同,但

    2024年02月07日
    浏览(46)
  • Kubernetes详解(十五)——Pod对象创建过程

    今天继续给大家介绍Linux运维相关知识,本文主要内容是Pod对象创建过程。 Pod对象是Kubernetes集群的基础对象,其创建过程如下所示: 从上图中可以看出,Pod的创建过程主要有以下步骤: 1、用户通过kubele或者其他API客户端提交Pod创建指令。 2、API将Pod对象的相关信息存入ETC

    2024年02月05日
    浏览(34)
  • 在CSDN学Golang云原生(Kubernetes Pod调度)

    在 Kubernetes 中,可以使用 NodeSelector 字段来指定 Pod 调度到哪些节点上运行。NodeSelector 是一个键值对的 map,其中键是节点的标签名,值是标签值。具体步骤如下: 在节点上添加标签 首先需要在节点上添加相应的标签,例如: 编写 Pod 的 YAML 文件 在编写 Pod 的 YAML 文件时,需

    2024年02月15日
    浏览(40)
  • 在CSDN学Golang云原生(Kubernetes Pod 有状态部署)

    Kubernetes StatefulSet 是 Kubernetes 中的一种资源类型,它能够保证有状态服务(Stateful Service)的唯一性和顺序部署,适用于需要持久化存储、网络标识、状态管理等场景。MongoDB 是一个非常流行的 NoSQL 数据库,下面我们介绍如何使用 Kubernetes StatefulSet 部署 MongoDB 集群。 创建一个

    2024年02月15日
    浏览(51)
  • 在CSDN学Golang云原生(Kubernetes Pod无状态部署)

    Kubernetes中的Pod是可以动态创建、销毁的,如果希望Pod只使用静态的IP地址而不是自动生成一个IP地址,那么就需要使用静态Pod。 静态Pod是在kubelet启动时通过指定文件夹路径来加载的。当kubelet检测到这些配置文件变化后,它会创建或删除相应的Pod,这样就可以轻松地部署静态

    2024年02月15日
    浏览(56)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包