Kubernetes中Pod容器的使用

2023-10-27

1 概述

Pod是K8S系统中可以创建和管理的最小单元,是资源对象模型中由用户创建或部署的最小资源对象模型

有许多组件围绕Pod进行扩展和支持,比如控制器对象是用来管控Pod对象的,Service或者Ingress资源对象是用来暴露Pod引用对象的,PersistentVolume资源对象是用来为Pod提供存储等。

1.1 Pod结构

Pod是多进程设计,一个Pod里面包含多个容器,而一个容器里面运行一个应用程序。

每个Pod都有一个特殊的被称为 “根容器”的Pause容器。Pause容器对应的镜像属于Kubernetes平台的一部分,为其他的业务容器作支撑。一般把业务相关联的容器放到一个pod里,从而方便相关容器之间网络互通和文件共享。

1.2 实现机制

Pod实现主要依赖于共享网络共享存储两大机制

  • 共享网络:docker创建的容器由于namespace和group而相互隔离的,在创建业务容器时会注册到 pause容器 中从而共享其 ip地址,mac地址,port 等信息,这样便处于同一个网络中实现网络的共享。

  • 共享存储:如下所示,每个容器会挂载到公共的数据卷Volume上,然后其数据都持久化存储到其中,当一个容器挂掉后,新的容器也能从Volume读取到之前的数据

  apiversion: v1
  kind: Pod
  metadata:
    name: my-pod
  spec:
    containers:
    -name: write
      image: centos
      command: ["bash", "-u","for i in {1..100};do echo $i » /data/hello;sleep 1;done"]
      # 挂载数据卷
      volumeMounts:
        -name: data
          mountPath: /data 
          
    -name: read
      image: centos
      command: [“bash",”-c","tail -f /data/hello"]
      # 挂载数据卷
      volumeMounts:
      -name: data
        mountPath: /data
    
    # 定义数据卷
    volumes:
    -name: data
      emptyDir: {}

2 Pod机制

2.1 镜像拉取策略

Pod的拉取策略主要分为了以下几种

  • IfNotPresent:默认值,镜像在宿主机上不存在才拉取
  • Always:每次创建Pod都会重新拉取一次镜像
  • Never:Pod永远不会主动拉取这个镜像
apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
    -name: nginx
    image: nginx:1.14
    # 拉取策略
    imagePullPolicy: Always

2.2 Pod资源限制

Pod在进行调度时,可以在调度器对资源的分配进行设置。例如限制使用的资源是 2C4G,那么在调度到对应的node节点时,只会占用对应的资源,对于不满足资源的节点则会跳过。

有两种资源配置的方式:

  • request:表示调度所需最少的资源
  • limits:表示最多允许使用的资源
apiVersion: v1
kind: Pod
metadata:
  name: frontend
spec:
  containers:
  - name: db
    image: mysql
    env:
    - name: MYSQL__ROOT_PASSWORD
      value: "password"
        
    resources:
      # 资源限制
      requests:
        memory: "64Mi"
        cpu: "250m"
        
      limits:
        memory: "128Mi"
        cpu: "500m"

2.3 Pod重启机制

当Pod中的容器出现问题时就会触发重启机制,重启策略主要分为以下三种

  • Always:当容器终止退出后,总是重启容器,默认策略 【nginx等,需要不断提供服务】
  • OnFailure:当容器异常退出(退出状态码非0)时,才重启容器。
  • Never:当容器终止退出,从不重启容器
apiVersion: v1
kind: Pod
metadata:
  name: dns-test
spec:
  containers:
  - name: busybox
    image: busybox:1.28
    args:
    - /bin/sh
    - -c
    - sleep 33000
  # 重启策略
  restartPolicy: Never

2.4 Pod健康检查

通过容器检查来判断服务是否可用,共有两种检查方式:存活检查livenessProbe,如果检查失败,将杀死容器,根据Pod的restartPolicy来操作;就绪检查readinessProbe,如果检查失败,Kubernetes会把Pod从Service endpoints中剔除

Probe支持以下三种检查方式

  • http Get:发送HTTP请求,返回200 - 400 范围状态码为成功
  • exec:执行Shell命令返回状态码是0为成功
  • tcpSocket:发起TCP Socket建立成功
apiVersion: v1
kind: Pod
metadata:
  labels:
    test: liveness
  name: liveness-exec
spec:
  containers:
  - name: liveness
    image: busybox
    args:
    - /bin/sh
    - -c
    - touch /tmp/healthy; sleep 30;
    # 通过exec来执行存活检查
    livenessProbe:
      exec:
        command:
        -cat
        -/tmp/healthy
      initialDelaySeconds: 5
      periodSeconds: 5

3 调度策略

创建Pod流程如下:

  • 首先创建一个pod,然后创建一个API Server 和 Etcd,把创建出来的信息存储在etcd中
  • 然后创建 Scheduler,监控API Server是否有新的Pod,如果有的话,会通过调度算法把pod调度具体node上
  • 在node节点,会通过 kubelet -- apiserver 读取etcd 拿到分配在当前node节点pod信息,然后通过docker创建容器
影响Pod调度的属性

在Pod调度时会有多个条件影响调度结果。

首先调度器会考虑Pod的资源限制,根据request找到满足条件的node节点进行调度

3.1 节点选择器NodeSelector

调度器会根据节点的标签将任务调度到符合条件的节点上,例如下面将任务调度到标签为dev的节点上

apiVersion: v1
kind: Pod
metadata:
  name: pod-example
spec:
  # 根据节点选择器标签进行调度
  nodeSelector:
    env role: dev
  containers:
  -name: nginx
    image: nginx:1.15

可以通过以下命令为节点新增标签,然后节点选择器就会进行调度了

kubectl label node node1 env_role=prod

3.2 节点亲和性NodeAffinity

节点亲和性和之前nodeSelector 基本一样的,根据节约束条件来决定Pod调度到哪些节点上

  • 硬亲和性:约束条件必须满足,不满足则不分配
  • 软亲和性:尝试满足,不保证
apiVersion: v1                                              
kind: Pod                                                    
metadata:                                                    
   name: with-node-affinity                                    
spec:                                                             
   affinity:                                                   
     nodeAffinitv:
       # 硬亲和性
       requiredDuringSchedulinglgnoredDuringExecution:
         nodeSelectorTerms:
         - matuhExpEessions:
           - key: env sle
             operator: In
             values:
               - dev
               - test
       # 软亲和性
       preferredDuringSchedulinglgnoredDuringExecution:
       - weight: 1
         preference:
           matchExpressions:
           - key: group
             operator: In
             values:
             - otherprod

支持常用操作符:in、NotIn、Exists、Gt、Lt、DoesNotExists

反亲和性:就是和亲和性刚刚相反,如 NotIn、DoesNotExists等

3.3 污点Taint

通过Taint 将节点添加污点,从而使本节点不做普通分配调度。nodeSelector 和 NodeAffinity,都是Pod的属性,而污点是节点的属性。

可以通过污点

  • 专用节点【限制ip】
  • 配置特定硬件的节点【固态硬盘】
  • 基于Taint驱逐【在node1不放,在node2放】

通过如下命令查看污点情况

kubectl describe node k8smaster | grep Taint

污点值有三个

  • NoSchedule:一定不被调度
  • PreferNoSchedule:尽量不被调度【也有被调度的几率】
  • NoExecute:不会调度,并且还会驱逐Node已有Pod

通过如下命令为节点添加污点

kubectl taint node [node] key=value:污点的三个值

举例:

kubectl taint node k8snode1 env_role=yes:NoSchedule

# 删除污点
kubectl taint node k8snode1 env_role:NoSchedule-
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Kubernetes中Pod容器的使用 的相关文章

随机推荐

  • 因果推断——图的三种基本结构

    因果推断入门笔记 V Structure Chain链状 Fork叉状 Collider碰撞 1 Chain 链状结构 X gt Y gt Z X和Y相关 Y和Z相关 X和Z相关 但是 如果condition在Y上 则X和Z是统计独立的 这
  • 三相桥式全控整流电路matlab仿真实验,三相全控桥式整流电路仿真实验

    三相全控桥式整流电路仿真实验 7页 本资源提供全文预览 点击全文预览即可全文预览 如果喜欢文档就下载吧 查找使用更方便哦 19 90 积分 实验九 电力电子电路的仿真实验 三相全控桥式整流电路仿真实验 一 实验目的 1 掌握MATLAB仿真
  • 故事分享

    一 Java是兴趣所在 L同学坦言说自己喜欢python这门语言 觉得它很有魅力 他说自己对互联网感兴趣 平时接触很多 自己也有尝试自学 看了很多教学视频和资料 然后他更加确定了自己对python的喜欢 他还给自己设置了一个小目标 独自搭建
  • 域名绑定Github个人博客

    首先自吹一波 我个人的博客网址 我的个人博客 1 个人博客搭建 基础的建站工作以下一套视频足以KO 底部音乐栏可以研究一下帮助文档 帮助文档其实非常的重要 很多问题全都在最新版本的帮助文档里面 之前查了网上很多答案都不太对 最后研究了一下帮
  • 最详细的MySQL安装、卸载

    MySQL是想在最主流的关系型数据库 所以作为一名 伟大 的程序猿 你的电脑上是必须要有的 相比较而言安装MySQL数据库还是很简单的 类似于傻瓜式安装 卸载 相对麻烦一些 需要手动删除一些文件 当然要仔细一些 演示版本MySQL 5 7
  • uniapp组件库总结笔记

    uView ui uView 2 0 全面兼容 nvue 的 uni app 生态框架 uni app UI 框架 优点 整体样式风格不错 缺点 不支持vue3 可以使用社区维护的uview plus uview plus 3 0 全面兼容
  • 蓝桥杯2015年第六届真题-机器人塔

    题目 题目链接 题解 DFS 二进制枚举 经典dfs之一 好像比较经典的那个同型dfs题叫 符号三角形 可以看出上面一行的安排方式均由下面一行的安排方式决定 因此我们只要定好最后一行 那么上面的安排方式均可以由下行推出 且最后一行固定则整个
  • 黑马实战项目瑞吉外卖的总结

    文章目录 一 瑞吉外卖项目总结 1 后端Controller层返回结果统一封装的R对象 2 定义静态资源映射关系 3 配置消息资源转换器 3 1 Reggie项目中遇到的问题 3 2 原理 3 3 解决方案 3 4 示例 4 Mybatis
  • python3的xpath_python3爬虫之xpath

    一 简介 XPath 是一门在 XML 文档中查找信息的语言 XPath 可用来在 XML 文档中对元素和属性进行遍历 XPath 是 W3C XSLT 标准的主要元素 并且 XQuery 和 XPointer 都构建于 XPath 表达之
  • 华为OD机试 - 最长连续子序列(Java)

    题目描述 有N个正整数组成的一个序列 给定整数sum 求长度最长的连续子序列 使他们的和等于sum 返回此子序列的长度 如果没有满足要求的序列 返回 1 输入描述 第一行输入是 N个正整数组成的一个序列 第二行输入是 给定整数sum 输出描
  • SpringCloud Alibaba Seata处理分布式事务

    文章目录 第一章 分布式事务问题 第二章 Seata简介 2 1 Seata是什么 2 2 Seata 整体工作流程 2 3 Seata AT 模式 2 3 1 AT 模式的前提 2 3 2 AT 模式的工作机制 2 4 下载 第三章 Se
  • react 事件绑定this指向

    一 使用class的实例方法 class Hello extends React Component onIncrement gt this setState count this state count 1 二 箭头函数
  • 如何透过上层div点击下层的元素解决方法

    如何透过上层div点击下层的元素解决方法 参考文章 1 如何透过上层div点击下层的元素解决方法 2 https www cnblogs com wei dong p 9928566 html 备忘一下
  • 可以估计不确定性的神经网络:SDE-Net

    作者丨段易通 知乎 来源丨https zhuanlan zhihu com p 234834189 编辑丨极市平台 随着深度学习技术的不断发展 DNN模型的预测能力变得越来越强 然而在一些情况下这却并不是我们想要的 比如说给模型一个与训练集
  • 多线程如何保证线程安全

    1 每次使用该对象的时候都创建一次 造成创建和销毁对象开销大 2 对方法进行加锁 造成线程阻塞性能差 3 使用ThreadLocal保证每个线程对同一个对象只创建一次 gt 较好的方法 ThreadLocal提供了线程的局部变量 每个线程都
  • windows下gvim打开文件显示乱码的解决

    问题 在windows中安装了gvim73 但是 使用gvim打开文件的时候 如果文件内容包含中文 那么 打开之后总是看到一堆乱码 解决办法 放狗搜了一下 发现这篇文章完美地解决了我的问题 http www douban com note
  • C. Doremy‘s IQ #808 div2

    Problem C Codeforces 题意就是给你一串序列 一个定值 如果对应的ai小于定值 就降智 否则直接过去 问你输出最多的方案 应该把心静一下的 思路不难想 对于我来说 应该是代码部分不太好实现 这个算是一个积累吧 思路是 尽量
  • 第八篇 算法————程序的灵魂

    2 1 程序 算法 数据结构 一个程序主要包括以下两方面的信息 1 对数据的描述 在程序中要指定哪些数据 以及这些数据的类型和数据的组织形式 这就是数据结构 2 对操作的描述 要求计算机进行操作的步骤 也就是算法 数据是操作的对象 操作的目
  • MSP432使用CCS模数转换(ADC)通用输入输出(GPIO)脉宽调制(PWM)通用异步接收器和发送器(UART)及其RTOS和机器人超声波距离检测

    示例 1 这段代码只会打开一个 P1 0 板载 LED 它是 MSP432 在寄存器级别的红色板载 LED include msp h void main void WDT A gt CTL WDT A CTL PW WDT A CTL H
  • Kubernetes中Pod容器的使用

    1 概述 Pod是K8S系统中可以创建和管理的最小单元 是资源对象模型中由用户创建或部署的最小资源对象模型 有许多组件围绕Pod进行扩展和支持 比如控制器对象是用来管控Pod对象的 Service或者Ingress资源对象是用来暴露Pod引