Kubernetes 了解及操作指令

一、核心概念

什么是 K8s

开源的容器编排平台,用于自动化部署、扩展和管理容器化应用,是一站式分布式系统开发与支撑平台。

核心能力

  • 自动部署与回滚:分步上线,健康监控,故障自动回滚

  • 服务发现与负载均衡:自动分配 DNS/IP,流量分发

  • 自动扩缩容:按 CPU 等指标增减实例

  • 自我修复:重启崩溃容器、替换故障 Pod、重新调度

  • 存储编排:自动挂载本地/云/网络存储

  • 密钥与配置管理:安全管理敏感信息,无需重建镜像

为什么用 K8s

  • 与业务无关的底层代码/功能模块从视线中消失

  • 不必费心负载均衡器选型和部署

  • 不必引入或自研复杂服务治理框架

  • 不必头疼服务监控和故障处理模块开发


二、集群架构

控制平面(Master)

组件

作用

kube-apiserver

集群统一 API 入口

etcd

键值存储,保存集群状态

kube-scheduler

Pod 调度

kube-controller-manager

维护期望状态

工作节点(Node)

组件

作用

kubelet

节点代理,管理 Pod 生命周期

kube-proxy

网络规则与负载均衡

容器运行时

containerd / CRI-O


三、核心资源对象

对象

说明

Pod

最小调度单元,含一个或多个紧密耦合容器

Service

为 Pod 提供稳定访问入口和负载均衡

Deployment

管理无状态应用副本数、滚动更新和回滚

StatefulSet

管理有状态应用,提供稳定网络标识和持久存储

ConfigMap / Secret

分别存储非敏感配置和敏感信息

Namespace

集群内资源的逻辑隔离

关键特性

  • 容器编排:自动化部署、滚动更新/回滚、负载均衡

  • 扩展和管理:自动扩展、自愈能力

  • 存储管理:持久化存储、存储编排

  • 服务发现和负载均衡:内置服务发现、多种负载均衡策略

  • 配置和密钥管理:配置文件/环境变量、安全密钥管理

  • 多环境支持:混合云/多云、多集群管理

  • 社区和生态:丰富插件扩展、持续演进


四、自动扩缩容体系

维度

HPA

VPA

CA

调整对象

Pod 副本数

单 Pod 资源配额

集群节点数

方向

水平(加/减 Pod)

垂直(改资源)

水平(加/减 Node)

触发

CPU/内存/自定义指标超阈值

实际使用与 Request 偏差大

Pod Pending(扩)/节点空闲(缩)

核心公式

ceil(当前副本 × 当前指标 / 目标指标)

Recommender 分析历史数据

模拟调度选最优节点池

采集周期

默认 15 秒

持续监控

默认 10 秒

依赖

Metrics Server / Prometheus Adapter

Metrics Server + Admission Controller

云厂商 API / 节点池

前置条件

Pod 必须配 resources.requests

需单独部署 VPA

需配节点池最小/最大数

适用

流量波动、突发高峰

资源调优、避免 OOM

集群资源不足或闲置

局限

不支持从 0 扩容

调整需重建 Pod

依赖云厂商 API

联动关系:

 流量突增 → HPA 扩容 Pod → 资源不足 → CA 扩容 Node
 流量回落 → HPA 缩容 Pod → 节点闲置 → CA 缩容 Node

HPA 管"应用层",CA 管"基础设施层",VPA 管"单 Pod 资源调优",三者配合实现全链路弹性。

扩展方案:

方案

定位

核心特点

KEDA

事件驱动扩缩容

支持 Kafka/RabbitMQ/Redis 等 60+ 事件源,可从 0 扩容

CronHPA

定时扩缩容

基于 Cron 表达式,适用周期性流量(如大促)

Cluster Proportional Autoscaler

系统组件扩缩

按集群节点数/CPU 核数自动调整 CoreDNS 等系统组件副本数

集群节点自动扩缩(Cluster Autoscaler / Karpenter):

  • 扩容触发:存在因资源不足无法调度的 Pending Pod 时,调用云厂商 API 制备新节点

  • 缩容触发:节点利用率持续低于阈值且 Pod 可迁移时,驱逐 Pod 并移除节点

  • 主流实现:Cluster Autoscaler(基于预定义 Node Group)、Karpenter(自动制备、直接管理云资源)


五、常用命令

1. 查看类(占日常 80%)

 kubectl cluster-info                 # 集群信息
 kubectl get nodes -o wide            # 节点详情
 kubectl get pods                     # Pod 列表
 kubectl get deploy                   # Deployment
 kubectl get svc                      # Service
 kubectl get all                      # 所有资源
 kubectl get pods -A                  # 所有命名空间
 kubectl get pods -o wide             # 含 IP/节点
 kubectl get pods -l app=xxx          # 按标签筛选
 kubectl get pods -w                  # 实时监控
 kubectl describe pod <name>          # 详情(调度/事件/状态)
 kubectl get pod <name> -o yaml       # 完整 YAML
 kubectl get events --sort-by='.lastTimestamp'  # 事件排障

2. 部署与更新

 kubectl apply -f app.yaml            # 创建/更新(生产只用 apply)
 kubectl apply -f ./k8s-dir/          # 整个目录
 kubectl delete -f app.yaml           # 删除
 kubectl scale deploy <name> --replicas=5        # 扩缩容
 kubectl autoscale deploy <name> --min=2 --max=10 --cpu-percent=80  # HPA
 kubectl set image deploy/<name> <container>=<image>:<tag>          # 热更新镜像
 kubectl rollout restart deploy/<name>           # 重启

3. 滚动发布与回滚

 kubectl rollout status deploy/<name>            # 发布状态
 kubectl rollout history deploy/<name>           # 发布历史
 kubectl rollout undo deploy/<name>              # 回滚上一版本
 kubectl rollout undo deploy/<name> --to-revision=3  # 回滚指定版本
 kubectl rollout pause deploy/<name>             # 暂停
 kubectl rollout resume deploy/<name>            # 恢复

4. 调试排障(三板斧)

 # 1️⃣ 看状态
 kubectl get pods
 kubectl describe pod <name>
 ​
 # 2️⃣ 看日志
 kubectl logs <name>                  # 日志
 kubectl logs <name> -f               # 实时追踪
 kubectl logs <name> --previous       # 上次崩溃日志
 kubectl logs <name> -c <container>   # 多容器指定
 ​
 # 3️⃣ 进入容器
 kubectl exec -it <name> -- /bin/bash
 kubectl exec -it <name> -- /bin/sh   # Alpine 精简镜像
 ​
 # 端口转发
 kubectl port-forward pod/<name> 8080:80
 kubectl port-forward svc/<name> 8080:80
 ​
 # 文件拷贝
 kubectl cp <pod>:/path/file ./local  # 容器→本地
 kubectl cp ./local <pod>:/path/file  # 本地→容器

5. 资源监控

 kubectl top nodes        # 节点资源(需 metrics-server)
 kubectl top pods         # Pod 资源
 kubectl top pods -A      # 所有命名空间

6. 节点维护

 kubectl cordon <node>            # 标记不可调度
 kubectl uncordon <node>          # 恢复调度
 kubectl drain <node> --ignore-daemonsets --delete-emptydir-data  # 驱逐 Pod
 kubectl taint nodes <node> key=value:NoSchedule  # 添加污点

### 7. 命名空间与上下文

 kubectl get ns                       # 查看所有命名空间
 kubectl create ns <name>             # 创建
 kubectl config get-contexts          # 查看上下文
 kubectl config use-context <name>    # 切换集群
 kubectl config set-context --current --namespace=<ns>  # 切换默认 ns

8. 配置与元数据

 kubectl label pod <name> env=prod --overwrite   # 加/改标签
 kubectl label pod <name> env-                   # 删标签
 kubectl annotate pod <name> note="xxx"          # 加注解
 kubectl edit deploy <name>                      # 在线编辑
 kubectl explain pod.spec.containers             # 字段文档
 kubectl get deploy <name> -o yaml > backup.yaml # 导出备份

9. 效率技巧

alias k=kubectl          # 日常直接用 k get pods

⭐ 日常记住三组

  • 排障三板斧:get pods → describe pod → logs pod

  • 发布三件套:apply → rollout status → rollout undo

  • 调试三件套:exec → port-forward → top


六、常见踩坑点

问题

原因

解决

节点一直 NotReady

未装 CNI 插件

部署 Flannel/Calico

ImagePullBackOff

镜像拉取失败

配置国内镜像源

cgroup 报错

SystemdCgroup 未开启

修改 containerd 配置

token 过期

默认 24 小时

kubeadm token create --print-join-command 重新生成