k8s
K8s 入门基础理论
K8s(Kubernetes)的核心是「容器编排平台」—— 简单说,就是帮你自动化管理大量容器(比如 Docker 容器)的 “管家系统”,不用手动启停、扩容、排错,适合部署微服务、网站、后台应用等。
K8s 核心定位:为什么需要它?
没有 K8s 时,你可能要手动做这些事:
- 容器挂了,得自己重启;
- 访问量变大,得手动加容器;
- 容器 IP 变了,得手动改访问地址;
- 多环境(开发 / 测试 / 生产)的容器容易混乱。
K8s 核心目标:解决 4 大痛点
- 自动化部署:一键启动成百上千个容器,不用逐个操作;
- 自愈能力:容器挂了、节点崩了,自动重建容器,不用人工干预;
- 弹性扩缩容:根据访问量自动加 / 减容器数量(比如双 11 扩容,平时缩容);
- 服务发现与负载均衡:给容器分配固定访问地址,自动分发请求到多个容器,避免单点故障。
必记核心概念
| 概念 | 通俗类比 | 规范定义 | 核心作用(为什么需要它) |
|---|---|---|---|
| 集群(Cluster) | 整个小区 | 由 1 个或多个 Node 组成的集合,是 K8s 的 “运行环境”。 | 容纳所有应用和资源,是 K8s 的 “大容器”。 |
| 节点(Node) | 小区里的一栋楼 | 集群中的物理机或虚拟机,是运行容器的 “硬件载体”。 | 提供 CPU、内存等硬件资源,Pod 必须运行在 Node 上。 |
| 命名空间(Namespace) | 楼里的单元楼(1 单元、2 单元) | 集群内的资源隔离抽象,相当于 “资源文件夹”。 | 1. 隔离多环境(开发 / 测试 / 生产),避免资源冲突;2. 控制资源配额(比如给开发环境分配 2 核 4G 内存)。 |
| Pod | 单元楼里的一套房子 | K8s 最小部署单元,包含 1 个或多个关联容器,共享网络和存储。 | K8s 不直接管理容器,通过 Pod 封装容器 —— 相当于给容器加了 “管理外壳”,方便 K8s 调度和监控。 |
| 控制器(以 Deployment 为例) | 房子的管家 | 管理 Pod 生命周期的 “自动化程序”,常见类型:Deployment(无状态应用)、StatefulSet(有状态应用)。 | 1. 自愈:Pod 挂了自动重建;2. 扩缩容:一键增减 Pod 数量;3. 版本更新:滚动更新 Pod(不中断服务)。 |
| 服务(Service) | 房子的固定门牌号 | 为 Pod 提供固定网络访问入口的抽象,关联多个 Pod,实现负载均衡。 | 解决 Pod IP 动态变化的问题 —— 不管 Pod 怎么重建,外部都能通过 Service 的固定地址访问。 |
| 配置中心(ConfigMap/Secret) | 房子里的 “公共配置”(比如 WiFi 密码) | ConfigMap:存储非敏感配置(如数据库地址、端口);Secret:加密存储敏感信息(如密码、Token)。 | 1. 配置与应用分离,不用改代码就能改配置;2. 敏感信息加密,避免明文泄露。 |
| 存储卷(Volume) | 房子里的 “储物间” | 为 Pod 提供持久化存储的抽象(容器删除后数据会丢,Volume 数据不会丢)。 | 解决容器 “数据临时存储” 的问题 —— 比如数据库 Pod 的数据、应用日志,需要持久化到 Volume。 |
| 核心组件(API Server) | 小区物业中心 | K8s 的 “统一入口”,所有操作(创建 Pod、扩容)都通过它执行,相当于 “大脑”。 | 接收并处理用户命令,协调其他组件工作,是 K8s 的核心枢纽。 |
| 一、基础查询(最简单,必学) | kubectl cluster-info | 查看集群核心组件状态 | 查小区物业中心、导航系统是否正常运行 | kubectl cluster-info |
|---|---|---|---|---|
| kubectl get nodes(简称:kubectl get no) | 查看集群节点状态 | 查小区里有几栋楼、每栋楼是否可用 | kubectl get nodes;kubectl get nodes -o wide(看楼的详细信息) |
|
| kubectl get namespaces(简称:kubectl get ns) | 查看所有命名空间 | 查小区里有哪些单元楼(default、kube-system 等) | kubectl get ns |
|
| kubectl get pods(简称:kubectl get po) | 查看当前命名空间 Pod 列表 | 查默认单元楼里有哪些房子、是否入住成功 | kubectl get po;kubectl get po -A(查所有单元楼的房子) |
|
| kubectl get deployments(简称:kubectl get deploy) | 查看当前命名空间 Deployment 列表 | 查默认单元楼里有哪些管家、管着多少房子 | kubectl get deploy;kubectl get deploy -n dev(查 dev 单元楼的管家) |
|
| kubectl get services(简称:kubectl get svc) | 查看当前命名空间 Service 列表 | 查默认单元楼里的房子有哪些固定门牌号 | kubectl get svc;kubectl get svc -n dev(查 dev 单元楼的门牌号) |
|
| kubectl describe <资源类型> < 资源名 > | 查看资源详细信息(排错基础) | 房子 / 管家 / 门牌号出问题?查详细档案(比如房子没建好的原因) | kubectl describe pod nginx-test;kubectl describe deploy nginx-dev |
|
| 二、核心资源操作(常用,基础进阶) | kubectl create namespace <名称>(简称:kubectl create ns < 名称 >) | 创建命名空间 | 新建一个单元楼(比如 dev 单元,专门放开发用的房子) | kubectl create ns dev |
| kubectl run <pod 名> --image=< 镜像 > | 快速创建 Pod(测试用) | 在默认单元楼里建一套临时房子(测试 Nginx) | kubectl run nginx-test --image=nginx:latest |
|
| kubectl create deployment <部署名> --image=< 镜像 > | 创建 Deployment(管理 Pod) | 给默认单元楼配一个管家,让管家管 Nginx 房子 | kubectl create deployment nginx-dev --image=nginx:1.25.0 -n dev |
|
| kubectl scale deployment <部署名> --replicas=< 数量 > | 扩缩容 Pod 数量 | 让管家多管 / 少管几套房(比如从 2 套扩到 3 套) | kubectl scale deployment nginx-dev --replicas=3 -n dev |
|
| kubectl expose <资源类型> < 资源名 > --type=NodePort --port=< 端口 > --target-port=< 容器端口 > | 创建 Service(暴露服务) | 给管家管的房子装固定门牌号(外部能访问) | kubectl expose deployment nginx-dev --type=NodePort --port=80 --target-port=80 -n dev |
|
| kubectl exec -it <pod 名> – < 命令 > | 进入 Pod 交互式终端 | 进房子里串门(查看 Nginx 配置) | kubectl exec -it nginx-test -- /bin/bash |
|
| kubectl delete <资源类型> < 资源名 > | 删除指定资源 | 拆房子 / 辞退管家 / 删门牌号 | kubectl delete pod nginx-test;kubectl delete deploy nginx-dev -n dev |
|
| 三、调试排错(中等常用,问题解决) | kubectl logs <pod 名> | 查看 Pod 日志 | 看房子里的日记(比如 Nginx 报错记录) | kubectl logs nginx-test;kubectl logs -f nginx-test(实时看日记) |
| kubectl get events | 查看集群事件 | 查小区最近的异常记录(比如哪栋楼资源不够、哪套房镜像拉取失败) | kubectl get events;kubectl get events -n dev(查 dev 单元楼的事件) |
|
| kubectl cp <本地路径> <pod 名 >:<pod 路径 > | 本地与 Pod 互传文件 | 给房子里送配置文件(比如把本地 nginx.conf 传到 Pod 里) | kubectl cp ./nginx.conf nginx-test:/etc/nginx/ |
|
| 四、进阶运维(低频,进阶学习) | kubectl set image deployment/<部署名> < 容器名 >=< 新镜像 > | 更新 Pod 镜像(版本升级) | 让管家把房子里的 Nginx 换成新版本(比如 1.26.0) | kubectl set image deployment/nginx-dev nginx=nginx:1.26.0 -n dev |
| kubectl rollout history deployment/<部署名> | 查看 Deployment 更新历史 | 查管家的工作记录(之前换过哪些版本) | kubectl rollout history deployment/nginx-dev -n dev |
|
| kubectl rollout undo deployment/<部署名> | 回滚 Deployment 版本 | 新版本出问题,让管家换回之前的版本 | kubectl rollout undo deployment/nginx-dev -n dev |
|
| kubectl apply -f <yaml 文件> | 通过 YAML 文件创建 / 更新资源 | 用 “图纸” 批量建单元楼 + 管家 + 房子(生产环境标准用法) | kubectl apply -f nginx-deploy.yaml |
|
| kubectl delete -f <yaml 文件> | 通过 YAML 文件删除资源 | 用 “图纸” 批量删除资源 | kubectl delete -f nginx-deploy.yaml |
|
| 五、高级操作(较少用,深入学习) | kubectl label <资源类型> < 资源名 > < 标签名 >=< 标签值 > | 给资源打标签 | 给房子贴标签(比如 “用途 = 测试”),方便筛选管理 | kubectl label pod nginx-test env=test |
| kubectl get pods -l <标签名>=< 标签值 > | 按标签筛选资源 | 只看贴了 “env=test” 标签的房子 | kubectl get pods -l env=test |
|
| kubectl top nodes/pods | 查看节点 / Pod 资源使用率 | 查哪栋楼 / 哪套房的 CPU / 内存不够用 | kubectl top nodes;kubectl top pods -n dev |
|
| kubectl cordon <节点名> | 标记节点不可调度 | 给某栋楼贴 “装修中”,不让新房子建在这里 | kubectl cordon node-1 |
|
| kubectl drain <节点名> | 驱逐节点上的 Pod(节点维护用) | 让某栋楼里的所有房子搬到其他楼(准备修楼) | kubectl drain node-1 --ignore-daemonsets |