K8S从入门到实战(2)
存储
存储分类
- 元数据
- configMap:用于保存配置数据(明文)
- Secret:用于保存敏感数据(编码)
- Downward API:容器在运行时从Kubernetes API 服务器获取有关它们自生的信息
- 真实数据
- Volume:用于存储临时或者持久性数据
- PersistentVolume:申请制的持久化存储
configMap
ConfigMap 功能在 Kubernetes1.2 版本中引入,许多应用程序会从配置文件、命令行参数或环境变量中读取配置信息。ConfigMap API 给我们提供了向容器中注入配置信息的机制,ConfigMap 可以被用来保存单个属性,也可以用来保存整个配置文件或者 JSON 二进制等对象
一次注入后,多次读取不在消耗网络IO
创建
- 用文件创建configmap对象
kubectl create configmap game-config —from-file=hongfu.file
- 直接用key value创建configmap对象, 适合值比较少的创建
kubectl create configmap literal-config —from-literal=name=dave —from-literal==password=pass
热更新
ConfigMap 热更新,指的是在不重启、不重建 Pod 的前提下,让容器内的应用程序自动感知并加载 ConfigMap 的配置变更,实现配置的「无停机生效」,是生产环境中非常核心的运维能力。有文件链接
-
以 Volume 卷挂载方式注入 → 支持热更新(集群侧自动同步)
-
以环境变量方式注入 → 完全不支持热更新
secret
secrte 对象类型用来保存敏感信息,列如密码,令牌,ssh秘钥等待。更加灵活安全。
-
Kubernetes 通过仅仅将 Secret 分发到需要访问 Secret 的 Pod 所在的机器节点来保障其安全性
-
Secret 只会存储在节点的内存中,永不写入物理存储,这样从节点删除 secret 时就不需要擦除磁盘数据
-
从 Kubernetes1.7 版本开始,etcd 会以加密形式存储 Secret,一定程度的保证了 Secret 安全性
Downward API - 存在的意义
Downward API 是Kubernetes 中一个功能,它允许容器运行的时候从Kubernetes API服务器中获取有关它们自生的信息。这些信息可以作为容器的内部环境变量或者文件注入到容器中,以便容器可以获取有关其运行环境的各种信息,如Pod名称、命令空间等待
- 提供容器元数据
- 动态配置
- 与Kubernetes 环境集成
Volume-存在的意义
容器磁盘上的文件的生命周期是短暂的,这就使得在容器中运行重要应用时会出现一些问题。首先,当容器崩溃时,kubelet会重启它,但是容器中的文件将丢失—容器以干净的状态重新启动。在pod中同时运行多个容器时,这些容器之间需要共享文件。Kubernetes中的Volume抽象就很好解决了这些问题。
PV/PVC
1.PV(PersistentVolume,持久卷)
PV 是集群级别的存储资源,由集群管理员预先配置、管理,代表了集群中的一块实际存储(如云盘、NAS、本地磁盘、分布式存储等)。
- 生命周期:独立于 Pod,是集群的底层存储资源,不会随 Pod 或 PVC 的删除而自动销毁(取决于回收策略)
- 作用:对底层存储进行抽象,向上提供统一的存储接口,屏蔽不同存储厂商的底层实现差异
- 归属:集群级别资源,不属于任何 Namespace
2. PVC(PersistentVolumeClaim,持久卷声明)
PVC 是用户 / 租户级别的存储申请,由应用开发者创建,代表 Pod 对存储资源的需求(比如需要多大空间、什么访问模式)。
- 生命周期:与 Pod 绑定,属于 Namespace 级别的资源
- 作用:作为用户对存储的「申请单」,向集群申请符合要求的 PV 资源
- 归属:Namespace 级别资源,必须和 Pod 在同一个 Namespace
3.PV/PVC - 关联条件
◆ 容量: PV 的值不小于 PVC 要求,可以大于最好一致
◆ 读写策略:完全匹配
□ 单节点读写 - ReadWriteOnce - RWO
□ 多节点只读 - ReadOnlyMany - ROX
□ 多节点读写 - ReadWriteMany - RWX
◆ 存储类: PV 的类与 PVC 的类必须一致,不存在包容降级关系
PV/PVC - 回收策略
➢ Retain(保留):手动回收
➢ Recycle(回收):基本擦除(rm -rf /thevolume/*)
➢ Delete(删除):关联的存储资产(例如 AWS EBS、GCE PD、Azure Disk 和 OpenStack Cinder 卷)将被删除
当前,只有 NFS 和 HostPath 支持回收策略。AWS EBS、GCE PD、Azure Disk 和 Cinder 卷支持删除策略
专业补充说明
-
Retain(保留)
这是默认策略,PVC 删除后 PV 会被保留,数据不会被自动清除,需要管理员手动清理 PV 与底层存储数据,适用于数据敏感、需长期留存的场景。
-
Recycle(回收)
会自动清空卷内的所有数据,清空后 PV 重新变为可用状态,可被新的 PVC 绑定,Kubernetes 1.25 版本后已被废弃,推荐改用动态供给实现。
-
Delete(删除)
PVC 删除后,PV 与对应的底层存储资产会被同步自动删除,适合云厂商块存储等支持自动销毁的存储类型,需注意数据会被永久删除,不可恢复。
StorageClass

调度器
概念
Scheduler 是 Kubernetes 的调度器,主要任务就是把定义的pod分配到集群的节点上
亲和性
节点亲和性
- preferredDuringSchedulingIgnoredDuringExecution:软性亲和策略
- 核心逻辑:优先调度到满足规则的节点,若没有符合条件的节点,Pod 也可以调度到其他节点,不会出现 Pending 无法启动的情况。
- 适用场景:非强制的资源偏好、业务就近调度、性能优先级匹配等场景,不影响集群整体调度可用性。
- 权重机制:可通过
weight字段给不同规则设置优先级,权重越高的规则,调度时优先级越高。
- requiredDuringSchedulingIgnoredDuringExecution:硬性亲和策略
- 核心逻辑:强制要求 Pod 必须调度到完全满足规则的节点上,若集群中没有符合条件的节点,Pod 会一直处于 Pending 状态,无法启动。
- 适用场景:强业务隔离、专属资源绑定、合规要求、硬件专属匹配(如 GPU 节点)等强约束场景。
pod亲和性
podAffinity(Pod 亲和性)让 Pod和指定的 Pod 部署在同一拓扑域(同一节点 / 同一机房 / 同一可用区)业务强依赖 Pod 就近部署、降低跨节点网络延迟、同业务 Pod 聚合管理
podAntiAffinity(Pod 反亲和性)让 Pod和指定的 Pod 部署在不同拓扑域(不同节点 / 不同机房 / 不同可用区)高可用部署(多副本 Pod 分散到不同节点,避免单节点故障导致服务全挂)、业务实例隔离、避免资源争抢
然后也分软硬
preferredDuringSchedulingIgnoredDuringExecution:软性策略
- 核心逻辑:优先让 Pod 满足规则,若集群中没有符合条件的节点,Pod 依然可以正常调度,不会出现 Pending。
- 适用场景:非强制的业务就近部署、高可用的弱约束场景,不影响集群整体调度可用性。
- 支持通过
weight字段给规则设置权重,权重越高的规则,调度优先级越高。
requiredDuringSchedulingIgnoredDuringExecution:硬性策略
- 核心逻辑:强制要求Pod 必须满足规则,若集群中没有符合条件的节点,Pod 会一直处于 Pending 状态,无法启动。
- 适用场景:强高可用约束、合规要求、业务强隔离等必须严格遵守的调度规则。
污点和容忍
如果pod能够容忍节点的污点,就表示可以有下一步匹配,否则不行
NoSchedule:不让新 Pod 来,已来的不管
PreferNoSchedule:尽量不让新 Pod 来,实在没地方来也能来
NoExecute:不让新 Pod 来,已经来的也得赶走
污点和容忍 好像 防火墙和安全组
固定节点调度
pod.spec.nodeName 会将 Pod 直接强制调度到指定的 Node 节点上,完全跳过 Kubernetes Scheduler 的所有调度策略,属于强制匹配规则。
k8s集群安全机制
Kubernetes 作为一个分布式集群的管理工具,保证集群的安全性是其一个重要的任务。API Server 是集群内部各个组件通信的中介,也是外部控制的入口。所以 Kubernetes 的安全机制基本就是围绕保护 API Server 来设计的。
- 认证:你是不是公司的人
- 鉴权:你有没有这个操作的权限
- 准入控制:虽然你有这个权限,但是这个操作是否合理
helm
概念
Helm 本质就是让 K8s 的应用管理(Deployment,Service 等)可配置,能动态生成。通过动态生成 K8s 资源清单文件(deployment.yaml, service.yaml)。然后调用 Kubectl 自动执行 K8s 资源部署
Helm 是官方提供的类似于 YUM 的包管理器,是部署环境的流程封装。Helm 有两个重要的概念:chart 和 release
- Chart:是创建一个应用的信息集合,包括各种 Kubernetes 对象的配置模板、参数定义、依赖关系、文档说明等。chart 是应用部署的自包含逻辑单元。可以将 chart 想象成 apt、yum 中的软件安装包
- Release:是 chart 的运行实例,代表了一个正在运行的应用。当 chart 被安装到 Kubernetes 集群,就生成一个 release。chart 能够多次安装到同一个集群,每次安装都是一个 release
- Helm cli:helm 客户端组件,负责和 kubernetes apiS 通信
- Repository:用于发布和存储 Chart 的仓库
支持与分享
如果这篇文章对你有帮助,欢迎分享给更多人或赞助支持!