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配置文件:


总结

相关推荐
我的golang之路果然有问题10 小时前
Docker 之常用操作(实习中的)
java·运维·笔记·docker·容器·eureka
牛奔10 小时前
Docker 容器无法停止的排障与解决全过程
运维·docker·云原生·容器·eureka
赵文宇(温玉)10 小时前
Docker的生态与商业化
docker·容器·eureka
不想画图10 小时前
Kubernetes(五)——rancher部署和Pod详解
linux·kubernetes·rancher
大都督老师11 小时前
配置 containerd 使用镜像加速器拉取 Docker Hub 镜像
容器·kubernetes·k8s
zyu6719 小时前
03-Docker存储和网络
网络·docker·容器
牛奔20 小时前
Docker Compose 两种安装与使用方式详解(适用于 Docker 19.03 版本)
运维·docker·云原生·容器·eureka
木童66221 小时前
Kubernetes 操作管理完全指南:从陈述式到声明式,覆盖全生命周期
云原生·容器·kubernetes
不想画图1 天前
Kubernetes(三)——组网概念和基础操作指令
云原生·容器·kubernetes