JAVA:Kubernetes 常见面试题的技术指南

admin
5
2025-08-15

1. 什么是 Kubernetes?它解决了哪些问题?

答:Kubernetes 是一个开源的容器编排平台,用于自动化容器化应用的部署、管理、扩展和网络配置。
Kubernetes 解决的问题包括:

🔹 容器的自动化部署与管理

🔹 应用的高可用性与负载均衡

🔹 资源利用优化和动态扩展

🔹 服务发现与网络通信

🔹 自动化故障恢复

image-gh16.png


2. 什么是 Pod?

答:Pod 是 Kubernetes 中的最小部署单元,它封装了一个或多个容器。

🔹 Pod 中的容器共享网络(如 IP 地址)和存储卷。

🔹 一个 Pod 通常用于运行单个应用容器,但也可以用于运行紧密相关的多个容器。


3. 什么是 Namespace?它有什么作用?

答:Namespace 是 Kubernetes 中的逻辑隔离单位,用于在同一个集群中创建多个虚拟的资源隔离环境。

🔹 实现资源隔离(例如开发、测试、生产环境分离)。

🔹 便于管理和组织大量资源。

🔹 配合资源配额(Resource Quota)限制不同 Namespace 的资源使用。


4. Kubernetes 中的 Deployment 是什么?它的作用是什么?

答:Deployment 是一种 Kubernetes 控制器,用于管理 Pod 和 ReplicaSet 的声明式更新。

🔹 定义应用的期望状态(如运行的 Pod 副本数量)。
🔹 支持滚动更新(Rolling Update)和回滚(Rollback)。
🔹 保证应用的高可用性。


5. 如何在 Kubernetes 中实现负载均衡?

答:Kubernetes 提供多种方式实现负载均衡:

🔹 ClusterIP(默认): 在集群内分配一个虚拟 IP 地址供其他 Pod 访问。

🔹 NodePort: 通过每个节点的指定端口暴露服务。

🔹 LoadBalancer: 使用云服务提供商的负载均衡器暴露服务。

🔹 Ingress: 提供基于 HTTP/HTTPS 的负载均衡和路由规则。


6. 什么是 ConfigMap 和 Secret?它们的区别是什么?

答:ConfigMap: 用于存储非敏感配置信息(如环境变量、配置文件)。Secret: 用于存储敏感信息(如密码、API 密钥)。
🔹 ConfigMap 数据是明文存储的,而 Secret 数据是经过 base64 编码的。

🔹 Secret 适合存储需要加密或权限管理的敏感数据。


7. 如何对 Pod 进行水平扩展(Horizontal Scaling)?

答:可以使用以下方法进行 Pod 水平扩展:

手动扩展: 使用 kubectl scale 命令,例如:

kubectl scale deployment <deployment-name> --replicas=5

自动扩展: 使用 Horizontal Pod Autoscaler (HPA),根据 CPU、内存或自定义指标自动调整副本数。例如:

kubectl autoscale deployment <deployment-name> --min=1 --max=10 --cpu-percent=50

8. 什么是 StatefulSet?它与 Deployment 的区别是什么?

答:StatefulSet 是一种 Kubernetes 控制器,专门用于管理有状态应用。与 Deployment 的区别:

🔹 StatefulSet 确保 Pod 有固定的标识(如 Pod 名称、网络标识)。

🔹 StatefulSet 支持有序部署和扩展。

🔹 StatefulSet 为每个 Pod 分配独立的持久存储卷(PersistentVolume)。
适用场景:有状态数据库(如 MySQL、MongoDB)、缓存(如 Redis)。


9. Kubernetes 如何处理 Pod 的故障?

答:Kubernetes 提供以下机制处理 Pod 故障:

🔹 Liveness Probe 和 Readiness Probe: 定期检查容器健康状态,不健康时自动重启容器或将其从服务流量中移除。

🔹 ReplicaSet: 确保 Pod 副本数量。如果 Pod 失败,ReplicaSet 会创建新的 Pod 替代。

🔹 Node 故障检测: 如果节点不可用,Kubernetes 会将 Pod 调度到其他可用节点


10. 什么是 Kubernetes 的网络模型?有哪些特点?

答:Kubernetes 的网络模型提供了以下关键特点:

🔹 每个 Pod 都有一个独立的 IP 地址。

🔹 Pod 间可以直接通过 IP 进行通信,无需 NAT。

🔹 Pod 和 Service 的通信通过 ClusterIP、NodePort 或 Ingress 实现。

🔹 Kubernetes 通常使用 CNI(Container Network Interface)插件(如 Flannel、Calico、Weave Net)实现网络模型。


11. 如何保障 Kubernetes 集群的安全性?

🔹 认证与授权: 使用 RBAC 控制用户和服务的访问权限。

🔹 网络策略: 使用 NetworkPolicy 限制 Pod 之间的通信。

🔹 加密通信: 确保 API Server 与其他组件之间的通信是加密的(使用 TLS)。

🔹 安全上下文: 定义 Pod 或容器的安全上下文,例如限制运行特权容器。

🔹 定期更新: 确保集群和容器镜像使用最新版本以避免已知漏洞


12. 如何调试一个崩溃的 Pod?

答:可以使用以下步骤调试:

查看 Pod 的事件:

kubectl describe pod <pod-name>

查看容器的日志:

kubectl logs <pod-name> -c <container-name>

如果容器重启频繁,可以加 --previous 参数查看之前的日志:

kubectl logs <pod-name> --previous

进入容器排查问题:

kubectl exec -it <pod-name> -- /bin/bash

13. Pod 是通过什么暴露端口的?

答:在 Kubernetes 中,Pod 暴露端口主要通过以下方式实现:
🔹 Pod 本身不直接对外暴露端口,必须借助 Service、Ingress 或特殊网络配置(如 HostPort)。

🔹 通过 Service 管理四层网络流量(如 TCP/UDP),是最常见的方式。

🔹 Ingress 适合需要基于域名或路径的复杂 HTTP 路由场景。

🔹 HostPort 和 HostNetwork 是特定场景下的备用方案,但一般不推荐使用。


14. Kubernetes 中如何实现多租户架构?

答:多租户架构可以通过以下方式实现:

🔹 Namespace 隔离: 为每个租户创建单独的 Namespace。

🔹 RBAC 权限控制: 配置租户对 Namespace 的资源访问权限。

🔹 资源配额: 使用 ResourceQuota 限制每个租户的资源使用量。

🔹 网络隔离: 使用 NetworkPolicy 限制 Pod 间的跨租户通信。


15. Kubernetes 的优缺点是什么?

优点:

🔹 自动化部署和管理容器。

🔹 支持滚动更新和回滚。

🔹 提供弹性扩展能力。

🔹 强大的社区支持和广泛的生态系统。

缺点:

🔹 学习曲线陡峭。

🔹 初始部署和配置较为复杂。

🔹 对资源的消耗较大,可能需要较高的硬件要求。


16. Kubernetes 图形管理界面有哪些?

答:可以根据问题描述和需求推荐工具,并着重分析其适用场景。例如:

🔹 小型集群或单集群:推荐 Kubernetes Dashboard 或 Lens。

🔹 企业级多集群管理:推荐 Rancher 或 KubeSphere 。

🔹 调试和开发场景:推荐 Octant 或 K9s。

🔹 GitOps 流程:推荐 Argo CD。


17. service和ingress有什么区别?

🔹 强调 Service 是基础组件,主要作用是暴露 Pod 和实现内部通信。

🔹 说明 Ingress 解决的是复杂 HTTP 路由场景,灵活性更高但需要依赖 Ingress Controller。

🔹 用具体例子说明使用场景(如 Ingress 适合电商网站的多域名路由,Service 适合微服务内部通信)。

🔹 补充说明 Ingress 和 Service 是互补的,比如 Ingress 后端仍然依赖 Service 进行流量分发。

特性 Service Ingress
作用 暴露 Pod,提供网络访问的统一入口。 管理外部请求到集群内部服务的路由规则。
工作层级 四层(基于 TCP/UDP 的传输层)。 七层(基于 HTTP/HTTPS 的应用层)。
负载均衡 支持简单的四层负载均衡(ClusterIP、NodePort、LoadBalancer)。 提供基于域名、路径的七层负载均衡和路由规则。
类型 ClusterIP、NodePort、LoadBalancer、ExternalName。 只定义了一种资源类型:Ingress。
主要功能 暴露和连接 Pod。 内部服务发现和负载均衡。 基于路径或主机名的路由。提供 HTTPS 终结点。
依赖组件 无(可以直接使用) 需要依赖 Ingress Controller(如 NGINX、Traefik)
典型使用场景 内部微服务通信。对外暴露简单四层服务。 对外暴露复杂的 Web 服务,基于域名或路径进行路由

18. 解释 Kubernetes 中的 ETCD,它的作用是什么?

答:ETCD 是 Kubernetes 的分布式键值存储系统,负责保存整个集群的配置和状态信息。
作用:

🔹 存储 Kubernetes 的所有资源对象,如 Pod、Service、Deployment 等。

🔹 支持集群高可用性和状态一致性。

🔹 是 API Server 的后端存储,用于管理集群状态。

安全注意点:

🔹 备份与恢复: 定期备份 ETCD 数据,以应对灾难恢复场景。

🔹 加密通信: 确保 ETCD 使用 TLS 加密。


19. 描述 Kubernetes 中的三种存储类型及其区别?

临时存储(EmptyDir):

🔹 Pod 生命周期内的数据存储。
🔹 Pod 删除时数据会丢失。
🔹 适用于临时缓存数据的场景。

持久存储(PersistentVolume, PV):

🔹 与集群生命周期无关的持久化存储。
🔹 支持网络存储(如 NFS、Ceph)。

动态存储(Dynamic Provisioning):

🔹 基于 StorageClass 动态创建 PersistentVolume。
🔹 自动化资源分配,减少人工操作。


20. Kubernetes 中如何排查节点无法调度的问题?

答:当节点无法调度时,可以通过以下步骤排查:

检查节点状态:

kubectl get nodes

状态可能为 NotReady 或 SchedulingDisabled。

查看详细描述:

kubectl describe node <node-name>

检查是否存在磁盘压力(DiskPressure)、内存压力(MemoryPressure)或 PID 压力(PIDPressure)。

检查 kubelet 和容器运行时:

检查 kubelet 是否正常运行:

systemctl status kubelet

查看容器运行时日志(如 Docker):

journalctl -u docker

如果是 Taints 问题:

查看节点的污点(Taint):

kubectl describe node <node-name> | grep Taint

如果 Pod 没有 Tolerations,可能会被阻止调度。


21. Kubernetes 如何处理应用回滚?

答:Kubernetes 的回滚功能由 Deployment 控制器实现。

使用 kubectl rollout undo 命令实现回滚:

kubectl rollout undo deployment/<deployment-name>

查看历史记录:

kubectl rollout history deployment/<deployment-name>

如果需要回滚到特定版本:

kubectl rollout undo deployment/<deployment-name> --to-revision=<revision-number>

22. Kubernetes 中的 CronJob 是什么?如何实现定时任务?

答:CronJob 是 Kubernetes 中用于周期性运行任务的资源。定时执行任务,例如备份数据库、清理临时文件。

apiVersion: batch/v1
kind: CronJob
metadata:
  name: sample-cronjob
spec:
  schedule: "0 0 * * *"  # 定义时间规则
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: sample-task
            image: busybox
            args:
            - /bin/sh
            - -c
            - date; echo "Hello from the Kubernetes CronJob"
          restartPolicy: OnFailure

检查任务状态:

kubectl get cronjob
kubectl get job

23. 什么是 DaemonSet?与 Deployment 有何不同?

答:DaemonSet 是 Kubernetes 中的一种控制器,用于在每个节点上运行一个 Pod 副本。

Deployment:

🔹 按需扩展 Pod 副本,分布在所有节点上。

🔹 适用于无状态或有状态应用的部署。

DaemonSet:

🔹 每个节点只有一个 Pod 副本。

🔹 适用于需要节点级别操作的场景(如日志收集、监控)

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: node-exporter
spec:
  selector:
    matchLabels:
      app: node-exporter
  template:
    metadata:
      labels:
        app: node-exporter
    spec:
      containers:
      - name: node-exporter
        image: prom/node-exporter

24. Kubernetes 的 HPA 和 VPA 有什么区别?

Horizontal Pod Autoscaler (HPA):

🔹 根据 CPU、内存或自定义指标,动态调整 Pod 的副本数量。

🔹 实现工作负载的水平扩展。

Vertical Pod Autoscaler (VPA):

🔹 动态调整 Pod 的资源请求(CPU 和内存)。
🔹 避免资源不足或过度分配。

二者的应用可以互补,HPA 负责副本扩展,VPA 负责优化资源配置。


25. Kubernetes 中如何优化资源使用?

资源请求和限制(Resource Requests & Limits):

为容器设置 requests(最低资源需求)和 limits(最大资源限制),避免资源竞争。

resources:
  requests:
    memory: "64Mi"
    cpu: "250m"
  limits:
    memory: "128Mi"
    cpu: "500m"

节点亲和性(Node Affinity):

通过 nodeAffinity 将 Pod 调度到特定节点:

affinity:
  nodeAffinity:
    requiredDuringSchedulingIgnoredDuringExecution:
      nodeSelectorTerms:
      - matchExpressions:
        - key: "node-role.kubernetes.io/worker"
          operator: In
          values:
          - "true"

使用 HPA 或 VPA 自动扩展:

根据负载动态调整 Pod 副本数或资源配置。

使用 Resource Quota 和 LimitRange:

通过 ResourceQuota 限制 Namespace 的资源使用:

apiVersion: v1
kind: ResourceQuota
metadata:
  name: compute-resources
spec:
  hard:
    pods: "10"
    requests.cpu: "4"
    limits.cpu: "10"

26. Kubernetes 集群的高可用架构怎么设计?

答:高可用架构设计包括:

🔹 控制平面高可用:
使用多个 Master 节点,部署 API Server、Controller Manager、Scheduler 等组件。
配置 ETCD 集群(建议奇数节点数)。
使用负载均衡(如 HAProxy、Nginx)对外暴露 API Server。

🔹 工作节点高可用:
部署多个 Worker 节点,避免单点故障。
配置 Pod 的副本数,启用 Pod 反亲和性(Pod Anti-affinity)。

🔹 网络高可用:
使用双平面或冗余网络接口。
配置容器网络插件(如 Calico、Flannel)支持高可用。

🔹 存储高可用:
使用分布式存储系统(如 Ceph、GlusterFS)。

动物装饰