11.1 故障排查概述
11.1.1 故障排查方法论
# 故障排查流程配置
apiVersion: v1
kind: ConfigMap
metadata:
name: troubleshooting-methodology
data:
troubleshooting-process.md: |
# Kubernetes故障排查方法论
## 1. 问题识别和分类
### 问题类型分类:
- **应用层问题**: 应用无法启动、功能异常、性能问题
- **平台层问题**: Pod调度失败、网络连接问题、存储问题
- **基础设施问题**: 节点故障、网络故障、存储故障
- **配置问题**: 资源配置错误、权限配置错误、网络策略错误
### 严重级别分类:
- **P0 - 紧急**: 服务完全不可用,影响所有用户
- **P1 - 高**: 核心功能不可用,影响大部分用户
- **P2 - 中**: 部分功能不可用,影响部分用户
- **P3 - 低**: 性能问题或非核心功能问题
## 2. 信息收集
### 基础信息收集:
```bash
# 集群状态
kubectl cluster-info
kubectl get nodes
kubectl get pods --all-namespaces
# 事件信息
kubectl get events --all-namespaces --sort-by='.lastTimestamp'
# 资源使用情况
kubectl top nodes
kubectl top pods --all-namespaces
```
### 详细信息收集:
```bash
# Pod详细信息
kubectl describe pod <pod-name> -n <namespace>
kubectl logs <pod-name> -n <namespace> --previous
# 网络信息
kubectl get svc,endpoints --all-namespaces
kubectl get networkpolicies --all-namespaces
# 存储信息
kubectl get pv,pvc --all-namespaces
kubectl get storageclass
```
## 3. 问题分析
### 分析步骤:
1. **症状分析**: 确定具体症状和影响范围
2. **时间线分析**: 确定问题开始时间和相关变更
3. **依赖关系分析**: 分析组件间的依赖关系
4. **资源分析**: 检查资源使用情况和限制
5. **日志分析**: 分析相关组件的日志
### 常用分析工具:
- kubectl: 基础诊断工具
- stern: 多Pod日志聚合
- k9s: 交互式集群管理
- Prometheus: 监控和告警
- Jaeger: 分布式追踪
## 4. 解决方案实施
### 解决策略:
1. **快速恢复**: 优先恢复服务可用性
2. **根因修复**: 修复根本原因
3. **预防措施**: 防止问题再次发生
4. **文档记录**: 记录问题和解决方案
## 5. 验证和监控
### 验证步骤:
1. 功能验证: 确认功能正常
2. 性能验证: 确认性能恢复
3. 稳定性验证: 观察一段时间确保稳定
4. 监控设置: 设置相关监控和告警
troubleshooting-checklist.md: |
# 故障排查检查清单
## 快速检查清单
### 集群级别检查:
- [ ] 检查集群状态: `kubectl cluster-info`
- [ ] 检查节点状态: `kubectl get nodes`
- [ ] 检查系统Pod: `kubectl get pods -n kube-system`
- [ ] 检查最近事件: `kubectl get events --sort-by='.lastTimestamp'`
### 应用级别检查:
- [ ] 检查Pod状态: `kubectl get pods -n <namespace>`
- [ ] 检查Pod详情: `kubectl describe pod <pod-name>`
- [ ] 检查Pod日志: `kubectl logs <pod-name>`
- [ ] 检查服务状态: `kubectl get svc -n <namespace>`
### 网络级别检查:
- [ ] 检查Service和Endpoints: `kubectl get svc,ep`
- [ ] 检查网络策略: `kubectl get networkpolicies`
- [ ] 检查DNS解析: `nslookup <service-name>`
- [ ] 检查网络连通性: `ping/telnet`
### 存储级别检查:
- [ ] 检查PV/PVC状态: `kubectl get pv,pvc`
- [ ] 检查存储类: `kubectl get storageclass`
- [ ] 检查挂载点: `df -h`
- [ ] 检查存储权限: `ls -la`
### 资源级别检查:
- [ ] 检查资源使用: `kubectl top nodes/pods`
- [ ] 检查资源配额: `kubectl get resourcequota`
- [ ] 检查限制范围: `kubectl get limitrange`
- [ ] 检查HPA状态: `kubectl get hpa`
11.1.2 常用故障排查工具
# 故障排查工具配置
apiVersion: v1
kind: ConfigMap
metadata:
name: troubleshooting-tools
data:
install-tools.sh: |
#!/bin/bash
# 安装故障排查工具脚本
echo "=== 安装Kubernetes故障排查工具 ==="
# 安装stern (多Pod日志聚合)
echo "1. 安装stern..."
if ! command -v stern &> /dev/null; then
curl -L https://github.com/stern/stern/releases/latest/download/stern_linux_amd64.tar.gz | tar xz
sudo mv stern /usr/local/bin/
echo "stern安装完成"
else
echo "stern已安装"
fi
# 安装k9s (交互式集群管理)
echo "\n2. 安装k9s..."
if ! command -v k9s &> /dev/null; then
curl -L https://github.com/derailed/k9s/releases/latest/download/k9s_Linux_x86_64.tar.gz | tar xz
sudo mv k9s /usr/local/bin/
echo "k9s安装完成"
else
echo "k9s已安装"
fi
# 安装kubectx和kubens (上下文切换)
echo "\n3. 安装kubectx和kubens..."
if ! command -v kubectx &> /dev/null; then
sudo git clone https://github.com/ahmetb/kubectx /opt/kubectx
sudo ln -s /opt/kubectx/kubectx /usr/local/bin/kubectx
sudo ln -s /opt/kubectx/kubens /usr/local/bin/kubens
echo "kubectx和kubens安装完成"
else
echo "kubectx和kubens已安装"
fi
# 安装krew (kubectl插件管理器)
echo "\n4. 安装krew..."
if ! kubectl krew version &> /dev/null; then
(
set -x; cd "$(mktemp -d)" &&
OS="$(uname | tr '[:upper:]' '[:lower:]')" &&
ARCH="$(uname -m | sed -e 's/x86_64/amd64/' -e 's/\(arm\)\(64\)\?.*/\1\2/' -e 's/aarch64$/arm64/')" &&
KREW="krew-${OS}_${ARCH}" &&
curl -fsSLO "https://github.com/kubernetes-sigs/krew/releases/latest/download/${KREW}.tar.gz" &&
tar zxvf "${KREW}.tar.gz" &&
./${KREW} install krew
)
echo 'export PATH="${KREW_ROOT:-$HOME/.krew}/bin:$PATH"' >> ~/.bashrc
echo "krew安装完成,请重新加载shell"
else
echo "krew已安装"
fi
# 安装有用的kubectl插件
echo "\n5. 安装kubectl插件..."
kubectl krew install debug
kubectl krew install trace
kubectl krew install tree
kubectl krew install who-can
kubectl krew install resource-capacity
echo "\n=== 工具安装完成 ==="
debug-pod.yaml: |
# 调试Pod模板
apiVersion: v1
kind: Pod
metadata:
name: debug-pod
namespace: default
spec:
containers:
- name: debug
image: nicolaka/netshoot:latest
command: ["sleep", "3600"]
securityContext:
capabilities:
add:
- NET_ADMIN
- SYS_PTRACE
volumeMounts:
- name: host-root
mountPath: /host
readOnly: true
volumes:
- name: host-root
hostPath:
path: /
hostNetwork: true
hostPID: true
restartPolicy: Never
quick-debug.sh: |
#!/bin/bash
# 快速调试脚本
NAMESPACE=${1:-"default"}
POD_NAME=${2}
if [ -z "$POD_NAME" ]; then
echo "用法: $0 [namespace] <pod-name>"
echo "快速调试指定Pod"
exit 1
fi
echo "=== 快速调试Pod: $NAMESPACE/$POD_NAME ==="
# 基本信息
echo "1. Pod基本信息:"
kubectl get pod $POD_NAME -n $NAMESPACE -o wide
# Pod详细描述
echo "\n2. Pod详细描述:"
kubectl describe pod $POD_NAME -n $NAMESPACE
# Pod日志
echo "\n3. Pod当前日志:"
kubectl logs $POD_NAME -n $NAMESPACE --tail=50
# Pod之前的日志(如果存在)
echo "\n4. Pod之前的日志:"
kubectl logs $POD_NAME -n $NAMESPACE --previous --tail=50 2>/dev/null || echo "没有之前的日志"
# 相关事件
echo "\n5. 相关事件:"
kubectl get events -n $NAMESPACE --field-selector involvedObject.name=$POD_NAME
# 网络信息
echo "\n6. 网络信息:"
kubectl get svc,endpoints -n $NAMESPACE
# 如果Pod正在运行,执行网络测试
if kubectl get pod $POD_NAME -n $NAMESPACE -o jsonpath='{.status.phase}' | grep -q "Running"; then
echo "\n7. 网络连通性测试:"
kubectl exec $POD_NAME -n $NAMESPACE -- nslookup kubernetes.default.svc.cluster.local 2>/dev/null || echo "DNS测试失败"
kubectl exec $POD_NAME -n $NAMESPACE -- wget -qO- --timeout=5 http://kubernetes.default.svc.cluster.local 2>/dev/null || echo "服务连接测试失败"
fi
echo "\n=== 调试完成 ==="
11.2 Pod故障排查
11.2.1 Pod状态问题
# Pod状态故障排查
apiVersion: v1
kind: ConfigMap
metadata:
name: pod-troubleshooting
data:
pod-status-debug.sh: |
#!/bin/bash
# Pod状态调试脚本
NAMESPACE=${1:-"default"}
POD_NAME=${2}
if [ -z "$POD_NAME" ]; then
echo "用法: $0 [namespace] <pod-name>"
exit 1
fi
echo "=== Pod状态诊断: $NAMESPACE/$POD_NAME ==="
# 获取Pod状态
POD_STATUS=$(kubectl get pod $POD_NAME -n $NAMESPACE -o jsonpath='{.status.phase}')
echo "Pod状态: $POD_STATUS"
case $POD_STATUS in
"Pending")
echo "\n=== Pending状态诊断 ==="
echo "可能原因:"
echo "1. 资源不足(CPU/内存)"
echo "2. 节点选择器不匹配"
echo "3. 污点和容忍度不匹配"
echo "4. PVC无法绑定"
echo "5. 镜像拉取失败"
echo "\n检查调度事件:"
kubectl get events -n $NAMESPACE --field-selector involvedObject.name=$POD_NAME,reason=FailedScheduling
echo "\n检查节点资源:"
kubectl describe nodes | grep -A 5 "Allocated resources"
echo "\n检查Pod资源请求:"
kubectl get pod $POD_NAME -n $NAMESPACE -o jsonpath='{.spec.containers[*].resources}'
;;
"Running")
echo "\n=== Running状态诊断 ==="
echo "Pod正在运行,检查容器状态:"
kubectl get pod $POD_NAME -n $NAMESPACE -o jsonpath='{.status.containerStatuses[*].state}'
echo "\n检查就绪状态:"
kubectl get pod $POD_NAME -n $NAMESPACE -o jsonpath='{.status.conditions[?(@.type=="Ready")].status}'
echo "\n检查重启次数:"
kubectl get pod $POD_NAME -n $NAMESPACE -o jsonpath='{.status.containerStatuses[*].restartCount}'
;;
"Failed")
echo "\n=== Failed状态诊断 ==="
echo "Pod执行失败,检查退出代码:"
kubectl get pod $POD_NAME -n $NAMESPACE -o jsonpath='{.status.containerStatuses[*].state.terminated.exitCode}'
echo "\n检查失败原因:"
kubectl get pod $POD_NAME -n $NAMESPACE -o jsonpath='{.status.containerStatuses[*].state.terminated.reason}'
echo "\n检查容器日志:"
kubectl logs $POD_NAME -n $NAMESPACE --previous
;;
"CrashLoopBackOff")
echo "\n=== CrashLoopBackOff状态诊断 ==="
echo "容器持续崩溃,检查崩溃原因:"
kubectl describe pod $POD_NAME -n $NAMESPACE | grep -A 10 "Last State"
echo "\n检查容器日志:"
kubectl logs $POD_NAME -n $NAMESPACE --previous
echo "\n检查资源限制:"
kubectl get pod $POD_NAME -n $NAMESPACE -o jsonpath='{.spec.containers[*].resources.limits}'
;;
*)
echo "\n=== 未知状态诊断 ==="
echo "Pod状态: $POD_STATUS"
kubectl describe pod $POD_NAME -n $NAMESPACE
;;
esac
echo "\n=== 通用检查 ==="
echo "检查镜像拉取策略:"
kubectl get pod $POD_NAME -n $NAMESPACE -o jsonpath='{.spec.containers[*].imagePullPolicy}'
echo "\n检查安全上下文:"
kubectl get pod $POD_NAME -n $NAMESPACE -o jsonpath='{.spec.securityContext}'
echo "\n检查卷挂载:"
kubectl get pod $POD_NAME -n $NAMESPACE -o jsonpath='{.spec.volumes}'
echo "\n=== 诊断完成 ==="
container-debug.sh: |
#!/bin/bash
# 容器调试脚本
NAMESPACE=${1:-"default"}
POD_NAME=${2}
CONTAINER_NAME=${3}
if [ -z "$POD_NAME" ]; then
echo "用法: $0 [namespace] <pod-name> [container-name]"
exit 1
fi
echo "=== 容器调试: $NAMESPACE/$POD_NAME ==="
# 如果没有指定容器名,获取第一个容器
if [ -z "$CONTAINER_NAME" ]; then
CONTAINER_NAME=$(kubectl get pod $POD_NAME -n $NAMESPACE -o jsonpath='{.spec.containers[0].name}')
echo "使用默认容器: $CONTAINER_NAME"
fi
# 检查容器状态
echo "\n1. 容器状态:"
kubectl get pod $POD_NAME -n $NAMESPACE -o jsonpath="{.status.containerStatuses[?(@.name=='$CONTAINER_NAME')].state}"
# 检查容器资源使用
echo "\n2. 容器资源使用:"
kubectl top pod $POD_NAME -n $NAMESPACE --containers
# 检查容器日志
echo "\n3. 容器日志(最近50行):"
kubectl logs $POD_NAME -n $NAMESPACE -c $CONTAINER_NAME --tail=50
# 如果容器正在运行,执行诊断命令
if kubectl get pod $POD_NAME -n $NAMESPACE -o jsonpath="{.status.containerStatuses[?(@.name=='$CONTAINER_NAME')].state.running}" | grep -q "startedAt"; then
echo "\n4. 容器内部诊断:"
echo "进程列表:"
kubectl exec $POD_NAME -n $NAMESPACE -c $CONTAINER_NAME -- ps aux 2>/dev/null || echo "无法获取进程列表"
echo "\n网络连接:"
kubectl exec $POD_NAME -n $NAMESPACE -c $CONTAINER_NAME -- netstat -tulpn 2>/dev/null || echo "无法获取网络连接"
echo "\n磁盘使用:"
kubectl exec $POD_NAME -n $NAMESPACE -c $CONTAINER_NAME -- df -h 2>/dev/null || echo "无法获取磁盘使用情况"
echo "\n环境变量:"
kubectl exec $POD_NAME -n $NAMESPACE -c $CONTAINER_NAME -- env 2>/dev/null || echo "无法获取环境变量"
else
echo "\n4. 容器未运行,无法执行内部诊断"
fi
echo "\n=== 调试完成 ==="
11.2.2 镜像拉取问题
# 镜像拉取故障排查
apiVersion: v1
kind: ConfigMap
metadata:
name: image-pull-troubleshooting
data:
image-pull-debug.sh: |
#!/bin/bash
# 镜像拉取调试脚本
NAMESPACE=${1:-"default"}
POD_NAME=${2}
if [ -z "$POD_NAME" ]; then
echo "用法: $0 [namespace] <pod-name>"
exit 1
fi
echo "=== 镜像拉取诊断: $NAMESPACE/$POD_NAME ==="
# 检查Pod事件中的镜像拉取错误
echo "1. 检查镜像拉取事件:"
kubectl get events -n $NAMESPACE --field-selector involvedObject.name=$POD_NAME,reason=Failed | grep -i "pull\|image"
# 获取Pod中的镜像信息
echo "\n2. Pod镜像信息:"
kubectl get pod $POD_NAME -n $NAMESPACE -o jsonpath='{.spec.containers[*].image}' | tr ' ' '\n'
# 检查镜像拉取策略
echo "\n3. 镜像拉取策略:"
kubectl get pod $POD_NAME -n $NAMESPACE -o jsonpath='{.spec.containers[*].imagePullPolicy}' | tr ' ' '\n'
# 检查镜像拉取密钥
echo "\n4. 镜像拉取密钥:"
kubectl get pod $POD_NAME -n $NAMESPACE -o jsonpath='{.spec.imagePullSecrets[*].name}' | tr ' ' '\n'
# 检查节点上的镜像
echo "\n5. 检查节点镜像:"
NODE_NAME=$(kubectl get pod $POD_NAME -n $NAMESPACE -o jsonpath='{.spec.nodeName}')
if [ ! -z "$NODE_NAME" ]; then
echo "Pod调度到节点: $NODE_NAME"
kubectl get node $NODE_NAME -o jsonpath='{.status.images[*].names}' | tr ' ' '\n' | head -10
else
echo "Pod尚未调度到节点"
fi
# 检查容器运行时
echo "\n6. 检查容器运行时:"
if [ ! -z "$NODE_NAME" ]; then
kubectl get node $NODE_NAME -o jsonpath='{.status.nodeInfo.containerRuntimeVersion}'
fi
# 提供解决建议
echo "\n\n=== 常见解决方案 ==="
echo "1. 镜像不存在或标签错误:"
echo " - 检查镜像名称和标签是否正确"
echo " - 使用 'docker pull <image>' 验证镜像是否可访问"
echo "\n2. 私有仓库认证问题:"
echo " - 创建镜像拉取密钥: kubectl create secret docker-registry"
echo " - 在Pod中引用密钥: imagePullSecrets"
echo "\n3. 网络连接问题:"
echo " - 检查节点到镜像仓库的网络连通性"
echo " - 检查防火墙和代理设置"
echo "\n4. 磁盘空间不足:"
echo " - 检查节点磁盘空间: kubectl describe node"
echo " - 清理未使用的镜像: docker system prune"
echo "\n=== 诊断完成 ==="
test-image-pull.sh: |
#!/bin/bash
# 测试镜像拉取脚本
IMAGE_NAME=${1}
NAMESPACE=${2:-"default"}
if [ -z "$IMAGE_NAME" ]; then
echo "用法: $0 <image-name> [namespace]"
exit 1
fi
echo "=== 测试镜像拉取: $IMAGE_NAME ==="
# 创建测试Pod
TEST_POD_NAME="image-pull-test-$(date +%s)"
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
name: $TEST_POD_NAME
namespace: $NAMESPACE
spec:
containers:
- name: test
image: $IMAGE_NAME
command: ["sleep", "60"]
restartPolicy: Never
EOF
echo "创建测试Pod: $TEST_POD_NAME"
# 等待Pod状态变化
echo "等待Pod状态变化..."
sleep 10
# 检查Pod状态
POD_STATUS=$(kubectl get pod $TEST_POD_NAME -n $NAMESPACE -o jsonpath='{.status.phase}')
echo "Pod状态: $POD_STATUS"
# 检查镜像拉取事件
echo "\n镜像拉取事件:"
kubectl get events -n $NAMESPACE --field-selector involvedObject.name=$TEST_POD_NAME
# 清理测试Pod
echo "\n清理测试Pod..."
kubectl delete pod $TEST_POD_NAME -n $NAMESPACE
echo "\n=== 测试完成 ==="
11.3 网络故障排查
11.3.1 Service连接问题
# Service网络故障排查
apiVersion: v1
kind: ConfigMap
metadata:
name: service-troubleshooting
data:
service-debug.sh: |
#!/bin/bash
# Service调试脚本
NAMESPACE=${1:-"default"}
SERVICE_NAME=${2}
if [ -z "$SERVICE_NAME" ]; then
echo "用法: $0 [namespace] <service-name>"
exit 1
fi
echo "=== Service网络诊断: $NAMESPACE/$SERVICE_NAME ==="
# 检查Service基本信息
echo "1. Service基本信息:"
kubectl get svc $SERVICE_NAME -n $NAMESPACE -o wide
# 检查Service详细信息
echo "\n2. Service详细信息:"
kubectl describe svc $SERVICE_NAME -n $NAMESPACE
# 检查Endpoints
echo "\n3. Endpoints信息:"
kubectl get endpoints $SERVICE_NAME -n $NAMESPACE -o wide
# 检查后端Pod
echo "\n4. 后端Pod状态:"
SELECTOR=$(kubectl get svc $SERVICE_NAME -n $NAMESPACE -o jsonpath='{.spec.selector}' | jq -r 'to_entries[] | "\(.key)=\(.value)"' | tr '\n' ',' | sed 's/,$//')
if [ ! -z "$SELECTOR" ]; then
echo "选择器: $SELECTOR"
kubectl get pods -n $NAMESPACE -l "$SELECTOR" -o wide
else
echo "Service没有选择器(可能是外部服务)"
fi
# 检查Service类型特定信息
SERVICE_TYPE=$(kubectl get svc $SERVICE_NAME -n $NAMESPACE -o jsonpath='{.spec.type}')
echo "\n5. Service类型: $SERVICE_TYPE"
case $SERVICE_TYPE in
"ClusterIP")
echo "ClusterIP Service诊断:"
CLUSTER_IP=$(kubectl get svc $SERVICE_NAME -n $NAMESPACE -o jsonpath='{.spec.clusterIP}')
echo "ClusterIP: $CLUSTER_IP"
# 测试DNS解析
echo "\n测试DNS解析:"
kubectl run dns-test --image=busybox --rm -it --restart=Never -- nslookup $SERVICE_NAME.$NAMESPACE.svc.cluster.local
;;
"NodePort")
echo "NodePort Service诊断:"
NODE_PORT=$(kubectl get svc $SERVICE_NAME -n $NAMESPACE -o jsonpath='{.spec.ports[0].nodePort}')
echo "NodePort: $NODE_PORT"
echo "\n节点信息:"
kubectl get nodes -o wide
;;
"LoadBalancer")
echo "LoadBalancer Service诊断:"
EXTERNAL_IP=$(kubectl get svc $SERVICE_NAME -n $NAMESPACE -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
echo "External IP: $EXTERNAL_IP"
if [ "$EXTERNAL_IP" = "<pending>" ] || [ -z "$EXTERNAL_IP" ]; then
echo "LoadBalancer IP处于pending状态,检查云提供商配置"
fi
;;
esac
# 检查网络策略
echo "\n6. 网络策略检查:"
kubectl get networkpolicies -n $NAMESPACE
# 检查kube-proxy
echo "\n7. kube-proxy状态:"
kubectl get pods -n kube-system -l k8s-app=kube-proxy
echo "\n=== 诊断完成 ==="
network-connectivity-test.sh: |
#!/bin/bash
# 网络连通性测试脚本
SOURCE_NAMESPACE=${1:-"default"}
SOURCE_POD=${2}
TARGET_SERVICE=${3}
TARGET_NAMESPACE=${4:-"default"}
if [ -z "$SOURCE_POD" ] || [ -z "$TARGET_SERVICE" ]; then
echo "用法: $0 [source-namespace] <source-pod> <target-service> [target-namespace]"
exit 1
fi
echo "=== 网络连通性测试 ==="
echo "源Pod: $SOURCE_NAMESPACE/$SOURCE_POD"
echo "目标Service: $TARGET_NAMESPACE/$TARGET_SERVICE"
# 检查源Pod状态
echo "\n1. 检查源Pod状态:"
kubectl get pod $SOURCE_POD -n $SOURCE_NAMESPACE
# 检查目标Service状态
echo "\n2. 检查目标Service状态:"
kubectl get svc $TARGET_SERVICE -n $TARGET_NAMESPACE
# DNS解析测试
echo "\n3. DNS解析测试:"
kubectl exec $SOURCE_POD -n $SOURCE_NAMESPACE -- nslookup $TARGET_SERVICE.$TARGET_NAMESPACE.svc.cluster.local
# 获取Service IP和端口
SERVICE_IP=$(kubectl get svc $TARGET_SERVICE -n $TARGET_NAMESPACE -o jsonpath='{.spec.clusterIP}')
SERVICE_PORT=$(kubectl get svc $TARGET_SERVICE -n $TARGET_NAMESPACE -o jsonpath='{.spec.ports[0].port}')
echo "\n4. 连通性测试:"
echo "Service IP: $SERVICE_IP"
echo "Service Port: $SERVICE_PORT"
# Ping测试(如果支持)
echo "\nPing测试:"
kubectl exec $SOURCE_POD -n $SOURCE_NAMESPACE -- ping -c 3 $SERVICE_IP 2>/dev/null || echo "Ping失败或不支持"
# 端口连通性测试
echo "\n端口连通性测试:"
kubectl exec $SOURCE_POD -n $SOURCE_NAMESPACE -- nc -zv $SERVICE_IP $SERVICE_PORT 2>/dev/null || echo "端口连接失败"
# HTTP测试(如果是HTTP服务)
echo "\nHTTP测试:"
kubectl exec $SOURCE_POD -n $SOURCE_NAMESPACE -- wget -qO- --timeout=5 http://$SERVICE_IP:$SERVICE_PORT 2>/dev/null || echo "HTTP请求失败"
# 检查网络策略影响
echo "\n5. 网络策略检查:"
echo "源命名空间网络策略:"
kubectl get networkpolicies -n $SOURCE_NAMESPACE
echo "\n目标命名空间网络策略:"
kubectl get networkpolicies -n $TARGET_NAMESPACE
echo "\n=== 测试完成 ==="
11.3.2 DNS解析问题
# DNS故障排查
apiVersion: v1
kind: ConfigMap
metadata:
name: dns-troubleshooting
data:
dns-debug.sh: |
#!/bin/bash
# DNS调试脚本
echo "=== Kubernetes DNS诊断 ==="
# 检查CoreDNS状态
echo "1. CoreDNS状态检查:"
kubectl get pods -n kube-system -l k8s-app=kube-dns
# 检查CoreDNS配置
echo "\n2. CoreDNS配置:"
kubectl get configmap coredns -n kube-system -o yaml
# 检查CoreDNS服务
echo "\n3. CoreDNS服务:"
kubectl get svc -n kube-system -l k8s-app=kube-dns
# 检查DNS策略
echo "\n4. 集群DNS配置:"
kubectl get configmap cluster-info -n kube-public -o yaml 2>/dev/null || echo "cluster-info ConfigMap不存在"
# 创建DNS测试Pod
echo "\n5. 创建DNS测试Pod:"
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
name: dns-test
namespace: default
spec:
containers:
- name: dns-test
image: busybox:1.35
command: ["sleep", "3600"]
restartPolicy: Never
EOF
# 等待Pod启动
echo "等待DNS测试Pod启动..."
kubectl wait --for=condition=Ready pod/dns-test --timeout=60s
# DNS解析测试
echo "\n6. DNS解析测试:"
echo "测试集群内部DNS:"
kubectl exec dns-test -- nslookup kubernetes.default.svc.cluster.local
echo "\n测试外部DNS:"
kubectl exec dns-test -- nslookup google.com
echo "\n测试反向DNS:"
kubectl exec dns-test -- nslookup 8.8.8.8
# 检查DNS配置文件
echo "\n7. Pod DNS配置:"
kubectl exec dns-test -- cat /etc/resolv.conf
# 清理测试Pod
echo "\n8. 清理测试Pod:"
kubectl delete pod dns-test
echo "\n=== DNS诊断完成 ==="
dns-performance-test.sh: |
#!/bin/bash
# DNS性能测试脚本
echo "=== DNS性能测试 ==="
# 创建DNS性能测试Pod
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
name: dns-perf-test
namespace: default
spec:
containers:
- name: dns-perf-test
image: busybox:1.35
command: ["sleep", "3600"]
restartPolicy: Never
EOF
# 等待Pod启动
kubectl wait --for=condition=Ready pod/dns-perf-test --timeout=60s
# DNS查询性能测试
echo "\n1. DNS查询延迟测试:"
for i in {1..10}; do
echo -n "查询 $i: "
kubectl exec dns-perf-test -- time nslookup kubernetes.default.svc.cluster.local 2>&1 | grep real
done
# DNS缓存测试
echo "\n2. DNS缓存测试:"
echo "首次查询:"
kubectl exec dns-perf-test -- time nslookup google.com 2>&1 | grep real
echo "缓存查询:"
kubectl exec dns-perf-test -- time nslookup google.com 2>&1 | grep real
# 并发DNS查询测试
echo "\n3. 并发DNS查询测试:"
for i in {1..5}; do
kubectl exec dns-perf-test -- nslookup kubernetes.default.svc.cluster.local &
done
wait
echo "并发查询完成"
# 清理测试Pod
kubectl delete pod dns-perf-test
echo "\n=== 性能测试完成 ==="
11.4 存储故障排查
11.4.1 PV/PVC问题
# 存储故障排查
apiVersion: v1
kind: ConfigMap
metadata:
name: storage-troubleshooting
data:
pv-pvc-debug.sh: |
#!/bin/bash
# PV/PVC调试脚本
NAMESPACE=${1:-"default"}
PVC_NAME=${2}
if [ -z "$PVC_NAME" ]; then
echo "用法: $0 [namespace] <pvc-name>"
echo "或者: $0 [namespace] all # 检查所有PVC"
exit 1
fi
echo "=== 存储诊断: $NAMESPACE/$PVC_NAME ==="
if [ "$PVC_NAME" = "all" ]; then
echo "检查所有PVC状态:"
kubectl get pvc -n $NAMESPACE
echo "\n检查所有PV状态:"
kubectl get pv
echo "\n检查存储类:"
kubectl get storageclass
return
fi
# 检查PVC状态
echo "1. PVC状态:"
kubectl get pvc $PVC_NAME -n $NAMESPACE -o wide
# 检查PVC详细信息
echo "\n2. PVC详细信息:"
kubectl describe pvc $PVC_NAME -n $NAMESPACE
# 获取PVC状态
PVC_STATUS=$(kubectl get pvc $PVC_NAME -n $NAMESPACE -o jsonpath='{.status.phase}')
echo "\nPVC状态: $PVC_STATUS"
case $PVC_STATUS in
"Pending")
echo "\n=== Pending状态诊断 ==="
echo "可能原因:"
echo "1. 没有匹配的PV"
echo "2. 存储类不存在或配置错误"
echo "3. 存储提供商问题"
echo "4. 权限问题"
# 检查存储类
STORAGE_CLASS=$(kubectl get pvc $PVC_NAME -n $NAMESPACE -o jsonpath='{.spec.storageClassName}')
if [ ! -z "$STORAGE_CLASS" ]; then
echo "\n检查存储类: $STORAGE_CLASS"
kubectl describe storageclass $STORAGE_CLASS
else
echo "\n使用默认存储类"
kubectl get storageclass -o jsonpath='{.items[?(@.metadata.annotations.storageclass\.kubernetes\.io/is-default-class=="true")].metadata.name}'
fi
# 检查可用PV
echo "\n检查可用PV:"
kubectl get pv | grep Available
;;
"Bound")
echo "\n=== Bound状态诊断 ==="
PV_NAME=$(kubectl get pvc $PVC_NAME -n $NAMESPACE -o jsonpath='{.spec.volumeName}')
echo "绑定的PV: $PV_NAME"
if [ ! -z "$PV_NAME" ]; then
echo "\nPV详细信息:"
kubectl describe pv $PV_NAME
# 检查PV状态
PV_STATUS=$(kubectl get pv $PV_NAME -o jsonpath='{.status.phase}')
echo "\nPV状态: $PV_STATUS"
fi
;;
"Lost")
echo "\n=== Lost状态诊断 ==="
echo "PV已丢失,可能原因:"
echo "1. 底层存储被删除"
echo "2. 存储节点故障"
echo "3. 网络连接问题"
;;
esac
# 检查使用该PVC的Pod
echo "\n3. 使用该PVC的Pod:"
kubectl get pods -n $NAMESPACE -o json | jq -r ".items[] | select(.spec.volumes[]?.persistentVolumeClaim.claimName==\"$PVC_NAME\") | .metadata.name"
# 检查存储事件
echo "\n4. 相关事件:"
kubectl get events -n $NAMESPACE --field-selector involvedObject.name=$PVC_NAME
echo "\n=== 诊断完成 ==="
storage-performance-test.sh: |
#!/bin/bash
# 存储性能测试脚本
NAMESPACE=${1:-"default"}
PVC_NAME=${2}
if [ -z "$PVC_NAME" ]; then
echo "用法: $0 [namespace] <pvc-name>"
exit 1
fi
echo "=== 存储性能测试: $NAMESPACE/$PVC_NAME ==="
# 创建性能测试Pod
TEST_POD_NAME="storage-perf-test-$(date +%s)"
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
name: $TEST_POD_NAME
namespace: $NAMESPACE
spec:
containers:
- name: storage-test
image: busybox:1.35
command: ["sleep", "3600"]
volumeMounts:
- name: test-volume
mountPath: /test
volumes:
- name: test-volume
persistentVolumeClaim:
claimName: $PVC_NAME
restartPolicy: Never
EOF
# 等待Pod启动
echo "等待测试Pod启动..."
kubectl wait --for=condition=Ready pod/$TEST_POD_NAME -n $NAMESPACE --timeout=60s
# 写入性能测试
echo "\n1. 写入性能测试:"
kubectl exec $TEST_POD_NAME -n $NAMESPACE -- dd if=/dev/zero of=/test/testfile bs=1M count=100 2>&1 | grep -E "copied|MB/s"
# 读取性能测试
echo "\n2. 读取性能测试:"
kubectl exec $TEST_POD_NAME -n $NAMESPACE -- dd if=/test/testfile of=/dev/null bs=1M 2>&1 | grep -E "copied|MB/s"
# 随机读写测试
echo "\n3. 随机读写测试:"
kubectl exec $TEST_POD_NAME -n $NAMESPACE -- dd if=/dev/urandom of=/test/randomfile bs=4K count=1000 2>&1 | grep -E "copied|MB/s"
# 文件系统测试
echo "\n4. 文件系统信息:"
kubectl exec $TEST_POD_NAME -n $NAMESPACE -- df -h /test
kubectl exec $TEST_POD_NAME -n $NAMESPACE -- mount | grep /test
# 清理测试文件
echo "\n5. 清理测试文件:"
kubectl exec $TEST_POD_NAME -n $NAMESPACE -- rm -f /test/testfile /test/randomfile
# 清理测试Pod
kubectl delete pod $TEST_POD_NAME -n $NAMESPACE
echo "\n=== 性能测试完成 ==="
11.4.2 挂载问题
# 挂载故障排查
apiVersion: v1
kind: ConfigMap
metadata:
name: mount-troubleshooting
data:
mount-debug.sh: |
#!/bin/bash
# 挂载调试脚本
NAMESPACE=${1:-"default"}
POD_NAME=${2}
if [ -z "$POD_NAME" ]; then
echo "用法: $0 [namespace] <pod-name>"
exit 1
fi
echo "=== 挂载诊断: $NAMESPACE/$POD_NAME ==="
# 检查Pod状态
echo "1. Pod状态:"
kubectl get pod $POD_NAME -n $NAMESPACE
# 检查Pod事件
echo "\n2. 挂载相关事件:"
kubectl get events -n $NAMESPACE --field-selector involvedObject.name=$POD_NAME | grep -i "mount\|volume"
# 检查Pod卷配置
echo "\n3. Pod卷配置:"
kubectl get pod $POD_NAME -n $NAMESPACE -o jsonpath='{.spec.volumes}' | jq .
# 检查容器挂载点
echo "\n4. 容器挂载点:"
kubectl get pod $POD_NAME -n $NAMESPACE -o jsonpath='{.spec.containers[*].volumeMounts}' | jq .
# 如果Pod正在运行,检查实际挂载情况
POD_STATUS=$(kubectl get pod $POD_NAME -n $NAMESPACE -o jsonpath='{.status.phase}')
if [ "$POD_STATUS" = "Running" ]; then
echo "\n5. 实际挂载情况:"
kubectl exec $POD_NAME -n $NAMESPACE -- mount | grep -v "proc\|sys\|dev" || echo "无法获取挂载信息"
echo "\n6. 磁盘使用情况:"
kubectl exec $POD_NAME -n $NAMESPACE -- df -h || echo "无法获取磁盘使用情况"
echo "\n7. 挂载点权限:"
kubectl exec $POD_NAME -n $NAMESPACE -- ls -la / | grep -E "mnt|opt|data" || echo "无特殊挂载点"
else
echo "\n5. Pod未运行,无法检查实际挂载情况"
# 检查挂载失败原因
echo "\n检查挂载失败原因:"
kubectl describe pod $POD_NAME -n $NAMESPACE | grep -A 10 -B 5 "Mount"
fi
# 检查相关PVC状态
echo "\n8. 相关PVC状态:"
kubectl get pod $POD_NAME -n $NAMESPACE -o jsonpath='{.spec.volumes[*].persistentVolumeClaim.claimName}' | tr ' ' '\n' | while read pvc; do
if [ ! -z "$pvc" ]; then
echo "PVC: $pvc"
kubectl get pvc $pvc -n $NAMESPACE
fi
done
# 检查节点存储情况
NODE_NAME=$(kubectl get pod $POD_NAME -n $NAMESPACE -o jsonpath='{.spec.nodeName}')
if [ ! -z "$NODE_NAME" ]; then
echo "\n9. 节点存储情况:"
echo "节点: $NODE_NAME"
kubectl describe node $NODE_NAME | grep -A 10 "Allocated resources"
fi
echo "\n=== 诊断完成 ==="
11.5 性能优化
11.5.1 资源优化
# 资源优化配置
apiVersion: v1
kind: ConfigMap
metadata:
name: resource-optimization
data:
resource-analysis.sh: |
#!/bin/bash
# 资源分析脚本
NAMESPACE=${1:-"all"}
echo "=== Kubernetes资源分析 ==="
# 集群资源概览
echo "1. 集群资源概览:"
kubectl top nodes
# 节点资源详情
echo "\n2. 节点资源详情:"
kubectl describe nodes | grep -A 5 "Allocated resources"
# Pod资源使用
echo "\n3. Pod资源使用TOP 10:"
if [ "$NAMESPACE" = "all" ]; then
kubectl top pods --all-namespaces | sort -k3 -nr | head -10
else
kubectl top pods -n $NAMESPACE | sort -k3 -nr | head -10
fi
# 资源请求和限制分析
echo "\n4. 资源请求和限制分析:"
if [ "$NAMESPACE" = "all" ]; then
kubectl get pods --all-namespaces -o json | jq -r '.items[] | select(.spec.containers[].resources.requests or .spec.containers[].resources.limits) | "\(.metadata.namespace)/\(.metadata.name): requests=\(.spec.containers[].resources.requests // "none"), limits=\(.spec.containers[].resources.limits // "none")"'
else
kubectl get pods -n $NAMESPACE -o json | jq -r '.items[] | select(.spec.containers[].resources.requests or .spec.containers[].resources.limits) | "\(.metadata.name): requests=\(.spec.containers[].resources.requests // "none"), limits=\(.spec.containers[].resources.limits // "none")"'
fi
# 没有资源限制的Pod
echo "\n5. 没有资源限制的Pod:"
if [ "$NAMESPACE" = "all" ]; then
kubectl get pods --all-namespaces -o json | jq -r '.items[] | select(.spec.containers[].resources.limits == null) | "\(.metadata.namespace)/\(.metadata.name)"'
else
kubectl get pods -n $NAMESPACE -o json | jq -r '.items[] | select(.spec.containers[].resources.limits == null) | "\(.metadata.name)"'
fi
# 资源配额使用情况
echo "\n6. 资源配额使用情况:"
if [ "$NAMESPACE" = "all" ]; then
kubectl get resourcequota --all-namespaces
else
kubectl get resourcequota -n $NAMESPACE
fi
# HPA状态
echo "\n7. HPA状态:"
if [ "$NAMESPACE" = "all" ]; then
kubectl get hpa --all-namespaces
else
kubectl get hpa -n $NAMESPACE
fi
echo "\n=== 分析完成 ==="
optimize-resources.sh: |
#!/bin/bash
# 资源优化建议脚本
NAMESPACE=${1:-"default"}
echo "=== 资源优化建议 ==="
# 分析CPU使用率
echo "1. CPU使用率分析:"
kubectl top pods -n $NAMESPACE --no-headers | while read pod cpu memory; do
cpu_value=$(echo $cpu | sed 's/m//')
if [ $cpu_value -lt 10 ]; then
echo " 低CPU使用: $pod ($cpu) - 建议减少CPU请求"
elif [ $cpu_value -gt 800 ]; then
echo " 高CPU使用: $pod ($cpu) - 建议增加CPU限制或扩容"
fi
done
# 分析内存使用率
echo "\n2. 内存使用率分析:"
kubectl top pods -n $NAMESPACE --no-headers | while read pod cpu memory; do
memory_value=$(echo $memory | sed 's/Mi//')
if [ $memory_value -lt 50 ]; then
echo " 低内存使用: $pod ($memory) - 建议减少内存请求"
elif [ $memory_value -gt 1000 ]; then
echo " 高内存使用: $pod ($memory) - 建议增加内存限制或扩容"
fi
done
# 检查资源请求与实际使用的差异
echo "\n3. 资源请求优化建议:"
kubectl get pods -n $NAMESPACE -o json | jq -r '.items[] | {name: .metadata.name, requests: .spec.containers[].resources.requests}' | while read line; do
echo "$line"
done
# 生成优化建议
echo "\n4. 优化建议:"
echo " - 为所有Pod设置资源请求和限制"
echo " - 根据实际使用情况调整资源配置"
echo " - 使用HPA进行自动扩缩容"
echo " - 考虑使用VPA进行垂直扩缩容"
echo " - 定期审查和调整资源配置"
echo "\n=== 建议完成 ==="
11.5.2 性能监控和调优
# 性能监控配置
apiVersion: v1
kind: ConfigMap
metadata:
name: performance-monitoring
data:
performance-monitor.sh: |
#!/bin/bash
# 性能监控脚本
NAMESPACE=${1:-"default"}
DURATION=${2:-"60"}
echo "=== 性能监控 (持续 ${DURATION}秒) ==="
# 创建监控日志文件
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
LOG_FILE="/tmp/k8s_performance_${TIMESTAMP}.log"
echo "监控日志文件: $LOG_FILE"
echo "开始时间: $(date)" > $LOG_FILE
# 监控循环
for i in $(seq 1 $((DURATION/10))); do
echo "\n=== 监控周期 $i ($(date)) ===" >> $LOG_FILE
# 节点资源使用
echo "\n节点资源使用:" >> $LOG_FILE
kubectl top nodes >> $LOG_FILE
# Pod资源使用
echo "\nPod资源使用:" >> $LOG_FILE
kubectl top pods -n $NAMESPACE >> $LOG_FILE
# 集群事件
echo "\n最新事件:" >> $LOG_FILE
kubectl get events -n $NAMESPACE --sort-by='.lastTimestamp' | tail -5 >> $LOG_FILE
# 等待10秒
sleep 10
done
echo "\n结束时间: $(date)" >> $LOG_FILE
echo "\n=== 监控完成,日志保存在: $LOG_FILE ==="
# 生成性能报告
echo "\n=== 性能报告摘要 ==="
echo "监控时长: ${DURATION}秒"
echo "平均节点CPU使用率:"
grep -A 20 "节点资源使用" $LOG_FILE | grep -v "节点资源使用" | awk '{sum+=$3; count++} END {if(count>0) print sum/count"%"}'
echo "\n高资源使用Pod:"
grep -A 50 "Pod资源使用" $LOG_FILE | awk '$3 > 500 {print $1, $3}' | sort -k2 -nr | head -5
cluster-health-check.sh: |
#!/bin/bash
# 集群健康检查脚本
echo "=== Kubernetes集群健康检查 ==="
# 检查集群基本状态
echo "1. 集群基本状态:"
kubectl cluster-info
# 检查节点状态
echo "\n2. 节点状态检查:"
kubectl get nodes
NOT_READY_NODES=$(kubectl get nodes --no-headers | grep -v Ready | wc -l)
if [ $NOT_READY_NODES -gt 0 ]; then
echo "⚠️ 发现 $NOT_READY_NODES 个非Ready节点"
kubectl get nodes | grep -v Ready
else
echo "✅ 所有节点状态正常"
fi
# 检查系统Pod状态
echo "\n3. 系统Pod状态检查:"
kubectl get pods -n kube-system
FAILED_SYSTEM_PODS=$(kubectl get pods -n kube-system --no-headers | grep -v Running | grep -v Completed | wc -l)
if [ $FAILED_SYSTEM_PODS -gt 0 ]; then
echo "⚠️ 发现 $FAILED_SYSTEM_PODS 个异常系统Pod"
kubectl get pods -n kube-system | grep -v Running | grep -v Completed
else
echo "✅ 所有系统Pod状态正常"
fi
# 检查资源使用情况
echo "\n4. 资源使用情况:"
kubectl top nodes
# 检查存储状态
echo "\n5. 存储状态检查:"
kubectl get pv
FAILED_PVS=$(kubectl get pv --no-headers | grep -v Bound | grep -v Available | wc -l)
if [ $FAILED_PVS -gt 0 ]; then
echo "⚠️ 发现 $FAILED_PVS 个异常PV"
kubectl get pv | grep -v Bound | grep -v Available
else
echo "✅ 所有PV状态正常"
fi
# 检查网络组件
echo "\n6. 网络组件检查:"
kubectl get pods -n kube-system -l k8s-app=kube-dns
kubectl get pods -n kube-system -l k8s-app=kube-proxy
# 检查最近的错误事件
echo "\n7. 最近的错误事件:"
kubectl get events --all-namespaces --field-selector type=Warning --sort-by='.lastTimestamp' | tail -10
# 生成健康评分
echo "\n8. 集群健康评分:"
TOTAL_SCORE=100
if [ $NOT_READY_NODES -gt 0 ]; then
TOTAL_SCORE=$((TOTAL_SCORE - NOT_READY_NODES * 20))
fi
if [ $FAILED_SYSTEM_PODS -gt 0 ]; then
TOTAL_SCORE=$((TOTAL_SCORE - FAILED_SYSTEM_PODS * 10))
fi
if [ $FAILED_PVS -gt 0 ]; then
TOTAL_SCORE=$((TOTAL_SCORE - FAILED_PVS * 5))
fi
echo "集群健康评分: $TOTAL_SCORE/100"
if [ $TOTAL_SCORE -ge 90 ]; then
echo "✅ 集群状态优秀"
elif [ $TOTAL_SCORE -ge 70 ]; then
echo "⚠️ 集群状态良好,建议关注警告项"
else
echo "❌ 集群状态需要立即关注"
fi
echo "\n=== 健康检查完成 ==="
performance-tuning.sh: |
#!/bin/bash
# 性能调优脚本
echo "=== Kubernetes性能调优 ==="
# 1. 节点性能调优
echo "1. 节点性能调优建议:"
# 检查节点资源使用率
kubectl top nodes --no-headers | while read node cpu memory; do
cpu_percent=$(echo $cpu | sed 's/%//')
memory_percent=$(echo $memory | sed 's/%//')
if [ $cpu_percent -gt 80 ]; then
echo " ⚠️ 节点 $node CPU使用率过高 ($cpu_percent%) - 建议扩容或迁移工作负载"
fi
if [ $memory_percent -gt 80 ]; then
echo " ⚠️ 节点 $node 内存使用率过高 ($memory_percent%) - 建议扩容或优化内存使用"
fi
done
# 2. Pod性能调优
echo "\n2. Pod性能调优建议:"
# 检查没有资源限制的Pod
echo " 检查没有资源限制的Pod:"
kubectl get pods --all-namespaces -o json | jq -r '.items[] | select(.spec.containers[].resources.limits == null) | " ⚠️ \(.metadata.namespace)/\(.metadata.name) - 建议设置资源限制"'
# 检查重启频繁的Pod
echo "\n 检查重启频繁的Pod:"
kubectl get pods --all-namespaces --no-headers | awk '$4 > 5 {print " ⚠️ " $1 "/" $2 " - 重启次数:" $4 " - 建议检查应用稳定性"}'
# 3. 存储性能调优
echo "\n3. 存储性能调优建议:"
# 检查PVC使用情况
kubectl get pvc --all-namespaces -o json | jq -r '.items[] | select(.status.phase == "Bound") | "\(.metadata.namespace)/\(.metadata.name): \(.spec.resources.requests.storage)"' | while read pvc_info; do
echo " $pvc_info"
done
# 4. 网络性能调优
echo "\n4. 网络性能调优建议:"
# 检查Service数量
SERVICE_COUNT=$(kubectl get svc --all-namespaces --no-headers | wc -l)
echo " 当前Service数量: $SERVICE_COUNT"
if [ $SERVICE_COUNT -gt 1000 ]; then
echo " ⚠️ Service数量较多,建议优化服务发现机制"
fi
# 检查NetworkPolicy
NETPOL_COUNT=$(kubectl get networkpolicies --all-namespaces --no-headers | wc -l)
echo " 当前NetworkPolicy数量: $NETPOL_COUNT"
# 5. 调度性能调优
echo "\n5. 调度性能调优建议:"
# 检查Pending的Pod
PENDING_PODS=$(kubectl get pods --all-namespaces --no-headers | grep Pending | wc -l)
if [ $PENDING_PODS -gt 0 ]; then
echo " ⚠️ 发现 $PENDING_PODS 个Pending状态的Pod"
kubectl get pods --all-namespaces | grep Pending | while read line; do
echo " $line"
done
else
echo " ✅ 没有Pending状态的Pod"
fi
# 6. 生成调优建议报告
echo "\n6. 性能调优建议报告:"
echo " "
echo " 📊 资源优化:"
echo " - 为所有Pod设置合适的资源请求和限制"
echo " - 使用HPA和VPA进行自动扩缩容"
echo " - 定期审查资源使用情况"
echo " "
echo " 🚀 应用优化:"
echo " - 优化应用启动时间和内存使用"
echo " - 使用多阶段构建减小镜像大小"
echo " - 实施健康检查和就绪探针"
echo " "
echo " 🌐 网络优化:"
echo " - 使用Service Mesh优化服务间通信"
echo " - 合理配置NetworkPolicy"
echo " - 考虑使用Ingress Controller负载均衡"
echo " "
echo " 💾 存储优化:"
echo " - 选择合适的存储类型和性能等级"
echo " - 使用本地存储提高I/O性能"
echo " - 定期清理未使用的PV和PVC"
echo "\n=== 性能调优完成 ==="
## 11.6 监控和告警
### 11.6.1 性能监控指标
```yaml
# 性能监控指标配置
apiVersion: v1
kind: ConfigMap
metadata:
name: performance-metrics
data:
key-metrics.yaml: |
# 关键性能指标定义
metrics:
# 集群级别指标
cluster:
- name: cluster_cpu_usage
description: 集群CPU使用率
query: (1 - avg(rate(node_cpu_seconds_total{mode="idle"}[5m]))) * 100
threshold:
warning: 70
critical: 85
- name: cluster_memory_usage
description: 集群内存使用率
query: (1 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes)) * 100
threshold:
warning: 75
critical: 90
- name: cluster_disk_usage
description: 集群磁盘使用率
query: (1 - (node_filesystem_avail_bytes / node_filesystem_size_bytes)) * 100
threshold:
warning: 80
critical: 95
# 节点级别指标
node:
- name: node_ready_status
description: 节点就绪状态
query: kube_node_status_condition{condition="Ready",status="true"}
threshold:
critical: 0
- name: node_cpu_usage
description: 节点CPU使用率
query: (1 - avg by (instance) (rate(node_cpu_seconds_total{mode="idle"}[5m]))) * 100
threshold:
warning: 70
critical: 85
- name: node_memory_usage
description: 节点内存使用率
query: (1 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes)) * 100
threshold:
warning: 75
critical: 90
- name: node_disk_usage
description: 节点磁盘使用率
query: (1 - (node_filesystem_avail_bytes / node_filesystem_size_bytes)) * 100
threshold:
warning: 80
critical: 95
- name: node_network_errors
description: 节点网络错误率
query: rate(node_network_receive_errs_total[5m]) + rate(node_network_transmit_errs_total[5m])
threshold:
warning: 10
critical: 50
# Pod级别指标
pod:
- name: pod_cpu_usage
description: Pod CPU使用率
query: rate(container_cpu_usage_seconds_total[5m]) * 100
threshold:
warning: 70
critical: 90
- name: pod_memory_usage
description: Pod内存使用率
query: (container_memory_working_set_bytes / container_spec_memory_limit_bytes) * 100
threshold:
warning: 75
critical: 90
- name: pod_restart_count
description: Pod重启次数
query: increase(kube_pod_container_status_restarts_total[1h])
threshold:
warning: 3
critical: 10
- name: pod_ready_status
description: Pod就绪状态
query: kube_pod_status_ready{condition="true"}
threshold:
critical: 0
# 应用级别指标
application:
- name: http_request_duration
description: HTTP请求响应时间
query: histogram_quantile(0.95, rate(http_request_duration_seconds_bucket[5m]))
threshold:
warning: 1
critical: 5
- name: http_request_rate
description: HTTP请求速率
query: rate(http_requests_total[5m])
threshold:
warning: 1000
critical: 5000
- name: http_error_rate
description: HTTP错误率
query: (rate(http_requests_total{status=~"5.."}[5m]) / rate(http_requests_total[5m])) * 100
threshold:
warning: 5
critical: 10
monitoring-dashboard.json: |
{
"dashboard": {
"title": "Kubernetes性能监控",
"panels": [
{
"title": "集群CPU使用率",
"type": "graph",
"targets": [
{
"expr": "(1 - avg(rate(node_cpu_seconds_total{mode=\"idle\"}[5m]))) * 100",
"legendFormat": "CPU使用率"
}
]
},
{
"title": "集群内存使用率",
"type": "graph",
"targets": [
{
"expr": "(1 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes)) * 100",
"legendFormat": "内存使用率"
}
]
},
{
"title": "Pod状态分布",
"type": "piechart",
"targets": [
{
"expr": "count by (phase) (kube_pod_status_phase)",
"legendFormat": "{{phase}}"
}
]
},
{
"title": "节点资源使用TOP 10",
"type": "table",
"targets": [
{
"expr": "topk(10, (1 - avg by (instance) (rate(node_cpu_seconds_total{mode=\"idle\"}[5m]))) * 100)",
"format": "table"
}
]
}
]
}
}
11.6.2 告警配置
# Prometheus告警规则
apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
name: kubernetes-performance-alerts
namespace: monitoring
spec:
groups:
- name: kubernetes.performance
rules:
# 集群级别告警
- alert: ClusterCPUUsageHigh
expr: (1 - avg(rate(node_cpu_seconds_total{mode="idle"}[5m]))) * 100 > 85
for: 5m
labels:
severity: critical
component: cluster
annotations:
summary: "集群CPU使用率过高"
description: "集群CPU使用率已达到 {{ $value }}%,超过85%阈值"
runbook_url: "https://runbooks.example.com/cluster-cpu-high"
- alert: ClusterMemoryUsageHigh
expr: (1 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes)) * 100 > 90
for: 5m
labels:
severity: critical
component: cluster
annotations:
summary: "集群内存使用率过高"
description: "集群内存使用率已达到 {{ $value }}%,超过90%阈值"
- alert: ClusterDiskUsageHigh
expr: (1 - (node_filesystem_avail_bytes / node_filesystem_size_bytes)) * 100 > 95
for: 5m
labels:
severity: critical
component: cluster
annotations:
summary: "集群磁盘使用率过高"
description: "集群磁盘使用率已达到 {{ $value }}%,超过95%阈值"
# 节点级别告警
- alert: NodeNotReady
expr: kube_node_status_condition{condition="Ready",status="true"} == 0
for: 1m
labels:
severity: critical
component: node
annotations:
summary: "节点未就绪"
description: "节点 {{ $labels.node }} 未就绪状态持续超过1分钟"
- alert: NodeCPUUsageHigh
expr: (1 - avg by (instance) (rate(node_cpu_seconds_total{mode="idle"}[5m]))) * 100 > 85
for: 5m
labels:
severity: warning
component: node
annotations:
summary: "节点CPU使用率过高"
description: "节点 {{ $labels.instance }} CPU使用率已达到 {{ $value }}%"
- alert: NodeMemoryUsageHigh
expr: (1 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes)) * 100 > 90
for: 5m
labels:
severity: warning
component: node
annotations:
summary: "节点内存使用率过高"
description: "节点 {{ $labels.instance }} 内存使用率已达到 {{ $value }}%"
# Pod级别告警
- alert: PodCrashLooping
expr: increase(kube_pod_container_status_restarts_total[1h]) > 5
for: 5m
labels:
severity: warning
component: pod
annotations:
summary: "Pod频繁重启"
description: "Pod {{ $labels.namespace }}/{{ $labels.pod }} 在过去1小时内重启了 {{ $value }} 次"
- alert: PodNotReady
expr: kube_pod_status_ready{condition="true"} == 0
for: 5m
labels:
severity: warning
component: pod
annotations:
summary: "Pod未就绪"
description: "Pod {{ $labels.namespace }}/{{ $labels.pod }} 未就绪状态持续超过5分钟"
- alert: PodMemoryUsageHigh
expr: (container_memory_working_set_bytes / container_spec_memory_limit_bytes) * 100 > 90
for: 5m
labels:
severity: warning
component: pod
annotations:
summary: "Pod内存使用率过高"
description: "Pod {{ $labels.namespace }}/{{ $labels.pod }} 内存使用率已达到 {{ $value }}%"
# 应用级别告警
- alert: HighHTTPErrorRate
expr: (rate(http_requests_total{status=~"5.."}[5m]) / rate(http_requests_total[5m])) * 100 > 10
for: 5m
labels:
severity: critical
component: application
annotations:
summary: "HTTP错误率过高"
description: "应用 {{ $labels.job }} HTTP错误率已达到 {{ $value }}%"
- alert: HighHTTPLatency
expr: histogram_quantile(0.95, rate(http_request_duration_seconds_bucket[5m])) > 5
for: 5m
labels:
severity: warning
component: application
annotations:
summary: "HTTP响应延迟过高"
description: "应用 {{ $labels.job }} 95%分位数响应时间已达到 {{ $value }}秒"
---
# AlertManager配置
apiVersion: v1
kind: ConfigMap
metadata:
name: alertmanager-config
namespace: monitoring
data:
alertmanager.yml: |
global:
smtp_smarthost: 'smtp.example.com:587'
smtp_from: 'alerts@example.com'
smtp_auth_username: 'alerts@example.com'
smtp_auth_password: 'password'
route:
group_by: ['alertname', 'cluster', 'service']
group_wait: 10s
group_interval: 10s
repeat_interval: 1h
receiver: 'default'
routes:
- match:
severity: critical
receiver: 'critical-alerts'
- match:
component: cluster
receiver: 'cluster-alerts'
- match:
component: application
receiver: 'application-alerts'
receivers:
- name: 'default'
email_configs:
- to: 'team@example.com'
subject: '[K8s Alert] {{ .GroupLabels.alertname }}'
body: |
{{ range .Alerts }}
告警: {{ .Annotations.summary }}
描述: {{ .Annotations.description }}
标签: {{ range .Labels.SortedPairs }}{{ .Name }}={{ .Value }} {{ end }}
时间: {{ .StartsAt }}
{{ end }}
- name: 'critical-alerts'
email_configs:
- to: 'oncall@example.com'
subject: '[CRITICAL] {{ .GroupLabels.alertname }}'
body: |
🚨 严重告警 🚨
{{ range .Alerts }}
告警: {{ .Annotations.summary }}
描述: {{ .Annotations.description }}
标签: {{ range .Labels.SortedPairs }}{{ .Name }}={{ .Value }} {{ end }}
时间: {{ .StartsAt }}
{{ end }}
webhook_configs:
- url: 'http://webhook-service:8080/alerts'
send_resolved: true
- name: 'cluster-alerts'
email_configs:
- to: 'infrastructure@example.com'
subject: '[Cluster] {{ .GroupLabels.alertname }}'
- name: 'application-alerts'
email_configs:
- to: 'developers@example.com'
subject: '[App] {{ .GroupLabels.alertname }}'
slack_configs:
- api_url: 'https://hooks.slack.com/services/YOUR/SLACK/WEBHOOK'
channel: '#alerts'
title: 'Kubernetes应用告警'
text: '{{ range .Alerts }}{{ .Annotations.summary }}{{ end }}'
11.6.3 自动化故障响应
# 自动化故障响应配置
apiVersion: v1
kind: ConfigMap
metadata:
name: auto-remediation
data:
auto-restart-failed-pods.sh: |
#!/bin/bash
# 自动重启失败Pod脚本
echo "=== 自动故障恢复脚本 ==="
# 检查失败的Pod
echo "1. 检查失败的Pod:"
FAILED_PODS=$(kubectl get pods --all-namespaces --field-selector=status.phase=Failed --no-headers)
if [ -z "$FAILED_PODS" ]; then
echo "没有发现失败的Pod"
else
echo "发现失败的Pod:"
echo "$FAILED_PODS"
# 删除失败的Pod(如果有Deployment会自动重建)
echo "\n2. 删除失败的Pod:"
kubectl get pods --all-namespaces --field-selector=status.phase=Failed -o json | jq -r '.items[] | "\(.metadata.namespace) \(.metadata.name)"' | while read namespace pod; do
echo "删除Pod: $namespace/$pod"
kubectl delete pod $pod -n $namespace
done
fi
# 检查CrashLoopBackOff状态的Pod
echo "\n3. 检查CrashLoopBackOff状态的Pod:"
CRASH_PODS=$(kubectl get pods --all-namespaces --no-headers | grep CrashLoopBackOff)
if [ -z "$CRASH_PODS" ]; then
echo "没有发现CrashLoopBackOff状态的Pod"
else
echo "发现CrashLoopBackOff状态的Pod:"
echo "$CRASH_PODS"
# 记录日志并重启
echo "$CRASH_PODS" | while read namespace pod ready status restarts age; do
echo "\n处理Pod: $namespace/$pod"
echo "获取Pod日志:"
kubectl logs $pod -n $namespace --previous --tail=20
# 如果重启次数超过10次,暂时不自动重启
if [ $restarts -gt 10 ]; then
echo "Pod重启次数过多($restarts),跳过自动重启"
continue
fi
echo "删除Pod进行重启:"
kubectl delete pod $pod -n $namespace
done
fi
echo "\n=== 自动故障恢复完成 ==="
auto-scale-resources.sh: |
#!/bin/bash
# 自动扩容脚本
echo "=== 自动资源扩容脚本 ==="
# 检查高CPU使用率的Deployment
echo "1. 检查高CPU使用率的Deployment:"
kubectl get deployments --all-namespaces -o json | jq -r '.items[] | select(.spec.replicas > 0) | "\(.metadata.namespace) \(.metadata.name) \(.spec.replicas)"' | while read namespace deployment replicas; do
# 获取Deployment的平均CPU使用率
AVG_CPU=$(kubectl top pods -n $namespace -l app=$deployment --no-headers 2>/dev/null | awk '{sum+=$2} END {if(NR>0) print sum/NR; else print 0}' | sed 's/m//')
if [ ! -z "$AVG_CPU" ] && [ $AVG_CPU -gt 800 ]; then
echo "Deployment $namespace/$deployment CPU使用率过高: ${AVG_CPU}m"
# 检查是否有HPA
HPA_EXISTS=$(kubectl get hpa -n $namespace $deployment 2>/dev/null | wc -l)
if [ $HPA_EXISTS -eq 0 ]; then
echo "创建HPA for $namespace/$deployment"
kubectl autoscale deployment $deployment -n $namespace --cpu-percent=70 --min=1 --max=10
else
echo "HPA已存在for $namespace/$deployment"
fi
fi
done
# 检查Pending状态的Pod
echo "\n2. 检查Pending状态的Pod:"
PENDING_PODS=$(kubectl get pods --all-namespaces --field-selector=status.phase=Pending --no-headers)
if [ ! -z "$PENDING_PODS" ]; then
echo "发现Pending状态的Pod:"
echo "$PENDING_PODS"
# 检查是否是资源不足导致的
echo "\n检查节点资源:"
kubectl describe nodes | grep -A 5 "Allocated resources"
# 建议扩容节点
echo "\n建议: 考虑添加更多节点或调整Pod资源请求"
fi
echo "\n=== 自动资源扩容完成 ==="
webhook-handler.py: |
#!/usr/bin/env python3
# Webhook处理器
from flask import Flask, request, jsonify
import json
import subprocess
import logging
app = Flask(__name__)
logging.basicConfig(level=logging.INFO)
@app.route('/alerts', methods=['POST'])
def handle_alert():
"""处理AlertManager发送的告警"""
try:
alerts = request.json.get('alerts', [])
for alert in alerts:
alert_name = alert.get('labels', {}).get('alertname')
severity = alert.get('labels', {}).get('severity')
component = alert.get('labels', {}).get('component')
logging.info(f"收到告警: {alert_name}, 严重级别: {severity}, 组件: {component}")
# 根据告警类型执行自动化响应
if alert_name == 'PodCrashLooping':
handle_pod_crash_looping(alert)
elif alert_name == 'NodeNotReady':
handle_node_not_ready(alert)
elif alert_name == 'ClusterCPUUsageHigh':
handle_high_cpu_usage(alert)
elif alert_name == 'PodNotReady':
handle_pod_not_ready(alert)
return jsonify({'status': 'success'}), 200
except Exception as e:
logging.error(f"处理告警时出错: {str(e)}")
return jsonify({'status': 'error', 'message': str(e)}), 500
def handle_pod_crash_looping(alert):
"""处理Pod崩溃循环"""
namespace = alert.get('labels', {}).get('namespace')
pod = alert.get('labels', {}).get('pod')
if namespace and pod:
logging.info(f"处理崩溃循环Pod: {namespace}/{pod}")
# 获取Pod日志
try:
result = subprocess.run(
['kubectl', 'logs', pod, '-n', namespace, '--previous', '--tail=50'],
capture_output=True, text=True
)
logging.info(f"Pod日志: {result.stdout}")
# 删除Pod进行重启
subprocess.run(['kubectl', 'delete', 'pod', pod, '-n', namespace])
logging.info(f"已删除Pod {namespace}/{pod} 进行重启")
except Exception as e:
logging.error(f"处理崩溃循环Pod时出错: {str(e)}")
def handle_node_not_ready(alert):
"""处理节点未就绪"""
node = alert.get('labels', {}).get('node')
if node:
logging.info(f"处理未就绪节点: {node}")
try:
# 获取节点详细信息
result = subprocess.run(
['kubectl', 'describe', 'node', node],
capture_output=True, text=True
)
logging.info(f"节点信息: {result.stdout}")
# 这里可以添加更多自动化处理逻辑
# 例如:重启节点、迁移Pod等
except Exception as e:
logging.error(f"处理未就绪节点时出错: {str(e)}")
def handle_high_cpu_usage(alert):
"""处理高CPU使用率"""
logging.info("处理高CPU使用率告警")
try:
# 执行自动扩容脚本
subprocess.run(['bash', '/scripts/auto-scale-resources.sh'])
logging.info("已执行自动扩容脚本")
except Exception as e:
logging.error(f"处理高CPU使用率时出错: {str(e)}")
def handle_pod_not_ready(alert):
"""处理Pod未就绪"""
namespace = alert.get('labels', {}).get('namespace')
pod = alert.get('labels', {}).get('pod')
if namespace and pod:
logging.info(f"处理未就绪Pod: {namespace}/{pod}")
try:
# 获取Pod详细信息
result = subprocess.run(
['kubectl', 'describe', 'pod', pod, '-n', namespace],
capture_output=True, text=True
)
logging.info(f"Pod信息: {result.stdout}")
# 检查Pod事件
result = subprocess.run(
['kubectl', 'get', 'events', '-n', namespace, '--field-selector', f'involvedObject.name={pod}'],
capture_output=True, text=True
)
logging.info(f"Pod事件: {result.stdout}")
except Exception as e:
logging.error(f"处理未就绪Pod时出错: {str(e)}")
if __name__ == '__main__':
app.run(host='0.0.0.0', port=8080)
11.7 故障排查最佳实践
11.7.1 故障排查流程
# 故障排查最佳实践
apiVersion: v1
kind: ConfigMap
metadata:
name: troubleshooting-best-practices
data:
troubleshooting-workflow.md: |
# Kubernetes故障排查最佳实践
## 1. 故障排查准备
### 1.1 建立基线
- 了解正常状态下的系统指标
- 记录关键配置和架构信息
- 建立监控和告警体系
- 准备故障排查工具和脚本
### 1.2 文档化
- 维护最新的架构文档
- 记录常见问题和解决方案
- 建立故障排查手册
- 保持联系人信息更新
## 2. 故障响应流程
### 2.1 初始响应(0-5分钟)
1. **确认告警**: 验证告警的真实性和严重性
2. **初步评估**: 快速评估影响范围和用户影响
3. **启动响应**: 根据严重级别启动相应的响应流程
4. **通知相关人员**: 通知相关团队和利益相关者
### 2.2 问题诊断(5-30分钟)
1. **收集信息**: 使用标准化脚本收集系统状态信息
2. **分析症状**: 分析告警、日志和监控数据
3. **确定范围**: 确定问题的影响范围和根本原因
4. **制定计划**: 制定详细的解决计划
### 2.3 问题解决(30分钟+)
1. **实施解决方案**: 按计划实施解决方案
2. **验证修复**: 验证问题是否得到解决
3. **监控稳定性**: 持续监控系统稳定性
4. **更新状态**: 及时更新问题状态和进展
### 2.4 事后处理
1. **根因分析**: 进行详细的根因分析
2. **改进措施**: 制定预防措施和改进计划
3. **文档更新**: 更新故障排查文档和知识库
4. **经验分享**: 与团队分享经验和教训
## 3. 故障排查技巧
### 3.1 系统性方法
- 从上到下:从应用层到基础设施层
- 从外到内:从用户体验到系统内部
- 分层诊断:网络、存储、计算、应用
- 时间线分析:确定问题开始时间和相关变更
### 3.2 工具使用
- **kubectl**: 基础诊断和操作
- **stern**: 多Pod日志聚合
- **k9s**: 交互式集群管理
- **Prometheus**: 监控和告警
- **Grafana**: 可视化分析
- **Jaeger**: 分布式追踪
### 3.3 日志分析
- 使用结构化日志格式
- 设置合适的日志级别
- 关联请求ID进行追踪
- 使用日志聚合工具
## 4. 常见问题模式
### 4.1 资源相关问题
- **症状**: Pod Pending、OOMKilled、节点压力
- **排查**: 检查资源请求、限制、节点容量
- **解决**: 调整资源配置、扩容、优化应用
### 4.2 网络相关问题
- **症状**: 连接超时、DNS解析失败、服务不可达
- **排查**: 检查Service、Endpoints、网络策略
- **解决**: 修复配置、重启网络组件、调整策略
### 4.3 存储相关问题
- **症状**: PVC Pending、挂载失败、I/O错误
- **排查**: 检查PV、PVC、存储类、权限
- **解决**: 修复存储配置、清理资源、调整权限
### 4.4 应用相关问题
- **症状**: 启动失败、频繁重启、功能异常
- **排查**: 检查日志、配置、依赖、健康检查
- **解决**: 修复代码、调整配置、更新依赖
## 5. 预防措施
### 5.1 监控和告警
- 设置全面的监控指标
- 配置合理的告警阈值
- 实施多层次告警策略
- 定期审查和调整告警规则
### 5.2 自动化
- 自动化常见故障的检测和修复
- 使用健康检查和自愈机制
- 实施自动扩缩容
- 建立自动化测试流程
### 5.3 容量规划
- 定期进行容量评估
- 预留足够的资源缓冲
- 制定扩容计划和流程
- 监控资源使用趋势
### 5.4 变更管理
- 建立标准化的变更流程
- 实施渐进式部署
- 保持配置版本控制
- 建立回滚机制
incident-response-checklist.md: |
# 故障响应检查清单
## 严重故障响应清单(P0/P1)
### 立即响应(0-5分钟)
- [ ] 确认告警并评估影响范围
- [ ] 通知相关团队和管理层
- [ ] 启动故障响应流程
- [ ] 建立沟通渠道(如Slack频道)
- [ ] 指定故障响应负责人
### 初步诊断(5-15分钟)
- [ ] 检查集群整体状态:`kubectl cluster-info`
- [ ] 检查节点状态:`kubectl get nodes`
- [ ] 检查系统Pod状态:`kubectl get pods -n kube-system`
- [ ] 检查最近事件:`kubectl get events --sort-by='.lastTimestamp'`
- [ ] 检查监控Dashboard确认问题范围
### 详细分析(15-30分钟)
- [ ] 收集相关Pod日志:`kubectl logs <pod-name>`
- [ ] 检查Pod详细状态:`kubectl describe pod <pod-name>`
- [ ] 分析网络连通性
- [ ] 检查存储状态
- [ ] 查看资源使用情况:`kubectl top nodes/pods`
### 解决实施
- [ ] 制定解决方案并评估风险
- [ ] 实施解决方案
- [ ] 验证修复效果
- [ ] 监控系统稳定性
- [ ] 更新故障状态
### 事后处理
- [ ] 进行根因分析
- [ ] 编写故障报告
- [ ] 制定预防措施
- [ ] 更新文档和流程
- [ ] 团队复盘和经验分享
## 一般故障响应清单(P2/P3)
### 问题确认
- [ ] 验证问题的真实性
- [ ] 评估影响范围和紧急程度
- [ ] 确定是否需要立即处理
### 信息收集
- [ ] 使用标准化脚本收集系统信息
- [ ] 分析相关日志和监控数据
- [ ] 确定问题的时间线
### 问题解决
- [ ] 制定解决计划
- [ ] 实施解决方案
- [ ] 验证修复效果
- [ ] 文档化解决过程
## 通用检查项目
### 集群健康检查
- [ ] 所有节点状态正常
- [ ] 系统组件运行正常
- [ ] 网络组件功能正常
- [ ] 存储系统可用
- [ ] DNS解析正常
### 应用健康检查
- [ ] 关键应用Pod运行正常
- [ ] 服务发现功能正常
- [ ] 负载均衡工作正常
- [ ] 数据库连接正常
- [ ] 外部依赖可访问
### 性能检查
- [ ] CPU使用率在正常范围
- [ ] 内存使用率在正常范围
- [ ] 磁盘使用率在正常范围
- [ ] 网络延迟在正常范围
- [ ] 应用响应时间正常
11.8 总结
本章详细介绍了Kubernetes的故障排查和性能优化,主要内容包括:
11.8.1 故障排查体系
- 方法论建立: 系统性的故障排查方法和流程
- 工具使用: kubectl、stern、k9s等专业工具的使用
- 问题分类: 按照组件和严重程度进行问题分类
- 检查清单: 标准化的故障排查检查清单
11.8.2 具体故障类型
- Pod故障: 状态问题、镜像拉取、容器崩溃等
- 网络故障: Service连接、DNS解析、网络策略等
- 存储故障: PV/PVC问题、挂载失败、性能问题等
- 节点故障: 资源不足、网络问题、系统故障等
11.8.3 性能优化
- 资源优化: CPU、内存、存储资源的合理配置
- 应用优化: 启动时间、内存使用、响应性能等
- 集群优化: 调度策略、网络配置、存储配置等
- 监控优化: 关键指标监控和性能基线建立
11.8.4 监控和告警
- 指标体系: 集群、节点、Pod、应用多层次指标
- 告警配置: 基于阈值的智能告警规则
- 自动化响应: 故障自动检测和修复机制
- 可视化分析: Grafana Dashboard和性能分析
11.8.5 最佳实践
- 预防为主: 通过监控、自动化、容量规划预防故障
- 快速响应: 建立标准化的故障响应流程
- 持续改进: 通过根因分析和经验总结持续优化
- 文档化: 维护完整的故障排查文档和知识库
11.8.6 关键要点
- 系统性方法: 采用分层、分类的系统性故障排查方法
- 工具熟练: 熟练掌握各种故障排查和性能分析工具
- 自动化程度: 提高故障检测、响应和修复的自动化程度
- 监控完善: 建立全面的监控体系和合理的告警策略
- 经验积累: 通过实践积累故障排查经验和优化技巧
通过本章的学习,你应该能够: - 建立完整的Kubernetes故障排查体系 - 快速定位和解决各类常见故障 - 实施有效的性能优化策略 - 建立自动化的监控和告警机制 - 制定预防性的运维策略
下一章我们将学习Kubernetes的高级特性和扩展机制。