K8s 部署学习笔记 K8s 部署学习笔记一、环境准备1.1 安装 minikubepowershell# 下载 minikubeWindows # 访问 https://github.com/kubernetes/minikube/releases # 下载 minikube-windows-amd64.exe重命名为 minikube.exe放到 C:\minikube\ # 验证安装 C:\minikube\minikube.exe version1.2 启动 minikube 集群powershell# 基本启动 C:\minikube\minikube.exe start --driverdocker --memory4096 --cpus2 # 国内镜像加速如果网络慢 C:\minikube\minikube.exe start --driverdocker --memory4096 --cpus2 --image-mirror-countrycn常见问题网络问题导致镜像拉取失败表格错误解决cannot pull kicbase image配置 Docker 镜像加速器或手动拉取镜像registry.cn-hangzhou.aliyuncs.com/... not found阿里云镜像源缺少某些镜像改用默认源二、部署过程中的问题与解决问题 1ImagePullBackOff镜像拉取失败现象powershellkubectl get pods -n camp # NAME READY STATUS RESTARTS AGE # camp-auth-xxx 0/1 ImagePullBackOff 0 5m原因分析镜像仓库需要认证私有镜像镜像不存在或拼写错误网络问题国内访问 ghcr.io 慢/被墙错误日志plainFailed to pull image ghcr.io/...: unauthorized解决方案方案 A本地构建并加载镜像推荐用于学习powershell# 1. 确认本地有镜像 docker images | findstr camp # 2. 给镜像打上 YAML 中期望的标签 docker tag kubernetes-microservices-camp-auth:latest ghcr.io/elishatheodore/kubernetes-microservices/camp-auth:latest docker tag kubernetes-microservices-camp-web:latest ghcr.io/elishatheodore/kubernetes-microservices/camp-web:latest docker tag kubernetes-microservices-camp-backend:latest ghcr.io/elishatheodore/kubernetes-microservices/camp-backend:latest # 3. 加载到 minikube minikube image load ghcr.io/elishatheodore/kubernetes-microservices/camp-auth:latest minikube image load ghcr.io/elishatheodore/kubernetes-microservices/camp-web:latest minikube image load ghcr.io/elishatheodore/kubernetes-microservices/camp-backend:latest # 4. 验证 minikube ssh -- docker images | findstr camp方案 B配置镜像拉取密钥用于私有仓库powershell# 创建 docker-registry 密钥 kubectl create secret docker-registry ghcr-secret --docker-serverghcr.io --docker-username你的GitHub用户名 --docker-password你的GitHubToken -n camp # 在 Deployment 中添加 imagePullSecrets # spec.template.spec.imagePullSecrets: # - name: ghcr-secret问题 2imagePullPolicy 导致重复拉取镜像现象即使镜像已加载到 minikubePod 仍然尝试从远程拉取。原因当镜像标签是latest时K8s 默认imagePullPolicy: Always每次都从远程拉取。解决修改 Deployment添加imagePullPolicy: Neveryamlspec: containers: - name: camp-auth image: ghcr.io/elishatheodore/kubernetes-microservices/camp-auth:latest imagePullPolicy: Never # ← 添加这一行批量修改命令powershell(Get-Content auth-frontend-deployment.yaml) -replace imagePullPolicy: Always, imagePullPolicy: Never | Set-Content auth-frontend-deployment.yaml问题 3PVC Pending持久化存储未绑定现象powershellkubectl get pvc -n camp # NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS # camp-database-pvc Pending default原因分析StorageClassdefault不存在minikube 的 storage-provisioner 未启用错误日志plainstorageclass.storage.k8s.io default not found解决方案方案 A创建 StorageClasspowershell# 查看现有 StorageClass kubectl get storageclass # 创建 default StorageClass apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: default annotations: storageclass.kubernetes.io/is-default-class: true provisioner: k8s.io/minikube-hostpath | kubectl apply -f -方案 B使用 minikube 自带的 standard StorageClass修改 PVC YAML将storageClassName: default改为storageClassName: standard方案 C手动创建 PV绕过动态供给yamlapiVersion: v1 kind: PersistentVolume metadata: name: camp-database-pv spec: capacity: storage: 1Gi accessModes: - ReadWriteOnce storageClassName: default hostPath: path: /tmp/camp-database问题 4subPath 挂载目录到文件现象powershellkubectl describe pod camp-backend-xxx -n camp # Error: failed to start container camp-backend # not a directory: Are you trying to mount a directory onto a file (or vice-versa)?原因YAML 中配置了subPath: camp.db但 PVC 挂载的是一个目录不是文件。原始配置错误yamlvolumeMounts: - name: database-storage mountPath: /app/camp.db # ← 期望挂载为文件 subPath: camp.db # ← 但 PVC 是目录解决方案去掉subPath改为挂载目录yamlvolumeMounts: - name: database-storage mountPath: /app/data # ← 改为挂载目录注意这样修改后应用的数据库路径也需要相应调整如从/app/camp.db改为/app/data/camp.db。问题 5CrashLoopBackOff容器启动后崩溃现象powershellkubectl get pods -n camp # NAME READY STATUS RESTARTS AGE # camp-backend-xxx 0/1 CrashLoopBackOff 5 10m排查步骤powershell# 1. 查看日志 kubectl logs camp-backend-xxx -n camp # 2. 查看详细事件 kubectl describe pod camp-backend-xxx -n camp常见原因表格原因日志特征解决应用启动失败应用错误日志修复应用代码或配置健康检查失败Liveness probe failed修改探针路径或延迟时间资源不足OOMKilled增加内存限制权限问题Permission denied修改文件权限或 SecurityContext问题 6Kustomize 补丁找不到目标现象powershellkubectl apply -k . # error: no matches for Id Deployment.v1.apps/camp-backend.[noNs] # failed to find unique target for patch原因patchesStrategicMerge中的 patch 没有指定namespace但资源在camp命名空间中。解决给 patch 添加namespace: campyamlpatchesStrategicMerge: - |- apiVersion: apps/v1 kind: Deployment metadata: name: camp-backend namespace: camp # ← 添加这一行三、K8s 核心概念详解3.1 Pod vs Container表格PodContainer定义K8s 最小调度单位Docker 运行实例包含1 个或多个 Container单个应用进程关系Pod 是 Container 的外壳Container 运行在 Pod 内生命周期由控制器管理Deployment 等随 Pod 创建和销毁类比Pod 是一间公寓Container 是公寓里的住户。3.2 Deployment vs ReplicaSet vs PodplainDeployment管理 ↓ 创建/管理 ReplicaSet副本控制 ↓ 创建/管理 Pod实际运行表格资源职责Deployment声明式管理应用支持滚动更新、回滚ReplicaSet确保指定数量的 Pod 副本在运行Pod实际承载容器的运行实例为什么需要三层Deployment 负责版本管理更新策略ReplicaSet 负责数量控制故障自愈Pod 负责实际运行3.3 Service 类型对比表格类型访问方式适用场景ClusterIP集群内部访问默认微服务之间通信NodePort节点 IP 端口外部临时访问LoadBalancer云厂商负载均衡器生产环境外部访问ExternalNameDNS 别名映射外部服务本项目使用 ClusterIP Ingress 的原因ClusterIP 只暴露集群内部Ingress 作为统一入口路由到不同 Service节省云厂商负载均衡器费用3.4 ConfigMap vs Secret表格ConfigMapSecret存储内容非敏感配置URL、日志级别敏感数据密码、Token编码方式明文Base64不是加密挂载方式环境变量或文件环境变量或文件安全性低中Base64 易解码重要Secret 的 Base64 只是编码不是加密。生产环境应使用Sealed SecretHashiCorp Vault云厂商 Secret Manager3.5 PersistentVolume vs PersistentVolumeClaim vs StorageClassplainStorageClass存储模板 ↓ 动态创建 PersistentVolume实际存储卷 ↓ 绑定 PersistentVolumeClaim存储申请 ↓ 挂载 Pod使用存储表格资源类比职责StorageClass存储套餐定义存储类型SSD/HDD/本地PersistentVolume实际硬盘集群中的存储资源PersistentVolumeClaim购买申请用户申请使用存储emptyDir vs PVC表格emptyDirPVC生命周期随 Pod 销毁独立于 Pod数据持久化❌ Pod 重启丢失✅ 数据保留适用场景临时缓存数据库、文件存储3.6 HPAHorizontal Pod Autoscaler工作原理plainMetrics Server 采集 CPU/内存 ↓ HPA Controller 计算需要的副本数 ↓ Deployment 调整 ReplicaSet ↓ Pod 数量变化关键参数表格参数说明minReplicas最小副本数防止缩容到 0maxReplicas最大副本数防止无限扩容targetCPUUtilizationPercentageCPU 使用率阈值scaleDownDelaySeconds缩容冷却时间默认 5 分钟注意HPA 需要 Metrics Server 才能获取指标。如果显示unknown说明 Metrics Server 未安装或未就绪。3.7 ResourceQuota vs LimitRange表格ResourceQuotaLimitRange作用范围整个命名空间单个 Pod/容器限制对象总资源使用量单个容器的资源默认值示例命名空间最多 20 个 Pod单个容器默认内存限制 512Mi关系ResourceQuota 小区总用水量限制LimitRange 每户的用水配额四、常用命令速查4.1 资源管理bash# 查看资源 kubectl get pods -n camp # 查看 Pod kubectl get deployment -n camp # 查看 Deployment kubectl get svc -n camp # 查看 Service kubectl get pvc -n camp # 查看 PVC kubectl get hpa -n camp # 查看 HPA kubectl get all -n camp # 查看所有资源 # 查看详情 kubectl describe pod pod-name -n camp # 查看 Pod 详情排错 kubectl logs pod-name -n camp # 查看日志 kubectl logs -f deployment/camp-backend -n camp # 持续查看日志 # 进入容器 kubectl exec -it pod-name -n camp -- sh # 进入容器调试4.2 资源操作bash# 扩缩容 kubectl scale deployment camp-backend --replicas5 -n camp # 删除资源 kubectl delete pod pod-name -n camp # 删除单个 Pod kubectl delete deployment camp-backend -n camp # 删除 Deployment kubectl delete namespace camp # 删除整个命名空间 # 端口转发 kubectl port-forward svc/camp-backend-service 8000:8000 -n camp4.3 minikube 管理bash# 启动/停止/删除 minikube start --driverdocker --memory4096 --cpus2 minikube stop minikube delete # 镜像管理 minikube image load image-name # 加载本地镜像 minikube ssh -- docker images # 查看 minikube 中的镜像 # 插件 minikube addons enable ingress # 启用 Ingress minikube addons enable metrics-server # 启用 Metrics Server minikube addons list # 查看插件列表五、部署最佳实践5.1 部署顺序plain1. Namespace命名空间 2. ConfigMap / Secret配置 3. PersistentVolumeClaim存储 4. Deployment应用 5. Service网络暴露 6. Ingress入口 7. HPA / ResourceQuota高级功能5.2 排错流程plainPod 异常 ↓ kubectl describe pod name ← 看 Events ↓ ├─ ImagePullBackOff → 检查镜像名、权限、imagePullPolicy ├─ Pending → 检查资源、节点、PVC ├─ CrashLoopBackOff → 查看日志、检查探针 └─ ...5.3 学习建议表格阶段内容第一阶段理解 Pod、Deployment、Service 基本概念第二阶段掌握 ConfigMap、Secret、PVC 的使用第三阶段学习 Ingress、HPA、ResourceQuota第四阶段尝试 Helm、Kustomize 等部署工具第五阶段部署到云厂商 K8sAKS/EKS/ACK