type
status
date
slug
summary
tags
category
icon
password
1、基于配置文件创建资源
基于配置文件创建资源需要有对应命名空间下的资源控制权限,一般在 K8S 的 master 节点执行,执行的命令如下:
2、配置文件解析
Kubernetes 使用 YAML 文件来定义和管理集群中的各种资源对象。一个典型的 Kubernetes YAML 文件包含以下四部分:
apiVersion
:API版本
kind
:资源类型
metadata
:资源元数据
spec
:资源规格
2.1 apiVersion
指定使用的 Kubernetes API 版本,常见的有:
v1
:最早的无分组的资源,适用于最稳定的核心 API,如Pod
、Service
、Namespace
、Secret
、ConfigMapPersistentVolume
(PV)、
PersistentVolumeClaim
(PVC)- Kubernetes 后来引入了分组机制,将相关资源归类到特定的 API 组中,格式为:
apiVersion: <组>/<版本>
。常见分组及版本:
组名 | 版本号 | 示例资源 |
apps | apps/v1 | Deployment 、StatefulSet 、DaemonSet 、ReplicaSet |
batch | batch/v1 | Job 、CronJob |
networking.k8s.io | networking.k8s.io/v1 | Ingress 、NetworkPolicy |
storage.k8s.io | storage.k8s.io/v1 | StorageClass |
rbac.authorization.k8s.io | rbac.authorization.k8s.io/v1 | Role 、ClusterRole 、RoleBinding |
autoscaling | autoscaling/v2 | HorizontalPodAutoscaler (HPA) |
apiextensions.k8s.io | apiextensions.k8s.io/v1 | CustomResourceDefinition (CRD) |
certificates.k8s.io | certificates.k8s.io/v1 | CertificateSigningRequest (CSR) |
2.2 kind
定义要创建的资源类型,常见的有:
Pod
Service
Deployment
StatefulSet
ConfigMap
Secret
Ingress
2.3 metadata
资源的元数据,主要用于标识、分类和管理资源,常用字段包括:
name
: 资源名称,在同一个命名空间内唯一,用于标识和操作该资源(如kubectl get pod <name>
)。
namespace
: 命名空间,实现逻辑上的资源隔离(如default
、kube-system
)。如果未指定,默认为default
。
labels
: 标签键值对,用于标识资源的属性,方便筛选、分组和管理(例如通过kubectl get pods -l app=nginx
)。
annotations
: 非标识性元数据(如版本说明、维护者信息),用于存储工具或用户的额外信息(不会用于筛选资源)。
ownerReferences
:标识资源的所属者(如声明某个 Pod 由某个 Deployment 创建),用于级联删除或垃圾回收。
常见使用场景:
- 查询和筛选资源:通过
labels
快速找到相关资源(如所有env=prod
的 Pod)。
- 权限控制:结合 RBAC,基于
namespace
或labels
限制用户访问权限。
- 自动化工具:CI/CD 或 Operator 通过
annotations
存储配置信息。
- 资源关联:通过
ownerReferences
管理资源生命周期(如删除 Deployment 时自动删除其 Pod)。
示例:
2.4 spec
spec
(规范)是资源定义的核心部分,用于定义用户期望的目标状态(Desired State)。它描述了对象应该如何配置、运行或行为,而 Kubernetes 的控制平面会不断协调实际状态以匹配 Spec 中的声明。根据不同的资源类型(如 Job、CronJob、DaemonSet 等),
spec
字段会有所差异,常用字段如下:Pod
常用字段:
containers
: 容器定义列表image
: 容器镜像ports
: 暴露的端口env
: 环境变量resources
: 资源请求和限制volumeMounts
: 挂载的卷
volumes
: 定义存储卷
restartPolicy
: 重启策略(Always
、OnFailure
、Never
)
nodeSelector
: 节点选择器
affinity
: 亲和性设置
Deployment
常用字段:
replicas
: 期望的副本数
selector
: 选择要代理的 Pod
strategy
: 更新策略(RollingUpdate 或 Recreate)
template
:同 Pod 的 spec
Service
常用字段
type
: 服务类型(ClusterIP、NodePort、LoadBalancer)
ports
: 端口映射
selector
: 选择要代理的 Pod
StatefulSet
常用字段:
replicas
: 期望的副本数
selector
: 选择要代理的 Pod
strategy
: 更新策略(RollingUpdate 或 Recreate)
template
:同 Pod 的 spec
volumeClaimTemplates
:StatefulSet 绑定的持久化卷声明
ConfigMap/Secret
模板
spec.template
是 Deployment、StatefulSet、DaemonSet、Job 等控制器对象中的一个关键字段,用于定义 Pod 的模板,描述了控制器(如 Deployment)应该创建和维护的 Pod 的配置。模板的作用:- 动态更新 Pod:当
spec.template
被修改时(例如更新镜像版本),控制器会根据新模板逐步替换旧的 Pod(滚动更新策略)。
- 关联 Pod 和控制器:控制器通过
spec.template.metadata.labels
和spec.selector
的匹配关系,识别自己管理的 Pod。
spec.template
的内容和 Pod 的 spec
一样。例如 Deployment 中的 spec.template
健康检查
Kubernetes 提供了以下探针来确保应用容器的可靠性:
- 存活探针 (Liveness Probe):用于检测容器是否处于运行状态。如果探测失败,kubelet 会杀死容器并根据重启策略决定是否重启。
- 就绪探针 (Readiness Probe):用于检测容器是否准备好接收流量。如果探测失败,端点控制器会从 Service 中移除该 Pod 的 IP 地址。
- 启动探针 (Startup Probe):用于保护慢启动容器。在启动探针成功之前,其他探针都会被禁用。
Kubernetes 支持三种探针探测方式:
- HTTP GET:向容器 IP 发送 HTTP GET 请求
- Exec:在容器内执行指定命令
- TCP Socket:尝试与容器建立 TCP 连接
其他参数:
initialDelaySeconds
:容器启动后等待多少秒才开始探测(默认 0)
periodSeconds
:执行探测的频率(默认 10)
timeoutSeconds
:探测超时时间(默认 1)
successThreshold
:探测失败后,最少连续成功次数才被认为成功(默认 1)
failureThreshold
:探测成功后,最少连续失败次数才被认为失败(默认 3)
容器重启策略
容器重启策略是指当容器中的进程终止时应该如何响应。这些策略通过 Pod 的
spec.restartPolicy
字段进行配置。支持以下三种重启策略:Always
:默认策略,只要容器退出(不论退出代码是什么),kubelet 就会自动重启容器,适用于需要持续运行的应用程序(如 Web 服务器)
OnFailure
:只有当容器以非零状态退出时才会重启,适用于批处理作业或预期会完成的任务
Never
:无论容器如何退出,都不会重启,适用于一次性任务或不需要重启的作业
不同的工作负载控制器对重启策略有不同的要求:
- Deployment/ReplicaSet/StatefulSet: 通常使用
Always
(默认)
- Job: 通常使用
OnFailure
或Never
- DaemonSet: 通常使用
Always
生命周期钩子
生命周期钩子(Lifecycle Hooks)机制是指容器在特定时刻(容器启动/关闭时)运行用户定义的代码,实现优雅的初始化、关闭和其他自定义行为。Kubernetes 提供两种生命周期钩子,支持 exec 和 http 两种使用方式。
PostStart
钩子:在容器创建后立即执行,用于容器启动后的初始化操作。
PreStop
钩子:在容器终止前执行,用于优雅关闭应用程序、保存状态等。
注意:
- PostStart 钩子与容器的主进程并行执行,不能保证在容器 ENTRYPOINT 之前完成。如果某个操作需要确保在容器 ENTRYPOINT 之前完成,可以使用 Init 容器(下面介绍)。
- Kubernetes 不保证钩子一定会执行成功(如节点崩溃时)
- PreStop 默认最长超时时间为 30s,如果超过 30s 进程还未完全停止,就发送 SIGKILL 信号强制杀死进程。可通过
spec.terminationGracePeriodSeconds
调整(terminationGracePeriodSeconds 一定大于 sleep 的时间)。
亲和性
亲和性(Affinity)是一种调度机制,用来指定 Pod 应该如何调度到节点上,或者 Pod 之间应该如何共同调度。Kubernetes 提供了两种亲和性类型:
- 节点亲和性 (Node Affinity):定义 Pod 应该调度到哪些节点上,基于节点的标签。
- Pod 亲和性/反亲和性 (Pod Affinity/Anti-affinity):定义 Pod 之间应该如何共同调度。
常用运算符:
In
: 值在集合中
NotIn
: 值不在集合中
Exists
: 标签存在
DoesNotExist
: 标签不存在
Gt
: 大于 (用于数值)
Lt
: 小于 (用于数值)
3、命名空间
4、工作负载
Deployment
适用于部署无状态应用(Stateless Application),例如 Web 服务、API 等,实例之间无依赖关系,可随意扩缩或替换。
Statefulset
Statefulset 适用于部署有状态应用(Stateful Application),例如数据库(MySQL、MongoDB)、分布式系统(ZooKeeper)等,需要稳定的网络标识、持久化存储或有序部署/扩缩。
使用注意:
- 创建 Statefulset 依赖 Headless Service,需要先创建。
- StatefulSet 创建的 Pod 遵循命名
<statefulsetName>-<ordinal>
,例如mysql-0
、mysql-1
。
- StatefulSet 自动创建的 PVC 遵循命名模式
<volumeClaimTemplateName>-<podName>-<ordinal>
,默认情况下,删除 StatefulSet 不会删除自动创建的 PVC。
DaemonSet
DaemonSet 在每个节点上运行一个 Pod,如日志收集器
Filebeat
。Job
Job 是 Kubernetes 中用于运行一次性任务的资源对象。
常用参数:
completions
:指定需要成功完成 Pod 的数量。
parallelism
:指定可以并行运行的 Pod 数量。
backoffLimit
:指定重试次数(默认为6)。
activeDeadlineSeconds
:设置 Job 运行的最长时间(秒)
ttlSecondsAfterFinished
:完成 N 秒后删除。
CronJob
如果需要定期运行 Job,可以使用 CronJob。例如定时清理日志的任务。
5、网络
Service
Service 将 Pod 提供的程序包装成服务对内提供访问,并对 Pod 进行负载平衡。因为 Pod 是临时的,IP 地址会变化,Service 提供稳定的虚拟 IP(ClusterIP)和 DNS 名称来访问 Pod,相当于为 Pod 提供了稳定的访问端点,屏蔽后端 Pod 的动态变化。
- ClusterIP:默认类型,为服务分配一个集群内可访问的虚拟 IP(VIP),生命周期内保持不变。
- DNS 自动注册:每个 Service 会注册一个 DNS 记录,格式为
<service-name>.<namespace>.svc.cluster.local
。同命名空间下可直接通过my-service
访问,跨命名空间需使用全名my-service.my-namespace
。
Kubernetes 提供几种 Service 类型:
ClusterIP
:默认类型,仅集群内可访问,通过 DNS 或 ClusterIP 进行访问。
NodePort
:在每个节点的 IP 上的静态端口暴露服务,可以从集群外部访问。
LoadBalancer
:使用云提供商的负载均衡器向外部暴露服务,自动分配外部 IP。
ExternalName
:通过返回 CNAME 记录将服务映射到 externalName 字段的内容,用于访问集群外部的服务。
其他特性:
- 当不需要均衡负载时(例如需要直连 Pod),可以创建 Headless Service,一般搭配 StatefulSet 使用。
- 多端口转发:
Ingress
Ingress 负责将 Service 暴露给外部进行访问,并可以根据访问路径(URL路径)路由到多个不同的 Service 中。Ingress 提供了 HTTP 和 HTTPS 路由规则:
- HTTP
- HTTPS
1、把证书保存为 Secret。先获取 SSL/TLS 证书,通常包含
- 证书文件(.crt 或 .pem)
- 私钥文件(.key)
然后执行以下命令
2、创建 Ingress 资源。
pathType
字段定义如何匹配 Ingress 规则中的路径(path) ,支持以下三种路径匹配方式:Exact
:精确匹配,路径必须完全匹配(区分大小写)。
Prefix
:前缀匹配,按 URL 路径前缀匹配(区分大小写)。路径会被逐级拆分(以/
分隔),且每一级必须完全匹配。
ImplementationSpecific
:匹配行为由具体的 Ingress Controller 实现决定(例如 Nginx、Traefik 等可能有不同逻辑)。具体行为需参考使用的 Ingress Controller 文档。- Nginx Ingress Controller:默认类似
Prefix
匹配,但可通过annotations
(如nginx.ingress.kubernetes.io/use-regex: "true"
)启用正则表达式。 - AWS ALB Ingress Controller:支持
Exact
和Prefix
,且Prefix
会自动处理路径末尾的/
。 - Traefik:支持精确匹配和前缀匹配,还支持正则表达式(通过注解配置)。
注意事项:
- 路径冲突:如果多个路径规则重叠,Kubernetes 会优先选择更具体的路径(如
Exact
优先于Prefix
)。
- 末尾斜杠:
Prefix
匹配时,/path
和/path/
是不同的(后者要求 URL 必须以/
结尾)。
- 通配符:原生 Ingress 不支持通配符(如
/api/*
),但某些 Controller(如 Nginx)通过扩展支持正则。
6、配置
ConfigMap
ConfigMap 用来存储非机密配置数据的资源对象,例如配置文件。有以下几种创建方式:
- 从字面值创建:
- 从文件创建:
- 从环境文件创建:
- 通过 YAML 配置文件创建:
创建后,可以通过以下方式在 Pod 中使用 ConfigMap:
- 作为环境变量
- 作为卷加载
- 作为容器命令行参数
注意:
- ConfigMap 必须在 Pod 之前创建,如果 ConfigMap 不存在,Pod 可能无法启动。
- ConfigMap 更新后,已挂载的文件可能需要一定时间(约1分钟)或 Pod 重启才能生效。
- 对于环境变量方式,ConfigMap 更新不会自动反映到已运行的 Pod 中
Secret
Secret 专门存储密码、证书、密钥等资源。创建方式类似于 ConfigMap,也支持以下创建方式:
- 从字面值创建
- 从文件创建
- 通过 YAML 配置文件创建
创建后,可以通过以下方式在 Pod 中使用 Secret:
- 作为环境变量
- 作为卷加载
注意:
- Secret 数据默认以 base64 编码存储,但不是加密的。执行
kubectl get secret tls-secret -o yaml
命令查看 Secret 得到的是 base64 编码后的内容。
- 如果想解码 Secret,可以执行
echo “base64编码内容” | base64 —-decode
命令。
- 在生产环境中,应考虑启用 Kubernetes 的 Secret 加密功能。
7、存储
PersistentVolume (PV)
PV 是集群中的一块物理存储资源(如 NFS、云存储、本地磁盘等),由管理员预先配置或通过 StorageClass 动态供给。
PersistentVolumeClaim (PVC)
PVC 是用户(或 Pod)对存储资源的请求,类似于 Pod 对 CPU/内存的请求。它通过绑定 PV 来获取实际存储。
StorageClass
StorageClass 的作用是动态管理集群中的 PV。StorageClass 将物理存储按性能、备份策略等分类,使用者只需要创建一个 PVC 指向合适的 StorageClass,StorageClass 会自动创建 PV 供 Pod 使用。
provisioner
:指定用于供应 PV 的卷插件- AWS EBS:
kubernetes.io/aws-ebs
- GCE PD:
kubernetes.io/gce-pd
- Azure Disk:
kubernetes.io/azure-disk
- NFS:
kubernetes.io/no-provisioner
- 其他 CSI 驱动: 使用 CSI 驱动名称
parameters
:特定于 provisioner 的参数
reclaimPolicy
:删除 PVC 后 PV 的处理策略(Delete
/Retain
)
allowVolumeExpansion
:是否允许卷扩展(true
或false
)
volumeBindingMode
:卷绑定时机(Immediate
/WaitForFirstConsumer
)
- Author:mcbilla
- URL:http://mcbilla.com/article/1f785c7d-7c1d-8002-be33-d6d8be9c9e25
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!
Relate Posts