Skip to main content

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调度到哪台机、几个副本、如何暴露与配置

仓库里常同时有 Dockerfiledeploy/*.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 是集群内的逻辑分区(默认常有 defaultkube-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 的规格……

读仓库清单时先看三行:kindmetadata.namespec 里镜像与端口。

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发布入口跟流水线,勿只在本机改生产

要点

  1. K8s = 声明式编排;Docker/OCI = 镜像
  2. 控制面存状态(etcd)并调度;Node 上 kubelet 真正跑容器
  3. 正经流程是 YAML + apply,不是一串一次性命令
  4. 先认 kind / 镜像 / 端口 / Namespace,再钻高级对象

面试速记

  1. K8s 和 Docker 什么关系? Docker(或同类)负责镜像与容器运行;K8s 负责多机编排、副本、服务发现与声明式运维。
  2. 控制面有哪些核心组件? API Server、etcd、Scheduler、Controller Manager。
  3. etcd 干什么? 持久化集群状态;控制面以它为权威存储。
  4. 什么是声明式? 提交期望状态,控制器持续调和(reconcile)到该状态。
  5. Namespace 是隔离边界吗? 是逻辑隔离与权限/配额的边界之一,不是强安全沙箱;网络隔离还需 NetworkPolicy 等。