K8s 基础与架构
Docker 把应用打成镜像;Kubernetes(K8s)在一群机器上编排这些容器:副本、滚动发布、服务发现、配置挂载。前端/全栈最常碰到的是:仓库里的 Deployment / Service YAML,以及用 kubectl 看 Pod 为什么挂了。
先会看懂声明式清单,比先搭完整集群更重要。本地可用 kind / minikube / Docker Desktop 自带 K8s 练手,选一种即可,下文不绑死工具。
镜像与 Dockerfile 约定见 Docker 基础。
解决什么问题
| 痛点 | K8s 怎么帮 |
|---|---|
单机 docker run 难扩、难自愈 | 声明期望副本数,挂了再拉起来 |
| 多机部署命令不一致 | 同一套 YAML,集群按期望收敛 |
| 服务地址随容器 IP 变 | Service 提供稳定虚 IP / DNS |
| 发布要停机 | Deployment 滚动更新 / 回滚 |
一句话:你描述「期望状态」,控制面负责逼近它。
与 Docker 的关系
| 层次 | 职责 |
|---|---|
| 镜像(Docker / OCI) | 应用怎么打包 |
| 运行时(containerd 等) | 节点上真正跑容器 |
| K8s | 调度到哪台机、几个副本、如何暴露与配置 |
仓库里常同时有 Dockerfile 与 deploy/*.yaml:前者产出镜像,后者描述集群里怎么跑该镜像。
集群长什么样
逻辑上分 控制面(Control Plane) 与 工作节点(Node):
| 组件 | 在哪 | 干什么 |
|---|---|---|
| API Server | 控制面 | 唯一入口;kubectl / 控制器都跟它说话 |
| etcd | 控制面 | 存集群状态(几乎所有对象) |
| Scheduler | 控制面 | 把 Pod 绑到合适 Node |
| Controller Manager | 控制面 | 各种控制器:副本、节点、Endpoint… |
| kubelet | 每个 Node | 在本机按 Pod 规格拉起容器 |
| kube-proxy / CNI | 节点网络 | Service 转发与 Pod 网络(实现因集群而异) |
托管集群(EKS / GKE / ACK 等)里,控制面多半由云厂商管;你日常主要碰 Node、Namespace、工作负载 YAML。
Namespace
Namespace 是集群内的逻辑分区(默认常有 default、kube-system)。
kubectl get ns
kubectl get pods -n default
kubectl config set-context --current --namespace=my-app # 可选:默认 ns
习惯:业务应用不要塞进 kube-system;多环境可用不同 Namespace 或不同集群。
声明式 vs 命令式
| 方式 | 例子 | 适用 |
|---|---|---|
| 命令式 | kubectl run / kubectl create deployment | 临时试一下 |
| 声明式 | 写 YAML → kubectl apply -f | 仓库与 CI 的正经做法 |
团队仓库几乎全是声明式。改完 YAML 再 apply,而不是在线上 kubectl edit 当唯一真相(紧急热修除外,事后要回写清单)。
最小 YAML 结构
几乎所有对象都长这样:
apiVersion: v1 # 或 apps/v1 等
kind: Pod # 资源类型
metadata:
name: hello
namespace: default # 可省略则用当前上下文 ns
labels:
app: hello
spec:
# 该 kind 的规格……
读仓库清单时先看三行:kind、metadata.name、spec 里镜像与端口。
kubectl apply -f deploy.yaml
kubectl get -f deploy.yaml
kubectl delete -f deploy.yaml
先认现场
| 标志 | 含义 | 你通常该怎么做 |
|---|---|---|
deploy/ / k8s/ / manifests/ | 集群清单目录 | 从 Deployment + Service 读起 |
Helm Chart / values.yaml | 模板化打包(本期不展开) | 问清用哪套 values 部署 |
| 仅有 Dockerfile、无 K8s | 可能还在 Compose / 单机 | 对照 Docker 基础 |
CI 里 kubectl apply / GitOps | 发布入口 | 跟流水线,勿只在本机改生产 |
要点
- K8s = 声明式编排;Docker/OCI = 镜像
- 控制面存状态(etcd)并调度;Node 上 kubelet 真正跑容器
- 正经流程是 YAML +
apply,不是一串一次性命令 - 先认
kind/ 镜像 / 端口 / Namespace,再钻高级对象
面试速记
- K8s 和 Docker 什么关系? Docker(或同类)负责镜像与容器运行;K8s 负责多机编排、副本、服务发现与声明式运维。
- 控制面有哪些核心组件? API Server、etcd、Scheduler、Controller Manager。
- etcd 干什么? 持久化集群状态;控制面以它为权威存储。
- 什么是声明式? 提交期望状态,控制器持续调和(reconcile)到该状态。
- Namespace 是隔离边界吗? 是逻辑隔离与权限/配额的边界之一,不是强安全沙箱;网络隔离还需 NetworkPolicy 等。