容器和 k8s 入门

2025-11-02T14:11:02+08:00 | 4分钟阅读 | 更新于 2025-11-02T14:11:02+08:00

@

容器底层技术栈

容器不是虚拟机,而是基于 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 是定义容器镜像构建过程的脚本。生产环境中应遵循以下最佳实践:

  1. 选择合适的基础镜像:优先使用官方精简镜像,如 golang:1.21-alpinedistroless 等。
  2. 多阶段构建:将编译阶段与运行阶段分离,减少最终镜像体积。
  3. 合理分层与缓存:将不常变化的依赖安装放在前面,提高构建缓存命中率。
  4. 非 root 运行:通过 USER 指令降低容器内权限。
  5. 只复制必要文件:使用 .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。典型结构包含 apiVersionkindmetadataspec 四个部分。

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 开发和可观测性领域的必备基础。

About Me

没什么想介绍的,一个很大众的码农…

喜欢代码,车,马,真的是 🐎

讨厌别人让我给自己的代码写注释 最厌烦别人的程序没有写注释

目标

学AI,加油!加油!