​Pod

简介: ​Pod

概述


Pod是K8s系统中可以创建管理最小单位


Pod是资源对象模型中由用户创建或部署的最小资源对象模型,也是K8s上运行容器应用的资源对象,


其他的资源对象都是用来支撑扩展Pod对象的功能


比如


控制器对象是用来管控Pod对象


service或ingress资源对象是用来暴露Pod引用对象


PersistentVolume资源对象是为Pod提供存储的


k8s 不会直接处理容器,而是Pod。Pod由一个或多个container组成


Pod是K8s的最重要的概念,每一个Pod都有一个特殊的被称之为根容器的Pause容器。

Pause容器对应的镜像属于K8s的一部分。除了Pause容器,每个Pod还包含一个或多个紧密相关的用户业务容器


基本概念


  1. 最小部署单位


  1. 包含多个容器(一组容器的集合)


  1. 同一个Pod容器共享网络命名空间(同一个Pod,共享网络)


  1. Pod短暂存在


Pod存在的意义


  1. 创建容器使用Docker,一个Docker对应的是”一个”容器。一个容器有进程,一个容器运行一个应用程序


  1. Pod是“多进程”设计,运行多个应用程序


  1. Pod的存在,为了亲密性
  • 两个应用需要进行交互
  • 网络外部隔离,内部互通


Pod共享实现机制


共享网络


容器本身之间相互隔离


使用namespace、group进行隔离而存在


实现原理


首先创建Pause根容器,其中会创建info容器


Pause容器中拥有同一个Ip,Mac地址,port

之间使用socket实现网络互通


后创建业务容器1,将业务容器1加入到info容器中


同时创建业务容器2,将业务容器2加入到info容器中


使用中介的概念实现互相相连


通过Pause容器,把其他业务容器加入到Pause容器里面,让所有的业务容器在同一个名称空间中,从而实现网络共享


共享存储


apiVersion: v1
kind: Pod
metadata:
  name: myapp
  labels:
    name: myapp
spec:
  containers:
  - name: myapp
    image: centos
    # imagePullPolicy: Always
    # imagePullPolicy: IfNotPresent
    # imagePullPolicy: Never
    resources:
      limits:
        memory: "128Mi"
        cpu: "500m"
    command: ["bash", "-c", "for i in (1..100);done echo $i >> /data/demo;sleep 1;done"]
    volumeMounts:            # 挂载数据卷
      - mountPath: /data
        name: data
  - name: myapp
    image: centos
    command: ["bash", "-c", "tail -f /data/demo"]
    resources:
      limits:
        memory: "128Mi"
        cpu: "500m"
    volumeMounts:        # 挂载数据卷
      - mountPath: /data
        name: data
  volumes:        # 定义数据卷
    - name: data


Pod实现持久化存储机制


  • 日志数据


  • 业务数据


引入一个数据卷Volume的概念,使用数据进行持久化存储


镜像拉取策略


# imagePullPolicy: Always        # 每次创建都会拉取新的镜像
# imagePullPolicy: IfNotPresent    #  默认值,镜像不在宿主机上时拉取
# imagePullPolicy: Never        # 从不主动拉取,需手动拉取


Pod资源限制


- name: myapp
    image: centos
    command: ["bash", "-c", "tail -f /data/demo"]
    resources:
      limits:        # 需要的“最大”配置
        memory: "128Mi"
        cpu: "500m"
      requests:    # 需要的‘最低’配置
        memory: "64Mi"
        cpu: "250m"
    volumeMounts:
      - mountPath: /data
        name: data


此配置由docker完成,并非Pod


Pod重启机制


# restartPolicy: Never # 从不
# restartPolicy: Alway    # 当容器退出的时候,总是重启容器,默认策略
# restartPolicy: onFailure    当状态码非0的时候,才重启


建议使用onFailure, 如果不会关的话,alway机制会使小白的我关不掉。


Pod健康检查


容器检查并不能检查到全部,例如出现java的堆内存溢出造成java部分并不能提供正常服务,此时的pod还是Running状态


健康检查的两种机制


  • livenessProbe(存活检查)


  • 如果检查容器的状态为失败,则会根据Pod中restartPolicy来操作


  • readnessProbe(就绪检查)


  • 如果检查容器的状态为失败,则会把Pod从service endpoints中剔除


livenessProbe(存活检查),杀掉此容器,restartPolicy重启


readnessProbe,杀掉此服务,由其他节点提供 实现重启


livenessProbe健康检查的方式


HttpGet


发送Http请求,返回200-400范围内状态码表示成功


exec


执行Shell命令返回状态码为0则成功


tcpsocket


发起Tcp, socket建立连接则成功


livenessProbe:
      exec:    # 检查方式
        command:
        - cat
        - ??
      initialDelaySeconds: 5    # 检查的时间间隔
      periodSecond: 5        #


Pod创建流程


640 (1).jpg


  1. create Pod → Api service  存储至 ectd


  1. Scheduler → api service — 读取etcd  → 使用调度算法,把Pod 调度至某个Node中去


  1. kubelc  — api service — 读取 etcd拿到, 分配至当前节点—Docker创建容器


Pod调度


640 (2).jpg


标签选择器


640 (3).jpg


#  kubectl label [--overwrite] (-f FILENAME | TYPE NAME) KEY_1=VAL_1 ...
# 更新标签名
kubectl label node node1 env_rold=dev
# 查看标签名
kubectl get nodes NAME --show-labels


查看标签名


640 (4).jpg


节点亲和性


640 (5).jpg


支持的常用操作符号


  • In


  • NoIn


  • Exists


  • Gt (大于)


  • Lt(小于)


  • DoesNotExists


影响Pod调度


640 (6).jpg


# 查看污点kubectl describe nodes NodeName | grep Taint
kubectl describe nodes docker-desktop | grep Taint# 为节点添加污点kubectl taint node NodeNAME key=value:污点中三个值
kubectl taint node NodeNAME env_role=yes:NoSchedule    # 此时的Nodename不会被调度# 删除污点kubectl taint node NodeNAME env_role:NoSchedule-


污点中的值


NoSchedule:一定不被调度


PreferNoSchedule: 尽量不调度


NoExecute: 不会被调度,并且驱逐Node已有Pod



污点容忍


640 (7).jpg

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
Kubernetes 关系型数据库 MySQL
k8s教程(基础篇)-入门及案例
k8s教程(基础篇)-入门及案例
4470 0
|
1月前
|
存储 Kubernetes 应用服务中间件
Kubernetes权威指南-基础篇
Kubernetes(K8s)是Google开源的容器编排系统,源自Borg,现为CNCF旗舰项目。它自动化部署、扩展和管理容器化应用,提供服务发现、负载均衡、自我修复、配置管理等功能,是云原生时代的基础设施核心。
|
1月前
|
消息中间件 人工智能 Java
抖音微信爆款小游戏大全:免费休闲/竞技/益智/PHP+Java全筏开源开发
本文基于2025年最新行业数据,深入解析抖音/微信爆款小游戏的开发逻辑,重点讲解PHP+Java双引擎架构实战,涵盖技术选型、架构设计、性能优化与开源生态,提供完整开源工具链,助力开发者从理论到落地打造高留存、高并发的小游戏产品。
|
存储 Kubernetes 调度
关于Pod的基础知识概览
【6月更文挑战第19天】Pod是Kubernetes的基本执行单元,是最小部署和管理的粒度,包含一个或多个共享网络和存储的容器,常比喻为豆荚中的豆子。Pod中的容器共享IP和端口,便于协作,支持Docker等容器运行时。
|
8月前
|
SQL 关系型数据库 分布式数据库
利用 PolarDB PG 版向量化引擎,加速复杂 SQL 查询!完成任务领发财新年抱枕!
利用 PolarDB PG 版向量化引擎,加速复杂 SQL 查询!完成任务领发财新年抱枕!
225 14
|
Prometheus 监控 Cloud Native
prometheus-operator入门使用上篇之ServiceMonitor
关于使用Prometheus Operator和Kube-Prometheus Stack进行监控的入门教程,涵盖了从部署到监控云原生和非云原生应用的详细步骤,以及监控失败的排查方法。
938 3
prometheus-operator入门使用上篇之ServiceMonitor
|
存储 Kubernetes 调度
Kubernetes Pod深度解析:构建可靠微服务的秘密武器(上)
本文旨在全面而深入地探讨Kubernetes(K8s)中的Pod概念,为读者提供对其核心特性和应用场景的深入理解。Pod作为Kubernetes的最小部署单元,承载着容器化应用的核心功能,是构建云原生应用的重要基石。
|
Prometheus 监控 Kubernetes
Prometheus+Grafana+Alertmanager搭建全方位的监控告警系统-超详细文档(上)
Prometheus+Grafana+Alertmanager搭建全方位的监控告警系统-超详细文档
|
Kubernetes Ubuntu Linux
Kubernetes(K8S)集群管理Docker容器(部署篇)
Kubernetes(K8S)集群管理Docker容器(部署篇)
2478 1