K8s 全面实战生产运维指南(持续更新)
前言
Kubernetes 是什么?
想象一下:你管理的是一整座超大型游乐园(集群),而不是一家餐厅。
这座游乐园有很多游乐设施(Pod):
- 旋转木马(Web 服务)
- 过山车(数据库)
- 摩天轮(缓存服务)
问题是:
- 如果旋转木马坏了怎么办?(Pod 挂了)
- 游客太多了,一个设施忙不过来怎么办?(流量高峰)
- 要新增一个碰碰车怎么办?(扩缩容)
Kubernetes 就是这座游乐园的"智能管理系统"! 它能:
- 自动修复坏了的设施(自愈)
- 自动调配游客到不同的设施(负载均衡)
- 根据游客数量自动增减设施(自动扩缩容)
Kubernetes(简称 K8s)是云原生的核心,让容器编排变得简单和强大。作为运维工程师,我们的职责是:让这座游乐园运转顺畅、游客满意。
本文档会告诉你:
- Kubernetes 核心概念
- kubectl 常用命令
- YAML 配置编写
- 核心资源详解
- 生产环境最佳实践
- 常见问题排查
目录
快速入门
Kubernetes 基本概念
| 概念 | 通俗解释 | 类比 |
|---|---|---|
| Cluster | 整个游乐园 | 游乐园园区 |
| Node | 游乐设施所在的区域 | 园区内的区域 |
| Pod | 最小的调度单位,一个或多个容器 | 一个游乐设施 |
| Deployment | 应用的部署配置 | 游乐设施的说明书 |
| Service | 服务的访问入口 | 游乐设施的入口检票口 |
| Ingress | HTTP/HTTPS 路由 | 游乐园的大门和地图 |
| ConfigMap | 配置信息 | 设施的操作手册 |
| Secret | 敏感配置(密码、密钥) | 保险箱里的密码 |
| PV/PVC | 持久化存储 | 储物柜 |
安装 kubectl
# 👀 Ubuntu/Debian 安装
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl
# 👀 验证安装
kubectl version --client
连接集群
# 👀 查看集群信息
kubectl cluster-info
# 👀 查看所有节点
kubectl get nodes
# 👀 切换集群(如果有多个集群)
kubectl config use-context <cluster-name>
# 👀 查看当前上下文
kubectl config current-context
核心概念详解
1. Cluster(集群)
什么是 Cluster?
就像一座完整的游乐园,包含所有的区域、设施、管理系统。
# 👀 查看集群信息
kubectl cluster-info
# 👀 查看集群详细信息
kubectl cluster-info dump
2. Node(节点)
什么是 Node?
就像游乐园里的不同区域(东区、西区、游乐区、表演区)。每个区域可以放置不同的设施(Pod)。
| 节点类型 | 通俗解释 |
|---|---|
| Master Node | 游乐园的"管理中心",负责调度和管理 |
| Worker Node | 实际运行设施的"工作区域" |
# 👀 查看所有节点
kubectl get nodes
# 👀 查看节点详细信息
kubectl describe node <node-name>
# 👀 查看节点资源使用
kubectl top nodes
3. Pod(豆荚)
什么是 Pod?
想象一下:一个太空舱(Pod)里可能有一个或多个宇航员(容器)。
Pod 是 Kubernetes 的最小调度单位! 通常一个 Pod 包含一个容器,但也可以包含多个紧密耦合的容器。
┌─────────────────────────────────────┐
│ Pod (太空舱) │
│ ┌─────────┐ ┌─────────┐ │
│ │Container │ │Container │ │
│ │ 容器1 │ │ 容器2 │ │
│ └─────────┘ └─────────┘ │
│ ┌─────────┐ │
│ │ 存储卷 │ │
│ └─────────┘ │
└─────────────────────────────────────┘
Pod 的特点:
- Pod 中的容器共享网络和存储
- 容器之间可以通过 localhost 通信
- 每个 Pod 有独立的 IP 地址
# 👀 查看所有 Pod
kubectl get pods
# 👀 查看指定命名空间的 Pod
kubectl get pods -n <namespace>
# 👀 查看 Pod 详细信息
kubectl describe pod <pod-name>
# 👀 查看 Pod 日志
kubectl logs <pod-name>
# 👀 进入 Pod 调试
kubectl exec -it <pod-name> -- /bin/bash
4. Deployment(部署)
什么是 Deployment?
就像游乐设施的"使用说明书":
- 这个设施长什么样(容器镜像)
- 需要几个设施同时运行(副本数)
- 设施坏了怎么处理(重启策略)
Deployment 的功能:
- 声明式更新(告诉 K8s 你想要什么状态)
- 滚动更新(平滑升级不停服)
- 回滚(出了问题可以撤回)
- 自愈(设施坏了自动重启)
# 👀 查看所有 Deployment
kubectl get deployments
# 👀 扩缩容
kubectl scale deployment <name> --replicas=3
# 👀 查看部署状态
kubectl rollout status deployment/<name>
# 👀 回滚到上一版本
kubectl rollout undo deployment/<name>
# 👀 回滚到指定版本
kubectl rollout undo deployment/<name> --to-revision=2
5. ReplicaSet(副本集)
什么是 ReplicaSet?
就像"设施管理员",负责确保指定数量的设施始终在运行。
Deployment 会自动管理 ReplicaSet,通常不需要直接操作。
# 👀 查看 ReplicaSet
kubectl get rs
6. Service(服务)
什么是 Service?
就像游乐设施的"统一入口":
- 每个设施有自己的编号(Pod IP),但可能经常变化
- Service 提供一个固定的"检票口"(Service IP)
- 游客通过检票口进入,自动被分配到具体设施
Service 类型:
| 类型 | 通俗解释 | 适用场景 |
|---|---|---|
| ClusterIP | 内部访问(只在集群内可达) | 内部服务间调用 |
| NodePort | 节点端口(通过节点 IP:端口访问) | 开发测试环境 |
| LoadBalancer | 负载均衡(云厂商提供) | 生产环境对外服务 |
| ExternalName | 外部服务别名 | 访问集群外的服务 |
# 👀 查看所有 Service
kubectl get svc
# 👀 查看 Service 详细信息
kubectl describe svc <service-name>
# 👀 测试 Service 访问
kubectl run test --rm -it --image=busybox -- wget -qO- http://<service-name>:<port>
7. Ingress(入口)
什么是 Ingress?
就像游乐园的大门和智能导览系统:
- 大门决定游客从哪个入口进入
- 导览系统告诉游客 A 项目在东区、B 项目在西区
Ingress 就是 K8s 的"HTTP/HTTPS 路由",把外部请求路由到不同的 Service。
# Ingress 示例
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-ingress
spec:
rules:
- host: myapp.example.com
http:
paths:
- path: /api
pathType: Prefix
backend:
service:
name: api-service
port:
number: 8080
- path: /
pathType: Prefix
backend:
service:
name: web-service
port:
number: 80
8. ConfigMap(配置映射)
什么是 ConfigMap?
就像给游乐设施准备的"操作手册":
- 设施的运行参数
- 环境配置
- 不需要加密的配置信息
# 👀 从文件创建 ConfigMap
kubectl create configmap my-config --from-file=config.properties
# 👀 从环境变量创建
kubectl create configmap my-config --from-literal=ENV=production
# 👀 查看 ConfigMap
kubectl get configmap
# 👀 查看 ConfigMap 内容
kubectl describe configmap my-config
# ConfigMap 示例
apiVersion: v1
kind: ConfigMap
metadata:
name: myapp-config
data:
DATABASE_HOST: "db.example.com"
DATABASE_PORT: "5432"
LOG_LEVEL: "info"
9. Secret(密钥)
什么是 Secret?
就像"保险箱":
- 存放密码、API 密钥、证书等敏感信息
- 数据经过 Base64 编码(不是加密!)
- 可以配合 RBAC 控制访问权限
# 👀 创建 Secret
kubectl create secret generic db-password --from-literal=password=secret123
# 👀 查看 Secret
kubectl get secret
# 👀 解码 Secret
kubectl get secret db-password -o jsonpath="{.data.password}" | base64 -d
kubectl 常用命令
命名空间操作
# 👀 查看所有命名空间
kubectl get namespaces
# 👀 创建命名空间
kubectl create namespace myapp
# 👀 切换默认命名空间
kubectl config set-context $(kubectl config current-context) --namespace=myapp
# 👀 在指定命名空间执行命令
kubectl get pods -n myapp
Pod 操作
# 👀 查看 Pod(所有命名空间)
kubectl get pods -A
# 👀 查看 Pod 详细信息
kubectl describe pod <pod-name>
# 👀 查看 Pod 日志
kubectl logs <pod-name>
kubectl logs <pod-name> --previous # 上一个容器的日志
# 👀 实时查看日志
kubectl logs -f <pod-name>
# 👀 进入 Pod 调试
kubectl exec -it <pod-name> -- /bin/bash
# 👀 执行单个命令
kubectl exec <pod-name> -- ls -la /app
# 👀 复制文件到 Pod
kubectl cp /local/file <pod-name>:/remote/path
# 🗑️ 删除 Pod
kubectl delete pod <pod-name>
Deployment 操作
# 👀 查看 Deployment
kubectl get deployments -n <namespace>
# 👀 创建 Deployment
kubectl apply -f deployment.yaml
# 👀 扩缩容
kubectl scale deployment <name> --replicas=5
# 👀 更新镜像
kubectl set image deployment/<name> container-name=image:tag
# 👀 查看滚动更新状态
kubectl rollout status deployment/<name>
# 👀 回滚
kubectl rollout undo deployment/<name>
# 🗑️ 删除 Deployment
kubectl delete deployment <name>
Service 操作
# 👀 查看 Service
kubectl get svc -A
# 👀 暴露 Deployment 为 Service
kubectl expose deployment <name> --type=LoadBalancer --port=80 --target-port=8080
# 👀 查看 Service 详情
kubectl describe svc <service-name>
# 🗑️ 删除 Service
kubectl delete svc <service-name>
资源创建和编辑
# 👀 应用配置文件
kubectl apply -f <file.yaml>
# 👀 查看已创建的资源
kubectl get all
# 👀 编辑资源
kubectl edit <resource-type> <name>
# 👀 查看资源 YAML
kubectl get <resource-type> <name> -o yaml
# 👀 导出资源 YAML
kubectl get <resource-type> <name> -o yaml --export > backup.yaml
调试和问题排查
# 👀 查看资源事件
kubectl describe <resource-type> <name>
# 👀 查看资源使用
kubectl top pods
kubectl top nodes
# 👀 查看 API 资源
kubectl api-resources
# 👀 授权检查
kubectl auth can-i create pods
# 👀 临时调试 Pod(ephemeral container)
kubectl debug <pod-name> -it --image=busybox
批量操作
# 👀 删除所有 Pod
kubectl delete pods --all
# 👀 删除所有 Pod(包含已终止的)
kubectl delete pods --field-selector=status.phase!=Running
# 👀 批量标签选择
kubectl get pods -l app=myapp
# 👀 批量执行命令
kubectl get pods -l app=myapp -o name | xargs kubectl logs
核心资源详解
1. Pod 资源配置
apiVersion: v1
kind: Pod
metadata:
name: myapp-pod
labels:
app: myapp
version: v1
spec:
# 容器配置
containers:
- name: myapp
image: myapp:1.0
ports:
- containerPort: 8080
name: http
# 资源限制
resources:
requests:
memory: "128Mi"
cpu: "250m"
limits:
memory: "256Mi"
cpu: "500m"
# 环境变量
env:
- name: APP_ENV
value: "production"
- name: DB_HOST
valueFrom:
configMapKeyRef:
name: myapp-config
key: DATABASE_HOST
# 健康检查
livenessProbe:
httpGet:
path: /health
port: 8080
initialDelaySeconds: 10
periodSeconds: 5
readinessProbe:
httpGet:
path: /ready
port: 8080
initialDelaySeconds: 5
periodSeconds: 3
# 启动探针
startupProbe:
httpGet:
path: /health
port: 8080
failureThreshold: 30
periodSeconds: 10
# 调度规则
nodeSelector:
disktype: ssd
# 容忍度
tolerations:
- key: "node-role"
operator: "Equal"
value: "web"
effect: "NoSchedule"
# 亲和性
affinity:
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
podAffinityTerm:
labelSelector:
matchLabels:
app: myapp
topologyKey: kubernetes.io/hostname
2. Deployment 完整配置
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp-deployment
labels:
app: myapp
spec:
# 副本数
replicas: 3
# 选择器
selector:
matchLabels:
app: myapp
# 滚动更新策略
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1 # 最多超出期望副本数
maxUnavailable: 0 # 最多不可用副本数
# Pod 模板
template:
metadata:
labels:
app: myapp
version: v1
spec:
containers:
- name: myapp
image: myapp:1.0
ports:
- containerPort: 8080
# 资源限制
resources:
requests:
memory: "128Mi"
cpu: "100m"
limits:
memory: "256Mi"
cpu: "500m"
# 健康检查
livenessProbe:
httpGet:
path: /health
port: 8080
initialDelaySeconds: 10
periodSeconds: 10
readinessProbe:
httpGet:
path: /ready
port: 8080
initialDelaySeconds: 5
periodSeconds: 5
# 钩子
lifecycle:
preStop:
exec:
command: ["/bin/sh", "-c", "sleep 10"]
3. Service 完整配置
apiVersion: v1
kind: Service
metadata:
name: myapp-service
spec:
# Service 类型
type: ClusterIP # ClusterIP / NodePort / LoadBalancer
# 标签选择器
selector:
app: myapp
# 端口配置
ports:
- name: http
port: 80 # Service 端口
targetPort: 8080 # Pod 端口
protocol: TCP
# Session 亲和性
sessionAffinity: ClientIP
# 外部流量策略
externalTrafficPolicy: Cluster # Cluster / Local
4. Ingress 完整配置
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: myapp-ingress
annotations:
# Nginx Ingress Controller 注解
nginx.ingress.kubernetes.io/rewrite-target: /
nginx.ingress.kubernetes.io/ssl-redirect: "true"
nginx.ingress.kubernetes.io/proxy-body-size: "50m"
spec:
# TLS 配置
tls:
- hosts:
- myapp.example.com
secretName: myapp-tls
# 规则
rules:
- host: myapp.example.com
http:
paths:
- path: /api
pathType: Prefix
backend:
service:
name: api-service
port:
number: 8080
- path: /
pathType: Prefix
backend:
service:
name: web-service
port:
number: 80
# 默认后端(404)
defaultBackend:
service:
name: default-backend
port:
number: 8080
5. ConfigMap 和 Secret
# ConfigMap
apiVersion: v1
kind: ConfigMap
metadata:
name: myapp-config
data:
APP_ENV: "production"
LOG_LEVEL: "info"
config.json: |
{
"database": "postgres",
"cache": "redis"
}
---
# Secret
apiVersion: v1
kind: Secret
metadata:
name: myapp-secret
type: Opaque
data:
# echo -n "password" | base64
DB_PASSWORD: cGFzc3dvcmQ=
# echo -n "api-key" | base64
API_KEY: YXBpLWtleQ==
6. HPA(水平自动扩缩容)
什么是 HPA?
就像游乐园根据游客数量自动增减设施:
- 游客多了(CPU > 80%),自动增加设施
- 游客少了(CPU < 20%),自动减少设施
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: myapp-hpa
spec:
# 目标 Deployment
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: myapp-deployment
# 副本数范围
minReplicas: 2
maxReplicas: 10
# 扩缩容指标
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 80
- type: Resource
resource:
name: memory
target:
type: Utilization
averageUtilization: 85
# 👀 创建 HPA
kubectl autoscale deployment myapp --cpu-percent=80 --min=2 --max=10
# 👀 查看 HPA
kubectl get hpa
# 👀 查看 HPA 详细信息
kubectl describe hpa myapp
7. PV 和 PVC(持久化存储)
什么是 PV/PVC?
就像游乐园的储物柜系统:
- PV = 储物柜(存储空间)
- PVC = 储物柜租用申请
- 游客(Pod)通过 PVC 租用储物柜
# PersistentVolume(存储卷)
apiVersion: v1
kind: PersistentVolume
metadata:
name: my-pv
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce # 单节点读写
# - ReadOnlyMany # 多节点只读
# - ReadWriteMany # 多节点读写
persistentVolumeReclaimPolicy: Retain # Retain / Delete / Recycle
storageClassName: standard
hostPath:
path: /data/pv001
---
# PersistentVolumeClaim(存储卷请求)
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: my-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi
storageClassName: standard
---
# Pod 使用 PVC
apiVersion: v1
kind: Pod
metadata:
name: myapp
spec:
containers:
- name: myapp
image: myapp:1.0
volumeMounts:
- name: my-storage
mountPath: /data
volumes:
- name: my-storage
persistentVolumeClaim:
claimName: my-pvc
YAML 配置详解
YAML 基本语法
# 键值对
name: myapp
version: "1.0"
# 数组/列表
containers:
- name: web
image: nginx
- name: api
image: myapi
# 嵌套对象
spec:
replicas: 3
selector:
matchLabels:
app: myapp
# 多行字符串
description: |
这是一个
多行字符串
保持格式
# 注释
# 这是注释
常用 API 版本
| 资源类型 | API 版本 |
|---|---|
| Pod | v1 |
| Service | v1 |
| Deployment | apps/v1 |
| ConfigMap | v1 |
| Secret | v1 |
| Ingress | networking.k8s.io/v1 |
| HPA | autoscaling/v2 |
| PV/PVC | v1 |
标签和选择器
# 标签(Labels)
metadata:
labels:
app: myapp
tier: frontend
environment: production
# 选择器(Selector)
spec:
selector:
matchLabels:
app: myapp
# 注解(Annotations)- 非标识信息
metadata:
annotations:
description: "This is my application"
contact: "admin@example.com"
资源清单导出
# 👀 导出 Deployment YAML
kubectl get deployment myapp -o yaml > deployment.yaml
# 👀 导出所有资源(排除状态字段)
kubectl get all -o yaml --export > backup.yaml
# 👀 查看 YAML 配置(不包含状态)
kubectl get deployment myapp -o yaml --dry-run=client
生产环境最佳实践
1. 资源限制
# 建议的资源限制配置
resources:
requests:
memory: "128Mi" # 保证分配
cpu: "100m" # 100 millicores
limits:
memory: "256Mi" # 上限
cpu: "500m"
内存限制建议:
- 生产环境至少 256Mi
- Java 应用建议 512Mi+
- 不要设置过小,否则 OOM
2. 健康检查
# Liveness Probe - 存活探针
livenessProbe:
httpGet:
path: /health/live
port: 8080
initialDelaySeconds: 15 # 等待应用启动
periodSeconds: 10 # 检查频率
failureThreshold: 3 # 连续失败次数
# Readiness Probe - 就绪探针
readinessProbe:
httpGet:
path: /health/ready
port: 8080
initialDelaySeconds: 5
periodSeconds: 5
failureThreshold: 1
3. 滚动更新配置
# 安全的滚动更新策略
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1 # 最多超出 1 个 Pod
maxUnavailable: 0 # 0 表示不中断服务
4. Pod 中断预算(PDB)
什么是 PDB?
就像游乐园在维护期间,保证至少有一定数量的设施开放。
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
name: myapp-pdb
spec:
# 最小可用数
minAvailable: 2
# 或者最大不可用数
# maxUnavailable: 1
selector:
matchLabels:
app: myapp
5. 网络策略
# 限制只允许来自 API 服务到数据库的流量
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: db-network-policy
spec:
podSelector:
matchLabels:
app: database
policyTypes:
- Ingress
ingress:
- from:
- podSelector:
matchLabels:
app: api
ports:
- protocol: TCP
port: 5432
6. 资源配额
# 命名空间资源配额
apiVersion: v1
kind: ResourceQuota
metadata:
name: myapp-quota
spec:
hard:
requests.cpu: "10"
requests.memory: 20Gi
limits.cpu: "20"
limits.memory: 40Gi
pods: "100"
7. 限制范围
# 默认资源限制
apiVersion: v1
kind: LimitRange
metadata:
name: myapp-limits
spec:
limits:
- type: Container
default:
memory: 256Mi
cpu: 200m
defaultRequest:
memory: 128Mi
cpu: 100m
max:
memory: 1Gi
cpu: 1
运维监控
常用监控命令
# 👀 查看节点状态
kubectl get nodes -o wide
# 👀 查看资源使用
kubectl top nodes
kubectl top pods -A
# 👀 查看资源使用(按命名空间)
kubectl top pods -n <namespace>
# 👀 查看资源使用(按标签)
kubectl top pods -l app=myapp
监控脚本
#!/bin/bash
echo "=========================================="
echo " K8s 监控报告"
echo "=========================================="
echo "时间: $(date)"
echo ""
echo "📊 【节点状态】"
kubectl get nodes -o wide
echo ""
echo "🔧 【系统组件状态】"
kubectl get pods -n kube-system
echo ""
echo "📦 【Deployment 状态】"
kubectl get deployments -A
echo ""
echo "🔌 【Service 状态】"
kubectl get svc -A
echo ""
echo "💾 【资源使用 - 节点】"
kubectl top nodes
echo ""
echo "💾 【资源使用 - Pod】"
kubectl top pods -A | head -20
echo "=========================================="
日志收集
# 👀 查看所有 Pod 日志
kubectl logs -l app=myapp --all-containers=true
# 👀 查看最近日志
kubectl logs --tail=100 <pod-name>
# 👀 查看时间戳
kubectl logs -t <pod-name>
# 👀 转发本地端口调试
kubectl port-forward <pod-name> 8080:8080
事件监控
# 👀 查看集群事件
kubectl get events -A --sort-by='.lastTimestamp'
# 👀 查看特定资源事件
kubectl describe <resource-type> <name> | grep -A 10 Events
# 👀 查看错误事件
kubectl get events -A --field-selector type=Warning
常见问题排查
问题 1:Pod 处于 Pending 状态
现象: Pod 一直处于 Pending 状态
通俗解释: 就像游乐设施申请建在某个区域,但区域满了或者不符合条件,建不了。
排查步骤:
# 👀 查看 Pod 详情
kubectl describe pod <pod-name>
常见原因:
-
资源不足
# 查看节点资源 kubectl describe nodes kubectl top nodes -
调度失败
- NodeSelector 不匹配
- 亲和性/反亲和性冲突
- 污点(Taints)未容忍
解决方案:
# 增加节点资源
# 或者调整 Pod 配置
kubectl edit pod <pod-name>
问题 2:Pod 处于 CrashLoopBackOff 状态
现象: Pod 不断重启
通俗解释: 游乐设施建好了,但运行就出故障,系统自动重启,重启后又故障。
排查步骤:
# 👀 查看日志
kubectl logs <pod-name> --previous
# 👀 查看详情
kubectl describe pod <pod-name>
常见原因:
-
应用启动失败
- 端口被占用
- 配置文件错误
- 依赖服务不可达
-
健康检查失败
- 探针配置错误
- 应用启动太慢
解决方案:
# 调整健康检查时间
livenessProbe:
initialDelaySeconds: 30 # 增加延迟
failureThreshold: 5 # 增加失败阈值
问题 3:Service 无法访问
现象: 无法从其他 Pod 访问 Service
通俗解释: 检票口建好了,但入口不通或者找错了地方。
排查步骤:
# 1. 确认 Service 存在
kubectl get svc <service-name>
# 2. 确认 Endpoint 存在
kubectl get endpoints <service-name>
# 3. 测试 DNS 解析
kubectl run test --rm -it --image=busybox -- nslookup <service-name>
# 4. 测试连通性
kubectl exec -it <source-pod> -- wget -qO- http://<service-name>
解决方案:
- 确认 Pod 标签匹配 Service Selector
- 确认 Pod 处于 Running 状态
- 检查网络策略
问题 4:镜像拉取失败
现象: Pod 无法启动,提示 ImagePullBackOff
通俗解释: 游乐设施的图纸(镜像)找不到,可能是地址错误或者权限不够。
排查步骤:
# 👀 查看拉取错误
kubectl describe pod <pod-name> | grep -A 5 "ImagePull"
# 常见错误:
# 1. 镜像地址错误
# 2. 镜像不存在
# 3. 没有拉取权限(需要 Secret)
解决方案:
# 1. 检查镜像地址
docker pull <image-name>
# 2. 创建拉取密钥
kubectl create secret docker-registry my-registry \
--docker-server=<registry> \
--docker-username=<user> \
--docker-password=<password>
# 3. 在 Pod 中引用
spec:
imagePullSecrets:
- name: my-registry
问题 5:OOMKilled(内存溢出)
现象: Pod 被杀掉,状态为 OOMKilled
通俗解释: 游乐设施耗电量超过限制,保险丝烧了。
排查步骤:
# 👀 查看 Pod 状态
kubectl get pod <pod-name> -o jsonpath='{.status.containerStatuses[0].lastState.terminated.reason}'
# 👀 查看资源使用
kubectl top pod <pod-name>
解决方案:
# 增加内存限制
resources:
limits:
memory: "512Mi"
问题 6:HPA 不工作
现象: Pod 数量没有自动扩缩容
排查步骤:
# 👀 查看 HPA 状态
kubectl get hpa
# 👀 查看 HPA 详细信息
kubectl describe hpa <hpa-name>
# 👀 查看指标
kubectl top hpa
常见原因:
- 指标服务未运行(metrics-server)
- Pod 没有配置资源请求
- 自定义指标未配置
解决方案:
# 安装 metrics-server
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
总结
核心概念
| 概念 | 通俗解释 |
|---|---|
| Pod | 太空舱(最小调度单位) |
| Deployment | 设施说明书(部署配置) |
| Service | 统一入口(检票口) |
| Ingress | 智能导览(HTTP 路由) |
| ConfigMap | 操作手册(配置) |
| Secret | 保险箱(密钥) |
| HPA | 自动管理员(扩缩容) |
| PV/PVC | 储物柜(持久存储) |
运维黄金法则
- 配置资源限制 - 别让 Pod 吃光资源
- 配置健康检查 - 让 K8s 知道应用死活
- 使用滚动更新 - 平滑升级不停服
- 设置资源配额 - 防止单个命名空间滥用
- 配置 PDB - 保障最低可用数
- 定期备份 - YAML 配置要备份
- 监控资源使用 - 及时发现问题
kubectl 常用命令速查
| 操作 | 命令 |
|---|---|
| 查看 Pod | kubectl get pods |
| 查看日志 | kubectl logs <pod> |
| 进入调试 | kubectl exec -it <pod> -- /bin/bash |
| 扩缩容 | kubectl scale deployment <name> --replicas=3 |
| 更新镜像 | kubectl set image deployment/<name> <container>=<image> |
| 回滚 | kubectl rollout undo deployment/<name> |
| 应用配置 | kubectl apply -f <file.yaml> |
| 查看资源 | kubectl get all |
| 排查问题 | kubectl describe <type> <name> |
最后一句话总结:
Kubernetes 就是云原生的"智能游乐园管理系统",让容器编排变得简单、可控、自动化。掌握好核心概念,配置好健康检查和资源限制,运维就不在话下!
持续更新中… 如有问题或建议,欢迎交流讨论!