侧边栏壁纸
博主头像
拾荒的小海螺博主等级

只有想不到的,没有做不到的

  • 累计撰写 192 篇文章
  • 累计创建 18 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

Kubernetes:常见的面试题和答案

拾荒的小海螺
2024-12-25 / 0 评论 / 0 点赞 / 8 阅读 / 13313 字

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

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

  • 容器的自动化部署与管理
  • 应用的高可用性与负载均衡
  • 资源利用优化和动态扩展
  • 服务发现与网络通信
  • 自动化故障恢复

1735111052777.jpg


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)。
0

评论区