K8S(七)—— Kubernetes Pod 基础概念与实战配置

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
    • [1、pod的基本概念 几种容器 2、pod 存在意义 3、pod 实现的机制 4、镜像拉取策略 5、镜像容器策略](#1、pod的基本概念 几种容器 2、pod 存在意义 3、pod 实现的机制 4、镜像拉取策略 5、镜像容器策略)
  • [一、Pod 基础详解](#一、Pod 基础详解)
    • [1.1 Pod 的基本概念的](#1.1 Pod 的基本概念的)
    • [1.2 Pod 的使用方式](#1.2 Pod 的使用方式)
      • [1.2.1 单容器 Pod](#1.2.1 单容器 Pod)
      • [1.2.2 多容器 Pod](#1.2.2 多容器 Pod)
    • [1.3 Pause 容器(基础容器)](#1.3 Pause 容器(基础容器))
    • [1.4 Pod 中的共享资源](#1.4 Pod 中的共享资源)
      • [1.4.1 网络共享](#1.4.1 网络共享)
      • [1.4.2 存储共享](#1.4.2 存储共享)
    • [1.5 Pod 的使用场景](#1.5 Pod 的使用场景)
    • [1.6 Pod 的类型](#1.6 Pod 的类型)
      • [1.6.1 自主式 Pod](#1.6.1 自主式 Pod)
      • [1.6.2 控制器管理的 Pod](#1.6.2 控制器管理的 Pod)
    • [1.7. Pod 的类型](#1.7. Pod 的类型)
    • [1.8. Pod容器的分类](#1.8. Pod容器的分类)
      • [1.8.1 基础容器(Infrastructure Container)](#1.8.1 基础容器(Infrastructure Container))
      • [1.8.2 初始化容器(Init Containers)](#1.8.2 初始化容器(Init Containers))
        • [1. 8.2.1 Init容器启动过程](#1. 8.2.1 Init容器启动过程)
        • [1. 8.2.2 Init 的容器作用](#1. 8.2.2 Init 的容器作用)
      • [1.8.3 应用容器(Main Containers)](#1.8.3 应用容器(Main Containers))
  • [二、Pod 的核心配置](#二、Pod 的核心配置)
    • [2.1 镜像拉取策略(imagePullPolicy)](#2.1 镜像拉取策略(imagePullPolicy))
      • [2.1.1 镜像拉取策略案例](#2.1.1 镜像拉取策略案例)
  • 总结

前言

1、pod的基本概念 几种容器

2、pod 存在意义
3、pod 实现的机制
4、镜像拉取策略
5、镜像容器策略

一、Pod 基础详解

1.1 Pod 的基本概念的

Pod 是 Kubernetes 集群里最小的部署单元,对应集群内一个运行中的进程;它可包含一个或多个耦合紧密的容器,这些容器共享网络、存储资源;Pod 是 K8s 管理容器的基础,Deployment、StatefulSet 等控制器均基于 Pod 实现扩展管理。

Kubernetes 中所有的控制器(如 Deployment、StatefulSet、DaemonSet 等)均以 Pod 为基础进行扩展


1、最小部署的单元

2、包含一个或者多个容器(一组容器的集合)

3、一个pod中的容器共享网络命名空间和存储资源

4、pod是短暂

1.2 Pod 的使用方式

根据包含的容器数量,Pod 主要分为两种使用方式:

1.2.1 单容器 Pod

最常见的用法,一个 Pod 仅包含一个容器。此时 Pod 可视为容器的"外壳",K8s 直接管理 Pod 而非容器。

bash 复制代码
apiVersion: v1
kind: Pod
metadata:
  name: single-container-pod
spec:
  containers:
  - name: nginx
    image: nginx:1.14

1.2.2 多容器 Pod

一个 Pod 包含多个容器,这些容器通常具有紧密的协作关系(如主应用与日志收集器),共享网络和存储资源,可通过 localhost 直接通信。

bash 复制代码
apiVersion: v1
kind: Pod
metadata:
  name: multi-container-pod
spec:
  containers:
  - name: app
    image: my-app:latest  # 主应用容器
  - name: sidecar
    image: log-collector:latest  # 日志收集边车容器

1.3 Pause 容器(基础容器)

每个 Pod 中都会默认运行一个特殊的 Pause 容器(又称"基础容器"),它是 Pod 的"基石",主要作用是:

  • 提供 Pod 级别的 Linux 命名空间(网络、PID 等),确保 Pod 内所有容器共享同一命名空间,Pod 内的所有容器共享网络和存储资源;
  • 维护 Pod 的网络端点,使容器间的通信更高效。

Pause 容器的镜像由 K8s 平台内置,用户无需手动配置。例如,在节点上执行 docker ps 可看到类似如下的容器:

bash 复制代码
registry.cn-hangzhou.aliyuncs.com/google-containers/pause-amd64:3.0   "/pause"

1.4 Pod 中的共享资源

Pod 内的容器通过共享资源实现协作,核心共享资源包括网络和存储:

1.4.1 网络共享

  • 每个 Pod 分配唯一的 IP 地址,所有容器共享该 IP 和端口范围;
  • 容器间可通过 localhost:端口 直接通信;
  • 与集群外通信时,需通过宿主机节点端口映射或 Service 暴露。

1.4.2 存储共享

  • Pod 可定义多个 Volume(存储卷),所有容器均可挂载并访问;
  • Volume 支持持久化存储,确保容器重启后数据不丢失。

1.5 Pod 的使用场景

Pod 的设计目标是承载"紧密耦合"的应用组件,典型使用场景包括:

单一进程应用:最常见,一个 Pod 运行一个业务容器(如 Nginx、MySQL);

多进程协作:多个容器协同完成一项任务(如主应用 + 日志收集器 + 配置更新器)。

1.6 Pod 的类型

根据管理方式,Pod 可分为两类:

1.6.1 自主式 Pod

直接由用户创建,无自我修复能力;

若所在节点故障,Pod 会被删除且不会自动重建。

1.6.2 控制器管理的 Pod

由 K8s 控制器(如 Deployment、StatefulSet)创建和管理;

支持副本管理、滚动升级、自动修复(节点故障时重建 Pod)等功能,是生产环境的首选。

1.7. Pod 的类型

  • 自主式 Pod:
    这种 Pod 不具备自我修复的能力。如果它所在的节点故障,Pod 会被删除,且不会自动恢复。
  • 控制器管理的 Pod:
    Kubernetes 中通常通过控制器(如 Deployment、StatefulSet)来管理 Pod。控制器提供副本管
    理、滚动升级、自动修复等功能。

1.8. Pod容器的分类

1.8.1 基础容器(Infrastructure Container)

即前文提到的 Pause 容器,由 K8s 自动创建,维护 Pod 的网络和存储基础,对用户透明。

bash 复制代码
维护整个 Pod 网络和存储空间
node 节点中操作
启动一个Pod时,k8s会自动启动一个基础容器
cat /opt/kubernetes/cfg/kubelet
......
--pod-infra-container-image=registry.cn-hangzhou.aliyuncs.com/googlecontainers/pause-amd64:3.0"
每次创建 Pod 时候就会创建,运行的每一个Pod都有一个 pause-amd64 的基础容器自动会运行,对于用户
是透明的
docker ps -a
registry.cn-hangzhou.aliyuncs.com/google-containers/pause-amd64:3.0 "/pause"

1.8.2 初始化容器(Init Containers)

Init容器必须在应用程序容器启动之前运行完成,而应用程序容器是并行运行的,所以Init容器能够提供

了一种简单的阻塞或延迟应用容器的启动的方法。

1. 8.2.1 Init容器启动过程

启动时机:在应用容器启动前运行,且必须按顺序执行(前一个成功才能启动下一个);

作用:完成应用启动前的初始化工作(如等待依赖服务就绪、配置文件生成、权限设置等);

特性:若初始化失败,K8s 会根据 Pod 重启策略重试,直至成功。

1. 8.2.2 Init 的容器作用

Init 容器因采用与应用容器分离的独立镜像,具备多方面核心优势:

可包含应用容器缺失的实用工具 / 个性化代码,无需为工具定制应用镜像;

能安全运行工具,避免降低应用镜像安全性,同时实现镜像创建者与部署者独立工作;

可拥有与应用容器不同的文件系统视图,能访问应用容器无权限的 Secrets;

还能阻塞 / 延迟应用容器启动,待先决条件满足后,再让所有应用容器并行启动。

1.8.3 应用容器(Main Containers)

即用户部署的业务容器,在所有初始化容器成功后并行启动,是 Pod 的核心工作负载

bash 复制代码
官网示例:
https://kubernetes.io/zh-cn/docs/concepts/workloads/pods/init-containers/
bash 复制代码
# init-container-pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: myapp-pod
  labels:
    app: myapp
spec:
  # 主应用容器
  containers:
  - name: myapp-container
    image: busybox:1.28
    command: ['sh', '-c', 'echo The app is running! && sleep 3600']
  # Init容器(串行执行:先init-myservice,再init-mydb)
  initContainers:
  - name: init-myservice
    image: busybox:1.28
    # 修正command换行问题,确保脚本逻辑完整
    command: ['sh', '-c', 'until nslookup myservice; do echo waiting for myservice; sleep 2; done;']
  - name: init-mydb
    image: busybox:1.28
    command: ['sh', '-c', 'until nslookup mydb; do echo waiting for mydb; sleep 2; done;']
bash 复制代码
这个例子是定义了一个具有 2 个 Init 容器的简单 Pod。 第一个等待 myservice 启动, 第二个等待
mydb 启动。 一旦这两个 Init容器都启动完成,Pod 将启动 spec 中的应用容器。
先去查看 找不到错误信息
kubectl describe pod myapp-pod
使用logs查看 指定好 init r容器名称
kubectl logs myapp-pod -c init-myservice
bash 复制代码
# myservice.yaml 正确格式(2个空格缩进,层级清晰)
apiVersion: v1
kind: Service
metadata:
  name: myservice  # metadata下的字段缩进2个空格
spec:  # spec与metadata同级,无缩进
  ports:  # spec下的字段缩进2个空格
  - protocol: TCP  # 列表项(-)后紧跟字段,缩进2个空格
    port: 80       # 列表项内的字段再缩进2个空格(共4个)
    targetPort: 9376
bash 复制代码
# mydb.yaml 正确格式
apiVersion: v1
kind: Service
metadata:
  name: mydb
spec:
  ports:
  - protocol: TCP
    port: 80
    targetPort: 9377
bash 复制代码
# 1. 创建myservice.yaml文件(用vim编辑,粘贴上面修正后的内容)
vim myservice.yaml

# 2. 创建myservice Service
kubectl create -f myservice.yaml

# 3. 查看所有Service(验证myservice是否创建成功)
kubectl get svc

# (可选)查看kube-system命名空间的Pod(无关,仅你原命令保留)
kubectl get pods -n kube-system

# (可选)查看默认命名空间的Pod(无关,仅你原命令保留)
kubectl get pods

# 4. 创建mydb.yaml文件(用vim编辑,粘贴上面修正后的内容)
vim mydb.yaml

# 5. 创建mydb Service
kubectl create -f mydb.yaml

# 6. 再次查看Service(验证mydb是否创建成功)
kubectl get svc

二、Pod 的核心配置

2.1 镜像拉取策略(imagePullPolicy)

  • IfNotPresent(默认):本地有镜像则使用,无则拉取;
  • Always:每次启动均重新拉取镜像(适合开发环境);
  • Never:仅使用本地镜像,不拉取。
bash 复制代码
spec:
  containers:
  - name: nginx
    image: nginx:1.14
    imagePullPolicy: Always  # 每次启动拉取镜像

2.1.1 镜像拉取策略案例

步骤1:准备工作与创建异常Pod

1、创建并进入测试目录:

bash 复制代码
mkdir /opt/demo && cd /opt/demo

2、创建并编辑pod1.yaml配置文件:


总结

相关推荐
ZIXEL子虔科技21 小时前
重绘赛道:AI将如何定义国产CAD的下一代?
ai·云原生
x70x801 天前
# Docker 搭建 MySQL 8 主从复制(踩坑实录 + 完整验证)
mysql·docker·容器
qq_316837751 天前
docker 运行 cn_clip
运维·docker·容器
江湖有缘1 天前
轻量级知识协作平台搭建:Docker + MediaWiki入门教程
docker·容器·eureka
Genie cloud1 天前
在 Mac 上使用 Docker 安装宝塔并部署 LNMP 环境
macos·docker·容器·云计算
Suchadar1 天前
Docker常用命令
运维·docker·容器
你才是臭弟弟1 天前
MinIo开发环境配置方案(Docker版本)
运维·docker·容器
七夜zippoe1 天前
Docker容器化Python应用最佳实践:从镜像优化到安全防护
python·docker·云原生·eureka·容器化
卓码软件测评1 天前
第三方软件课题验收测试【使用Docker容器部署LoadRunner负载生成器以实现弹性压测 】
测试工具·docker·容器·性能优化·单元测试·测试用例
Knight_AL1 天前
Dockerfile 的 EXPOSE 和 Docker Compose 的 ports 有什么区别?
docker·容器·eureka