前言

本篇是Kubernetes第四篇,大家一定要把环境搭建起来,看是解决不了问题的,必须实战。从现在开始都是重要的核心概念,此篇偏一些Pod的概念介绍,后续每篇都会有实战。

Kubernetes系列文章:
  1. Kubernetes介绍
  2. Kubernetes环境搭建
  3. Kubernetes-kubectl介绍

什么是Pod

Pod是一个或一个以上的 容器(例如Docker容器)组成的,且具有共享存储/网络/UTS/PID的能力,以及运行容器的规范。并且在Kubernetes中,Pod是最小的可被调度的原子单位。


img

Pod就像是我们的一个虚拟机,上面除了运行我们的主应用程序之外,还可以运行一个与该应用紧密相关的进程。如日志收集工具、Git文件拉取器、配置文件更新重启器等。因为在Kubernetes中,一个Pod里的所有容器都只会被分配到同一台主机上运行。

为什么是Pod

  1. 对于容器来说采用单进程模型,不具备管理多个进程的能力,当我们想实现多个容器被绑定在一起进行管理的时候,容器就不能满足我们,我们可以制作为镜像,显然这是很麻烦的;
  2. 对于容器来说,与其它容器是完全隔离的,通常情况下,无法与其它容器共享网络、存储。只能通过暴露的端口进行相互访问,当容器之间存在共享存储并且相互依赖的时候,容器就不能满足我们;

由于容器不能满足以上情况,因此Kubernetes就设计出来Pod的概念,对于Pod来说可以包含一个或者多个容器,这样对于多个容器需要一起部署的情况就迎刃而解。此外每个Pod来说都运行着一个特殊的被称之为Pause的容器,其他容器被称为业务容器,业务容器共享Pause容器的网络栈和Volume挂载卷,因此他们之间通信和数据交换更为高效。在设计时可以充分利用这一特性,将一组密切相关的服务进程放入同一个Pod中;同一个Pod里的容器之间仅需通过localhost就能互相通信。


img

此外Pod还可以定义Init Container,如果为一个 Pod 指定了多个 Init 容器,这些Init容器会按顺序逐个运行。每个 Init 容器都必须运行成功,下一个才能够运行。当所有的 Init 容器运行完成时,Kubernetes 才会为 Pod 初始化应用容器。如果Pod的Init容器失败,Kubernetes会不断地重启Pod,直到Init容器成功为止。


img

Init Container让我们解决当容器存在依赖关系时候的启动问题,比较经典的案例就是war和Tomcat之间的依赖问题,我们可以将war定义为Init Container,之后在启动Tomcat。

Pod配置文件介绍


image.png

Pod相关配置大致分为五类,这里重点介绍spec、metadata相关配置,关于version其实没有太多说的,kind会在后面类型介绍说明,status会在Pod的生命周期中介绍。

metadata

image.png

关于metadata就是给pod定义一些元数据,方便进行资源管理,大致分为是三种维度:

  1. NameSpace: 命名空间划分可以按照业务域或者团队,当然如果集群数量太少其实没必要的;
  2. Labels: 标签能够附加于 Kubernetes 的任何资源对象之上,可以在资源创建时指定,也可以随时按需添加在活动对象之中,由标签选择器进行匹配检查完成资源筛选。一个对象可拥有不止一个标签,而同一个标签也可以被添加至多个资源之上。在实践中可以按照多个不同维度的标签以实现灵活的资源分组管理功能,可以分为版本标签、环境标签、应用标签等等;
  3. Annotation: 与标签类似,注解也是“键值”类型的数据,不过它不能用于标签及筛选 Kubernetes 对象,仅可用于为资源提供“元数据”信息。另外,注解中的元数据不受字符数量的限制,它可大可小,可以为结构化或非结构化形式,也支持使用在标签中禁止使用的其他字段;
spec

image.png

spec可以分为两类:一类为pod相关的,另外一类是容器相关的;凡是调度、网络、存储,以及安全相关的属性,基本上是 Pod 级别的,主要包括分为以下六种属性,可能漏掉的大家可以留言,我补充:

  1. NodeSelector: 设置NodeSelector表示将该Pod调度到包含这个label的node上;
  2. NodeName: 将Pod调度到指定的Node节点上,指定了nodeName的Pod会直接跳过Scheduler的调度逻辑,直接写入PodList列表;
  3. Volumes: 关于容器数据持久化的卷的定义,大致分为三类emptyDir、hostPath和projected,容器上有关于卷的挂载都是和pod相关的,图上图已经将每种卷的用途已经写明白了,大家可以认真阅读;
  4. RestartPolicy: Pod重启策略,分为三种Always、OnFailure、Never,后续还会有单独栏目专门来讲解Pod重启策略,这里先大致了解一下;
  5. 探针: 关于探针部分会在Pod的生命周期篇章中详细介绍,这里记住是三种类型:LivenessProbe、ReadinessProbe、StartupProbe;
  6. hostNetwork: 是否使用主机网络模式,默认为false,如果设置为true,表示使用宿主机网络,容器上有关端口的定义与Pod的网络也是不可分割的;

对于容器相关的属性,其实也离不开容器相关的镜像、容器网络、启动参数、环境、资源限制、挂载目录,看过之前我Docker介绍应该很容易理解这些配置文件的定义:

  1. Name: 定义容器的名称;
  2. Image: 拉取镜像名称;
  3. ImagePullPolicy: 镜像拉取的策略,包括Always、ifNotPresent、Never,Always总数拉取镜像仓库的镜像,如果标签是lastest那么说明每次都是拉取最新镜像;ifNotPresent仅当本地镜像缺失时方才从目标仓库下载镜像,Never禁止从仓库下载镜像,仅使用本地镜像;
  4. ports: 主要定义容器关于网络的参数,控制主要是Pod;
  5. 容器启动命令参数:command容器的启动命令列表,args传入的命名参数,类似于Dockerfile 中 ENTRYPOINT 定义义;
  6. 环境变量: env主要用于指定容器的环境变量;
  7. resources: 现在容器使用的CPU、内存相关的资源;
  8. 容器的卷: workingDir指定容器工作的目录,volumeMounts用于指定挂载到容器内部的存储卷配置;

结束

欢迎大家点点关注,点点赞!

Kubernetes-Pod介绍(-)的更多相关文章

  1. Kubernetes Pod 全面知识

    Pod 是在 Kubernetes 中创建和管理的.最小的可部署的计算单元,是最重要的对象之一.一个 Pod 中包含一个或多个容器,这些容器在 Pod 中能够共享网络.存储等环境. 学习 Kubern ...

  2. 三十五、kubernetes NameSpace介绍

    Kubernetes NameSpace 介绍 Kubernetes使用命名空间的概念帮助解决集群中在管理对象时的复杂性问题.命名空间允许将对象分组到一起,便于将它们作为一个单元进行筛选和控制.无论是 ...

  3. 三十四、kubernetes证书介绍

    Kubernetes 证书介绍 一.证书机制说明 Kubernetes 作为一个分布式集群的管理工具,保证集群的安全性是其一个重要的任务.API Server 是集群内部各个组件通信的中介,也是外部控 ...

  4. 三十一、kubernetes网络介绍

    Kubernetes 网络介绍 Service是Kubernetes的核心概念,通过创建Service,可以为一组具有相同功能的容器应用提供一个统一的入口地址,并且将请求负载分发到后端的各个容器应用上 ...

  5. Kubernetes Pod 驱逐详解

    原文链接:Kubernetes Pod 驱逐详解 在 Kubernetes 中,Pod 使用的资源最重要的是 CPU.内存和磁盘 IO,这些资源可以被分为可压缩资源(CPU)和不可压缩资源(内存,磁盘 ...

  6. Kubernetes Pod 镜像拉取策略

    Kubernetes Pod 镜像拉取策略 官方文档:https://kubernetes.io/docs/concepts/containers/images/ • IfNotPresent:默认值 ...

  7. Kubernetes Pod 资源限制

    Kubernetes Pod 资源限制 官方文档:https://kubernetes.io/docs/concepts/configuration/manage-compute-resources- ...

  8. Kubernetes Pod 调度约束

    Kubernetes Pod 调度约束 可以将pod调度到指定的节点Node内 默认:根据节点资源利用率等分配Node节点. nodeName用于将Pod调度到指定的Node名称上 nodeSelec ...

  9. Kubernetes Pod故障归类与排查方法

    Pod概念 Pod是kubernetes集群中最小的部署和管理的基本单元,协同寻址,协同调度. Pod是一个或多个容器的集合,是一个或一组服务(进程)的抽象集合. Pod中可以共享网络和存储(可以简单 ...

  10. Python Django撸个WebSSH操作Kubernetes Pod(下)- 终端窗口自适应Resize

    追求完美不服输的我,一直在与各种问题斗争的路上痛并快乐着 上一篇文章Django实现WebSSH操作Kubernetes Pod最后留了个问题没有解决,那就是terminal内容窗口的大小没有办法调整 ...

随机推荐

  1. Go语言基础知识总结(持续中)

    Go基础知识总结 变量声明 Go语言中的变量需要声明以后才可以使用(需要提前定义变量)并且声明后必须使用(不适用会报错) 标准声明 var 变量名 变量类型 example: var name str ...

  2. 论文笔记:(CVPR2017)PointNet: Deep Learning on Point Sets for 3D Classification and Segmentation

    目录 一. 存在的问题 二. 解决的方案 1.点云特征 2.解决方法 三. 网络结构 四. 理论证明 五.实验效果 1.应用 (1)分类: ModelNet40数据集 (2)部件分割:ShapeNet ...

  3. Linux的磁盘管理和进程管理(入门)

    查看磁盘使用情况 df :列出文件系统整体的磁盘使用量 增加-h参数可以使得显示的容量更人性化 du:检查磁盘空间使用量---需要进入文件中查看 挂载本地磁盘或文件 mount mount /dev/ ...

  4. 一文读懂Spring动态配置多数据源---源码详细分析

    Spring动态多数据源源码分析及解读 一.为什么要研究Spring动态多数据源 ​ 期初,最开始的原因是:想将答题服务中发送主观题答题数据给批改中间件这块抽象出来, 但这块主要使用的是mq消息的方式 ...

  5. JUC学习笔记(二)

    JUC学习笔记(一)https://www.cnblogs.com/lm66/p/15118407.html 1.Lock接口 1.1.Synchronized 1.1.1.Synchronized关 ...

  6. preg_replace函数/e 模式下的代码执行+一道例题

    目录 例一 例二 补充 看一道ctf题-----[BJDCTF2020]ZJCTF,不过如此 参考链接 例一 源码: <?php preg_replace('/(.*)/ei', 'strtol ...

  7. 智能合约审计-不安全的delegatecall

    简介 当合约A以delegatecall方式调用时, 相当于将外部合约B的func()代码复制过来 (其函数中涉及的变量或函数都需要在本地存在), 在合约A上下文空间中执行. 合约 pragma so ...

  8. “入职一年,那个被高薪挖来的Android开发被劝退了。”

    其实,在很多小伙伴的想法中,是希望通过跳槽实现薪酬涨幅,可是跳槽不是冲动后决定,应该谨慎啊~ 01 我的学弟,最近向我吐槽,2020 年上半年入职一家公司,当时是高薪挖走的他,所谓钱到位,工作也是充满 ...

  9. MySQL-初见

    目录 初识MySQL 数据库基本命令 创建数据库表 数据库引擎 修改和删除表字段 MySQL数据管理 DML语言 DQL查询数据 单表查询 WHERE条件子句 模糊查询:比较操作符 联表查询 排序查询 ...

  10. 操作系统思考 第十一章 C语言中的信号量

    第十一章 C语言中的信号量 作者:Allen B. Downey 原文:Chapter 11 Semaphores in C 译者:飞龙 协议:CC BY-NC-SA 4.0 信号量是学习同步的一个好 ...