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一致。

实战练习#

  1. 创建Deployment+Service,使Pod可被Service访问,并用EndpointSlice验证。
  2. 创建ConfigMap与PVC,挂载到Pod,验证环境变量与挂载目录。
  3. 修改Deployment镜像并回滚,观察ReplicaSet变化。
  4. 设计一组Label/Selector使两个Service分别指向不同Pod集合。