K8S 核心原理与故障排查实战笔记
一、K8S 基础认知:从 “物业类比” 理解核心架构
1.1 K8S 与 Docker 的本质区别
|
工具 |
定位 |
核心作用 |
操作逻辑 |
|
Docker |
单机容器管理工具 |
打包、启动单机容器(如 Nginx) |
命令直接操作(docker run) |
|
K8S(Kubernetes) |
多机容器集群操作系统 |
管理多节点容器的调度、自愈、网络 |
定义 “需求” 后自动执行(写配置文件) |
类比理解:
- Docker 像 “业主家的收纳箱”,仅管理单个节点的容器;
- K8S 像 “小区物业”,负责多栋楼(多节点)的容器分配、维护、网络打通,解决 “多机协同” 问题。
1.2 K8S 核心组件:物业的 “不同岗位”
K8S 核心组件分工明确,所有组件异常都可对应 “岗位职责问题”,如下表:
|
K8S 组件 |
类比物业岗位 |
部署位置 |
核心工作(实战场景) |
常见故障表现 |
|
kube-apiserver |
物业前台 |
控制平面节点 |
所有操作的唯一入口(接收 kubectl 指令、同步集群状态) |
无法执行 kubectl 命令、组件通信超时 |
|
kube-scheduler |
住房分配员 |
控制平面节点 |
为新 Pod 分配节点(按资源、亲和性规则) |
Pod 一直处于 Pending 状态 |
|
kube-controller-manager |
物业维修队 |
控制平面节点 |
自愈(重启崩溃容器)、扩缩容(按配置维持 Pod 数量) |
Pod 崩溃后不重启、扩缩容无响应 |
|
kubelet |
每栋楼的楼管 |
所有节点(控制 + 工作) |
执行容器操作(启动 / 停止 Pod)、监控节点资源、上报节点状态 |
Pod 处于 ContainerCreating 状态、10250 端口不通 |
|
etcd |
物业档案室 |
控制平面节点 |
存储集群所有配置(节点信息、Pod 规则、证书) |
集群 “失忆”、组件无法获取配置 |
|
网络插件(Flannel/Calico) |
小区网络布线队 |
所有节点 |
打通跨节点网络(给 Pod 分配唯一 IP、实现跨节点通信) |
跨节点 Pod 无法 ping 通 |
二、K8S 部署与工具链:分工明确的 “三把钥匙”
2.1 核心工具对比:kubeadm、kubectl、kubelet
|
工具 |
定位 |
日常使用频率 |
核心命令(实战) |
|
kubeadm |
集群维护工具(修核心组件) |
低(故障时用) |
kubeadm init(初始化集群)、kubeadm reset(重置集群)、kubeadm init phase control-plane all(重建控制平面) |
|
kubectl |
应用操作工具(管 Pod) |
高(每天用) |
kubectl apply -f 配置.yaml(启动应用)、kubectl get pods(查 Pod 状态)、kubectl logs Pod名(查日志)、kubectl describe pod Pod名(排障) |
|
kubelet |
节点执行工具(底层干活) |
无(自动运行) |
无常用命令,仅需 systemctl status kubelet(查状态)、systemctl restart kubelet(重启) |
关键认知:
- 单机版 K8S 中,一台主机 “身兼数职”:既运行控制平面组件(apiserver/scheduler),也运行 kubelet,同时通过 kubectl 操作应用;
- kubelet 是 “后台执行者”,安装后以系统服务常驻,无需手动调用,只需确保其运行状态。
2.2 单机版 K8S 部署流程(实战步骤)
- 前置准备:安装 Docker/containerd(容器运行时)、关闭防火墙(避免端口拦截);
- 安装 K8S 组件:
|
# 安装 kubeadm、kubectl、kubelet apt install -y kubelet kubeadm kubectl # Ubuntu/Debian # 或 yum install -y kubelet kubeadm kubectl # CentOS/RHEL |
- 初始化集群(指定国内镜像源,避免国外仓库访问问题):
|
kubeadm init --image-repository registry.aliyuncs.com/google_containers \ --kubernetes-version v1.21.14 \ --pod-network-cidr=10.244.0.0/16 \ --apiserver-advertise-address=192.168.0.102 # 本机 IP |
- 配置 kubectl 权限:
|
mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config |
- 部署网络插件(必装,否则 Pod 无法跨节点通信):
|
kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/v0.22.0/Documentation/kube-flannel.yml |
- 允许单机调度 Pod(单机版需取消控制平面污点):
|
kubectl taint nodes --all node-role.kubernetes.io/control-plane- |
三、K8S 核心故障排查:从日志到解决方案
3.1 高频故障 1:kube-scheduler 持续 CrashLoopBackOff
故障现象
|
kubectl get pods -n kube-system | grep kube-scheduler # 输出:kube-scheduler-k8ss 0/1 CrashLoopBackOff 8 153m |
核心原因与排查步骤
- 原因分类:
- 配置文件问题(scheduler.conf 为空 / 缺失 apiserver 地址);
- 证书不匹配(scheduler 证书未被 apiserver 信任);
- kubelet 异常(10250 端口不通,无法管理静态 Pod);
- apiserver 异常(6443 端口不通,调度器无法通信)。
- 排查流程(实战命令):
|
# 步骤1:查看调度器日志(关键!定位具体错误) kubectl logs kube-scheduler-k8ss -n kube-system --previous # 常见日志错误与对应方案: # 错误1:invalid configuration(配置无效)→ 重建 scheduler.conf sudo rm -f /etc/kubernetes/scheduler.conf /etc/kubernetes/pki/scheduler.* sudo kubeadm init phase control-plane scheduler --apiserver-advertise-address=192.168.0.102 # 错误2:connection refused 192.168.0.102:6443(apiserver 不通)→ 检查 apiserver 状态 kubectl get pods -n kube-system | grep kube-apiserver # 确保 Running telnet 192.168.0.102 6443 # 测试 6443 端口 # 错误3:connection refused 192.168.0.102:10250(kubelet 不通)→ 重启 kubelet sudo systemctl restart kubelet sudo systemctl status kubelet |
- 终极解决方案(配置混乱时):
若多次修复无效,重置集群(保留软件,仅清配置):
|
sudo kubeadm reset -f sudo rm -rf /var/lib/etcd /var/lib/kubelet /etc/cni/net.d # 重新初始化(参考 2.2 步骤 3-6) |
3.2 高频故障 2:kubectl 无法获取日志(10250 端口不通)
故障现象
|
kubectl logs kube-scheduler-k8ss -n kube-system # 输出:Error from server: Get "https://192.168.0.102:10250/containerLogs/...": dial tcp 192.168.0.102:10250: connect: connection refused |
核心原因与解决方案
- 原因:kubelet 服务未启动 / 崩溃,或 10250 端口被防火墙拦截;
- 解决方案:
|
# 步骤1:检查 kubelet 状态 sudo systemctl status kubelet # 若未运行,重启并设置开机启动 sudo systemctl restart kubelet sudo systemctl enable kubelet # 步骤2:检查 10250 端口是否被防火墙拦截 # Ubuntu/Debian 开放端口 sudo ufw allow 10250/tcp # CentOS/RHEL 开放端口 sudo firewall-cmd --add-port=10250/tcp --permanent sudo firewall-cmd --reload # 步骤3:验证端口连通性 telnet 192.168.0.102 10250 # 显示 Connected 即正常 |
3.3 高频故障 3:apiserver 与 etcd 通信异常
故障现象
- 所有 kubectl 命令执行缓慢或超时;
- apiserver 日志出现 etcd timeout 错误。
解决方案
|
# 步骤1:查看 apiserver 日志,确认 etcd 错误 kubectl logs kube-apiserver-k8ss -n kube-system -f | grep -i "etcd\|timeout" # 步骤2:检查 etcd 状态 kubectl get pods -n kube-system | grep etcd # 确保 Running # 步骤3:若 etcd 异常,重建 etcd(单机版) sudo kubeadm reset -f --skip-remove-etcd-member # 保留 etcd 数据(可选) sudo kubeadm init phase certs etcd-ca # 重建 etcd 证书 sudo kubeadm init phase etcd local # 重建本地 etcd 实例 |
四、K8S 关键概念与操作:实战必备
4.1 核心概念:Pod、Deployment、Service
|
概念 |
作用 |
类比理解 |
常用操作命令 |
|
Pod |
最小部署单元(1 个或多个容器) |
业主家的 “一套房子” |
kubectl get pods(查状态)、kubectl delete pod Pod名(删除) |
|
Deployment |
管理 Pod 的 “控制器” |
物业的 “住房管理协议” |
kubectl apply -f deployment.yaml(创建)、kubectl scale deployment 名 --replicas=3(扩缩容) |
|
Service |
暴露 Pod 网络(固定访问地址) |
小区的 “门牌号” |
kubectl get services(查地址)、kubectl expose deployment 名 --port=80 --type=NodePort(创建 NodePort 服务) |
4.2 配置文件示例:启动 Nginx 应用(deployment.yaml)
|
apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment # Deployment 名称 spec: replicas: 2 # 启动 2 个 Pod selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.21 # 容器镜像 ports: - containerPort: 80 # 容器内部端口 --- # 暴露 Service(NodePort 类型,外部可访问) apiVersion: v1 kind: Service metadata: name: nginx-service spec: type: NodePort selector: app: nginx ports: - port: 80 # Service 端口 targetPort: 80 # 对应 Pod 端口 nodePort: 30080 # 节点暴露端口(外部通过 http://192.168.0.102:30080 访问) |
操作命令:
|
# 启动应用 kubectl apply -f deployment.yaml # 查看 Deployment 和 Service kubectl get deployment kubectl get service nginx-service # 访问 Nginx(外部浏览器或 curl) curl http://192.168.0.102:30080 |
4.3 kubeadm reset 与 “重新安装 K8S” 的区别
|
操作 |
清理范围 |
保留内容 |
适用场景 |
耗时 |
|
kubeadm reset |
集群配置(/etc/kubernetes/)、证书、kubelet 缓存 |
Docker/containerd、容器镜像、基础组件(kubeadm/kubectl/kubelet) |
配置混乱、控制平面组件故障 |
5-10 分钟 |
|
重新安装 K8S |
所有 K8S 组件、Docker/containerd、镜像、配置 |
系统基础环境 |
基础软件损坏(如 kubelet 二进制丢失)、跨大版本升级 |
20-30 分钟 |
实战建议:优先使用 kubeadm reset 重建集群,避免重复安装软件,节省时间。
五、附录:常用命令速查
5.1 集群维护命令
|
功能 |
命令 |
|
查看控制平面组件状态 |
kubectl get pods -n kube-system |
|
查看 kubelet 状态 |
sudo systemctl status kubelet |
|
重启控制平面组件 |
kubectl delete pod 组件名 -n kube-system(自动重建) |
|
重置集群 |
sudo kubeadm reset -f |
|
查看集群信息 |
kubectl cluster-info |
5.2 应用操作命令
|
功能 |
命令 |
|
启动应用 |
kubectl apply -f 配置文件.yaml |
|
查看 Pod 详细信息 |
kubectl describe pod Pod名 |
|
查看容器日志 |
kubectl logs Pod名 -f(-f 实时跟踪) |
|
进入容器内部 |
kubectl exec -it Pod名 -- /bin/bash |
|
删除应用 |
kubectl delete -f 配置文件.yaml 或 kubectl delete deployment 名 |
5.3 故障排查命令
|
功能 |
命令 |
|
检查端口连通性 |
telnet IP 端口 或 nc -zv IP 端口 |
|
查看组件日志 |
kubectl logs 组件名 -n kube-system --previous(--previous 查看上一次崩溃日志) |
|
查看 kubelet 日志 |
sudo journalctl -u kubelet -f(实时跟踪) |
|
检查节点资源 |
kubectl top node(查看节点 CPU / 内存使用) |
|
检查 Pod 资源 |
kubectl top pod(查看 Pod CPU / 内存使用) |
1万+

被折叠的 条评论
为什么被折叠?



