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/deleteTYPE:资源类型,单数/复数/缩写均可(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 内部管理) |
三、小贴士
- 多装个 alias:
alias k=kubectl,日常操作省一半打字 - 学会
-o组合:-o wide、-o yaml、-o json、-o name是查信息的四板斧 - 先 diff 再 apply:改线上配置前
kubectl diff -f,养成习惯能避免很多事故 - k9s 值得一试:终端版可视化管理工具,界面化浏览所有资源
- 文档权威来源:Kubernetes 官方中文文档 和 kubectl 命令参考 是最靠谱的学习资料
Kubernetes 入门不难,难的是把「声明式」「期望状态」「控制循环」这套心智模型建立起来。命令敲熟 + 概念想通,后面学 Helm、Istio、Operator 都是水到渠成的事。