Kubernetes 是一个强大的容器编排平台,它提供了一套丰富的资源对象来帮助我们管理和部署应用程序。在 Kubernetes 中,服务的部署通常涉及多个资源对象,包括 Deployment、Service、ConfigMap、Secret、Horizontal Pod Autoscaler (HPA) 等。每个资源对象都有其特定的用途,可以帮助我们实现灵活、弹性的应用部署和自动化运维。本文将介绍这些常见的 Kubernetes 服务部署文件模板,帮助开发人员快速部署和管理应用。

1.Deployment 模板

Deployment 是 Kubernetes 中最常用的资源对象之一,用于部署和管理应用的副本。通过 Deployment,可以确保指定数量的 Pod 始终处于运行状态,并且支持版本控制、滚动更新、回滚等功能。

  1. metadata.name: Deployment 的名称,必须是唯一的。
  2. metadata.labels: 为 Deployment 打上标签,方便管理和筛选。
  3. spec.replicas: 指定 Pod 的副本数量,这里设置为 3,表示会创建 3 个相同的 Pod。
  4. spec.selector.matchLabels: 选择器,用于匹配 Pod 的标签。这里选择所有标签为 app=nginx 的 Pod。
  5. spec.template.metadata.labels: 为 Pod 打上标签,必须与选择器匹配。
  6. spec.template.spec.containers: 定义容器的配置。 - name: 容器的名称。 - image: 使用的容器镜像,这里是 nginx:latest。 - ports: 容器暴露的端口,nginx 默认监听 80 端口。 - resources: 设置容器的资源请求和限制,确保容器能够正常运行且不会占用过多资源。
apiVersion: apps/v1  # 使用的 Kubernetes API 版本
kind: Deployment     # 资源类型为 Deployment
metadata:
  name: nginx-deployment  # Deployment 的名称
  labels:
    app: nginx            # Deployment 的标签
    env: production       # 标识环境(例如生产环境)
spec:
  replicas: 3             # 指定 Pod 的副本数量为 3
  selector:
    matchLabels:
      app: nginx          # 选择器,匹配标签为 app=nginx 的 Pod
  template:               # Pod 模板
    metadata:
      labels:
        app: nginx        # Pod 的标签,必须与选择器匹配
    spec:
      containers:
        - name: nginx-container  # 容器的名称
          image: nginx:latest    # 使用 nginx:latest 镜像
          ports:
            - containerPort: 80  # 容器暴露的端口(nginx 默认监听 80 端口)
          resources:             # 资源请求和限制
            requests:
              cpu: "100m"        # 请求 0.1 核 CPU
              memory: "128Mi"    # 请求 128MB 内存
            limits:
              cpu: "500m"        # 最多使用 0.5 核 CPU
              memory: "256Mi"    # 最多使用 256MB 内存

2. Service 模板

Service 用于在 Kubernetes 集群内或集群外暴露应用的端口,方便访问。它为 Pod 提供统一的访问接口,并且支持负载均衡。

  1. metadata.name: Service 的名称,必须是唯一的。
  2. spec.selector: 选择器,用于匹配 Pod 的标签。Service 会将流量路由到标签匹配的 Pod。 - 例如:app: <app-name> 表示选择所有标签为 app=<app-name> 的 Pod。
  3. spec.ports: 定义 Service 的端口配置。 - protocol: 协议类型,默认为 TCP。 - port: Service 暴露的端口,外部通过该端口访问 Service。 - targetPort: 目标 Pod 的端口,Service 将流量转发到 Pod 的这个端口。
  4. spec.type: Service 的类型,决定 Service 如何暴露。 - ClusterIP: 默认类型,仅在集群内部访问。 - NodePort: 在每个节点的指定端口上暴露 Service,允许外部访问。 - LoadBalancer: 通过云提供商的负载均衡器暴露 Service。
apiVersion: v1
kind: Service
metadata:
  name: nginx-service  # Service 的名称
  labels:
    app: nginx         # Service 的标签
spec:
  selector:
    app: nginx         # 选择器,匹配标签为 app=nginx 的 Pod
  ports:
    - protocol: TCP    # 协议类型,TCP 是默认值
      port: 80         # Service 暴露的端口
      targetPort: 80   # 目标 Pod 的端口
  type: ClusterIP      # Service 类型,ClusterIP 是默认值,可选值: ClusterIP, NodePort, LoadBalancer

3. Horizontal Pod Autoscaler (HPA) 模板

HPA 用于自动调整应用的副本数量,通常基于 CPU 或内存利用率。当应用负载增加时,HPA 会自动增加 Pod 副本数,反之亦然,确保系统始终保持高效的资源利用。

  1. scaleTargetRef: - 指定 HPA 要扩展的目标资源。 - apiVersionkind 必须与目标资源一致。 - name 是目标资源的名称(这里是 nginx-deployment)。
  2. minReplicas: - Pod 的最小副本数量,即使负载很低,也不会少于这个值。
  3. maxReplicas: - Pod 的最大副本数量,即使负载很高,也不会超过这个值。
  4. metrics: - 定义扩展的指标。 - type: Resource 表示基于资源(如 CPU、内存)进行扩展。 - name: cpu 表示监控 CPU 使用率。 - target.type: Utilization 表示目标类型为利用率。 - averageUtilization: 80 表示当 CPU 使用率超过 80% 时,自动扩展 Pod。
apiVersion: autoscaling/v2  # 使用的 Kubernetes API 版本
kind: HorizontalPodAutoscaler  # 资源类型为 HorizontalPodAutoscaler
metadata:
  name: nginx-hpa  # HPA 的名称
spec:
  scaleTargetRef:  # 指定要扩展的目标资源
    apiVersion: apps/v1  # 目标资源的 API 版本
    kind: Deployment  # 目标资源的类型
    name: nginx-deployment  # 目标资源的名称(与 Deployment 名称一致)
  minReplicas: 1  # 最小副本数量
  maxReplicas: 10  # 最大副本数量
  metrics:  # 定义扩展指标
    - type: Resource  # 资源类型指标
      resource:
        name: cpu  # 监控 CPU 使用率
        target:
          type: Utilization  # 目标类型为利用率
          averageUtilization: 80  # 当 CPU 使用率超过 80% 时,自动扩展

4. ConfigMap 模板

ConfigMap 用于存储配置信息,应用程序可以从 ConfigMap 中读取配置信息,避免硬编码。ConfigMap 支持将配置作为环境变量、命令行参数或者文件挂载到容器内。

apiVersion: v1
kind: ConfigMap
metadata:
  name: nginx-config  # ConfigMap 的名称
data:
  # 键值对 1:Nginx 配置文件
  nginx.conf: |
    server {
        listen 80;
        server_name localhost;

        location / {
            root /usr/share/nginx/html;
            index index.html;
        }
    }

  # 键值对 2:环境变量
  env_vars: |
    APP_NAME=nginx
    ENV=production

5. Secret 模板

Secret 用于存储敏感数据(如密码、API 密钥等),可以加密存储。与 ConfigMap 类似,Secret 也可以挂载为环境变量或文件。

echo -n "admin" | base64  # 输出:YWRtaW4=
echo -n "password123" | base64  # 输出:cGFzc3dvcmQxMjM=

apiVersion: v1
kind: Secret
metadata:
  name: nginx-secret  # Secret 的名称
type: Opaque
data:
  username: YWRtaW4=           # Base64 编码的用户名
  password: cGFzc3dvcmQxMjM=   # Base64 编码的密码

# 验证
kubectl get secrets
kubectl describe secret nginx-secret

在 Pod 中使用 Secret

Secret 可以通过以下方式在 Pod 中使用:

  1. 作为环境变量

yaml env: - name: SECRET_USERNAME valueFrom: secretKeyRef: name: nginx-secret # Secret 的名称 key: username # Secret 中的键 - name: SECRET_PASSWORD valueFrom: secretKeyRef: name: nginx-secret # Secret 的名称 key: password # Secret 中的键

  1. 作为卷挂载

yaml volumes: - name: secret-volume secret: secretName: nginx-secret # Secret 的名称 containers: - name: nginx-container volumeMounts: - name: secret-volume mountPath: /etc/secret # 挂载路径 readOnly: true

6. Ingress 模板

Ingress 是 Kubernetes 中用于管理外部访问的资源对象,它通常用于 HTTP/HTTPS 流量的路由,能够将外部请求根据不同的路径或域名转发到集群内部的 Service。

  1. metadata.annotations: - nginx.ingress.kubernetes.io/rewrite-target: /:重写目标路径,将所有流量重写到根路径。 - 其他常见的注解包括 SSL 配置、负载均衡配置等。
  2. spec.rules: - 定义路由规则。 - host:指定域名,只有匹配该域名的请求才会被路由。 - http.paths:定义 HTTP 路径规则。
    • path:请求路径。
    • pathType:路径匹配类型,常见的有 Prefix(前缀匹配)和 Exact(精确匹配)。
    • backend:指定后端服务。
    • service.name:后端服务的名称。
    • service.port.number:后端服务的端口。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: nginx-ingress  # Ingress 的名称
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /  # 重写目标路径
spec:
  rules:
    - host: example.com  # 域名
      http:
        paths:
          - path: /      # 路径
            pathType: Prefix  # 路径类型,Prefix 表示前缀匹配
            backend:
              service:
                name: nginx-service  # 后端服务的名称
                port:
                  number: 80  # 后端服务的端口

## 验证
kubectl get ingress
kubectl describe ingress nginx-ingress

7. PersistentVolume (PV) 和 PersistentVolumeClaim (PVC) 模板

在 Kubernetes 中,PersistentVolume(PV)用于管理持久化存储资源,而 PersistentVolumeClaim(PVC)是用户请求存储资源的方式。PVC 会自动绑定到一个合适的 PV 上,支持在 Pod 生命周期之外持久存储数据。

示例:

假设我们需要为 Nginx 应用配置一个 PV 和 PVC,使用主机路径 /mnt/data 作为存储。

1. PersistentVolume (PV)

  1. PV 字段: - capacity.storage:PV 的存储容量。 - accessModes:PV 的访问模式,常见的有:
    • ReadWriteOnce:只能被单个节点读写。
    • ReadOnlyMany:可以被多个节点只读。
    • ReadWriteMany:可以被多个节点读写。
    • persistentVolumeReclaimPolicy:PV 的回收策略,常见的有:
    • Retain:删除 PVC 后保留 PV 和数据。
    • Delete:删除 PVC 后自动删除 PV 和数据。
    • Recycle:删除 PVC 后清空 PV 中的数据(已弃用)。
    • hostPath:使用主机路径作为存储,适用于单节点测试环境。
apiVersion: v1
kind: PersistentVolume
metadata:
  name: nginx-pv  # PV 的名称
spec:
  capacity:
    storage: 5Gi  # 存储容量
  accessModes:
    - ReadWriteOnce  # 访问模式
  persistentVolumeReclaimPolicy: Retain  # 回收策略
  hostPath:
    path: "/mnt/data"  # 主机路径

2. PersistentVolumeClaim (PVC)

  1. PVC 字段: - accessModes:PVC 的访问模式,必须与 PV 的访问模式匹配。 - resources.requests.storage:PVC 请求的存储容量。
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nginx-pvc  # PVC 的名称
spec:
  accessModes:
    - ReadWriteOnce  # 访问模式
  resources:
    requests:
      storage: 5Gi  # 请求的存储容量

8.StatefulSet 模板

StatefulSet 用于管理有状态应用,能够提供稳定的网络身份和持久化存储。它适用于需要顺序部署、稳定标识符(如数据库、缓存系统等)的应用。

  1. serviceName: - 关联的 Headless Service 名称,用于为每个 Pod 提供唯一的网络身份。 - Headless Service 不会分配 ClusterIP,而是直接返回 Pod 的 IP 地址。
  2. replicas: - StatefulSet 的副本数量,每个副本都有唯一的标识符(如 mysql-0mysql-1 等)。
  3. selector.matchLabels: - 选择器,用于匹配 Pod 的标签。
  4. template: - 定义 Pod 的模板,包括容器的配置。
  5. volumeMounts: - 将持久化存储挂载到容器的指定路径。
  6. volumeClaimTemplates: - 定义持久化存储模板,每个 Pod 都会根据模板创建一个 PVC。 - accessModes:访问模式,常见的有 ReadWriteOnceReadOnlyManyReadWriteMany。 - resources.requests.storage:请求的存储容量。
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mysql  # StatefulSet 的名称
spec:
  serviceName: mysql-service  # 关联的 Headless Service 名称
  replicas: 3  # 副本数量
  selector:
    matchLabels:
      app: mysql  # 选择器,匹配 Pod 的标签
  template:
    metadata:
      labels:
        app: mysql  # Pod 的标签
    spec:
      containers:
        - name: mysql-container  # 容器的名称
          image: mysql:5.7  # 容器镜像
          ports:
            - containerPort: 3306  # 容器暴露的端口
          env:
            - name: MYSQL_ROOT_PASSWORD
              value: "password"  # MySQL root 密码
          volumeMounts:
            - name: mysql-data  # 卷名称
              mountPath: /var/lib/mysql  # 挂载路径
  volumeClaimTemplates:  # 持久化存储模板
    - metadata:
        name: mysql-data  # 卷名称
      spec:
        accessModes:
          - ReadWriteOnce  # 访问模式
        resources:
          requests:
            storage: 10Gi  # 请求的存储容量
0 子项 · 2 次浏览 · 2026-09-16