16.1.4 核心对象模型与资源关系
核心对象模型与资源关系#
对象模型总览#
Kubernetes以“对象 + 控制器 + 声明式”驱动集群。对象分为工作负载、服务网络、配置存储三类,并由Namespace/RBAC/CRD治理。
原理草图(对象关系总览):
元数据与对象通用结构#
统一字段结构示例(Pod):
# 文件: /tmp/pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: demo-pod
namespace: default
labels:
app: demo
annotations:
owner: ops
spec:
containers:
- name: web
image: nginx:1.25
status: {}
关键字段解释:
- apiVersion/kind:对象类型与版本。
- metadata:唯一标识与标签/注解。
- spec:期望状态(用户声明)。
- status:实际状态(控制器写入)。
应用命令:
kubectl apply -f /tmp/pod.yaml
kubectl get pod demo-pod -o wide
kubectl get pod demo-pod -o jsonpath='{.metadata.labels}'
排错提示:
# 对象无法创建:查看事件
kubectl describe pod demo-pod
# 资源字段错误:查看API校验报错
kubectl apply -f /tmp/pod.yaml --dry-run=client -o yaml
Pod:最小调度单元#
示例:Pod挂载ConfigMap与PVC(含完整命令)
# 1) 创建ConfigMap
kubectl create configmap app-conf --from-literal=APP_MODE=prod
# 2) 创建PVC(使用默认StorageClass)
cat > /tmp/pvc.yaml <<'EOF'
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: app-pvc
spec:
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 1Gi
EOF
kubectl apply -f /tmp/pvc.yaml
# 3) 创建Pod挂载ConfigMap与PVC
cat > /tmp/pod-pvc.yaml <<'EOF'
apiVersion: v1
kind: Pod
metadata:
name: app-pod
labels:
app: demo
spec:
containers:
- name: app
image: busybox:1.36
command: ["sh","-c","env; sleep 3600"]
envFrom:
- configMapRef:
name: app-conf
volumeMounts:
- name: data
mountPath: /data
volumes:
- name: data
persistentVolumeClaim:
claimName: app-pvc
EOF
kubectl apply -f /tmp/pod-pvc.yaml
验证效果:
kubectl exec app-pod -- sh -c 'echo $APP_MODE; df -h /data'
排错提示:
# Pod Pending:检查PVC是否绑定
kubectl get pvc app-pvc
kubectl describe pod app-pod | sed -n '/Events/,$p'
控制器与工作负载关系#
示例:Deployment -> ReplicaSet -> Pod
cat > /tmp/deploy.yaml <<'EOF'
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-deploy
spec:
replicas: 2
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web
spec:
containers:
- name: web
image: nginx:1.25
EOF
kubectl apply -f /tmp/deploy.yaml
kubectl get deploy,rs,pod -l app=web
滚动更新与回滚:
kubectl set image deploy/web-deploy web=nginx:1.26
kubectl rollout status deploy/web-deploy
kubectl rollout undo deploy/web-deploy
排错提示:
# ReplicaSet不创建Pod:检查selector与template labels是否匹配
kubectl describe deploy web-deploy
服务发现与网络对象#
示例:Service选择Pod,Ingress映射Service
# 1) Service
cat > /tmp/svc.yaml <<'EOF'
apiVersion: v1
kind: Service
metadata:
name: web-svc
spec:
selector:
app: web
ports:
- port: 80
targetPort: 80
EOF
kubectl apply -f /tmp/svc.yaml
# 2) Ingress(需已有Ingress Controller)
cat > /tmp/ing.yaml <<'EOF'
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: web-ing
spec:
rules:
- host: web.example.local
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: web-svc
port:
number: 80
EOF
kubectl apply -f /tmp/ing.yaml
验证映射:
kubectl get svc web-svc
kubectl get endpointslice -l kubernetes.io/service-name=web-svc
排错提示:
# Service无后端:检查Pod标签
kubectl get pod -l app=web --show-labels
# Ingress无效:检查Controller与事件
kubectl get ingress web-ing
kubectl describe ingress web-ing
存储与配置对象#
关系链路:Pod → PVC → PV → Storage
示例:查看PVC绑定关系
kubectl get pvc app-pvc -o wide
kubectl get pv | grep app-pvc
常见问题:
- PVC Pending:无可用StorageClass或PV不匹配。
- Pod CrashLoopBackOff:配置/密钥未挂载或环境变量缺失。
排错命令:
kubectl describe pvc app-pvc
kubectl describe pod app-pod
kubectl logs app-pod
命名空间与多租户#
示例:创建Namespace并限制资源
kubectl create ns team-a
cat > /tmp/quota.yaml <<'EOF'
apiVersion: v1
kind: ResourceQuota
metadata:
name: team-a-quota
namespace: team-a
spec:
hard:
requests.cpu: "2"
requests.memory: 2Gi
limits.cpu: "4"
limits.memory: 4Gi
EOF
kubectl apply -f /tmp/quota.yaml
检查配额:
kubectl -n team-a describe quota team-a-quota
资源关系图谱(逻辑链路)#
对象间依赖与生命周期#
OwnerReference与GC示意:
查看对象依赖:
kubectl get rs -l app=web -o jsonpath='{.items[0].metadata.ownerReferences}'
核心认知要点#
- Selector与Label决定对象关系与流量归属。
- Service/存储/配置三类对象与Pod深度耦合。
- 控制器通过Reconcile使spec与status一致。
实战练习#
- 创建Deployment+Service,使Pod可被Service访问,并用EndpointSlice验证。
- 创建ConfigMap与PVC,挂载到Pod,验证环境变量与挂载目录。
- 修改Deployment镜像并回滚,观察ReplicaSet变化。
- 设计一组Label/Selector使两个Service分别指向不同Pod集合。