k8s是啥?
Kubernetes(常写作 k8s)是什么?
Kubernetes(读作 “koo‑ber‑net‑es”)是一个 开源的容器编排(orchestration)平台,用来 自动化部署、扩缩容、管理和监控 运行在 容器(Container) 里的应用。
“k8s” 是 K + 8 个字母(ubernete)+ s 的缩写,常被写作 k8s。
1️⃣ 为什么会出现 Kubernetes?
|
场景 |
传统做法 |
产生的问题 |
| 多实例部署 |
手动 |
难以统一配置、版本不一致、运维成本高 |
| 弹性伸缩 |
手动启动/停止容器 |
响应慢、资源浪费 |
| 服务发现/负载均衡 |
手动配置 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)
+---------------------------+
| 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)
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)
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 应用到集群
# 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) |
集中化日志查询 |
| 服务网格 | 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。 |
| Horizontal Pod Autoscaler (HPA) 的工作原理? |
HPA 通过 Metrics Server 读取 CPU、内存或自定义指标,计算目标副本数,然后更新对应 Deployment/ReplicaSet 的 |
| etcd 在集群中的作用? |
负责持久化 所有集群状态(对象元数据、配置),为控制平面提供强一致性的 KV 存储。 |
| kubectl apply 与 kubectl replace 的区别? | apply
是 声明式:只发送差异(patch),适合持续迭代; |
| 什么是 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 = “把一堆容器当作一台自愈的、可伸缩的、可观测的超级服务器”。
更多推荐
所有评论(0)