Kubernetes(常写作 k8s)是什么?
Kubernetes (读作 "koo‑ber‑net‑es" )是一个 开源的容器编排(orchestration)平台 ,用来 自动化部署、扩缩容、管理和监控 运行在 容器(Container) 里的应用。
"k8s" 是 K + 8 个字母(ubernete )+ s 的缩写,常被写作 k8s。
1️⃣ 为什么会出现 Kubernetes?
| 场景 | 传统做法 | 产生的问题 |
|---|---|---|
| 多实例部署 | 手动 docker run 多次 |
难以统一配置、版本不一致、运维成本高 |
| 弹性伸缩 | 手动启动/停止容器 | 响应慢、资源浪费 |
| 服务发现/负载均衡 | 手动配置 Nginx/HAProxy | 配置繁琐、故障恢复慢 |
| 滚动升级 | 逐台手动升级 | 中断风险、回滚困难 |
| 故障自愈 | 手动检查容器状态 | 监控/恢复不及时 |
| [ ] |
Kubernetes 把这些功能 统一抽象 成一套 声明式 API,只要描述期望的状态,控制平面会自动把真实状态调到期望状态。
2️⃣ 核心概念(最常用的对象)
| 对象 | 作用 | 常见用途 |
|---|---|---|
| Node | 集群中的一台机器(VM 或裸金属),运行 kubelet 与 container runtime(Docker、containerd、CRI‑O) | 物理/虚拟资源的提供者 |
| Pod | Kubernetes 最小可调度单元,一组共享网络/存储的容器(通常 1‑2 个) | 业务容器、sidecar(日志、代理) |
| ReplicaSet | 保证 Pod 副本数 始终等于声明的数目 | 实现水平扩缩容 |
| Deployment | 对 ReplicaSet 进行声明式管理,提供 滚动升级、回滚 等功能 | 生产环境的主流部署方式 |
| Service | 为一组 Pod 提供 稳定的网络入口(ClusterIP、NodePort、LoadBalancer、ExternalName) | 内部服务发现、外部访问 |
| Ingress | 基于 HTTP/HTTPS 的 路由层 ,配合 Ingress‑Controller(如 Nginx、Traefik)实现 URL 路由、TLS 终止 | 对外提供 Web/API |
| ConfigMap / Secret | 把 配置文件 、环境变量 、敏感信息 注入 Pod | 配置分离、密码管理 |
| StatefulSet | 为有状态服务(数据库、Kafka)提供 稳定的网络标识、持久卷 | 有状态服务 |
| DaemonSet | 在每个 Node 上运行 同一个 Pod(日志收集、监控代理) | 节点级守护进程 |
| Job / CronJob | 一次性任务 或 定时任务 | 批处理、定时备份 |
| PersistentVolume (PV) / PersistentVolumeClaim (PVC) | 抽象存储资源(NFS、Ceph、云盘) | 持久化数据卷 |
| Namespace | 多租户/业务隔离的 逻辑分区 | 多团队共用同一集群 |
| [ ] |
3️⃣ 体系结构(Control Plane + Node)
go
+---------------------------+
| kube-apiserver (REST API)|
+------------+--------------+
|
+-------------------+-------------------+
| | |
+-------v------+ +--------v------+ +--------v------+
| controller- | | scheduler | | etcd (kv store)|
| manager | | (assign Pods)| +----------------+
+--------------+ +---------------+
(Control Plane -- 负责全局决策、状态存储)
|
| kubelet + container runtime
v
+-------------------+ +-------------------+
| Node 1 (worker) | | Node 2 (worker) |
| kubelet | | kubelet |
| container runtime | | container runtime |
+-------------------+ +-------------------+
-
• kube-apiserver :所有资源的统一入口,提供
kubectl、Dashboard、CI/CD 等客户端的 API。 -
• etcd :高可用的 键值存储,持久化集群状态(Pod、ConfigMap、Secret 等)。
-
• controller‑manager :一组控制器(ReplicaSet、Deployment、Job...)不断对比 期望状态 vs. 实际状态,并做出相应动作。
-
• scheduler:把新建的 Pod 绑定到合适的 Node(考虑资源、亲和性、拓扑等因素)。
-
• kubelet (在每个 Node 上)负责 监控本机容器、执行指令、上报状态。
-
• container runtime:实际启动容器的组件(Docker、containerd、CRI‑O、gVisor 等)。
4️⃣ 常见使用场景
| 场景 | 典型解决方案 |
|---|---|
| 微服务 | 用 Deployment + Service + Ingress 组合,实现弹性、灰度发布、流量路由。 |
| 大数据 / 机器学习 | 通过 Kubeflow 、Argo Workflows 编排训练任务,利用 GPU Node 自动调度。 |
| CI/CD | GitLab、Jenkins、GitHub Actions 把 CI 产物 (Docker 镜像)直接 kubectl apply 到测试/生产环境。 |
| 边缘/IoT | 轻量化发行版 k3s / MicroK8s 在树莓派、边缘服务器上运行。 |
| 多租户 SaaS | 用 Namespace + ResourceQuota + NetworkPolicy 隔离不同客户的资源。 |
| 无服务器(Serverless) | Knative 、OpenFaaS 、Kubeless 把函数映射为短生命周期的 Pod。 |
| 灾备/多集群 | Cluster Federation 、Velero 进行跨集群备份、恢复、同步。 |
| [ ] |
5️⃣ 与其他容器编排工具的对比
| 特性 | Kubernetes | Docker Swarm | Apache Mesos | Nomad |
|---|---|---|---|---|
| 成熟度 | 最高(CNCF 项目) | Docker 官方入门版 | 早期大规模作业调度 | HashiCorp 轻量化 |
| 生态 | 丰富(Helm、Istio、Prometheus、Knative、Kubeflow 等) | 较少(Compose、Stack) | 较少(Marathon) | 中等(Consul、Vault) |
| 扩展性 | 插件化(CRD、Webhook) | 限制较多 | 通过框架扩展 | 简单插件 |
| 多租户 | Namespace + RBAC + NetworkPolicy | 基本不支持 | 支持但复杂 | 支持 |
| 水平伸缩 | 自动 HPA/VPA + Cluster Autoscaler | 手动 | 手动/脚本 | 手动 |
| 学习曲线 | 陡峭 | 平缓 | 中等 | 中等 |
| 生产案例 | 谷歌、亚马逊、微软、阿里、腾讯、华为等 | 小型团队、开发环境 | 大规模批处理 | 中小企业、边缘计算 |
| [ ] |
结论 :如果你需要 高可用、弹性伸缩、复杂服务网格、跨云/多租户 ,Kubernetes 是业界事实标准。Docker Swarm 适合快速上手、实验性 场景;k3s、MicroK8s 则是 轻量版 ,适合 边缘/IoT 或 本地开发。
6️⃣ 快速上手示例(最小的 Hello‑World)
6.1 创建一个 Deployment(hello.yaml)
go
apiVersion: apps/v1
kind:Deployment
metadata:
name:hello-deploy
labels:
app:hello
spec:
replicas:3 # 3 个副本
selector:
matchLabels:
app:hello
template:
metadata:
labels:
app:hello
spec:
containers:
-name:hello
image:nginx:alpine # 任意容器镜像
ports:
-containerPort: 80
6.2 公开 Service(ClusterIP → NodePort)
go
apiVersion: v1
kind:Service
metadata:
name:hello-svc
spec:
type:NodePort # 暴露到宿主机端口
selector:
app:hello
ports:
-port:80 # Pod 内部端口
targetPort:80
nodePort:30080 # 主机上 30080 端口可访问
6.3 应用到集群
go
# 1. 连接到你的 k8s 集群(kubectl 已配置好)
kubectl apply -f hello.yaml
# 2. 查看运行状态
kubectl get pods -l app=hello
kubectl get svc hello-svc
# 3. 在浏览器访问节点 IP + 30080,即可看到 Nginx 默认页面
只需 几行 YAML ,Kubernetes 自动完成 调度、拉取镜像、启动容器、负载均衡。
7️⃣ 常用工具生态
| 类别 | 常见工具 | 作用 |
|---|---|---|
| 包管理 | Helm 、Kustomize | 把一组 YAML 打包、模板化、版本化 |
| 监控 & 可观测 | Prometheus 、Grafana 、Thanos 、OpenTelemetry | 指标、日志、追踪 |
| 日志聚合 | EFK (Elasticsearch‑Fluentd‑Kibana) Loki + Grafana | 集中化日志查询 |
| 服务网格 | Istio 、Linkerd 、Consul Connect | 流量管理、熔断、mTLS |
| CI/CD | Argo CD 、Flux 、Jenkins X | GitOps 自动化部署 |
| 安全 | OPA / Gatekeeper 、Kube‑bench 、Kubescape | 策略审计、合规检查 |
| 存储 | Rook 、OpenEBS 、CSI 插件(AWS EBS、GCE PD、Azure Disk) | 动态供给持久卷 |
| 服务器无状态 | Knative 、OpenFaaS 、KEDA | 自动伸缩的函数/事件驱动工作负载 |
| 轻量发行版 | k3s 、MicroK8s 、kind(在 Docker 中跑) | 本地开发、边缘、CI 测试 |
| [ ] |
8️⃣ 常见面试/学习问题(简短答案)
| 问题 | 简要回答 |
|---|---|
| Kubernetes 的核心目标是什么? | 提供 声明式、自动化 的容器编排平台,负责 部署、伸缩、恢复、服务发现 等全生命周期管理。 |
| Pod 与 Container 有何区别? | Pod 是 Kubernetes 调度的最小单元,一组 共享网络/存储 的容器;Container 是实际运行的进程实例。 |
| 什么是 Service 的 ClusterIP、NodePort、LoadBalancer? | ClusterIP :仅集群内部可访问的虚拟 IP。 NodePort :在每个节点上打开固定端口,外部可通过 <NodeIP>:<NodePort> 访问。 LoadBalancer:在云平台上自动创建外部负载均衡器(ELB/ALB),提供公网 IP。 |
| Horizontal Pod Autoscaler (HPA) 的工作原理? | HPA 通过 Metrics Server 读取 CPU、内存或自定义指标,计算目标副本数,然后更新对应 Deployment/ReplicaSet 的 spec.replicas。 |
| etcd 在集群中的作用? | 负责持久化 所有集群状态(对象元数据、配置),为控制平面提供强一致性的 KV 存储。 |
| kubectl apply 与 kubectl replace 的区别? | apply 是 声明式 :只发送差异(patch),适合持续迭代;replace 会 完整覆盖 目标对象,可能导致临时中断。 |
| 什么是 DaemonSet? | 确保 每个 Node (包括新加入的)上运行 相同的 Pod,常用于日志、监控、网络插件等守护进程。 |
| 如何实现滚动升级? | 使用 Deployment:K8s 会逐步创建新 Pod,等待就绪后删除旧 Pod,保持期望副本数不变,实现无停机升级。 |
| Kubernetes 中的 Namespace 有哪些作用? | 逻辑隔离资源、配额管理(ResourceQuota)、RBAC 权限划分、简化名称冲突。 |
| k3s 与原生 Kubernetes 的区别? | k3s 是轻量化发行版,去掉了很多 Alpha/扩展组件,二进制仅 ~40 MB,适合边缘、IoT、开发环境。功能上兼容全部 K8s API。 |
| [ ] |
9️⃣ 小结
-
• Kubernetes(k8s) 是 容器编排的事实标准 ,提供 声明式 API 、自愈 、弹性伸缩 、服务发现 与 丰富生态。
-
• 核心概念 Node / Pod / Deployment / Service / Ingress 等帮助我们把 微服务 抽象为 可扩展、可管理 的单元。
-
• 通过 Helm、GitOps、服务网格、监控/日志 等配套工具,k8s 可以支撑 从单机开发到大规模生产 的全链路。
-
• 对于 小型/边缘 环境,k3s、MicroK8s、kind 提供轻量化的本地/嵌入式版本;而 Docker Swarm 则更适合 快速入门,但在功能和生态上远不如 k8s。
只要掌握 YAML 声明 、kubectl 基本命令 与 控制平面/工作节点的职责划分 ,就能在几分钟内部署一个可弹性伸缩的服务,随后再逐步引入 Helm、Prometheus、Istio 等进阶组件,构建完整的云原生平台。
一句话概括 :
Kubernetes = "把一堆容器当作一台自愈的、可伸缩的、可观测的超级服务器"。