Loading...

文章背景图

K8s 全面实战生产运维指南(持续更新)

2026-06-03
0
-
- 分钟
|

K8s 全面实战生产运维指南(持续更新)

前言

Kubernetes 是什么?

想象一下:你管理的是一整座超大型游乐园(集群),而不是一家餐厅。

这座游乐园有很多游乐设施(Pod):

  • 旋转木马(Web 服务)
  • 过山车(数据库)
  • 摩天轮(缓存服务)

问题是:

  • 如果旋转木马坏了怎么办?(Pod 挂了)
  • 游客太多了,一个设施忙不过来怎么办?(流量高峰)
  • 要新增一个碰碰车怎么办?(扩缩容)

Kubernetes 就是这座游乐园的"智能管理系统"! 它能:

  • 自动修复坏了的设施(自愈)
  • 自动调配游客到不同的设施(负载均衡)
  • 根据游客数量自动增减设施(自动扩缩容)

Kubernetes(简称 K8s)是云原生的核心,让容器编排变得简单和强大。作为运维工程师,我们的职责是:让这座游乐园运转顺畅、游客满意

本文档会告诉你:

  • Kubernetes 核心概念
  • kubectl 常用命令
  • YAML 配置编写
  • 核心资源详解
  • 生产环境最佳实践
  • 常见问题排查

目录

  1. 快速入门
  2. 核心概念详解
  3. kubectl 常用命令
  4. 核心资源详解
  5. YAML 配置详解
  6. 生产环境最佳实践
  7. 运维监控
  8. 常见问题排查

快速入门

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>

常见原因:

  1. 资源不足

    # 查看节点资源
    kubectl describe nodes
    kubectl top nodes
    
  2. 调度失败

    • NodeSelector 不匹配
    • 亲和性/反亲和性冲突
    • 污点(Taints)未容忍

解决方案:

# 增加节点资源
# 或者调整 Pod 配置
kubectl edit pod <pod-name>

问题 2:Pod 处于 CrashLoopBackOff 状态

现象: Pod 不断重启

通俗解释: 游乐设施建好了,但运行就出故障,系统自动重启,重启后又故障。

排查步骤:

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

# 👀 查看详情
kubectl describe pod <pod-name>

常见原因:

  1. 应用启动失败

    • 端口被占用
    • 配置文件错误
    • 依赖服务不可达
  2. 健康检查失败

    • 探针配置错误
    • 应用启动太慢

解决方案:

# 调整健康检查时间
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>

解决方案:

  1. 确认 Pod 标签匹配 Service Selector
  2. 确认 Pod 处于 Running 状态
  3. 检查网络策略

问题 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 储物柜(持久存储)

运维黄金法则

  1. 配置资源限制 - 别让 Pod 吃光资源
  2. 配置健康检查 - 让 K8s 知道应用死活
  3. 使用滚动更新 - 平滑升级不停服
  4. 设置资源配额 - 防止单个命名空间滥用
  5. 配置 PDB - 保障最低可用数
  6. 定期备份 - YAML 配置要备份
  7. 监控资源使用 - 及时发现问题

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 就是云原生的"智能游乐园管理系统",让容器编排变得简单、可控、自动化。掌握好核心概念,配置好健康检查和资源限制,运维就不在话下!


持续更新中… 如有问题或建议,欢迎交流讨论!

原创

K8s 全面实战生产运维指南(持续更新)

本文链接: K8s 全面实战生产运维指南(持续更新)

本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。

评论交流

文章目录