Kubernetes 初识与常用命令介绍

从「一堆容器」到「一个集群」——理解 K8s 的核心概念与架构,掌握 kubectl 常用命令,快速上手云原生时代的基础设施技能。

一、初识 Kubernetes

1.1 为什么需要 Kubernetes

回顾部署方式的演进,每一步都是在解决上一阶段的痛点:

阶段 特点 痛点
传统部署 应用直接跑在物理机上 资源争抢、运维成本高、难以扩容
虚拟化部署 每台 VM 一个完整操作系统 隔离性提升但资源开销大、启动慢
容器部署 共享内核、秒级启动、轻量隔离 容器数量一多,手动管理就失控了

容器化解决了「怎么打包」的问题,但成百上千个容器怎么调度、怎么保证高可用、怎么弹性伸缩、怎么服务发现,这些编排问题 Docker 本身解决不了。于是 Kubernetes 出现了。

1.2 Kubernetes 是什么

Kubernetes(简称 K8s)是一个开源的容器编排平台,源自 Google 内部十几年大规模容器管理经验的 Borg 系统,2014 年开源,2015 年捐给 CNCF(云原生计算基金会),如今是云原生生态的绝对事实标准。

一句话概括:你告诉它「我想要什么状态」,它负责把实际状态调成期望状态,并且持续保持。

1.3 Kubernetes 能做什么

  • 服务发现与负载均衡:自动分配 DNS 名称和 IP,流量大了自动分流
  • 存储编排:自动挂载本地存储、NFS、云存储,无需手动配卷
  • 自动部署与回滚:以受控速率滚动更新,出问题秒级回滚
  • 自动装箱:根据声明的 CPU/内存需求,自动调度到最优节点
  • 自我修复:自动重启失败的容器、替换不健康的实例
  • 密钥与配置管理:ConfigMap/Secret 安全存储配置,不重建镜像即可更新

1.4 集群架构

一个 K8s 集群由控制平面(Control Plane)工作节点(Worker Node)组成:

┌─────────────────── 控制平面 ───────────────────┐
│  kube-apiserver    集群唯一入口,所有操作的网关     │
│  etcd              分布式键值存储,集群的「数据库」   │
│  kube-scheduler    决定 Pod 调度到哪个节点          │
│  kube-controller-manager  控制器,维护期望状态      │
└──────────────────────┬────────────────────────┘
                       │
┌─────────────────── 工作节点 ───────────────────┐
│  kubelet           节点代理,确保容器按规格运行      │
│  kube-proxy        网络代理,实现 Service 转发      │
│  容器运行时         containerd / CRI-O 等          │
└────────────────────────────────────────────────┘

1.5 核心资源对象

对象 作用
Pod 最小调度单元,1 个或多个共享网络/存储的容器集合
Deployment 声明副本数,负责滚动更新、回滚、扩缩容(无状态应用首选)
Service 稳定的网络入口,自动负载均衡到一组 Pod
Namespace 命名空间,逻辑隔离,多团队共享集群
ConfigMap / Secret 配置与敏感数据,与镜像解耦
PV / PVC 持久化存储,独立于 Pod 生命周期
Ingress 七层入口,把 HTTP 流量路由到不同 Service
StatefulSet 有状态应用(数据库等),每个 Pod 有持久唯一身份
DaemonSet 每个节点都运行一个副本(日志采集、监控等)

1.6 声明式 API 与期望状态

K8s 最核心的设计思想是声明式:你通过 YAML 描述「期望状态」,K8s 的控制循环持续对比「实际状态」,有差异就调谐(reconcile),直到两者一致。

kubectl apply -f deployment.yaml
        ↓
API Server 校验并写入 etcd
        ↓
Controller 发现「实际 ≠ 期望」→ 调谐
        ↓
Scheduler 分配到最优节点
        ↓
kubelet 拉起容器 → 变成 Running

这也是为什么 K8s 里「改了配置只是第一步,它自己会去达成」——你只管声明,执行交给平台。

1.7 本地环境怎么搭

没有现成集群时,本地学习最常用这三个:

  • minikube:单节点集群,最接近真实,适合完整学习
  • kind:Docker 里的 Kubernetes,秒级起集群,适合 CI/快速试验
  • k3s:轻量发行版,资源占用极小,适合边缘/学习机

Windows 上装 Docker Desktop 自带 Kubernetes 选项,勾上即可体验。

二、kubectl 常用命令

kubectl 是操作集群的命令行工具。语法:

kubectl [command] [TYPE] [NAME] [flags]
  • command:操作,如 get / describe / delete
  • TYPE:资源类型,单数/复数/缩写均可(pod / pods / po 等价)
  • NAME:资源名称,省略则操作该类型全部资源

2.1 集群信息

# 查看集群信息
kubectl cluster-info

# 查看客户端/服务端版本
kubectl version

# 查看所有节点(-o wide 显示 IP 等更多信息)
kubectl get nodes
kubectl get nodes -o wide

# 查看节点资源使用情况(需要 metrics-server)
kubectl top nodes

2.2 查看资源(最常用)

# 查看某命名空间下的 Pod / Service / Deployment
kubectl get pods
kubectl get services
kubectl get deployments

# 查看所有命名空间的资源(-A = --all-namespaces)
kubectl get pods -A
kubectl get pods --all-namespaces

# 查看指定命名空间
kubectl get pods -n my-namespace

# 查看某个具体资源
kubectl get pod my-pod
kubectl get pods my-pod -o yaml    # 完整 YAML(排障必看)
kubectl get pods my-pod -o json    # JSON 格式
kubectl get pods -o wide           # 显示节点、IP、所在节点

# 持续监听变化(Ctrl+C 退出)
kubectl get pods -w

# 按标签筛选
kubectl get pods -l app=nginx

# 查看资源详情(事件、状态、最近状态变更,排障第一步)
kubectl describe pod my-pod
kubectl describe node my-node

# 查看全部资源类型
kubectl api-resources

2.3 创建与更新资源

# 声明式创建/更新(推荐,幂等,改完 apply 即可)
kubectl apply -f deployment.yaml
kubectl apply -f ./my-config/          # 整个目录
kubectl apply -f https://example.com/x.yaml   # 远程 URL

# 命令式创建(快速试验用,生产不推荐)
kubectl create deployment nginx --image=nginx
kubectl create namespace dev

# 用标准输入
echo '...yaml...' | kubectl apply -f -

# 直接编辑线上资源(会用默认编辑器打开)
kubectl edit deployment nginx

# 对比文件与线上差异(改前先看)
kubectl diff -f deployment.yaml

2.4 扩缩容与滚动更新

# 调整副本数
kubectl scale deployment nginx --replicas=5

# 更新镜像
kubectl set image deployment/nginx nginx=nginx:1.25

# 查看滚动更新状态
kubectl rollout status deployment/nginx

# 查看更新历史
kubectl rollout history deployment/nginx

# 回滚到上一个版本
kubectl rollout undo deployment/nginx

# 回滚到指定版本
kubectl rollout undo deployment/nginx --to-revision=2

# 手动重启(配置更新后常用)
kubectl rollout restart deployment/nginx

2.5 调试与排查(get → describe → logs)

# 查看日志(排障核心)
kubectl logs my-pod
kubectl logs my-pod -f                    # 实时跟踪
kubectl logs my-pod --previous            # 上次崩溃容器的日志
kubectl logs my-pod -c my-container       # 多容器 Pod 指定容器
kubectl logs -l app=nginx --tail=100      # 按标签批量 + 只取末尾 100 行

# 进入容器交互式 shell
kubectl exec -it my-pod -- /bin/bash
kubectl exec -it my-pod -c my-container -- sh

# 把文件拷进/拷出容器
kubectl cp my-pod:/var/log/app.log ./app.log
kubectl cp ./config.json my-pod:/etc/config.json

# 端口转发:把集群内端口映射到本地调试
kubectl port-forward pod/my-pod 8080:80
kubectl port-forward svc/my-service 8080:80

# 查看集群事件(排障高价值信息)
kubectl get events
kubectl get events --sort-by=.lastTimestamp

排障黄金流程:get 看状态 → describe 看事件 → logs 看日志,基本能定位 90% 的问题。

2.6 删除资源

kubectl delete pod my-pod
kubectl delete deployment nginx
kubectl delete -f deployment.yaml        # 按文件删除(连带相关资源)
kubectl delete pods --all                # 删除某命名空间下所有 Pod
kubectl delete ns dev                    # 删除整个命名空间(连带内部所有资源!)
kubectl delete pod my-pod --grace-period=0 --force   # 强制删除(卡 Terminating 时)

2.7 上下文与多集群切换

# 查看当前上下文和所有上下文
kubectl config current-context
kubectl config get-contexts

# 切换上下文(多集群/多环境切换的关键)
kubectl config use-context my-cluster

# 快捷查看默认命名空间
kubectl get ns

2.8 常用资源类型速查

缩写 全称 中文
po Pod 最小调度单元
deploy Deployment 无状态工作负载
svc Service 服务发现/负载均衡
ns Namespace 命名空间
no Node 节点
cm ConfigMap 配置
secret Secret 密钥
pv / pvc PersistentVolume / PersistentVolumeClaim 持久化存储
ing Ingress 七层入口
sts StatefulSet 有状态工作负载
ds DaemonSet 节点级守护
rs ReplicaSet 副本集(Deployment 内部管理)

三、小贴士

  • 多装个 aliasalias k=kubectl,日常操作省一半打字
  • 学会 -o 组合-o wide-o yaml-o json-o name 是查信息的四板斧
  • 先 diff 再 apply:改线上配置前 kubectl diff -f,养成习惯能避免很多事故
  • k9s 值得一试:终端版可视化管理工具,界面化浏览所有资源
  • 文档权威来源Kubernetes 官方中文文档kubectl 命令参考 是最靠谱的学习资料

Kubernetes 入门不难,难的是把「声明式」「期望状态」「控制循环」这套心智模型建立起来。命令敲熟 + 概念想通,后面学 Helm、Istio、Operator 都是水到渠成的事。