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,如 PodServiceNamespaceSecretConfigMapPersistentVolume(PV)、
PersistentVolumeClaim(PVC)
  • Kubernetes 后来引入了分组机制,将相关资源归类到特定的 API 组中,格式为:apiVersion: <组>/<版本>。常见分组及版本:
组名
版本号
示例资源
apps
apps/v1
DeploymentStatefulSetDaemonSetReplicaSet
batch
batch/v1
JobCronJob
networking.k8s.io
networking.k8s.io/v1
IngressNetworkPolicy
storage.k8s.io
storage.k8s.io/v1
StorageClass
rbac.authorization.k8s.io
rbac.authorization.k8s.io/v1
RoleClusterRoleRoleBinding
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: 命名空间,实现逻辑上的资源隔离(如 defaultkube-system)。如果未指定,默认为 default
  • labels: 标签键值对,用于标识资源的属性,方便筛选、分组和管理(例如通过 kubectl get pods -l app=nginx)。
  • annotations: 非标识性元数据(如版本说明、维护者信息),用于存储工具或用户的额外信息(不会用于筛选资源)。
  • ownerReferences:标识资源的所属者(如声明某个 Pod 由某个 Deployment 创建),用于级联删除或垃圾回收。
常见使用场景:
  1. 查询和筛选资源:通过 labels 快速找到相关资源(如所有 env=prod 的 Pod)。
  1. 权限控制:结合 RBAC,基于 namespace 或 labels 限制用户访问权限。
  1. 自动化工具:CI/CD 或 Operator 通过 annotations 存储配置信息。
  1. 资源关联:通过 ownerReferences 管理资源生命周期(如删除 Deployment 时自动删除其 Pod)。
示例:

2.4 spec

spec(规范)是资源定义的核心部分,用于定义用户期望的目标状态(Desired State)。它描述了对象应该如何配置、运行或行为,而 Kubernetes 的控制平面会不断协调实际状态以匹配 Spec 中的声明。
根据不同的资源类型(如 Job、CronJob、DaemonSet 等),spec 字段会有所差异,常用字段如下:

Pod

常用字段:
  • containers: 容器定义列表
    • image: 容器镜像
    • ports: 暴露的端口
    • env: 环境变量
    • resources: 资源请求和限制
    • volumeMounts: 挂载的卷
  • volumes: 定义存储卷
  • restartPolicy: 重启策略( AlwaysOnFailureNever
  • 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 支持三种探针探测方式:
        1. HTTP GET:向容器 IP 发送 HTTP GET 请求
          1. Exec:在容器内执行指定命令
            1. 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-0mysql-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:支持精确匹配和前缀匹配,还支持正则表达式(通过注解配置)。
                                      注意事项:
                                      1. 路径冲突:如果多个路径规则重叠,Kubernetes 会优先选择更具体的路径(如 Exact 优先于 Prefix)。
                                      1. 末尾斜杠:Prefix 匹配时,/path 和 /path/ 是不同的(后者要求 URL 必须以 / 结尾)。
                                      1. 通配符:原生 Ingress 不支持通配符(如 /api/*),但某些 Controller(如 Nginx)通过扩展支持正则。

                                      6、配置

                                      ConfigMap

                                      ConfigMap 用来存储非机密配置数据的资源对象,例如配置文件。有以下几种创建方式:
                                      • 从字面值创建:
                                        • 从文件创建:
                                          • 从环境文件创建:
                                            • 通过 YAML 配置文件创建:
                                              创建后,可以通过以下方式在 Pod 中使用 ConfigMap:
                                              1. 作为环境变量
                                                1. 作为卷加载
                                                  1. 作为容器命令行参数
                                                    注意:
                                                    • ConfigMap 必须在 Pod 之前创建,如果 ConfigMap 不存在,Pod 可能无法启动。
                                                    • ConfigMap 更新后,已挂载的文件可能需要一定时间(约1分钟)或 Pod 重启才能生效。
                                                    • 对于环境变量方式,ConfigMap 更新不会自动反映到已运行的 Pod 中

                                                    Secret

                                                    Secret 专门存储密码、证书、密钥等资源。创建方式类似于 ConfigMap,也支持以下创建方式:
                                                    • 从字面值创建
                                                      • 从文件创建
                                                        • 通过 YAML 配置文件创建
                                                          创建后,可以通过以下方式在 Pod 中使用 Secret:
                                                          1. 作为环境变量
                                                            1. 作为卷加载
                                                              注意:
                                                              • 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
                                                              Kubernetes系列:俯瞰Kubernetes全貌Kubernetes系列:Kubectl常用命令
                                                              Loading...