K8S关键业务概念

1. Pod

  • 最小调度单元:一个或多个容器(Container)的逻辑组合,共享网络和存储。
  • 生命周期短暂:Pod 可能因节点故障或调度策略被销毁重建。

2. Deployment

在 Kubernetes(K8S)中,Deployment 是用于管理 PodReplicaSet 的核心抽象,旨在简化应用的部署、更新、扩缩容和回滚操作。以下是其核心概念、功能及使用场景的详细解析:


一、Deployment 的核心作用

1. 声明式管理 Pod 副本

  • 功能:定义应用的期望状态(如运行多少个副本、使用哪个镜像版本),由 Deployment 控制器确保实际状态与期望一致。
  • 场景
    当 Pod 因节点故障、手动删除或更新失败时,Deployment 会自动创建新 Pod 以维持副本数。

2. 滚动更新(Rolling Update)

  • 功能:逐步替换旧版本 Pod 为新版本,确保服务不中断。
  • 优势
    • 分批更新:每次只更新部分 Pod,剩余旧 Pod 继续处理请求。
    • 自动回退:若更新后健康检查失败,自动回滚到上一个稳定版本。

3. 版本回滚(Rollback)

  • 功能:快速回退到历史版本(通过 kubectl rollout undo 命令)。
  • 原理:Deployment 会记录每次更新的历史版本(ReplicaSet),回滚时切换到此版本。

4. 扩缩容(Scaling)

  • 功能:手动或自动调整 Pod 副本数量(通过 kubectl scale 或 Horizontal Pod Autoscaler)。

二、Deployment 的组成

1. 核心字段解析

在 Deployment 的 YAML 配置中,以下字段是关键:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment  # Deployment 名称
spec:
  replicas: 3             # 期望的 Pod 副本数
  selector:
    matchLabels:
      app: nginx          # 匹配 Pod 的标签
  template:               # Pod 模板
    metadata:
      labels:
        app: nginx        # Pod 标签(必须与 selector 匹配)
    spec:
      containers:
        - name: nginx
          image: nginx:1.20  # 容器镜像
          ports:
            - containerPort: 80

2. 与 ReplicaSet 的关系

  • ReplicaSet:Deployment 通过创建 ReplicaSet 间接管理 Pod。
    • 每次更新(如镜像版本变更)会生成新的 ReplicaSet。
    • 旧 ReplicaSet 会被保留,用于版本回滚。

Deployment-ReplicaSet-Pod 关系图


三、Deployment 的典型使用场景

1. 部署应用

# 创建 Deployment
kubectl apply -f nginx-deployment.yaml

# 查看 Deployment 状态
kubectl get deployments
kubectl get pods -l app=nginx

2. 更新镜像版本

# 滚动更新到新版本(nginx:1.21)
kubectl set image deployment/nginx-deployment nginx=nginx:1.21

# 观察更新过程
kubectl rollout status deployment/nginx-deployment

3. 回滚到旧版本

# 查看历史版本
kubectl rollout history deployment/nginx-deployment

# 回滚到上一个版本
kubectl rollout undo deployment/nginx-deployment

# 回滚到指定版本(通过 --to-revision)
kubectl rollout undo deployment/nginx-deployment --to-revision=2

4. 调整副本数

# 手动扩缩容
kubectl scale deployment nginx-deployment --replicas=5

# 自动扩缩容(需提前安装 HPA)
kubectl autoscale deployment nginx-deployment --cpu-percent=50 --min=3 --max=10

5. 蓝绿部署(高级场景)

通过调整 selector 或权重,逐步将流量从旧版本切换到新版本(需配合 Service 或 Ingress)。


四、Deployment 的配置策略

1. 滚动更新策略

spec:
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 25%        # 允许临时超出副本数的比例(默认25%)
      maxUnavailable: 25%  # 更新期间允许不可用的副本比例(默认25%)

2. 健康检查

通过 Readiness ProbeLiveness Probe 确保更新过程可靠:

containers:
  - name: nginx
    livenessProbe:
      httpGet:
        path: /
        port: 80
      initialDelaySeconds: 5
      periodSeconds: 5

五、Deployment 与 StatefulSet 的区别

特性 Deployment StatefulSet
适用场景 无状态应用(如 Web 服务) 有状态应用(如数据库、分布式存储)
网络标识 Pod 名称随机(如 nginx-5c689d4d5-abcx Pod 名称固定且有序(如 mysql-0, mysql-1
存储 临时存储或共享存储 每个 Pod 有独立的持久化存储
扩缩容顺序 无顺序要求 按顺序扩容/缩容(如先启动 mysql-0,再 mysql-1)

六、总结

  • Deployment 是管理无状态应用的核心工具
    通过声明式配置实现 Pod 的部署、滚动更新、扩缩容和回滚。
  • 核心价值
    • 稳定性:确保指定数量的 Pod 始终运行。
    • 灵活性:支持无缝更新和版本回退。
    • 自动化:减少人工干预,提升运维效率。
  • 典型应用
    Web 服务、API 后端、微服务组件等无状态场景。

3. Service

  • 服务暴露与负载均衡:为一组 Pod 提供稳定的 IP 地址和 DNS 名称。
  • 类型
    • ClusterIP:集群内部访问(默认)。
    • NodePort:通过节点端口暴露服务。
    • LoadBalancer:集成云厂商的负载均衡器(如 AWS ALB)。

4. ConfigMap & Secret

  • ConfigMap:存储非敏感配置(如环境变量、配置文件)。
  • Secret:存储敏感数据(Base64 编码,非加密),如数据库密码。

5. Volume

  • 持久化存储:挂载外部存储到 Pod,支持本地磁盘、云存储(如 AWS EBS)、分布式存储(如 Ceph)。

6. Namespace

  • 资源隔离:将集群划分为多个虚拟空间(如 devprod),隔离资源、权限和网络策略。

7. StatefulSet

  • 有状态应用管理:适用于需要稳定网络标识(如数据库)、持久化存储和有序部署/扩展的场景(如 MySQL、Redis)。

8. DaemonSet

  • 节点级守护进程:确保每个节点运行一个 Pod 副本(如日志采集器 Fluentd、监控代理 Prometheus Node Exporter)。

9. Job & CronJob

  • Job:运行一次性任务,确保任务完成。
  • CronJob:定时执行任务(如每日备份)。

10. Ingress

  • 外部流量管理:通过路由规则(如域名、路径)将 HTTP/HTTPS 流量分发到不同服务,通常配合 Ingress Controller(如 Nginx、Traefik)使用。

11. 节点(Node)

在 Kubernetes 中,节点(Node) 是集群中的工作单元,可以是物理机或虚拟机,负责运行容器化应用(Pod)。
阿里云 ECS 是一种弹性计算服务,属于虚拟机,属于 基础设施资源(IaaS)。
每个节点上运行着kubelet、容器运行时等组件。然后,需要解释节点在调度中的作用,即调度器选择节点来运行Pod的过程。接着,用户的问题可能涉及节点资源不足、标签不匹配、污点等原因导致Pod无法分配,我需要详细说明这些因素。用户可能需要了解如何检查节点的状态和配置,比如使用kubectl命令查看节点信息,检查资源使用情况,标签和污点设置。这有助于他们诊断调度问题。还要提到节点状态的条件,如Ready、MemoryPressure等,这些状态会影响调度决策。

参考资料

posted @ 2025-03-10 12:02  向着朝阳  阅读(30)  评论(0)    收藏  举报