容器底层技术栈
容器不是虚拟机,而是基于 Linux Namespace、Cgroups、UnionFS 等技术实现的进程级隔离。云原生场景下常见的容器运行时包括:
| 组件 | 定位 | 说明 |
|---|---|---|
| Docker | 容器平台 | 提供 CLI、镜像构建、容器生命周期管理等完整体验 |
| containerd | 高级容器运行时 | 从 Docker 中剥离,专注容器管理,K8s 默认使用 |
| CRI-O | 轻量容器运行时 | 专为 Kubernetes CRI 设计,兼容 OCI 标准 |
| runc | 低级容器运行时 | OCI 参考实现,负责真正创建和运行容器进程 |
Kubernetes 1.24 之后移除了 dockershim,直接使用 containerd 等符合 CRI(Container Runtime Interface)的运行时。理解这一分层,有助于排查镜像拉取、容器启动、资源限制等实际问题。
Dockerfile 生产最佳实践
Dockerfile 是定义容器镜像构建过程的脚本。生产环境中应遵循以下最佳实践:
- 选择合适的基础镜像:优先使用官方精简镜像,如
golang:1.21-alpine、distroless等。 - 多阶段构建:将编译阶段与运行阶段分离,减少最终镜像体积。
- 合理分层与缓存:将不常变化的依赖安装放在前面,提高构建缓存命中率。
- 非 root 运行:通过
USER指令降低容器内权限。 - 只复制必要文件:使用
.dockerignore避免将敏感文件打入镜像。
# 多阶段构建示例
FROM golang:1.21 AS builder
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -o server .
FROM gcr.io/distroless/static-debian11
WORKDIR /app
COPY --from=builder /app/server .
USER nonroot:nonroot
EXPOSE 8080
ENTRYPOINT ["./server"]
本地 Kubernetes 集群搭建
本地学习 K8s 的常用方案有:
- minikube:跨平台单节点 K8s,适合初学者。
- kind(Kubernetes IN Docker):用 Docker 容器模拟多节点集群,CI 与本地测试常用。
- k3s/k3d:轻量级发行版,资源占用低,适合边缘与本地开发。
- Docker Desktop:自带单节点 K8s,开箱即用。
以 kind 为例,创建一个多节点集群:
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
- role: worker
- role: worker
执行 kind create cluster --config kind-config.yaml 即可拉起集群。
K8s 核心资源
Kubernetes 通过声明式 API 管理应用生命周期。核心资源可分为四类:
工作负载
- Pod:最小调度单元,包含一个或多个容器。
- Deployment:管理无状态应用,支持滚动更新与副本控制。
- StatefulSet:管理有状态应用,提供稳定网络标识与持久存储。
- DaemonSet:每个节点运行一个 Pod,适合日志、监控代理。
- Job / CronJob:一次性或定时任务。
网络
- Service:ClusterIP、NodePort、LoadBalancer、ExternalName 四种类型。
- Ingress / IngressClass:七层流量入口,通常配合 NGINX、Traefik 使用。
- NetworkPolicy:定义 Pod 间网络访问策略。
配置
- ConfigMap:存储非敏感配置。
- Secret:存储敏感信息,如密码、Token。
- ** downwardAPI**:将 Pod/Node 元数据注入容器。
存储
- PersistentVolume(PV):集群层面的存储资源。
- PersistentVolumeClaim(PVC):用户申请存储的接口。
- StorageClass:动态供应存储模板。
应用交付:YAML、Manifest、Helm、Kustomize
YAML / Manifest
K8s 资源以 YAML 形式描述,称为 Manifest。典型结构包含 apiVersion、kind、metadata、spec 四个部分。
Helm
Helm 是 K8s 的包管理工具,通过 Chart 将一组资源模板化。核心概念:
- Chart:应用包目录。
- Template:使用 Go template 渲染 YAML。
- Values:参数化配置。
- Release:Chart 部署到集群后的实例。
helm create myapp
helm install myapp ./myapp -f values-prod.yaml
Kustomize
Kustomize 通过 overlay 方式管理不同环境的配置差异,无需模板语言。典型目录结构:
base/
deployment.yaml
kustomization.yaml
overlays/
dev/
kustomization.yaml
replica-patch.yaml
prod/
kustomization.yaml
replica-patch.yaml
Helm 适合需要复杂参数化与版本分发的场景;Kustomize 更适合环境差异化管理,两者也可结合使用。
总结
容器与 Kubernetes 是云原生架构的基石。掌握容器运行时原理、Dockerfile 构建技巧、K8s 核心资源模型,以及 Helm/Kustomize 等交付工具,是进入 AIOps、Operator 开发和可观测性领域的必备基础。