当前位置: 首页 > news >正文

Kubernetes 实战入门:核心资源操作指南

Kubernetes 实战入门:核心资源操作指南

一、Namespace(命名空间)

1.1 核心概念与作用

Namespace 是 Kubernetes 中用于实现资源隔离的核心资源,主要解决以下场景需求:

  • 环境隔离:将开发(ycy)、测试(test)、生产(prod)等不同环境的资源划分到独立 Namespace,避免 Pod、Service 等资源命名冲突或误操作。
  • 多租户隔离:结合 Kubernetes 授权机制(如 RBAC),将不同 Namespace 分配给不同租户管理,实现租户间资源独立;同时可通过资源配额(Resource Quota)限制租户的 CPU、内存等资源使用量,防止资源滥用。

关键特性:默认情况下,同一集群内不同 Namespace 的 Pod 可通过集群内部网络通信,但可通过网络策略(Network Policy)进一步限制跨 Namespace 访问;Namespace 仅作用于集群内部资源,不影响外部访问。

1.2 集群默认 Namespace

Kubernetes 集群启动后会自动创建 4 个默认 Namespace,各自功能如下表所示:

Namespace 名称状态(STATUS)核心作用
defaultActive未指定 Namespace 的资源(如 Pod、Deployment)默认归属此命名空间
kube-node-leaseActive用于集群节点间心跳检测(Kubernetes v1.13+ 引入),保障节点状态实时同步
kube-publicActive公共资源命名空间,所有用户(包括未认证用户)均可访问,常用于存储集群公共配置
kube-systemActiveKubernetes 系统组件(如 kube-apiserver、coredns、kube-proxy)默认部署于此

查看默认 Namespace 命令

[root@master ~]# kubectl get namespace
NAME              STATUS   AGE
default           Active   45h     # 未指定Namespace的资源默认归属
kube-node-lease   Active   45h     # 节点心跳维护
kube-public       Active   45h     # 公共资源访问
kube-system       Active   45h     # 系统组件部署

1.3 Namespace 操作详解

1.3.1 查看操作

支持多种查看方式,满足不同信息需求:

  1. 查看所有 Namespace
    快速获取集群内所有 Namespace 的名称、状态和创建时间:

    [root@master ~]# kubectl get ns  # "ns"是"namespace"的缩写,命令等效
    NAME              STATUS   AGE
    default           Active   45h
    kube-node-lease   Active   45h
    kube-public       Active   45h
    kube-system       Active   45h
    
  2. 查看指定 Namespace
    聚焦单个 Namespace 的基础信息:

    [root@master ~]# kubectl get ns default  # 查看default命名空间
    NAME      STATUS   AGE
    default   Active   45h
    
  3. 指定输出格式
    Kubernetes 支持 widejsonyaml 等多种格式,用于获取更详细的资源定义信息:

    • yaml 格式(推荐,查看完整资源配置):
      [root@master ~]# kubectl get ns default -o yaml
      apiVersion: v1  # API版本
      kind: Namespace  # 资源类型
      metadata:creationTimestamp: "2025-10-27T04:27:00Z"  labels:kubernetes.io/metadata.name: default  # 系统标签name: default  # Namespace名称resourceVersion: "191"  # 资源版本(用于集群内部版本控制)uid: 3debe6c9-f2ed-483a-b938-c363d5755036  # 唯一标识符
      spec:finalizers:  # 终结器,确保删除前完成清理操作- kubernetes
      status:phase: Active  # 状态(Active:正常使用;Terminating:正在删除)
      
    • json 格式(适合程序解析):
      kubectl get ns default -o json
      
  4. 查看 Namespace 详情
    包含资源配额(Resource Quota)、限制范围(LimitRange)等扩展信息:

    [root@master ~]# kubectl describe ns default
    Name:         default  # 名称
    Labels:       kubernetes.io/metadata.name=default  # 标签
    Annotations:  <none>  # 注解(无额外配置时为空)
    Status:       Active  # 状态:Active(正常)/Terminating(删除中)
    # ResourceQuota:针对该Namespace的整体资源限制(如总CPU、总内存)
    No resource quota.
    # LimitRange:针对Namespace内单个资源(如Pod、Container)的默认资源限制
    No LimitRange resource.
    
1.3.2 创建操作

支持命令行直接创建YAML 配置创建两种方式:

  1. 命令行创建
    快速创建 Namespace(如创建 ycy 命名空间用于开发环境):

    [root@master ~]# kubectl create ns ycy
    namespace/ycy created 
    
   
2. **YAML 配置创建**  适合需要持久化配置或批量创建的场景,步骤如下:- 1. 创建 YAML 文件(如 `ns-ycy.yaml`),定义 Namespace 配置:```yamlapiVersion: v1  # 固定API版本(Namespace属于v1组)kind: Namespace  # 资源类型为Namespacemetadata:name: ycy  # Namespace名称(必须唯一)```- 2. 执行创建命令:```bash[root@master ~]# kubectl create -f ns-ycy.yamlnamespace/ycy created```#### 1.3.3 删除操作
删除 Namespace 会同时删除其下所有资源(如 Pod、Deployment、Service),需谨慎操作:
1. **命令行删除**  直接删除指定 Namespace(如删除 `ycy`):```bash[root@master ~]# kubectl delete ns ycynamespace "ycy" deleted 
  • 注意:删除过程中 Namespace 状态会变为 Terminating,待其下所有资源清理完成后才会彻底删除,耗时取决于资源数量。
  1. YAML 配置删除
    通过已有的 YAML 文件删除对应 Namespace:
    [root@master ~]# kubectl delete -f ns-ycy.yaml
    namespace "ycy" deleted
    

二、Pod

2.1 核心概念与作用

Pod 是 Kubernetes 集群中最小的部署和管理单元,所有容器(Container)必须运行在 Pod 内。其核心特性如下:

  • 容器封装:一个 Pod 可包含 1 个或多个容器(如业务容器 + 日志收集容器),这些容器共享 Pod 的网络命名空间(同一 IP、端口)和存储卷(Volume),实现紧密协作。
  • 系统组件载体:Kubernetes 集群自身的组件(如 kube-apiserver、coredns、kube-proxy)均以 Pod 形式运行在 kube-system Namespace 中。
  • 生命周期短暂:Pod 是临时性资源,若容器故障或节点下线,Pod 会被销毁,需通过 Deployment 等控制器实现自动重建。

2.2 Pod 的内部结构

Pod 内部包含两类容器:

  • 业务容器:运行用户应用(如 Nginx、Java 服务),可多个。
  • Pause 容器:每个 Pod 默认包含一个 pause 容器(镜像为 gcr.io/google_containers/pause-amd64),用于:
    1. 维护 Pod 的网络命名空间,使多个业务容器共享同一网络。
    2. 作为 Pod 的 “PID 1” 进程,处理僵尸进程回收。

结构示意图

Pod
├─ Pause 容器(gcr.io/google_containers/pause-amd64)
├─ 业务容器1(如 Nginx,镜像:nginx:latest)
└─ 业务容器2(如 日志收集,镜像:log-agent:v1)

2.3 查看集群系统 Pod

Kubernetes 系统组件以 Pod 形式部署在 kube-system Namespace,可通过以下命令查看(AGE 对应当前 2025.10.29 往前推算,符合集群稳定运行逻辑):

[root@master ~]# kubectl get pod -n kube-system  # "-n"指定Namespace
NAME                                      READY   STATUS    RESTARTS       AGE
calico-kube-controllers-9d57d8f49-gwcvl   1/1     Running   2 (5h23mago)   23h
calico-node-8v85q                         1/1     Running   2 (5h23mago)   23h
calico-node-fxmqv                         1/1     Running   2 (5h23mago)   23h
calico-node-lbnh2                         1/1     Running   2 (5h23mago)   23h
  • 字段说明
    • READY就绪容器数/总容器数(如 1/1 表示所有容器正常就绪)。
    • STATUS:Pod 状态(Running:正常运行;Pending:等待调度;CrashLoopBackOff:容器反复崩溃)。
    • RESTARTS:容器重启次数(正常运行时为 0)。
    • AGE:Pod 创建时间(基于当前 2025.10.29,2d1h 表示 10 月 27 日启动)。

2.4 Pod 操作详解

Kubernetes 不推荐直接创建独立 Pod(称为“自主式 Pod”),因 Pod 故障后无法自动重建;通常通过 Deployment 等控制器管理 Pod(称为“受控 Pod”)。以下操作包含两种 Pod 类型的创建与管理。

2.4.1 创建并运行 Pod
方式 1:通过 Deployment 控制器创建(推荐)

控制器会监控 Pod 状态,若 Pod 故障则自动重建,保障服务可用性:

# 命令格式:kubectl run <Pod名称> --image=<镜像> --port=<暴露端口> --namespace=<命名空间>
[root@master ~]# kubectl run nginx --image=nginx:latest --port=80 --namespace ycy
deployment.apps/nginx created  
  • 参数说明
    • --image=nginx:latest:指定 Pod 内容器的镜像(此处为最新版 Nginx)。
    • --port=80:指定容器暴露的端口(Nginx 默认端口为 80)。
    • --namespace ycy:指定 Pod 归属的 Namespace(需提前创建 ycy)。
方式 2:直接创建自主式 Pod(不推荐)

仅用于测试场景,Pod 故障后无自动恢复能力:

# 通过YAML创建自主式Pod(后续2.4.5节详细说明)
kubectl create -f pod-nginx.yaml
2.4.2 查看 Pod 信息
1. 查看 Pod 基本信息

快速获取 Pod 名称、状态、重启次数等基础信息(AGE 基于当前 2025.10.29 计算):

[root@master ~]# kubectl get pods -n ycy  # "-n ycy"指定Namespace
NAME    READY   STATUS    RESTARTS   AGE
nginx   1/1     Running   0          43s  # Nginx Pod正常运行,无重启(43秒前创建,对应2025.10.29操作)
  • 若需查看 Pod 所在节点(Node)和 IP 地址,添加 -o wide 参数:
    [root@master ~]# kubectl get pods -n ycy -o wide
    NAME    READY   STATUS    RESTARTS   AGE    IP             NODE    NOMINATED NODE   READINESS GATES
    nginx   1/1     Running   0          190s   10.244.1.23    node1   <none>           <none>  # 190秒前创建,约3分钟前
    
    • IP:Pod 的集群内部 IP(仅集群内可访问)。
    • NODE:Pod 调度到的节点(此处为 node1)。
2. 查看 Pod 详细信息

包含容器日志、事件(Events)、挂载卷(Volumes)等关键信息,用于问题排查,时间均匹配当前 2025.10.29:

[root@master ~]# kubectl describe pod nginx -n ycy
Name:         nginx  # Pod名称
Namespace:    ycy    # 所属Namespace
Priority:     0      # 优先级(默认0,高优先级Pod优先调度)
Node:         node1/192.168.5.4  # 所在节点名称及IP
Start Time:   Wed, 29 Oct 2025 09:29:24 +0800  
Labels:       pod-template-hash=5ff7956ff6  # Deployment自动添加的标签(用于关联Pod与控制器)run=nginx  # 用户指定的标签
Annotations:  <none>  # 注解(无额外配置时为空)
Status:       Running  # Pod状态
IP:           10.244.1.23  # 集群内部IP
IPs:IP:           10.244.1.23
Controlled By:  ReplicaSet/nginx  # 控制该Pod的控制器(Deployment通过ReplicaSet管理Pod)# 容器详情(Pod内的容器列表)
Containers:nginx:  # 容器名称Container ID:   docker://4c62b8c0648d2512380f4ffa5da2c99d16e05634979973449c98e9b829f6253c  # Docker容器IDImage:          nginx:latest  # 容器镜像Image ID:       docker-pullable://nginx@sha256:485b610fefec7ff6c463ced9623314a04ed67e3945b9c08d7e53a47f6d108dc7  # 镜像ID(唯一)Port:           80/TCP  # 暴露端口(TCP协议)Host Port:      0/TCP  # 主机端口(0表示随机分配,此处未映射主机端口)State:          Running  # 容器状态(Running:运行中)Started:      Wed, 29 Oct 2025 09:30:01 +0800  # 容器启动时间(创建后37秒启动,符合实际流程)Ready:          True  # 容器是否就绪(True表示可提供服务)Restart Count:  0  # 容器重启次数Environment:    <none>  # 环境变量(无额外配置时为空)Mounts:  # 挂载的卷(默认包含ServiceAccount令牌卷)/var/run/secrets/kubernetes.io/serviceaccount from default-token-hwvvw (ro)  # 只读挂载的ServiceAccount令牌# Pod状态条件(用于判断Pod是否正常)
Conditions:Type              Status  # 状态(True:满足条件)Initialized       True    # Pod初始化完成Ready             True    # Pod就绪(可接收请求)ContainersReady   True    # 所有容器就绪PodScheduled      True    # Pod已调度到节点# 挂载的卷(存储配置)
Volumes:default-token-hwvvw:  # 卷名称(默认ServiceAccount令牌卷)Type:        Secret (a volume populated by a Secret)  # 卷类型为Secret(存储敏感信息)SecretName:  default-token-hwvvw  # 关联的Secret名称Optional:    false  # 是否可选(false表示必须存在)# QoS级别(服务质量等级,BestEffort表示无资源限制,优先级最低)
QoS Class:       BestEffort
Node-Selectors:  <none>  # 节点选择器(无限制时为空)
# 容忍度(允许Pod调度到有特定污点的节点)
Tolerations:     node.kubernetes.io/not-ready:NoExecute for 300s  # 节点未就绪时,300秒后驱逐Podnode.kubernetes.io/unreachable:NoExecute for 300s  # 节点不可达时,300秒后驱逐Pod# 事件(记录Pod生命周期中的关键操作,时间线匹配2025.10.29 09:29-09:33)
Events:Type    Reason     Age        From               Message----    ------     ----       ----               -------Normal  Scheduled  <unknown>  default-scheduler  Successfully assigned ycy/nginx-5ff7956ff6-fg2db to node1  # 成功调度到node1节点Normal  Pulling    4m11s      kubelet, node1     Pulling image "nginx:latest"  Normal  Pulled     3m36s      kubelet, node1     Successfully pulled image "nginx:latest"  # 约3分半前拉取成功Normal  Created    3m36s      kubelet, node1     Created container nginx  # 约3分半前创建容器Normal  Started    3m36s      kubelet, node1     Started container nginx  # 约3分半前启动容器
2.4.3 访问 Pod

Pod 的集群内部 IP 可用于集群内节点或其他 Pod 访问,步骤如下:

  1. 获取 Pod 的集群内部 IP
    通过 -o wide 参数查看 IP:

    [root@master ~]# kubectl get pods -n ycy -o wide
    NAME    READY   STATUS    RESTARTS   AGE    IP             NODE    ... 
    nginx   1/1     Running   0          190s   10.244.1.23    node1   ... 
    

此处 Pod 的 IP 为 10.244.1.23

  1. 在集群内访问 Pod
    通过 curl 或其他工具访问 Pod 暴露的端口(如 Nginx 的 80 端口):
    [root@master ~]# curl http://10.244.1.23:80
    <!DOCTYPE html>
    <html>
    <head><title>Welcome to nginx!</title>  # Nginx默认页面,说明访问成功
    </head>
    <body><p><em>Thank you for using nginx.</em></p>
    </body>
    </html>
    
    • 注意:若在集群外访问,需通过 Service(如 NodePort、LoadBalancer)暴露 Pod,后续章节会详细说明。
2.4.4 删除 Pod

删除 Pod 需区分自主式 Pod受控 Pod(由 Deployment 等控制器管理),操作时间为

1. 删除自主式 Pod(无控制器管理)

直接删除 Pod 即可,删除后不会自动重建:

[root@master ~]# kubectl delete pod nginx -n ycy
pod "nginx" deleted 
2. 删除受控 Pod(由 Deployment 管理)

若直接删除 Pod,控制器会立即重建新 Pod 以维持预期副本数,需先删除控制器:

  1. 步骤 1:查看控制器(Deployment)
    确认 Pod 所属的 Deployment:

    [root@master ~]# kubectl get deploy -n ycy  # "deploy"是"deployment"的缩写
    NAME    READY   UP-TO-DATE   AVAILABLE   AGE
    nginx   1/1     1            1           9m7s 
    
   
2. **步骤 2:删除 Deployment 控制器**  删除控制器后,其管理的所有 Pod 会被自动删除:```bash[root@master ~]# kubectl delete deploy nginx -n ycydeployment.apps "nginx" deleted  # 控制器删除成功
  1. 步骤 3:验证 Pod 已删除
    [root@master ~]# kubectl get pods -n ycy
    No resources found in ycy namespace.  # 无Pod资源,说明删除成功
    
2.4.5 YAML 配置操作

通过 YAML 文件可精细定义 Pod 的配置(如容器参数、环境变量、挂载卷),适用于生产环境

1. 创建 YAML 文件(如 pod-nginx.yaml
apiVersion: v1  # Pod的API版本(固定为v1)
kind: Pod       # 资源类型为Pod
metadata:name: nginx   # Pod名称(在所属Namespace内唯一)namespace: ycy # 所属Namespace(需提前创建)
spec:containers:   # 容器列表(一个Pod可包含多个容器)- image: nginx:latest  # 容器镜像(必填)name: pod            # 容器名称(在Pod内唯一)ports:               # 容器暴露的端口配置- name: nginx-port   # 端口名称(自定义,用于标识)containerPort: 80  # 容器内部端口(Nginx默认端口)protocol: TCP      # 协议类型(TCP/UDP,默认TCP)
2. 执行创建命令
[root@master ~]# kubectl create -f pod-nginx.yaml
pod/nginx created 
3. 执行删除命令
[root@master ~]# kubectl delete -f pod-nginx.yaml
pod "nginx" deleted  # 删除成功

三、Label(标签)

3.1 核心概念与作用

Label 是 Kubernetes 中用于资源标识与筛选的键值对(key=value),主要作用如下:

  • 资源分组:通过 Label 对 Pod、Node、Deployment 等资源进行多维度分组(如按环境、版本、功能分层)。
  • 灵活筛选:通过 Label Selector(标签选择器)查询或操作符合条件的资源(如仅删除“环境=测试”的 Pod)。
  • 控制器关联:Deployment、Service 等资源通过 Label Selector 与 Pod 关联(如 Deployment 仅管理带特定 Label 的 Pod)。

3.2 Label 特性

  1. 灵活性
    • 一个资源可添加任意数量的 Label(如 env=ycyversion=v1tier=frontend)。
    • 同一个 Label 可添加到任意类型的资源(如给 Node 和 Pod 都添加 region=cn-north)。
  2. 动态性:Label 可在资源创建后通过命令或 YAML 动态添加、修改或删除,无需重启资源。
  3. 无强制规范:Label 的 keyvalue 由用户自定义,但建议遵循语义化命名(如 environment 表示环境,version 表示版本)。

3.3 常用 Label 示例

标签类型示例作用说明
环境标签env=ycyenv=testenv=prod区分开发、测试、生产环境的资源
版本标签version=v1version=v2version=stable标识资源的版本(如应用的迭代版本)
功能分层标签tier=frontendtier=backendtier=database按功能分层(前端、后端、数据库)
节点属性标签node-role.kubernetes.io/masternode-type=compute标识节点角色(主节点、计算节点)

3.4 Label Selector(标签选择器)

Label Selector 是用于筛选符合条件 Label 资源的规则,分为两类:

3.4.1 基于等式的选择器(Equality-based)

通过等式(=!=)匹配 Label,适用于精确筛选:

  • key=value:选择 key 等于 value 的资源(如 env=ycy:选择环境为开发的资源)。
  • key!=value:选择 key 不等于 value 的资源(如 env!=prod:排除生产环境的资源)。
3.4.2 基于集合的选择器(Set-based)

通过集合(innot inexists)匹配 Label,适用于多值筛选:

  • key in (value1, value2):选择 key 等于 value1value2 的资源(如 version in (v1, v2):选择版本为 v1 或 v2 的资源)。
  • key not in (value1, value2):选择 key 不等于 value1 且不等于 value2 的资源(如 tier not in (frontend):排除前端资源)。
  • key:选择包含 key 标签的所有资源(不限制 value)。
  • !key:选择不包含 key 标签的所有资源。
3.4.3 多条件组合

多个 Label Selector 可通过逗号(,)组合,需同时满足所有条件:

  • 示例 1:env=ycy, version=v1:选择“环境=开发”且“版本=v1”的资源。
  • 示例 2:tier=backend, env not in (prod):选择“功能=后端”且“环境非生产”的资源。

3.5 Label 操作详解

3.5.1 为资源添加 Label(命令行)

以 Pod 为例,为 ycy Namespace 下的 nginx-pod 添加 Label version=1.0

[root@master ~]# kubectl label pod nginx-pod version=1.0 -n ycy
pod/nginx-pod labeled  # 添加成功
  • 命令格式:kubectl label <资源类型> <资源名称> <label键值对> -n <命名空间>
  • 支持的资源类型:podnodedeploymentservice 等。
3.5.2 为资源更新 Label(命令行)

若需修改已存在的 Label,需添加 --overwrite 参数(强制覆盖):

# 将nginx-pod的version从1.0更新为2.0
[root@master ~]# kubectl label pod nginx-pod version=2.0 -n ycy --overwrite
pod/nginx-pod labeled  # 更新成功
3.5.3 查看资源的 Label
1. 查看单个资源的 Label

通过 --show-labels 参数显示资源的所有 Label:

[root@master ~]# kubectl get pod nginx-pod -n ycy --show-labels
NAME        READY   STATUS    RESTARTS   AGE   LABELS
nginx-pod   1/1     Running   0          10m   version=2.0  # 已添加的Label,10分钟前创建Pod
2. 查看所有资源的 Label
[root@master ~]# kubectl get pods -n ycy --show-labels
NAME        READY   STATUS    RESTARTS   AGE   LABELS
nginx-pod   1/1     Running   0          17m   version=2.0  # 17分钟前创建
test-pod    1/1     Running   0          5m    env=test,version=v1  # 5分钟前创建
3.5.4 通过 Label 筛选资源
1. 基于等式筛选
  • 筛选 ycy Namespace 下 version=2.0 的 Pod:
    [root@master ~]# kubectl get pod -n ycy -l version=2.0 --show-labels
    NAME        READY   STATUS    RESTARTS   AGE   LABELS
    nginx-pod   1/1     Running   0          17m   version=2.0
    
  • 筛选 ycy Namespace 下 version!=2.0 的 Pod:
    [root@master ~]# kubectl get pod -n ycy -l version!=2.0 --show-labels
    NAME       READY   STATUS    RESTARTS   AGE   LABELS
    test-pod   1/1     Running   0          7m    env=test,version=2.0
    
2. 基于集合筛选
  • 筛选 ycy Namespace 下 version in (v1, v2) 的 Pod:
    [root@master ~]# kubectl get pod -n ycy -l 'version in (v1, v2)' --show-labels
    NAME       READY   STATUS    RESTARTS   AGE   LABELS
    test-pod   1/1     Running   0          9m    env=test,version=v1
    
  • 筛选 ycy Namespace 下 version not in (v1) 的 Pod:
    [root@master ~]# kubectl get pod -n ycy -l 'version not in (v1)' --show-labels
    NAME        READY   STATUS    RESTARTS   AGE   LABELS
    nginx-pod   1/1     Running   0          20m   version=2.0
    
3.5.5 删除资源的 Label

删除 Label 需在 key 后添加 -(短横线),格式为 key-

# 删除nginx-pod的version标签
[root@master ~]# kubectl label pod nginx-pod version- -n ycy
pod/nginx-pod labeled  # 删除成功

验证删除结果

[root@master ~]# kubectl get pod nginx-pod -n ycy --show-labels
NAME        READY   STATUS    RESTARTS   AGE   LABELS
nginx-pod   1/1     Running   0          22m   <none>  # Label已删除,Pod创建于22分钟前
3.5.6 通过 YAML 配置 Label

创建或更新资源时,可在 YAML 的 metadata.labels 字段定义 Label,示例如下(以 Pod 为例):

1. 创建 YAML 文件(如 pod-nginx-with-labels.yaml
apiVersion: v1
kind: Pod
metadata:name: nginx          # Pod名称namespace: ycy       # 所属Namespacelabels:              # Label配置(多个Label用逗号分隔)version: "3.0"     # 版本标签(value带特殊字符时需加引号)env: "test"        # 环境标签
spec:containers:- image: nginx:latestname: podports:- name: nginx-portcontainerPort: 80protocol: TCP
2. 执行创建或更新命令
  • 若资源未创建,执行创建命令(2025.10.29 执行):
    kubectl create -f pod-nginx-with-labels.yaml
    
  • 若资源已存在,执行更新命令(覆盖现有配置):
    kubectl apply -f pod-nginx-with-labels.yaml
    
3. 验证 Label 已添加
[root@master ~]# kubectl get pod nginx -n ycy --show-labels
NAME    READY   STATUS    RESTARTS   AGE   LABELS
nginx   1/1     Running   0          30s   env=test,version=3.0 

四、Deployment(部署控制器)

4.1 核心概念与作用

Deployment 是 Kubernetes 中最常用的 Pod 控制器,用于管理 Pod 的创建、更新和扩缩容,核心作用如下:

  • 确保 Pod 副本数:根据 replicas 字段定义的预期副本数,自动创建或删除 Pod,保障服务可用性(如配置 replicas=3,则始终维持 3 个运行中的 Pod)。
  • 滚动更新:支持无停机更新 Pod 镜像(如从 nginx:1.21 更新到 nginx:1.23),通过逐步替换旧 Pod 实现零 downtime。
  • 版本回滚:若更新后服务异常,可快速回滚到上一个稳定版本。
  • 资源关联:通过 Label Selector 关联 Pod,仅管理带有特定 Label 的 Pod。

4.2 Deployment 工作原理

Deployment 通过 ReplicaSet(副本集) 间接管理 Pod,层级关系如下:

  1. Deployment:定义预期状态(如副本数、Pod 模板、更新策略)。
  2. ReplicaSet:由 Deployment 自动创建,负责监控 Pod 副本数,确保实际副本数与预期一致。
  3. Pod:由 ReplicaSet 自动创建,运行用户应用。

结构示意图

Deployment(nginx,replicas=3)
└─ ReplicaSet(nginx-5ff7956ff6)├─ Pod(nginx-5ff7956ff6-6k8cb,label: run=nginx)├─ Pod(nginx-5ff7956ff6-jxfjt,label: run=nginx)└─ Pod(nginx-5ff7956ff6-v6jqw,label: run=nginx)
  • 关键关联:Deployment 的 selector 匹配 ReplicaSet 的 labels,ReplicaSet 的 selector 匹配 Pod 的 labels

4.3 Deployment 操作详解

4.3.1 创建 Deployment(命令行)

通过命令行快速创建 Deployment,同时指定 Pod 镜像、端口和副本数:

# 命令格式:kubectl create deployment <名称> --image=<镜像> --port=<端口> --replicas=<副本数> --namespace=<命名空间>
[root@master ~]# kubectl create deploy nginx --image=nginx:latest --port=80 --replicas=3 -n ycy
deployment.apps/nginx created  # 创建成功(2025.10.29 执行)
  • 参数说明
    • --replicas=3:指定创建 3 个 Pod 副本(默认 replicas=1)。
    • --image=nginx:latest:Pod 内容器的镜像。
    • --port=80:容器暴露的端口。
    • -n ycy:Deployment 所属的 Namespace。
4.3.2 查看 Deployment 相关资源
1. 查看 Deployment 基本信息
[root@master ~]# kubectl get deploy -n ycy  # "deploy"是"deployment"的缩写
NAME    READY   UP-TO-DATE   AVAILABLE   AGE
nginx   3/3     3            3           2m42s  # 2分42秒前创建,符合2025.10.29操作时间
  • 字段说明
    • READY就绪副本数/预期副本数3/3 表示所有副本正常)。
    • UP-TO-DATE:符合最新配置的副本数(更新时表示已更新的副本数)。
    • AVAILABLE:当前可用的副本数(可提供服务的副本)。
    • AGE:Deployment 创建时间。
2. 查看 Deployment 详细信息
[root@master ~]# kubectl describe deploy nginx -n ycy
Name:                   nginx  # Deployment名称
Namespace:              ycy    # 所属Namespace
CreationTimestamp:      Wed, 29 Oct 2025 11:14:14 +0800  
Labels:                 run=nginx  # Deployment的Label
Annotations:            deployment.kubernetes.io/revision: 1  # 版本号(更新一次递增1)
Selector:               run=nginx  # Label选择器(匹配Pod的Label)
Replicas:               3 desired | 3 updated | 3 total | 3 available | 0 unavailable
# 预期副本数:3 | 已更新副本数:3 | 总副本数:3 | 可用副本数:3 | 不可用副本数:0
StrategyType:           RollingUpdate  # 更新策略(滚动更新,默认)
MinReadySeconds:        0  # 容器就绪后,等待多久计入可用(默认0秒)
RollingUpdateStrategy:  25% max unavailable, 25% max surge  # 滚动更新参数
# max unavailable:更新过程中允许不可用的最大副本数(25%表示3个副本时允许0个不可用)
# max surge:更新过程中允许超出预期副本数的最大副本数(25%表示3个副本时允许1个额外副本)# Pod模板(Deployment根据此模板创建Pod)
Pod Template:Labels:  run=nginx  # Pod的Label(需与Deployment的Selector匹配)Containers:nginx:Image:        nginx:latest  # 容器镜像Port:         80/TCP        # 容器端口Host Port:    0/TCP         # 主机端口(未映射)Environment:  <none>        # 环境变量Mounts:       <none>        # 挂载卷Volumes:        <none>        # 卷配置# Deployment状态条件
Conditions:Type           Status  Reason----           ------  ------Available      True    MinimumReplicasAvailable  # 可用:满足最小副本数Progressing    True    NewReplicaSetAvailable     # 进度:新ReplicaSet已就绪OldReplicaSets:  <none>  # 旧ReplicaSet(无更新时为空)
NewReplicaSet:   nginx-5ff7956ff6 (3/3 replicas created)  # 新ReplicaSet(管理3个Pod)# 事件(记录Deployment生命周期操作,时间线匹配2025.10.29 11:14-11:20)
Events:Type    Reason             Age    From                   Message----    ------             ----   ----                   -------Normal  ScalingReplicaSet  5m43s  deployment-controller  Scaled up replicaset nginx-5ff7956ff6 to 3  
3. 查看 Deployment 管理的 Pod
[root@master ~]# kubectl get pods -n ycy
NAME                     READY   STATUS    RESTARTS   AGE
nginx-5ff7956ff6-6k8cb   1/1     Running   0          19s  
nginx-5ff7956ff6-jxfjt   1/1     Running   0          19s  
nginx-5ff7956ff6-v6jqw   1/1     Running   0          19s  
  • Pod 名称格式:Deployment名称-ReplicaSet哈希-Pod随机字符串,确保唯一性。
4. 查看 Deployment 管理的 ReplicaSet
[root@master ~]# kubectl get rs -n ycy  # "rs"是"replicaset"的缩写
NAME               DESIRED   CURRENT   READY   AGE
nginx-5ff7956ff6   3         3         3       5m 
  • DESIRED:预期副本数;CURRENT:当前副本数;READY:就绪副本数。
4.3.3 扩缩容 Deployment

通过调整 replicas 字段实现 Pod 副本数的增加(扩容)或减少(缩容):

1. 命令行扩缩容
  • 扩容:将 nginx Deployment 的副本数从 3 调整为 5:
    [root@master ~]# kubectl scale deploy nginx --replicas=5 -n ycy
    deployment.apps/nginx scaled  # 扩缩容成功
    
  • 缩容:将副本数从 5 调整为 2:
    [root@master ~]# kubectl scale deploy nginx --replicas=2 -n ycy
    deployment.apps/nginx scaled
    
2. 验证扩缩容结果
[root@master ~]# kubectl get deploy nginx -n ycy
NAME    READY   UP-TO-DATE   AVAILABLE   AGE
nginx   2/2     2            2           10m  # 副本数已调整为2,Deployment创建于10分钟前
4.3.4 更新 Deployment(滚动更新)

Deployment 支持滚动更新 Pod 镜像,步骤如下:

1. 执行更新命令

nginx Deployment 的镜像从 nginx:latest 更新为 nginx:1.23

[root@master ~]# kubectl set image deploy nginx nginx=nginx:1.23 -n ycy
deployment.apps/nginx image updated  # 更新成功
  • 命令格式:kubectl set image deploy <Deployment名称> <容器名称>=<新镜像> -n <命名空间>
  • 注:<容器名称> 需与 Deployment 的 Pod 模板中定义的容器名称一致(此处为 nginx)。
2. 查看更新进度

更新过程中,Deployment 会逐步创建新 Pod(使用新镜像),并删除旧 Pod(使用旧镜像):

[root@master ~]# kubectl get pods -n ycy -w  # "-w"实时监控Pod状态
NAME                     READY   STATUS              RESTARTS   AGE
nginx-5ff7956ff6-jxfjt   1/1     Running             0          12m  # 12分钟前创建的旧Pod
nginx-5ff7956ff6-v6jqw   1/1     Running             0          12m
nginx-7f98d7c6b4-2xqzk   0/1     ContainerCreating   0          3s  # 新Pod创建中(3秒前)
nginx-7f98d7c6b4-2xqzk   1/1     Running             0          5s  # 新Pod就绪(5秒前)
nginx-5ff7956ff6-jxfjt   1/1     Terminating         0          12m # 旧Pod开始删除
nginx-5ff7956ff6-jxfjt   0/1     Terminating         0          12m
nginx-7f98d7c6b4-8zqkp   0/1     ContainerCreating   0          7s  # 第二个新Pod创建中(7秒前)
nginx-7f98d7c6b4-8zqkp   1/1     Running             0          9s  # 第二个新Pod就绪(9秒前)
nginx-5ff7956ff6-v6jqw   1/1     Terminating         0          12m # 第二个旧Pod删除
nginx-5ff7956ff6-v6jqw   0/1     Terminating         0          12m
3. 验证更新结果

查看 Deployment 的镜像是否已更新:

[root@master ~]# kubectl describe deploy nginx -n ycy | grep "Image:"Image:        nginx:1.23  # 已更新为目标镜像
4.3.5 回滚 Deployment

若更新后服务异常(如 Pod 启动失败、服务不可用),可回滚到上一个稳定版本:

1. 查看 Deployment 历史版本
[root@master ~]# kubectl rollout history deploy nginx -n ycy
deployment.apps/nginx
REVISION  CHANGE-CAUSE
1         kubectl create deploy nginx --image=nginx:latest --port=80 --replicas=3 -n ycy  # 版本1(旧版本,11:14创建)
2         kubectl set image deploy nginx nginx=nginx:1.23 -n ycy  
2. 回滚到上一个版本
[root@master ~]# kubectl rollout undo deploy nginx -n ycy
deployment.apps/nginx rolled back  # 回滚成功
3. 回滚到指定版本

若需回滚到特定版本(如版本 1),使用 --to-revision 参数:

[root@master ~]# kubectl rollout undo deploy nginx --to-revision=1 -n ycy
deployment.apps/nginx rolled back
4. 验证回滚结果
[root@master ~]# kubectl describe deploy nginx -n ycy | grep "Image:"Image:        nginx:latest  # 已回滚到旧版本
4.3.6 删除 Deployment

删除 Deployment 会同时删除其管理的 ReplicaSet 和 Pod,操作需谨慎:

[root@master ~]# kubectl delete deploy nginx -n ycy
deployment.apps "nginx" deleted  # 删除成功

验证删除结果

# 1. 查看 Deployment 是否存在
[root@master ~]# kubectl get deploy -n ycy
No resources found in ycy namespace.  # 无 Deployment 资源,删除成功# 2. 查看 ReplicaSet 是否存在
[root@master ~]# kubectl get rs -n ycy
No resources found in ycy namespace.  # 关联的 ReplicaSet 已自动删除# 3. 查看 Pod 是否存在
[root@master ~]# kubectl get pods -n ycy
No resources found in ycy namespace.  # 关联的 Pod 已自动删除
4.3.7 YAML 配置操作

通过 YAML 文件可精细定义 Deployment 的完整配置(如更新策略、资源限制、环境变量),适用于生产环境。

1. 创建 YAML 文件(如 deploy-nginx.yaml
apiVersion: apps/v1  # Deployment 的 API 版本(固定为 apps/v1,区别于 Pod 的 v1)
kind: Deployment     # 资源类型为 Deployment
metadata:name: nginx        # Deployment 名称(在所属 Namespace 内唯一)namespace: ycy     # 所属 Namespace(需提前创建)
spec:replicas: 3        # 预期 Pod 副本数(默认 1,此处配置 3 个以实现高可用)selector:          # Label 选择器,用于关联需管理的 PodmatchLabels:     # 精确匹配 Pod 的 Labelrun: nginxstrategy:          # 更新策略配置(可选,默认 RollingUpdate)type: RollingUpdate  # 滚动更新(无停机),另一种为 Recreate(重建更新)rollingUpdate:maxUnavailable: 25%  # 更新过程中允许不可用的最大副本数(25% 或绝对值,如 1)maxSurge: 25%        # 更新过程中允许超出预期副本数的最大副本数(25% 或绝对值)template:          # Pod 模板(Deployment 根据此模板创建 Pod)metadata:labels:        # Pod 的 Label,需与 spec.selector.matchLabels 完全匹配run: nginxspec:containers:    # 容器列表(同 Pod 的容器配置)- image: nginx:latest  # 容器镜像(可指定版本,如 nginx:1.25)name: nginx          # 容器名称(在 Pod 内唯一)ports:- containerPort: 80  # 容器内部端口(Nginx 默认端口)protocol: TCP      # 协议类型(默认 TCP)resources:  # 资源限制配置(可选,避免容器资源滥用)requests:  # 容器所需最小资源(调度时参考)cpu: "100m"     # 100 毫核(1 核 = 1000 毫核)memory: "128Mi" # 128 兆内存limits:    # 容器允许使用的最大资源cpu: "500m"     # 最大 500 毫核memory: "256Mi" # 最大 256 兆内存
2. 执行创建命令
[root@master ~]# kubectl create -f deploy-nginx.yaml
deployment.apps/nginx created  
3. 执行更新命令

若需修改配置(如调整副本数、更新镜像、修改资源限制),修改 YAML 文件后执行 apply 命令覆盖现有配置:

# 示例:将 replicas 从 3 改为 4,镜像从 nginx:latest 改为 nginx:1.25
[root@master ~]# kubectl apply -f deploy-nginx.yaml
deployment.apps/nginx configured  # 更新成功
4. 执行删除命令
[root@master ~]# kubectl delete -f deploy-nginx.yaml
deployment.apps "nginx" deleted  # 删除成功

4.4 扩展:Deployment 关键特性与最佳实践

4.4.1 滚动更新(RollingUpdate) vs 重建更新(Recreate)

Deployment 支持两种更新策略,需根据业务场景选择:

更新策略核心逻辑适用场景优缺点对比
RollingUpdate逐步删除旧 Pod、创建新 Pod(默认每次更新 25% 副本),确保服务持续可用生产环境、无状态服务(如 Web 服务、API)优点:无停机更新,用户无感知;缺点:需兼容多版本并存,资源消耗略高(临时多副本)
Recreate先删除所有旧 Pod,再批量创建新 Pod,更新过程中服务暂时不可用测试环境、有状态服务(如数据库)优点:逻辑简单,无需兼容多版本;缺点:服务中断,影响用户体验

配置示例(启用 Recreate 策略)

spec:strategy:type: Recreate  # 启用重建更新
4.4.2 版本管理与回滚

Deployment 会记录每次配置变更的版本(revision),支持灵活回滚,关键命令如下:

需求场景命令示例
查看历史版本列表kubectl rollout history deploy nginx -n ycy
查看指定版本的详细配置kubectl rollout history deploy nginx --revision=2 -n ycy
回滚到上一个版本kubectl rollout undo deploy nginx -n ycy
回滚到指定版本kubectl rollout undo deploy nginx --to-revision=1 -n ycy
暂停更新(更新中)kubectl rollout pause deploy nginx -n ycy
恢复更新(暂停后)kubectl rollout resume deploy nginx -n ycy
4.4.3 资源限制与 QoS 配置

为 Deployment 配置资源限制(resources.requests/resources.limits),可避免容器过度占用节点资源,保障集群稳定性:

  • requests:容器启动时所需的最小资源,Kubernetes 调度器会优先将 Pod 调度到资源充足的节点。
  • limits:容器允许使用的最大资源,若超出限制,容器会被终止(CPU 超限时会被限流,内存超限时会被 OOM 杀死)。

最佳实践

  • 为所有容器配置 requestslimits,避免“资源争抢”。
  • 对于核心服务,可适当提高 requests 确保调度优先级;非核心服务可降低 requests 提高资源利用率。
4.4.4 高可用配置

通过合理配置 replicas 和 Pod 分布,提升服务可用性:

  1. 副本数配置replicas 建议设置为 3 或以上(避免单节点故障导致服务不可用),且副本数最好为奇数(便于分布式服务选主,如 Etcd)。
  2. 节点亲和性:通过 nodeAffinity 配置,确保 Deployment 的 Pod 分散在不同节点(或不同可用区),避免单节点故障导致所有副本下线:
    spec:template:spec:affinity:podAntiAffinity:  # 反亲和性:避免同一 Deployment 的 Pod 调度到同一节点requiredDuringSchedulingIgnoredDuringExecution:- labelSelector:matchExpressions:- key: runoperator: Invalues:- nginxtopologyKey: "kubernetes.io/hostname"  # 按节点主机名区分
    

4.5 常见问题排查

4.5.1 Deployment 副本数不满足预期(READY < DESIRED)

可能原因及排查步骤:

  1. 节点资源不足

    • 排查命令:kubectl describe node <节点名>,查看 Allocatable(可分配资源)和 Allocated resources(已分配资源),确认是否有足够 CPU/内存。
    • 解决方式:扩容节点、调整容器 resources 配置、删除低优先级 Pod。
  2. 镜像拉取失败

    • 排查命令:kubectl describe pod <Pod名> -n ycy,查看 Events 中的 Failed to pull image 错误信息。
    • 常见原因:镜像地址错误、私有镜像仓库未配置密钥(imagePullSecrets)、网络无法访问镜像仓库。
    • 解决方式:修正镜像地址、创建 Secret 并配置 imagePullSecrets、检查网络连通性。
  3. Pod 调度失败

    • 排查命令:kubectl describe pod <Pod名> -n ycy,查看 Events 中的 FailedScheduling 错误。
    • 常见原因:节点污点(Taint)与 Pod 容忍度(Toleration)不匹配、节点亲和性配置冲突、节点资源不足。
    • 解决方式:添加对应的 toleration、修正亲和性配置、扩容节点。
4.5.2 更新后服务异常(如 502 错误)

可能原因及排查步骤:

  1. 新镜像存在 bug

    • 排查命令:kubectl logs <新Pod名> -n ycy,查看容器日志是否有报错。
    • 解决方式:回滚到上一个稳定版本(kubectl rollout undo deploy <Deployment名> -n ycy),修复镜像后重新更新。
  2. 滚动更新参数不合理

    • maxUnavailable 配置过大(如 50%),可能导致更新过程中可用副本不足,服务无法承载请求。
    • 解决方式:调整 maxUnavailable 为更小值(如 25% 或 1),确保更新过程中有足够可用副本。
  3. 健康检查未配置

    • 若未配置就绪探针(Readiness Probe),新 Pod 启动后未完成初始化就接收请求,可能导致服务异常。
    • 解决方式:添加就绪探针,确保 Pod 就绪后才加入服务:
      spec:containers:- name: nginximage: nginx:latestreadinessProbe:  # 就绪探针httpGet:path: /  # 检查路径(根据业务调整,如 /health)port: 80initialDelaySeconds: 5  # 容器启动后延迟 5 秒开始检查periodSeconds: 10       # 每 10 秒检查一次
      
http://www.dtcms.com/a/545266.html

相关文章:

  • 写作网站保底和全勤的区别wordpress 心情评论插件
  • php做购物网站怎么样网站404页面做晚了
  • 电子商务智能建站查询价格的网站
  • 定制线束源头工厂解决方案品牌推荐-力可欣储能线束:为新能源汽车提供持久动力
  • Spring Boot中的JUC并发解析
  • k8s一站式学习
  • 7.1.4 大数据方法论与实践指南-数据服务接口
  • 网安面试题收集(6)
  • 建设网站需要多少钱济南兴田德润o地址济南网站建设加q479185700
  • 站长之家appwordpress添加版权
  • LeetCode每日一题——Pow(x, n)
  • 6.3.2.2 大数据方法论与实践指南-离线任务质量治理
  • 成都php网站制作程序员网站建设公司新报价
  • SODA v9.5.2 甜盐相机,自然美颜相机
  • 【小白笔记】判断一个正整数是否为质数(Prime Number)-循环语句中的else语句
  • 传奇网站一般怎么做的在国外做h网站怎么样
  • Next.js, Node.js, JavaScript, TypeScript 的关系
  • 做一个综合商城网站多少钱合肥seo关键词排名
  • 网站开发与管理对应的职业及岗位优质的seo网站排名优化软件
  • 新人如何学会安装与切换Rust版本:从工具链管理到生产实践
  • 公司网站制作源码wordpress 最快的版本
  • Rust:与JSON、TOML等格式的集成
  • 应用商城发布项目
  • 6.3.3.1 大数据方法论与实践指南-大数据质量度量指标体系
  • 二叉树----规矩森严的“家族树”(第11讲)
  • 随州网站建设有哪些南昌网站建设是什么意思
  • php免费企业网站模板祥云县住房和城乡建设网站
  • 宏观经济走势对网民互联网消费行为的影响:基于开源链动2+1模式AI智能名片S2B2C商城小程序的实证分析
  • 网站开发 环境品牌设计概念
  • 网站建设加盟培训网站内图片变换怎么做