欢迎光临
我们一直在努力

K8s与Docker核心区别解析

Kubernetes(K8s)和Docker是云原生和容器化领域的核心技术,相关面试题通常涵盖基础概念、架构、核心组件、网络、存储、安全以及运维实践等多个维度。

一、核心概念与架构对比

对比维度DockerKubernetes (K8s)
定位 容器引擎,用于创建、运行和管理单个容器 。 容器编排平台,用于自动化部署、扩展和管理容器化应用 。
核心功能 镜像构建、容器生命周期管理、容器仓库。 服务发现与负载均衡、存储编排、自动部署与回滚、自动扩缩容、自我修复、密钥与配置管理 。
管理对象 镜像(Image)、容器(Container)。 Pod、Deployment、Service、ConfigMap、Secret、Volume 等 。
集群管理 原生支持较弱,需借助 Docker Swarm 实现集群管理。 原生设计即为分布式系统,擅长管理大规模容器集群 。
关系 K8s 的底层运行时之一(可通过 CRI 接口使用 containerd,而 containerd 由 Docker 演化而来)。 使用 Docker(或 containerd)作为其容器运行时,负责上层编排调度 。

二、Docker 核心面试题解析

1. Docker 与虚拟机的本质区别是什么?

Docker 容器与虚拟机(VM)的关键区别在于虚拟化层级和资源开销。

  • 虚拟机:在物理硬件上通过 Hypervisor(如 VMware ESXi, KVM)虚拟出一套完整的客户机操作系统(Guest OS),再在其上运行应用。每个 VM 都包含独立的 OS 内核、系统库和应用程序,资源占用大,启动慢 。
  • Docker 容器:共享宿主机的操作系统内核,通过 Namespace 实现资源(如进程、网络)隔离,通过 Cgroups 实现资源限制(如 CPU、内存)。容器只包含应用及其依赖的库,体积小,启动快(秒级)。

代码示例:运行一个 Nginx 容器。

# 拉取镜像
docker pull nginx:alpine
# 运行容器,映射宿主机80端口到容器80端口
docker run -d –name my-nginx -p 80:80 nginx:alpine

2. Docker 镜像(Image)和容器(Container)的关系?

镜像是容器的静态模板,是一个只读的层叠文件系统(UnionFS)。容器是镜像的运行实例,在镜像的只读层之上,添加了一个可写的容器层(Container Layer)。所有对运行中容器的文件修改都发生在这个可写层,镜像本身保持不变 。

3. 如何优化 Docker 镜像体积?

  • 使用轻量级基础镜像:如 Alpine Linux 替代 Ubuntu。
  • 多阶段构建(Multi-stage Build):在 Dockerfile 中使用多个 FROM 指令,将编译环境和运行环境分离,最终镜像只包含运行所需的文件 。

代码示例:一个 Go 应用的多阶段构建 Dockerfile。

# 第一阶段:构建环境
FROM golang:1.19 AS builder
WORKDIR /app
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -o myapp .

# 第二阶段:运行环境
FROM alpine:latest
RUN apk –no-cache add ca-certificates
WORKDIR /root/
# 从 builder 阶段仅复制编译好的二进制文件
COPY –from=builder /app/myapp .
CMD ["./myapp"]

三、Kubernetes 核心面试题解析

1. Kubernetes 的核心组件及其作用?

一个 K8s 集群主要由控制平面(Master)和工作节点(Node)组成 。

  • 控制平面组件:
    • kube-apiserver:集群的统一入口,所有资源操作的唯一入口,提供 RESTful API 。
    • etcd:分布式键值存储数据库,保存整个集群的状态、配置等所有关键数据,是集群的“大脑” 。
    • kube-scheduler:负责 Pod 的调度,根据资源需求、亲和性等策略,将新创建的 Pod 分配到合适的 Node 上 。
    • kube-controller-manager:运行各种控制器,确保集群的实际状态向期望状态收敛。例如 Node Controller、Deployment Controller 等 。
  • 工作节点组件:
    • kubelet:节点上的“代理”,负责与 API Server 通信,管理本节点 Pod 的生命周期,确保容器健康运行 。
    • kube-proxy:实现 Kubernetes Service 的网络代理和负载均衡,维护节点上的网络规则 。
    • 容器运行时:如 Docker 或 containerd,负责运行容器 。

2. 什么是 Pod?为什么需要 Pod?

Pod 是 K8s 中可以创建和管理的最小、最简单的部署单元。一个 Pod 包含一个或多个共享网络和存储命名空间的容器 。

需要 Pod 的原因:

  • 亲密性协作:为需要紧密耦合、共享资源(如 localhost 网络、共享 Volume)的多个容器提供一个“逻辑主机”。
  • 管理边界:Pod 作为原子调度单位,其内的容器总是被一起调度到同一个节点上。
  • 生命周期一致:Pod 内的容器同时启动、终止,共享生命周期。
  • 代码示例:一个包含主应用容器和 Sidecar 日志收集容器的 Pod 定义片段。

    apiVersion: v1
    kind: Pod
    metadata:
    name: myapp-pod
    spec:
    containers:
    – name: app
    image: myapp:latest
    volumeMounts:
    – name: log-volume
    mountPath: /var/log/myapp
    – name: log-sidecar
    image: fluentd:latest
    volumeMounts:
    – name: log-volume
    mountPath: /var/log/myapp
    volumes:
    – name: log-volume
    emptyDir: {}

    3. Deployment, Service, Ingress 的区别与联系?

    对象作用关注点
    Deployment 定义 Pod 的期望状态(副本数、镜像版本等),并提供滚动更新和回滚能力。 应用部署与更新。
    Service 为一组功能相同的 Pod(通常由 Deployment 管理)提供一个稳定的网络端点(ClusterIP、NodePort、LoadBalancer),实现服务发现和负载均衡 。 内部服务访问与负载均衡。
    Ingress 是集群内服务对外暴露的 HTTP/HTTPS 路由规则的集合。它本身不是服务,而是通过配置规则,将外部流量路由到不同的 Service。通常需要 Ingress Controller(如 nginx-ingress)来实现 。 外部访问与路由管理(7层)。

    联系:Ingress -> Service -> Deployment -> Pod。外部用户通过 Ingress 访问,Ingress 将流量导向对应的 Service,Service 再将流量负载均衡到后端由 Deployment 管理的多个 Pod 副本上。

    4. 如何实现应用配置管理?

    K8s 提供了 ConfigMap 和 Secret 对象来将配置信息与容器镜像解耦。

    • ConfigMap:用于存储非机密的、键值对形式的配置数据(如配置文件、环境变量)。
    • Secret:用于存储敏感信息(如密码、令牌、密钥),数据以 Base64 编码存储(默认),提供一定程度的保护 。

    代码示例:在 Deployment 中使用 ConfigMap 设置环境变量。

    apiVersion: v1
    kind: ConfigMap
    metadata:
    name: app-config
    data:
    LOG_LEVEL: "INFO"
    MAX_CONNECTIONS: "100"

    apiVersion: apps/v1
    kind: Deployment
    metadata:
    name: myapp-deployment
    spec:
    template:
    spec:
    containers:
    – name: app
    image: myapp:latest
    env:
    – name: LOG_LEVEL # 容器内的环境变量名
    valueFrom:
    configMapKeyRef:
    name: app-config # 引用的ConfigMap名称
    key: LOG_LEVEL # 引用的键

    5. 简述 K8s 服务发现的机制?

    K8s 中有两种主要的服务发现方式:

  • 环境变量:当 Pod 被创建时,kubelet 会为当前命名空间中所有活跃的 Service 在 Pod 中注入一组环境变量(如 SERVICE_NAME_SERVICE_HOST)。这种方式简单,但依赖创建顺序,且只在 Pod 内有效 。
  • DNS(推荐):集群核心组件 CoreDNS 会为 Service 和 Pod 创建 DNS 记录。在 Pod 内部,可以通过 ..svc.cluster.local 的形式访问 Service。这是最灵活和推荐的方式 。
  • 四、综合与运维实践

    1. 如何排查 Pod 一直处于 Pending 状态?

  • kubectl describe pod <pod-name>:查看 Pod 的详细事件(Events),通常会直接提示原因,如资源不足、节点选择器不匹配等。
  • kubectl get nodes:检查节点状态是否都为 Ready。
  • 检查资源配额:kubectl describe quota -n <namespace>。
  • 检查持久化卷声明(PVC)是否绑定成功:kubectl get pvc。
  • 2. K8s 的滚动更新(Rolling Update)是如何工作的?

    由 Deployment 控制器管理。当更新 Pod 模板(如镜像版本)时,Deployment 会逐步用新版本的 Pod 替换旧版本的 Pod,确保在更新过程中始终有指定数量的 Pod 可用,不影响服务 。可以通过 strategy.rollingUpdate.maxUnavailable 和 maxSurge 字段控制更新节奏。

    3. 什么是 ETCD?它在 K8s 中起什么作用?

    ETCD 是一个分布式、强一致性的键值存储系统,基于 Raft 一致性算法实现高可用 。在 K8s 中,ETCD 作为集群的“唯一数据源”,存储着所有集群状态数据,包括节点信息、Pod 信息、Service、ConfigMap、Secret 以及各种对象的期望状态和实际状态。API Server 是所有组件与 ETCD 交互的中介 。其高可用性对集群的稳定至关重要。


    参考来源

    • 【k8s面试】超详细kubernetes面试题总结,面试必问!(附200道K8s Docker面试真题+答案详解
    • 【k8s面试】超详细kubernetes面试题总结,面试必问!(附200道K8s/Docker面试真题+答案详解)
    • 面试之—K8S、Docker面试题整理
    • 【k8s面试】超详细kubernetes面试题总结,面试必问!(附200道K8s Docker面试真题+答案详解(2)
    • 【k8s面试】超详细kubernetes面试题总结,面试必问!(附200道K8s Docker面试真题+答案详解(1)
    • java程序设计第四版清华大学出版社答案

     

    赞(0)
    未经允许不得转载:171主机测评 » K8s与Docker核心区别解析
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址