Kubernetes 是一个强大的容器编排平台,它提供了一套丰富的资源对象来帮助我们管理和部署应用程序。在 Kubernetes 中,服务的部署通常涉及多个资源对象,包括 Deployment、Service、ConfigMap、Secret、Horizontal Pod Autoscaler (HPA) 等。每个资源对象都有其特定的用途,可以帮助我们实现灵活、弹性的应用部署和自动化运维。本文将介绍这些常见的 Kubernetes 服务部署文件模板,帮助开发人员快速部署和管理应用。
1.Deployment 模板
Deployment 是 Kubernetes 中最常用的资源对象之一,用于部署和管理应用的副本。通过 Deployment,可以确保指定数量的 Pod 始终处于运行状态,并且支持版本控制、滚动更新、回滚等功能。
metadata.name: Deployment 的名称,必须是唯一的。metadata.labels: 为 Deployment 打上标签,方便管理和筛选。spec.replicas: 指定 Pod 的副本数量,这里设置为 3,表示会创建 3 个相同的 Pod。spec.selector.matchLabels: 选择器,用于匹配 Pod 的标签。这里选择所有标签为app=nginx的 Pod。spec.template.metadata.labels: 为 Pod 打上标签,必须与选择器匹配。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 提供统一的访问接口,并且支持负载均衡。
metadata.name: Service 的名称,必须是唯一的。spec.selector: 选择器,用于匹配 Pod 的标签。Service 会将流量路由到标签匹配的 Pod。 - 例如:app: <app-name>表示选择所有标签为app=<app-name>的 Pod。spec.ports: 定义 Service 的端口配置。 -protocol: 协议类型,默认为 TCP。 -port: Service 暴露的端口,外部通过该端口访问 Service。 -targetPort: 目标 Pod 的端口,Service 将流量转发到 Pod 的这个端口。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 副本数,反之亦然,确保系统始终保持高效的资源利用。
scaleTargetRef: - 指定 HPA 要扩展的目标资源。 -apiVersion和kind必须与目标资源一致。 -name是目标资源的名称(这里是nginx-deployment)。minReplicas: - Pod 的最小副本数量,即使负载很低,也不会少于这个值。maxReplicas: - Pod 的最大副本数量,即使负载很高,也不会超过这个值。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 中使用:
- 作为环境变量:
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 中的键
- 作为卷挂载:
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。
metadata.annotations: -nginx.ingress.kubernetes.io/rewrite-target: /:重写目标路径,将所有流量重写到根路径。 - 其他常见的注解包括 SSL 配置、负载均衡配置等。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)
- 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)
- 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 用于管理有状态应用,能够提供稳定的网络身份和持久化存储。它适用于需要顺序部署、稳定标识符(如数据库、缓存系统等)的应用。
serviceName: - 关联的 Headless Service 名称,用于为每个 Pod 提供唯一的网络身份。 - Headless Service 不会分配 ClusterIP,而是直接返回 Pod 的 IP 地址。replicas: - StatefulSet 的副本数量,每个副本都有唯一的标识符(如mysql-0、mysql-1等)。selector.matchLabels: - 选择器,用于匹配 Pod 的标签。template: - 定义 Pod 的模板,包括容器的配置。volumeMounts: - 将持久化存储挂载到容器的指定路径。volumeClaimTemplates: - 定义持久化存储模板,每个 Pod 都会根据模板创建一个 PVC。 -accessModes:访问模式,常见的有ReadWriteOnce、ReadOnlyMany、ReadWriteMany。 -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 # 请求的存储容量