首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >k8s中的deployment是个啥?

k8s中的deployment是个啥?

原创
作者头像
大侠之运维
发布2025-09-15 17:08:13
发布2025-09-15 17:08:13
90
举报

如果你最近在学习k8s相关内容,那么这篇内容不可错过,deployment是K8s中最核心的对象,这篇文章将通过一个最简单的例子来介绍下deployment。

deployment初介绍

pod是k8s中最基础的单元,而deployment是对pod的抽象体现,deployment主要保证实现配置所声明的状态。

一些关键概念

  • deployment可以调度和管理多个pod副本,比如可以确保pod的数量和状态符合预期,如果有pod异常退出,会自动拉起新的pod进行替换
  • 一个pod可能包含多个容器,多个容器共享一套网络命名空间,因此ip地址是同一个,例如一个应用容器+一个sidecar容器
  • pod的ip是临时的,因此k8s访问pod通过service来实现,后者通过标签(label)和选择器(selector)来路由流量,对于外部访问来讲,service提供了一个稳定的入口
  • deployment适用于无状态服务,如果有状态需要持久化,应使用statefulset

实践

下面将会介绍一个完整的nginx deployment示例。

deployment配置文件

deployment配置文件通常使用yaml格式,其中包含的主要配置有如下几项:

代码语言:bash
复制
apiVersion
Kind
metadata
spec

在k8s中不仅deployment,其它诸如services, Replica Set, Configmap, Jobs都是被称作对象。

下面具体介绍上面几个配置的含义:

1.apiVersion

目前所使用的k8s对象的版本,生产环境默认使用apps/v1,属于生产稳定版本,另外还有其他如:Alpha:早期的候选版本,Beta:API 在 Alpha 测试后即成为 beta 版本,stable:不包含 alpha 和 beta 的 API 属于稳定类别。

代码语言:bash
复制

2.kind

它用于声明当前配置文件要创建的资源对象类型。

代码语言:bash
复制
kind: Deployment

3.metadata

它的作用在于定义对象的元数据信息,常用字段有name、namespace、labels、annotations等

其中labels:主要用于对Deployment对象进行分组和分类的键值对。

Name:表示要创建的 Deployment 的名称。

Namespace:要在其中创建Deployment的命名空间的名称。

Annotations:键值对(如标签),但用于不同的使用案例。

代码语言:bash
复制
metadata:
  name: my-nginx
  labels:
    app: nginx

4.spec

核心部分,描述对象期望的状态,常用字段有replicas、selector、template

其中selector用于选择哪些pod用于该deployment管理,template其实是pod的模板,会包括其对应的metadata及spec(包括containers及volumes定义存储卷(ConfigMap、Secret、PVC 等))

如:

代码语言:bash
复制
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.21
        ports:
        - containerPort: 80

deployment完整案例

将会通过如下几步来给出一个deployment的实践

  • 创建namespace
  • 创建nginx deployment
  • 创建nginx服务
  • 暴露和访问nginx服务

🔹 Deployment 实践案例:部署 Nginx

步骤 1:创建 namespace

我们先创建一个独立的命名空间,便于管理 Nginx 相关的资源。

代码语言:bash
复制
kubectl create namespace demo-nginx

或者使用 YAML 文件:

代码语言:yaml
复制
apiVersion: v1
kind: Namespace
metadata:
  name: demo-nginx

步骤 2:创建 Nginx Deployment

创建一个 Deployment 来运行 Nginx,设置 3 个副本

代码语言:yaml
复制
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  namespace: demo-nginx
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.21
        ports:
        - containerPort: 80

应用配置:

代码语言:bash
复制
kubectl apply -f nginx-deployment.yaml

验证:

代码语言:bash
复制
kubectl get pods -n demo-nginx -o wide

步骤 3:创建 Nginx 服务

Deployment 会启动多个 Pod,而 Pod IP 是临时的,因此我们需要创建 Service 来统一访问入口。

代码语言:yaml
复制
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
  namespace: demo-nginx
spec:
  selector:
    app: nginx
  ports:
  - protocol: TCP
    port: 80       # Service 暴露的端口
    targetPort: 80 # Pod 内部容器端口
  type: ClusterIP  # 只在集群内可访问

应用配置:

代码语言:bash
复制
kubectl apply -f nginx-service.yaml

查看:

代码语言:bash
复制
kubectl get svc -n demo-nginx

步骤 4:暴露和访问 Nginx 服务

如果你需要 集群外部访问,可以把 Service 类型改为 NodePort 或通过 Ingress Controller 暴露。

NodePort
代码语言:yaml
复制
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
  namespace: demo-nginx
spec:
  selector:
    app: nginx
  ports:
  - port: 80
    targetPort: 80
    nodePort: 30080   # 手动指定 NodePort(范围 30000-32767)
  type: NodePort

访问方式(浏览器或 curl):

代码语言:bash
复制
http://<NodeIP>:30080

最终结果

  • 你在 demo-nginx 命名空间中创建了一个 Nginx Deployment(3 个 Pod)。
  • 通过 Service 暴露 Pod,并根据需要使用 NodePort 或 Ingress 对外提供访问。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • deployment初介绍
  • 一些关键概念
  • 实践
    • deployment配置文件
    • deployment完整案例
  • 🔹 Deployment 实践案例:部署 Nginx
    • 步骤 1:创建 namespace
    • 步骤 2:创建 Nginx Deployment
    • 步骤 3:创建 Nginx 服务
    • 步骤 4:暴露和访问 Nginx 服务
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档