【Kubernetes基础--Pod深入理解】--查阅笔记2

news2025/4/16 13:41:18

深入理解Pod

  • 为什么要有个Pod
    • 1. 容器协作与资源共享
    • 2. 简化调度和资源管理
    • 3. 设计模式支持
  • Pod 基本用法
  • Pod 容器共享 Volume
  • Pod 的配置管理
    • ConfigMap 概述
    • 创建 ConfigMap 资源对象
    • 在 Pod 中使用 ConfigMap
    • 使用 ConfigMap 的限制条件

为什么要有个Pod

Pod 的引入并非技术冗余,而是 k8s 为应对容器编排复杂性的关键设计。它提供的是一种编排思想,而非具体的技术方案。

Pod 作为 k8s 最小的调度和管理单元,解决了容器化环境中的多个关键问题:

1. 容器协作与资源共享

  • 亲密关系容器组:Pod 允许同一组容器共享 Network Namespace 和 Volume,这些容器需要紧密协作(如共享网络、存储或进程空间)。例如,日志收集容器与应用容器共享日志目录,或 Sidecar 模式下的代理容器与主应用容器通过本地 Socket 通信
  • 统一网络和存储:Pod 内容器共享 同一个 IP 和端口范围,可以通过 localhost 直接通信;共享 Volume 可以实现文件交换(配置文件、临时数据等)

2. 简化调度和资源管理

  • 成组调度:需要共同运行的容器(比如 Web 服务与缓存服务)必须部署在同一个节点。Pod 作为整体调度单位,避免因分散部署导致资源不足或依赖失效。例如,k8s 直接以 Pod 为粒度分配 CPU、内存资源,而非逐个容器计算
  • 统一生命周期:Pod 内的容器具有一致的生命周期。若某个容器异常退出,K8S 可基于 Pod 的重启策略(如 Always、OnFailure)统一处理,而非单独管理每个容器。
  • 统一运维:扩缩容、滚动升级等操作以 Pod 为单位,当节点故障时,K8S 可直接重建整个 Pod,而非逐个恢复容器,提升系统健壮性

3. 设计模式支持

  • Infra 容器:每个 Pod 默认有一个 Infra 容器(pause 容器),负责创建共享的 Network Namespace 和 Volume。用户容器通过加入 Infra 容器的命名空间实现资源共享,解决了容器启动顺序依赖问题
  • 扩展设计:Pod 支持 Init 容器(初始化任务)、Sidecar 容器(辅助功能如日志转发)等模式,增强了应用的可维护性。例如,通过 Sidecar 实现服务网格的流量代理

Pod 基本用法

使用 Docker 时,我们使用 docker run 来创建并启动一个容器。但是,在 k8s 中对长时间运行容器的要求是:其主程序需要一直在前台执行

比如,我们使用 ./start.sh & 在后台执行程序,则在 k8s 创建包含这个容器的 Pod 之后运行完该命令,即认为 Pod 执行结束,将立刻销毁。如果为该 Pod 定义了 RC,则系统会监控到该 Pod 已经终止,之后根据 RC 定义中 Pod 的 replicas 副本数量生成一个新的 Pod。一旦创建新的 Pod,就在执行完启动命令后陷入无限循环的过程中。这就是Kubernetes需要我们自己创建的 Docker 镜像并以一个前台命令作为启动命令的原因。

以一种场景举例,frontend 和 redis 两个容器应用为紧耦合的关系,并组合成一个整体对外提供服务时,应将这两个容器打包为一个Pod,配置文件 frontend-localredis-pod.yaml:

apiVersion: v1
kind: Pod
metadata:
  name: redis-php
  labels:
    name: redis-php
spec: 
  containers:
  - name: frontend
    image: kubeguide/guestbook-php-frontend:localredis
    ports:
    - containerPort: 80
  - name: redis
    image: kubeguide/redis-master
    ports:
    - containerPort: 6379

属于同一个 Pod 的多个容器应用之间相互访问时仅需要通过 localhost 就可以通信,使得这一组容器被“绑定”在了一个环境中。

kubectl create -f frontend-localredis-pod.yaml
# pod "redis-php" created

kubectl get pods   # READAY 2/2 表示两个容器都成功运行了
kubectl describe pod redis-php # 显示 pod 详细信息

Pod 容器共享 Volume

同一个 Pod 中的多个容器能够共享 Pod 级别的存储卷 Volume。Volume 可以被定义为各种类型,多个容器各自进行挂载操作,将一个 Volume 挂载为容器内部需要的目录。

看个例子:在 Pod 内包含两个容器:tomcat 和 busybox,在 Pod 级别设置 Volume “app-logs”​,用于tomcat向其中写日志文件,busybox 读日志文件,配置文件 pod-volume-applogs.yaml:

apiVersion: v1
kind: Pod
metadata:
  name: volume-pod
spec:
  containers:
  - name: tomcat
    image: tomcat
    ports:
    - containerPort: 8080
    volumeMounts:
    - name: app-logs
      mountPath: /usr/local/tomcat/logs
  - name: busybox
    image: busybox
    command: ["sh", "-c", "tail -f /logs/catalina*.log"]
    volumeMounts:
    - name: app-logs
      mountPath: /logs
  volumes:
  - name: app-logs
    emptyDir: {}

Volume 名为 app-logs,类型为 emptyDir(还可设置其他类型,如 hostPath,configMap等),挂载到 tomcat 容器内的/usr/local/tomcat/logs 目录,同时挂载到 busybox 容器内的 /logs 目录。tomcat 容器在启动后会向 /usr/local/tomcat/logs 目录写文件,busybox 容器就可以读取其中的文件了。

# busybox 容器的启动命令为tail -f /logs/catalina*.log,我们可以通过 kubectl logs 命令查看 busybox 容器的输出内容:
kubectl logs volume-pod -c busybox
# 登录 tomcat 容器进行查看
kubectl exec -ti volume-pod -c tomcat -- ls /usr/local/tomcat/logs
kubectl exec -ti volume-pod -c tomcat -- tail /usr/local/tomcat/logs/catalina*.log

Pod 的配置管理

将应用所需的配置信息与程序进行分离,可以使应用程序被更好地复用,通过不同的配置也能实现更灵活的功能。
将应用打包为容器镜像后,可以通过环境变量或者外挂文件的方式在创建容器时进行配置注入。k8s 1.2开始提供统一的应用配置管理–ConfigMap,实现多个容器的配置。

ConfigMap 概述

  • 生成为容器内的环境变量
  • 设置容器启动命令的启动参数(需设置为环境变量)​
  • 以 Volume 的形式挂载为容器内部的文件或目录

ConfigMap 以 key:value 的形式保存在 k8s 系统中供应用使用,既可以用于表示一个变量的值(例如 apploglevel=info)​,也可以用于表示一个完整配置文件的内容(例如server.xml=<?xml…>…)。

可以通过 YAML 配置文件或者直接使用 kubectl create configmap 命令行的方式来创建 ConfigMap。

创建 ConfigMap 资源对象

  1. 通过 YAML 配置文件方式创建
    举例 cm-appvars.yaml 将几个应用所需的变量定义为 ConfigMap 的用法:
apiVersion: v1
kind: ConfigMap
metadata:
  name: cm-appvars
data:
  apploglevel: info
  appdatadir: /var/data

执行 create 命令创建

kubectl create -f cm-appvars.yaml  # ConfigMap "cm-appvars" created

kubectl get configmap

kubectl describe configmap cm-appvars

kubectl get configmap cm-appvars -o yaml

cm-appconfigfiles.yaml 描述了将两个配置文件 server.xml 和 logging.properties 定义为 ConfigMap 的用法,设置 key 为配置文件的别名,value 则是配置文件的全部文本内容:

apiVersion: v1
kind: ConfigMap
metadata:
  name: cm-appconfigfiles
data:
  key-serverxml: |
    <?xml version='1.0' encoding='utf-8' ?>
    <Server port="8080" shutdown="SHUTDOWN">
      <Listener className="xxx" />
      ...
    </Server>
  key-loggingproperties: "handles
    =filehanlder\r\n\r\nformatter
    =simpleformater\r\n\r\nlevel
    =info\r\n\r\n"
  1. 通过 kubectl 命令创建
  • 通过 --from-file 参数从文件中进行创建,可以指定 key 的名称,也可以在一个命令行中创建包含多个 key 的 ConfigMap:
kubectl create configmap NAME --from-file=[key=]source --from-file=[key=]source

kubectl create configmap cm-server.xml --from-file=server.xml # ConfigMap "cm-server.xml" created
kubectl describe configmap cm-server.xml
  • 通过 --from-file 参数从目录中进行创建,该目录下的每个配置文件名都被设置为 key,文件的内容被设置为 value:
kubectl create configmap NAME --from-file=config-files-dir

kubectl create configmap cm-appconf --from-file=configfiles
kubectl describe configmap cm-appconf
  • 使用 --from-literal 时会从文本中进行创建,直接将指定的 key=value创建为 ConfigMap 的内容:
kubectl create configmap NAME --from-literal=key1=value1 --from-literal=key2=value2

kubectl create configmap cm-appenv --from-literal=loglevel=info --from-literal=appdatadir=/var/data
kubectl describe configmap cm-appenv

在 Pod 中使用 ConfigMap

  1. 通过环境变量使用 ConfigMap
    以前面的 ConfigMap “cm-appvars” 为例,在 Pod “cm-test-pod” 中,将 ConfigMap “cm-appvars” 中的内容以环境变量方式设置为容器内部的环境变量,容器的启动命令将显示这两个环境变量
apiVersion: v1
kind: Pod
metadata:
  name: cm-test-pod
spec:
  containers:
  - name: cm-test
    image: busybox
    command: [ "/bin/sh", "-c", "env | grep APP" ]
    env:
    - name: APPLOGLEVEL             # 定义环境变量的名称
      valueFrom:                     # key“apploglevel”对应的值
      configMapKeyRef:
        name: cm-appvars          # 环境变量的值取自cm-appvars:
        key: apploglevel          # key为apploglevel
    - name: APPDATADIR              # 定义环境变量的名称
      valueFrom:                     # key“appdatadir”对应的值
      configMapKeyRef:
        name: cm-appvars          # 环境变量的值取自cm-appvars
        key: appdatadir           # key为appdatadir
  restartPolicy: Never            # 不会自动重启

使用 kubectl create -f 命令创建该 Pod,由于是测试 Pod,所以该 Pod 在执行完启动命令后将会退出,并且不会被系统自动重启(restartPolicy=Never)​:

kubectl create -f cm-test-pod.yaml  # pod "cm-test-pod" created

kubectl get pods --show-all # 使用kubectl get pods --show-all查看已经停止的 Pod
# 查看该Pod的日志,可以看到启动命令“env | grep APP”的执行结果
kubectl logs cm-test-pod
# APPDATADIR=/var/data
# APPLOGLEVEL=info

k8s 1.6版本开始,引入新的字段 envFrom,实现了在 Pod 环境中将 ConfigMap(也可用于 Secret 资源对象)中所有定义的 key=value 自动生成为环境变量:

apiVersion: v1
kind: Pod
metadata:
  name: cm-test-pod
spec:
  containers:
  - name: cm-test
    image: busybox
    command: [ "/bin/sh", "-c", "env" ]
    envFrom:
    - configMapRef
      name: cm-appvars      # 根据cm-appvars中的 key=value 自动生成环境变量
  restartPolicy: Never

注意:环境变量的名称受POSIX命名规范(​[a-zA-Z_]​[a-zA-Z0-9_]*)约束,不能以数字开头。如果包含非法字符,则系统将跳过该条环境变量的创建,并记录一个Event来提示环境变量无法生成,但并不阻止Pod的启动

  1. 通过 volumeMount 使用 ConfigMap
    在Pod “cm-test-app” 的定义中,将 ConfigMap “cm-appconfigfiles” 中的内容以文件的形式 mount 到容器内部的 /configfiles 目录下。Pod 配置文件cm-test-app.yaml:
apiVersion: v1
kind: Pod
metadata:
  name: cm-test-app
spec:
  containers:
  - name: cm-test-app
    image: tomcat-app:v1
    ports:
    - containerPort: 8080
    volumeMounts:
    - name: serverxml                    # 引用Volume的名称
      mountPath: /configfiles            # 挂载到容器内的目录
  volumes:
  - name: serverxml                      # 定义Volume的名称
    configMap:
      name: cm-appconfigfiles            # 使用ConfigMap“cm-appconfigfiles”
      items:
      - key: key-serverxml               # key=key-serverxml
        path: server.xml                 # value将server.xml文件名进行挂载
      - key: key-loggingproperties       # key=key-loggingproperties
        path: logging.properties         # value将logging.properties文件名进行挂载

创建 Pod,进入容器,查看 /configfiles 目录下存在 serverl.xml 和 logging.properties 文件,内容为 ConfigMap “cm-appconfigfiles” 中两个 key 定义的内容:

kubectl create -f cm-test-app.yaml

kubectl exec -ti cm-test-app -- bash

cat /configfiles/server.xml
cat /configfiles/logging.properties

在引用 ConfigMap 时不指定 items,则使用 volumeMount 方式在容器内的目录下为每个 item 都生成一个文件名为 key 的文件:

apiVersion: v1
kind: Pod
metadata:
  name: cm-test-app
spec:
  containers:
  - name: cm-test-app
    image: tomcat-app:v1
    imagePullPolicy: Never
    ports:
    - containerPort: 8080
    volumeMounts:
    - name: serverxml               # 引用Volume的名称
      mountPath: /configfiles      # 挂载到容器内的目录
  volumes:
  - name: serverxml                 # 定义Volume的名称
    configMap:
      name: cm-appconfigfiles      # 使用ConfigMap“cm-appconfigfiles”

查看到在 /configfiles 目录下存在key-loggingproperties和key-serverxml文件,文件的名称来自在ConfigMap cm-appconfigfiles中定义的两个key的名称,文件的内容则为value的内容

kubectl create -f cm-test-app.yaml

ls /configfiles  # key-loggingproperties  key-serverxml        

使用 ConfigMap 的限制条件

  • ConfigMap 必须在 Pod 之前创建
  • ConfigMap 受 Namespace 限制,只有处于相同 Namespace 中的 Pod 才可以引用它
  • kubelet 只支持可以被API Server管理的 Pod 使用 ConfigMap。kubelet 在本 Node 上通过–manifest-url 或 --config 自动创建的静态 Pod将无法引用 ConfigMap
  • 在 Pod 对 ConfigMap 进行挂载(volumeMount)操作时,在容器内部只能挂载为“目录”​,无法挂载为“文件”​。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2335994.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Maven超级详细安装部署

1.到底什么是Maven&#xff1f;搞清楚这个 Maven 是一个项目管理工具&#xff0c;主要用于 Java 项目的构建、依赖管理和文档生成。 它基于项目对象模型&#xff08;POM&#xff09;&#xff0c;通过 pom.xml 文件定义项目的配置。 &#xff08;简单说破&#xff1a;就是工程…

电机控制-隆博戈观测器(Luenberger state observer)

本文围绕基于无传感器控制策略的状态观测器展开&#xff0c;介绍其在电机领域的应用、原理、性能表现及无传感器驱动的优劣&#xff1a; 应用场景&#xff1a;适用于燃油泵、风扇等大量固定转速和低成本应用场景。工作原理&#xff1a;状态观测器利用完整的电机微分模型&#…

RK3506+net9+VS2022跨平台调试C#程序

下载GetVsDbg.sh &#xff0c;这脚本会下载一个压缩包&#xff0c;然后解压缩&#xff0c;设置x权限等等。但是目标板子连不上&#xff0c;就想办法获取到下载路径&#xff0c;修改这个脚本&#xff0c;显示这个下载链接后&#xff0c;复制一下&#xff0c;用电脑下下来 修改好…

【16】数据结构之基于树的排序算法篇章

目录标题 选择排序简单选择排序树形选择排序 堆排序堆的定义Heap小跟堆大根堆堆的存储堆的代码设计堆排序的代码设计 排序算法综合比较 选择排序 基本思想&#xff1a;从待排序的序列中选出最大值或最小值&#xff0c;交换该元素与待排序序列的头部元素&#xff0c;对剩下的元…

华熙生物亮相消博会,这次又带来了什么样的变化?

首先&#xff0c;从展示层面来看&#xff0c;华熙生物在消博会上构建科技桥梁&#xff0c;展台主视觉展示糖生物学发展历程与自身发展交织历程&#xff0c;这象征着中国生物科技企业从产业突围到定义全球标准的蜕变。这一展示不仅提升了华熙生物的品牌形象&#xff0c;更向外界…

大象机器人推出myCobot 280 RDK X5,携手地瓜机器人共建智能教育机

摘要 大象机器人全新推出轻量级高性能教育机械臂 myCobot 280 RDK X5&#xff0c;该产品集成地瓜机器人 RDK X5 开发者套件&#xff0c;深度整合双方在硬件研发与智能计算领域的技术优势&#xff0c;实现芯片架构、软件算法、硬件结构的全栈自主研发。作为国内教育机器人生态合…

【初阶数据结构】——算法复杂度

一、前言 1、数据结构是什么&#xff1f; 数据结构(Data Structure)是计算机存储、组织数据的⽅式&#xff0c;指相互之间存在⼀种或多种特定关系的数 据元素的集合。没有⼀种单⼀的数据结构对所有⽤途都有⽤&#xff0c;所以我们要学各式各样的数据结构&#xff0c; 如&…

Google-A2A协议全面解析:一文掌握Agent-to-Agent协议的核心与应用

前言&#xff1a; 在当今人工智能技术飞速发展的时代&#xff0c;智能体&#xff08;Agent&#xff09;已悄然融入我们生活的各个角落。无论是个人智能助手&#xff0c;还是企业的自动化工具&#xff0c;各类AI代理的应用愈发广泛。但目前这些智能体之间大多处于孤立状态&…

Linux-服务器添加审计日志功能

#查看audit软件是否在运行(状态为active而且为绿色表示已经在运行) systemctl start auditd #如果没有在运行的话,查看是否被系统禁用 (audit为0表示被禁用) cat /proc/cmdline | grep -w "audit=0" #修改/etc/default/grub里面audit=0 改为audit=1 #更新GRUB…

基于机器视觉的多孔零件边缘缺陷检测(源码C++、opencv、凸包、凸缺陷检测)

&#x1f451;主页&#xff1a;吾名招财 &#x1f453;简介&#xff1a;工科学硕&#xff0c;研究方向机器视觉&#xff0c;爱好较广泛… ​&#x1f4ab;签名&#xff1a;面朝大海&#xff0c;春暖花开&#xff01; 基于机器视觉的多孔零件边缘缺陷检测&#xff08;源码C、ope…

如何使用AI辅助开发CSS3 - 通义灵码功能全解析

一、引言 CSS3 作为最新的 CSS 标准&#xff0c;引入了众多新特性&#xff0c;如弹性布局、网格布局等&#xff0c;极大地丰富了网页样式的设计能力。然而&#xff0c;CSS3 的样式规则繁多&#xff0c;记忆所有规则对于开发者来说几乎是不可能的任务。在实际开发中&#xff0c…

MySQL入门:数据表的创建

​今天我们来介绍一下除HTML外的另一种语言&#xff1a;MySQL语言&#xff1b; MySQL&#xff1a;即一种用于管理和处理关系数据库的标准语言。要用于执行查询、更新、管理数据库中的数据以及定义和操作数据库结构。 接下来我会逐一介绍它的作用以及其中数据表&#xff0c;数据…

数据库的基本原则

数据库的核心原则 原子性与持久性&#xff1a;原子性&#xff08;Atomicity&#xff09;确保一个事务中的所有操作要么全部完成&#xff0c;要么完全不执行&#xff0c;不会出现部分完成的情况。持久性&#xff08;Durability&#xff09;则保证一旦事务提交成功&#xff0c;即…

Rust 中的Relaxed 内存指令重排演示:X=0 Y=0 是怎么出现的?

&#x1f525; Rust 中的内存重排演示&#xff1a;X0 && Y0 是怎么出现的&#xff1f; 在并发编程中&#xff0c;我们经常会听说“内存重排&#xff08;Memory Reordering&#xff09;”这个术语&#xff0c;但它似乎总是只出现在理论或者别人口中的幻觉里。本文将通过…

C++进程间通信开发实战:高效解决项目中的IPC问题

C进程间通信开发实战&#xff1a;高效解决项目中的IPC问题 在复杂的软件项目中&#xff0c;进程间通信&#xff08;Inter-Process Communication, IPC&#xff09;是实现模块化、提高系统性能与可靠性的关键技术之一。C作为一门高性能的编程语言&#xff0c;广泛应用于需要高效…

FPGA-DDS技术的波形发生器

1.实验目的 1.1掌握直接数字频率合成&#xff08;DDS&#xff09;的基本原理及其实现方法。 1.2在DE2-115 FPGA开发板上设计一个可调频率的正弦波和方波发生器&#xff0c;频率范围10Hz~5MHz&#xff0c;最小分辨率小于1kHz。 1.3使用Quartus II进行仿真&#xff0c;并通过S…

C#实现通过MQTT Broker——EMQX发布订阅消息及其认证、授权的安全配置操作

一、准备内容 MQTT的构成、使用场景、工作原理介绍-CSDN博客文章浏览阅读656次,点赞7次,收藏12次。MQTT(Message Queuing Telemetry Transport)是一种轻量级、基于发布-订阅模式的消息传输协议【适用于资源受限的设备和低带宽、高延迟或不稳定的网络环境】它在物联网应用中…

【双指针】三数之和(medium)

三数之和&#xff08;medium&#xff09; 题⽬描述&#xff1a;解法&#xff08;排序双指针&#xff09;&#xff1a;算法思路&#xff1a;C 算法代码&#xff1a;Java 算法代码&#xff1a;注&#xff1a;数组转列表 题⽬链接&#xff1a;15. 三数之和 题⽬描述&#xff1a; …

【项目管理】第17章 项目干系人管理-- 知识点整理

项目管理-相关文档,希望互相学习,共同进步 风123456789~-CSDN博客 (一)知识总览 项目管理知识域 知识点: (项目管理概论、立项管理、十大知识域、配置与变更管理、绩效域) 对应:第6章-第19章 第6章 项目管理概论 4分第13章 项目资源管理 3-4分第7章 项目…

视频融合平台EasyCVR可视化AI+视频管理系统,打造轧钢厂智慧安全管理体系

一、背景分析 在轧钢厂&#xff0c;打包机负责线材打包&#xff0c;操作人员需频繁进入内部添加护垫、整理包装、检修调试等。例如&#xff0c;每班产线超过300件&#xff0c;12小时内人员进出打包机区域超过300次。若员工安全意识薄弱、违规操作&#xff0c;未落实安全措施就…