tech
Kubernetes 核心对象速查
记录 K8s 业务应用必备的对象层级,从最精简集合到生产必备组件,理清 Deployment、Service、Ingress、ConfigMap、PVC 等核心资源的关系。
跑一个业务应用上 K8s,能对外访问、具备基本自愈能力,需要哪些对象?这里按「必须」「几乎必用」 梳理,并附上一份极简可用的 YAML 示例合集。
最精简集合(能跑、能访问的极简 Demo)
这套组合足够启动一个无状态服务,并让集群内部能稳定访问它:
- Deployment —— 无状态业务应用的核心控制器,管理 Pod 副本数、滚动更新、扩缩容和自愈。不要手写 Pod,Pod 由 Deployment 自动生成并托管。
- Pod —— 最小运行单元,但一般不手动创建,由 Deployment 控制器自动产生。
- Service —— 给一组 Pod 提供统一的网络入口,实现负载均衡。没有 Service,Pod IP 会随重启变化,集群内部无法稳定访问。
这三者足以构成一个最小可行单元。
对外暴露访问(公网/主机访问)
二选一,按场景决定:
- Ingress(生产最常用) —— 七层 HTTP/HTTPS 路由,支持域名和路径转发。需要额外部署 Ingress‑Controller(如 Nginx Ingress、Traefik)才能生效。
- Service 类型为 NodePort / LoadBalancer —— 四层暴露方式,适合测试或非 HTTP 场景。
真实项目几乎必用的对象
线上业务除了跑起来,还要管配置、存数据、做隔离:
配置 & 敏感信息
- ConfigMap —— 存放非敏感配置,如配置文件、环境变量。
- Secret —— 存放密码、Token、密钥等敏感数据。注意:Secret 只是 Base64 编码,并非加密,生产环境建议配合外部密钥管理方案(如 HashiCorp Vault、External Secrets Operator)。
存储(有状态业务)
- PersistentVolumeClaim(PVC) —— Pod 申请存储资源,业务通过 PVC 读写数据。
- PV —— 集群层面的存储资源,通常由存储类(StorageClass)动态供给,开发者一般只写 PVC 即可。
命名空间
- Namespace —— 资源隔离,一个项目通常独占一个 Namespace,部署时通过
kubectl apply -n <namespace>指定。
权限(多团队生产)
- ServiceAccount + Role + RoleBinding —— RBAC 权限体系,用于 Pod 内应用访问 K8s API。个人开发/测试环境可省略。
极简 YAML 示例(完整可部署)
以下是一个 Golang HTTP 服务的完整最小示例,包含 Deployment + Service + ConfigMap + Ingress:
# 1. Namespace(可选,推荐生产使用)
apiVersion: v1
kind: Namespace
metadata:
name: demo-app
---
# 2. ConfigMap(非敏感配置)
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
namespace: demo-app
data:
APP_ENV: "production"
LOG_LEVEL: "info"
---
# 3. Deployment(核心)
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
namespace: demo-app
labels:
app: my-app
spec:
replicas: 2
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: app
image: nginx:alpine # 替换为你的业务镜像
ports:
- containerPort: 80
envFrom:
- configMapRef:
name: app-config
resources:
requests:
memory: "64Mi"
cpu: "100m"
limits:
memory: "128Mi"
cpu: "200m"
# 健康检查(生产必备)
livenessProbe:
httpGet:
path: /health
port: 80
initialDelaySeconds: 5
periodSeconds: 10
readinessProbe:
httpGet:
path: /ready
port: 80
initialDelaySeconds: 3
periodSeconds: 5
---
# 4. Service(集群内稳定访问)
apiVersion: v1
kind: Service
metadata:
name: my-app-svc
namespace: demo-app
spec:
selector:
app: my-app
ports:
- port: 80
targetPort: 80
type: ClusterIP # 仅集群内访问,对外暴露用 Ingress 或 NodePort
---
# 5. Ingress(对外七层路由,需 Ingress-Controller)
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-app-ingress
namespace: demo-app
spec:
rules:
- host: api.your-domain.com # 替换为实际域名
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: my-app-svc
port:
number: 80
注意事项
- Pod 不应该手动维护:业务 Pod 一律交给 Deployment / StatefulSet 管理,不要单独写 Pod YAML。
- Service 只做转发:Service 本身不代理外部流量;Ingress 只是路由规则,真正干活的是 Ingress‑Controller。
- Secret 不是加密:默认只是 Base64,生产环境请使用外部密钥管理。
- PV 由运维负责:业务开发者通常只写 PVC,PV 由存储类自动供给或集群管理员维护。
