​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

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
存储 Kubernetes 调度
k8s教程(pod篇)-DaemonSet(每个node上只调度一个pod)
k8s教程(pod篇)-DaemonSet(每个node上只调度一个pod)
251 0
|
存储 Kubernetes Docker
k8s--pod 介绍
k8s--pod 介绍
k8s--pod 介绍
|
存储 Kubernetes 负载均衡
【Kubernetes系统原理、核心资源、Pod原理与创建及生命周期管理、Job、Cronjob、Statefulset、Service负载均衡Ingress】
【Kubernetes系统原理、核心资源、Pod原理与创建及生命周期管理、Job、Cronjob、Statefulset、Service负载均衡Ingress】
400 2
|
容器 Perl
Kubernetes----Pod配置容器重启策略
Kubernetes----Pod配置容器重启策略
1999 0
|
6月前
|
Kubernetes 负载均衡 调度
k8s初始化pod-pod标签
k8s初始化pod-pod标签
58 1
|
8月前
|
Kubernetes 应用服务中间件 nginx
Kubernetes学习-深入Pod篇(一) 创建Pod,Pod配置文件详解
Kubernetes学习-深入Pod篇(一) 创建Pod,Pod配置文件详解
|
Kubernetes 监控 容器
kubectl 的作用
kubectl是Kubernetes命令行工具,用于与Kubernetes集群进行交互和管理。它提供了许多命令,用于管理集群、部署应用、监视资源状态、调试问题等。 以下是kubectl的主要功能: 1. 配置管理:kubectl可以用于查看、创建、修改和删除Kubernetes集群的配置信息,如节点、命名空间、服务账号、角色等。 2. 应用管理:kubectl可以用于管理应用程序的部署、扩容、缩放、更新和删除。通过kubectl,您可以创建和管理Pod、Service、Deployment、StatefulSet等资源对象。 3. 资源监控:kubectl可以获取和监视Kubernet
281 0
|
Kubernetes 容器 Perl
Kubernetes----Pod配置容器启动命令
Kubernetes----Pod配置容器启动命令
915 0
|
存储 Kubernetes 网络协议
k8s入门-定义一个Pod
k8s入门-定义一个Pod
296 0
|
Kubernetes 调度 开发者
K83 集群核心概念 pod_Pod 访问及删除 | 学习笔记
快速学习 K83 集群核心概念 pod_Pod 访问及删除
270 0
K83 集群核心概念 pod_Pod 访问及删除 | 学习笔记