引言

Kubernetes(简称K8s)作为云原生时代的容器编排标准,已经成为现代应用部署和管理的核心技术。无论是初创公司还是大型企业,都在积极采用Kubernetes来提升应用的可扩展性、可靠性和运维效率。本文将从零开始,系统性地介绍Kubernetes的核心概念、实战操作、高级特性以及常见问题的解决方案,帮助读者从入门到精通,掌握Kubernetes容器编排的精髓。

1. Kubernetes基础概念

1.1 什么是Kubernetes?

Kubernetes是一个开源的容器编排平台,最初由Google开发,现由云原生计算基金会(CNCF)维护。它能够自动化部署、扩展和管理容器化应用。Kubernetes的核心目标是提供一个声明式的API,让用户能够定义应用的期望状态,并由系统自动调整实际状态以匹配期望状态。

1.2 核心组件

Kubernetes集群由控制平面(Control Plane)和工作节点(Worker Nodes)组成。

  • 控制平面组件

    • kube-apiserver:集群的API入口,所有操作都通过它进行。
    • etcd:分布式键值存储,保存集群状态。
    • kube-scheduler:负责将Pod调度到合适的节点上。
    • kube-controller-manager:运行控制器,确保集群状态与期望状态一致。
  • 工作节点组件

    • kubelet:在每个节点上运行,负责管理Pod和容器。
    • kube-proxy:维护网络规则,实现Service的负载均衡。
    • 容器运行时:如Docker、containerd等,负责运行容器。

1.3 核心概念

  • Pod:Kubernetes中最小的可部署单元,一个Pod可以包含一个或多个容器,这些容器共享网络命名空间和存储卷。
  • Service:定义了一组Pod的访问策略,提供稳定的网络端点。
  • Deployment:管理Pod的副本数和更新策略,确保应用的高可用性。
  • ConfigMap和Secret:用于管理配置数据和敏感信息。
  • Namespace:用于资源隔离,将集群划分为多个虚拟集群。

2. Kubernetes入门实战

2.1 环境搭建

2.1.1 使用Minikube搭建本地集群

Minikube是一个轻量级的Kubernetes实现,适合本地开发和测试。

# 安装Minikube(以macOS为例)
brew install minikube

# 启动集群
minikube start

# 验证集群状态
kubectl get nodes

2.1.2 使用云服务商的托管集群

对于生产环境,建议使用云服务商的托管Kubernetes服务,如AWS EKS、Google GKE、Azure AKS等。以AWS EKS为例:

# 安装eksctl
brew install eksctl

# 创建集群
eksctl create cluster --name my-cluster --region us-west-2 --nodegroup-name my-nodes --node-type t3.medium --nodes 3

# 配置kubectl
aws eks update-kubeconfig --name my-cluster --region us-west-2

2.2 第一个Kubernetes应用

2.2.1 创建Deployment

创建一个简单的Nginx应用:

# nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.21
        ports:
        - containerPort: 80

应用配置:

kubectl apply -f nginx-deployment.yaml

2.2.2 创建Service

创建一个Service来暴露Nginx应用:

# nginx-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  selector:
    app: nginx
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
  type: LoadBalancer

应用配置:

kubectl apply -f nginx-service.yaml

2.2.3 验证应用

# 查看Pod状态
kubectl get pods

# 查看Service状态
kubectl get svc

# 访问应用(如果使用Minikube)
minikube service nginx-service

2.3 基本命令

# 查看资源
kubectl get pods
kubectl get deployments
kubectl get services
kubectl get nodes

# 查看详细信息
kubectl describe pod <pod-name>
kubectl describe deployment <deployment-name>

# 查看日志
kubectl logs <pod-name>

# 进入容器
kubectl exec -it <pod-name> -- /bin/bash

# 删除资源
kubectl delete -f <file.yaml>
kubectl delete deployment <deployment-name>

3. Kubernetes进阶特性

3.1 配置管理

3.1.1 ConfigMap

ConfigMap用于存储非敏感的配置数据。

# configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: app-config
data:
  app.properties: |
    server.port=8080
    database.url=jdbc:mysql://localhost:3306/mydb

在Pod中使用ConfigMap:

# pod-with-configmap.yaml
apiVersion: v1
kind: Pod
metadata:
  name: app-pod
spec:
  containers:
  - name: app
    image: myapp:1.0
    env:
    - name: APP_CONFIG
      valueFrom:
        configMapKeyRef:
          name: app-config
          key: app.properties
    volumeMounts:
    - name: config-volume
      mountPath: /etc/config
  volumes:
  - name: config-volume
    configMap:
      name: app-config

3.1.2 Secret

Secret用于存储敏感数据,如密码、API密钥等。

# 创建Secret
kubectl create secret generic db-secret --from-literal=username=admin --from-literal=password=secret123

在Pod中使用Secret:

# pod-with-secret.yaml
apiVersion: v1
kind: Pod
metadata:
  name: db-pod
spec:
  containers:
  - name: db
    image: mysql:5.7
    env:
    - name: MYSQL_USER
      valueFrom:
        secretKeyRef:
          name: db-secret
          key: username
    - name: MYSQL_PASSWORD
      valueFrom:
        secretKeyRef:
          name: db-secret
          key: password

3.2 存储管理

3.2.1 PersistentVolume (PV) 和 PersistentVolumeClaim (PVC)

PV是集群中的存储资源,PVC是Pod对存储的请求。

# pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-volume
spec:
  capacity:
    storage: 5Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: /mnt/data
# pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-claim
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 2Gi

在Pod中使用PVC:

# pod-with-pvc.yaml
apiVersion: v1
kind: Pod
metadata:
  name: app-pod
spec:
  containers:
  - name: app
    image: myapp:1.0
    volumeMounts:
    - name: data-volume
      mountPath: /data
  volumes:
  - name: data-volume
    persistentVolumeClaim:
      claimName: pvc-claim

3.3 网络策略

NetworkPolicy用于控制Pod之间的网络流量。

# network-policy.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: deny-all
spec:
  podSelector: {}
  policyTypes:
  - Ingress
  - Egress

允许特定标签的Pod访问:

# allow-nginx-policy.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-nginx
spec:
  podSelector:
    matchLabels:
      app: nginx
  policyTypes:
  - Ingress
  ingress:
  - from:
    - podSelector:
        matchLabels:
          app: frontend
    ports:
    - protocol: TCP
      port: 80

3.4 自动扩缩容

3.4.1 Horizontal Pod Autoscaler (HPA)

HPA根据CPU使用率或其他指标自动调整Pod副本数。

# hpa.yaml
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: nginx-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: nginx-deployment
  minReplicas: 2
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 50

应用配置:

kubectl apply -f hpa.yaml

3.4.2 Cluster Autoscaler

Cluster Autoscaler自动调整集群节点数量。在AWS EKS中,可以使用以下配置:

# 创建IAM角色
eksctl create iamserviceaccount \
  --name cluster-autoscaler \
  --namespace kube-system \
  --cluster my-cluster \
  --attach-policy-arn arn:aws:iam::aws:policy/AmazonEKSClusterAutoscalerPolicy \
  --approve

# 部署Cluster Autoscaler
kubectl apply -f https://raw.githubusercontent.com/kubernetes/autoscaler/master/cluster-autoscaler/cloudprovider/aws/examples/cluster-autoscaler-autodiscover.yaml

4. 高级主题

4.1 服务网格(Service Mesh)

服务网格提供了服务间通信的可观测性、安全性和控制。Istio是流行的服务网格实现。

4.1.1 安装Istio

# 下载Istio
curl -L https://istio.io/downloadIstio | sh -
cd istio-*
export PATH=$PWD/bin:$PATH

# 安装Istio
istioctl install --set profile=demo -y

4.1.2 部署示例应用

# 部署Bookinfo应用
kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml

# 配置网关
kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml

4.1.3 查看Istio仪表板

# 启用Kiali
kubectl apply -f samples/addons/kiali.yaml

# 访问Kiali
istioctl dashboard kiali

4.2 GitOps

GitOps是一种使用Git作为唯一事实来源来管理Kubernetes配置的方法。Argo CD是流行的GitOps工具。

4.2.1 安装Argo CD

kubectl create namespace argocd
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml

4.2.2 配置Argo CD应用

# argocd-app.yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: my-app
  namespace: argocd
spec:
  project: default
  source:
    repoURL: https://github.com/myorg/myapp.git
    targetRevision: HEAD
    path: k8s
  destination:
    server: https://kubernetes.default.svc
    namespace: default
  syncPolicy:
    automated:
      prune: true
      selfHeal: true

应用配置:

kubectl apply -f argocd-app.yaml

4.3 安全最佳实践

4.3.1 RBAC(基于角色的访问控制)

# role.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: default
  name: pod-reader
rules:
- apiGroups: [""]
  resources: ["pods"]
  verbs: ["get", "watch", "list"]
# rolebinding.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: read-pods
  namespace: default
subjects:
- kind: User
  name: jane
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: Role
  name: pod-reader
  apiGroup: rbac.authorization.k8s.io

4.3.2 Pod安全策略(Pod Security Policies)

Pod安全策略用于控制Pod的安全上下文。

# psp.yaml
apiVersion: policy/v1beta1
kind: PodSecurityPolicy
metadata:
  name: restricted
spec:
  privileged: false
  allowPrivilegeEscalation: false
  requiredDropCapabilities:
    - ALL
  volumes:
    - 'configMap'
    - 'emptyDir'
    - 'projected'
    - 'secret'
    - 'downwardAPI'
    - 'persistentVolumeClaim'
  hostNetwork: false
  hostIPC: false
  hostPID: false
  runAsUser:
    rule: 'MustRunAsNonRoot'
  seLinux:
    rule: 'RunAsAny'
  supplementalGroups:
    rule: 'MustRunAs'
    ranges:
      - min: 1
        max: 65535
  fsGroup:
    rule: 'MustRunAs'
    ranges:
      - min: 1
        max: 65535

5. 常见问题解析

5.1 Pod无法启动

问题描述:Pod处于Pending状态,无法启动。

可能原因

  1. 资源不足(CPU、内存)
  2. 节点不可用
  3. 镜像拉取失败
  4. 调度失败

解决方案

# 查看Pod详细信息
kubectl describe pod <pod-name>

# 检查事件日志
kubectl get events --sort-by='.lastTimestamp'

# 检查节点资源
kubectl top nodes

# 如果是镜像拉取问题,检查镜像仓库访问权限
kubectl get pod <pod-name> -o yaml | grep imagePullSecrets

5.2 Service无法访问

问题描述:创建了Service,但无法访问。

可能原因

  1. Service类型配置错误
  2. 端口映射错误
  3. 防火墙或网络策略阻止
  4. 没有外部IP(对于LoadBalancer类型)

解决方案

# 检查Service状态
kubectl get svc <service-name>

# 检查Endpoints
kubectl get endpoints <service-name>

# 检查网络策略
kubectl get networkpolicy -A

# 如果是LoadBalancer类型,检查外部IP是否分配
kubectl get svc <service-name> -o jsonpath='{.status.loadBalancer.ingress[0].ip}'

5.3 存储卷挂载失败

问题描述:Pod无法挂载存储卷。

可能原因

  1. PVC未绑定到PV
  2. PV存储空间不足
  3. 存储类配置错误
  4. 节点无法访问存储

解决方案

# 检查PVC状态
kubectl get pvc

# 检查PV状态
kubectl get pv

# 查看PVC详细信息
kubectl describe pvc <pvc-name>

# 检查存储类
kubectl get storageclass

5.4 内存泄漏或CPU使用率过高

问题描述:Pod内存使用持续增长或CPU使用率过高。

可能原因

  1. 应用程序本身存在内存泄漏
  2. 资源限制设置不当
  3. 没有配置自动扩缩容

解决方案

# 监控Pod资源使用
kubectl top pods

# 查看Pod详细信息
kubectl describe pod <pod-name>

# 配置资源限制
# 在Deployment中添加资源限制
resources:
  limits:
    memory: "512Mi"
    cpu: "500m"
  requests:
    memory: "256Mi"
    cpu: "250m"

# 配置HPA自动扩缩容
kubectl apply -f hpa.yaml

5.5 配置管理问题

问题描述:配置更新后Pod没有重新加载。

可能原因

  1. ConfigMap或Secret更新后,Pod没有重启
  2. 应用程序没有实现配置热加载

解决方案

# 方法1:使用滚动更新
kubectl rollout restart deployment <deployment-name>

# 方法2:使用ConfigMap作为环境变量(需要重启)
# 方法3:使用Volume挂载ConfigMap,配合应用热加载
# 方法4:使用Spring Cloud Config等配置中心

5.6 网络问题

问题描述:Pod之间无法通信。

可能原因

  1. 网络策略限制
  2. DNS解析失败
  3. Service配置错误

解决方案

# 检查DNS解析
kubectl run -it --rm --image=busybox:1.28 dns-test --restart=Never -- nslookup kubernetes.default

# 检查网络策略
kubectl get networkpolicy -A

# 检查Service
kubectl get svc
kubectl get endpoints

6. 实战项目:部署微服务应用

6.1 项目架构

我们将部署一个简单的微服务应用,包含以下组件:

  • 前端服务(React)
  • 后端API服务(Node.js)
  • 数据库(PostgreSQL)
  • Redis缓存

6.2 部署数据库

# postgres-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: postgres
spec:
  replicas: 1
  selector:
    matchLabels:
      app: postgres
  template:
    metadata:
      labels:
        app: postgres
    spec:
      containers:
      - name: postgres
        image: postgres:13
        env:
        - name: POSTGRES_DB
          value: myapp
        - name: POSTGRES_USER
          valueFrom:
            secretKeyRef:
              name: db-secret
              key: username
        - name: POSTGRES_PASSWORD
          valueFrom:
            secretKeyRef:
              name: db-secret
              key: password
        ports:
        - containerPort: 5432
        volumeMounts:
        - name: postgres-data
          mountPath: /var/lib/postgresql/data
      volumes:
      - name: postgres-data
        persistentVolumeClaim:
          claimName: postgres-pvc
---
# postgres-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: postgres-service
spec:
  selector:
    app: postgres
  ports:
    - protocol: TCP
      port: 5432
      targetPort: 5432
  type: ClusterIP

6.3 部署Redis

# redis-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: redis
spec:
  replicas: 1
  selector:
    matchLabels:
      app: redis
  template:
    metadata:
      labels:
        app: redis
    spec:
      containers:
      - name: redis
        image: redis:6
        ports:
        - containerPort: 6379
---
# redis-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: redis-service
spec:
  selector:
    app: redis
  ports:
    - protocol: TCP
      port: 6379
      targetPort: 6379
  type: ClusterIP

6.4 部署后端API服务

# backend-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: backend
spec:
  replicas: 2
  selector:
    matchLabels:
      app: backend
  template:
    metadata:
      labels:
        app: backend
    spec:
      containers:
      - name: backend
        image: myapp/backend:1.0
        env:
        - name: DB_HOST
          value: postgres-service
        - name: DB_PORT
          value: "5432"
        - name: DB_NAME
          value: myapp
        - name: DB_USER
          valueFrom:
            secretKeyRef:
              name: db-secret
              key: username
        - name: DB_PASSWORD
          valueFrom:
            secretKeyRef:
              name: db-secret
              key: password
        - name: REDIS_HOST
          value: redis-service
        - name: REDIS_PORT
          value: "6379"
        ports:
        - containerPort: 3000
        resources:
          limits:
            memory: "256Mi"
            cpu: "200m"
          requests:
            memory: "128Mi"
            cpu: "100m"
---
# backend-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: backend-service
spec:
  selector:
    app: backend
  ports:
    - protocol: TCP
      port: 3000
      targetPort: 3000
  type: ClusterIP

6.5 部署前端服务

# frontend-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: frontend
spec:
  replicas: 2
  selector:
    matchLabels:
      app: frontend
  template:
    metadata:
      labels:
        app: frontend
    spec:
      containers:
      - name: frontend
        image: myapp/frontend:1.0
        env:
        - name: API_URL
          value: http://backend-service:3000
        ports:
        - containerPort: 80
        resources:
          limits:
            memory: "128Mi"
            cpu: "100m"
          requests:
            memory: "64Mi"
            cpu: "50m"
---
# frontend-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: frontend-service
spec:
  selector:
    app: frontend
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
  type: LoadBalancer

6.6 配置HPA

# backend-hpa.yaml
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: backend-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: backend
  minReplicas: 2
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 70
  - type: Resource
    resource:
      name: memory
      target:
        type: Utilization
        averageUtilization: 80

6.7 部署所有组件

# 创建Secret
kubectl create secret generic db-secret --from-literal=username=admin --from-literal=password=secret123

# 创建PVC
kubectl apply -f postgres-pvc.yaml

# 部署所有资源
kubectl apply -f postgres-deployment.yaml
kubectl apply -f redis-deployment.yaml
kubectl apply -f backend-deployment.yaml
kubectl apply -f frontend-deployment.yaml

# 部署Service
kubectl apply -f postgres-service.yaml
kubectl apply -f redis-service.yaml
kubectl apply -f backend-service.yaml
kubectl apply -f frontend-service.yaml

# 部署HPA
kubectl apply -f backend-hpa.yaml

6.8 验证部署

# 查看所有Pod状态
kubectl get pods

# 查看Service状态
kubectl get svc

# 查看HPA状态
kubectl get hpa

# 访问前端应用(获取LoadBalancer的外部IP)
kubectl get svc frontend-service

# 查看后端日志
kubectl logs -f deployment/backend

# 监控资源使用
kubectl top pods

7. 生产环境最佳实践

7.1 资源管理

7.1.1 设置资源请求和限制

# 在Deployment中设置资源
resources:
  requests:
    memory: "256Mi"
    cpu: "250m"
  limits:
    memory: "512Mi"
    cpu: "500m"

7.1.2 使用ResourceQuota

# resource-quota.yaml
apiVersion: v1
kind: ResourceQuota
metadata:
  name: compute-resources
spec:
  hard:
    requests.cpu: "10"
    requests.memory: 20Gi
    limits.cpu: "20"
    limits.memory: 40Gi

7.2 监控和日志

7.2.1 部署Prometheus和Grafana

# 使用Helm安装Prometheus
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update
helm install prometheus prometheus-community/kube-prometheus-stack

# 访问Grafana
kubectl port-forward svc/prometheus-grafana 3000:80

7.2.2 部署EFK日志栈

# 安装Elasticsearch
helm install elasticsearch elastic/elasticsearch

# 安装Fluentd
helm install fluentd fluent/fluentd

# 安装Kibana
helm install kibana elastic/kibana

7.3 高可用性

7.3.1 多可用区部署

# 使用Pod反亲和性
affinity:
  podAntiAffinity:
    requiredDuringSchedulingIgnoredDuringExecution:
    - labelSelector:
        matchExpressions:
        - key: app
          operator: In
          values:
          - myapp
      topologyKey: "kubernetes.io/hostname"

7.3.2 使用PodDisruptionBudget

# pdb.yaml
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
  name: myapp-pdb
spec:
  minAvailable: 2
  selector:
    matchLabels:
      app: myapp

7.4 安全加固

7.4.1 使用NetworkPolicy

# deny-all-policy.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: deny-all
spec:
  podSelector: {}
  policyTypes:
  - Ingress
  - Egress

7.4.2 使用Pod Security Admission

# 在Kubernetes 1.23+中,使用Pod Security Admission
kubectl label namespace default pod-security.kubernetes.io/enforce=restricted

7.5 CI/CD流水线

7.5.1 使用Argo CD实现GitOps

# argocd-app.yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: myapp
  namespace: argocd
spec:
  project: default
  source:
    repoURL: https://github.com/myorg/myapp.git
    targetRevision: main
    path: k8s
  destination:
    server: https://kubernetes.default.svc
    namespace: default
  syncPolicy:
    automated:
      prune: true
      selfHeal: true
    syncOptions:
    - CreateNamespace=true

7.5.2 使用Jenkins或GitLab CI

// Jenkinsfile示例
pipeline {
    agent any
    stages {
        stage('Build') {
            steps {
                sh 'docker build -t myapp:${BUILD_NUMBER} .'
            }
        }
        stage('Test') {
            steps {
                sh 'docker run myapp:${BUILD_NUMBER} npm test'
            }
        }
        stage('Deploy') {
            steps {
                sh 'kubectl apply -f k8s/deployment.yaml'
            }
        }
    }
}

8. 常见问题深度解析

8.1 调度问题

问题:Pod长时间处于Pending状态。

分析

  1. 使用kubectl describe pod查看事件
  2. 检查节点资源:kubectl describe node <node-name>
  3. 检查节点污点:kubectl describe node <node-name> | grep Taints
  4. 检查Pod的节点选择器或亲和性规则

解决方案

# 查看节点资源
kubectl describe node <node-name>

# 查看节点污点
kubectl describe node <node-name> | grep Taints

# 如果节点有污点,需要在Pod中添加容忍度
tolerations:
- key: "key1"
  operator: "Equal"
  value: "value1"
  effect: "NoSchedule"

8.2 网络问题

问题:Service无法访问。

分析

  1. 检查Service类型和端口
  2. 检查Endpoints是否正确
  3. 检查网络策略
  4. 检查kube-proxy状态

解决方案

# 检查Endpoints
kubectl get endpoints <service-name>

# 检查kube-proxy日志
kubectl logs -n kube-system <kube-proxy-pod>

# 检查网络策略
kubectl get networkpolicy -A

8.3 存储问题

问题:PVC无法绑定到PV。

分析

  1. 检查PV和PVC的匹配条件
  2. 检查存储类
  3. 检查存储后端是否可用

解决方案

# 查看PV和PVC的匹配情况
kubectl get pv,pvc

# 检查存储类
kubectl get storageclass

# 查看PVC事件
kubectl describe pvc <pvc-name>

8.4 资源限制问题

问题:Pod频繁被OOMKilled。

分析

  1. 检查Pod的内存限制
  2. 检查节点内存使用情况
  3. 检查应用内存使用模式

解决方案

# 查看Pod的资源限制
kubectl get pod <pod-name> -o yaml | grep -A 5 resources

# 监控Pod内存使用
kubectl top pod <pod-name>

# 调整资源限制
kubectl patch deployment <deployment-name> -p '{"spec":{"template":{"spec":{"containers":[{"name":"<container-name>","resources":{"limits":{"memory":"1Gi"}}}]}}}}'

8.5 配置更新问题

问题:ConfigMap更新后,Pod没有重新加载配置。

分析

  1. ConfigMap作为Volume挂载时,更新不会自动触发Pod重启
  2. 应用程序需要实现配置热加载

解决方案

# 方法1:使用滚动更新
kubectl rollout restart deployment <deployment-name>

# 方法2:使用Spring Cloud Config等配置中心
# 方法3:使用sidecar容器监听ConfigMap变化并触发应用重载

8.6 镜像拉取问题

问题:Pod无法拉取镜像。

分析

  1. 检查镜像名称和标签是否正确
  2. 检查镜像仓库访问权限
  3. 检查节点网络连接

解决方案

# 查看Pod事件
kubectl describe pod <pod-name>

# 检查镜像拉取密钥
kubectl get pod <pod-name> -o yaml | grep imagePullSecrets

# 手动拉取镜像测试
docker pull <image-name>

9. 学习资源推荐

9.1 官方文档

9.2 在线课程

9.3 书籍推荐

  • 《Kubernetes权威指南:从Docker到Kubernetes实践全接触》
  • 《Kubernetes in Action》
  • 《Kubernetes Patterns》

9.4 社区资源

9.5 认证考试

  • CKA (Certified Kubernetes Administrator):针对Kubernetes管理员
  • CKAD (Certified Kubernetes Application Developer):针对应用开发者
  • CKS (Certified Kubernetes Security Specialist):针对安全专家

10. 总结

Kubernetes作为容器编排的行业标准,其学习曲线虽然陡峭,但掌握后将为你的职业生涯带来巨大价值。本文从基础概念到高级特性,从实战部署到生产最佳实践,全面覆盖了Kubernetes的核心知识点。

学习路径建议

  1. 入门阶段:掌握基本概念,使用Minikube搭建本地环境,部署简单应用
  2. 进阶阶段:学习配置管理、存储、网络、自动扩缩容等高级特性
  3. 实战阶段:部署微服务应用,实践CI/CD流水线
  4. 精通阶段:掌握服务网格、GitOps、安全加固等生产级特性

持续学习

Kubernetes生态系统发展迅速,建议持续关注以下方面:

  • 新版本特性(如Kubernetes 1.28+的新功能)
  • 云原生技术栈(如Service Mesh、Serverless)
  • 安全最佳实践
  • 性能优化技巧

通过不断实践和学习,你将能够熟练运用Kubernetes解决实际业务问题,成为云原生领域的专家。