K8S 核心原理与故障排查实战笔记

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 部署流程(实战步骤)

  1. 前置准备:安装 Docker/containerd(容器运行时)、关闭防火墙(避免端口拦截);
  2. 安装 K8S 组件

# 安装 kubeadm、kubectl、kubelet

apt install -y kubelet kubeadm kubectl  # Ubuntu/Debian

# 或

yum install -y kubelet kubeadm kubectl  # CentOS/RHEL

  1. 初始化集群(指定国内镜像源,避免国外仓库访问问题):

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

  1. 配置 kubectl 权限

mkdir -p $HOME/.kube

sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

sudo chown $(id -u):$(id -g) $HOME/.kube/config

  1. 部署网络插件(必装,否则 Pod 无法跨节点通信):

kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/v0.22.0/Documentation/kube-flannel.yml

  1. 允许单机调度 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

核心原因与排查步骤
  1. 原因分类
    • 配置文件问题(scheduler.conf 为空 / 缺失 apiserver 地址);
    • 证书不匹配(scheduler 证书未被 apiserver 信任);
    • kubelet 异常(10250 端口不通,无法管理静态 Pod);
    • apiserver 异常(6443 端口不通,调度器无法通信)。
  1. 排查流程(实战命令)

# 步骤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

  1. 终极解决方案(配置混乱时)

若多次修复无效,重置集群(保留软件,仅清配置):

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

核心原因与解决方案
  1. 原因:kubelet 服务未启动 / 崩溃,或 10250 端口被防火墙拦截;
  2. 解决方案

# 步骤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 / 内存使用)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值