k8s面试题100道,你能回答几道?(三)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、部署与服务管理
    • 如何部署一个应用到k8s集群
    • Deployment的作用是什么?与ReplicaSet的关系?
    • 如何通过Deployment实现滚动更新(Rolling Update)?
    • 解释maxSurge和maxUnavailable参数的含义。
    • 如何回滚Deployment到之前的版本?
    • Deployment的更新策略(RollingUpdate/Recreate)区别?
    • 如何暂停和恢复Deployment的滚动更新?
    • 什么是minReadySeconds?如何影响Pod就绪状态?
    • 如何通过Deployment实现蓝绿发布或金丝雀发布?
    • 如何查看Deployment的更新历史记录?
    • 如何扩缩容Deployment的副本数?
  • 二、网络和安全
    • Service的作用是什么?解决什么问题?
    • ClusterIP、NodePort、LoadBalancer和ExternalName的区别?
    • 如何通过Service暴露一个Deployment?
    • 什么是kube-proxy的iptables模式和IPVS模式?
    • Headless Service的用途是什么?如何定义?
    • 解释Ingress的作用及常见控制器(Nginx、Traefik)。
    • Ingress和Service的区别?
    • 如何配置Ingress实现基于路径的路由?
    • 什么是Network Policy?如何限制Pod之间的网络流量?
    • 如何调试Service无法访问的问题?
    • 解释Kubernetes的DNS服务(CoreDNS)工作原理。
    • Pod如何通过DNS名称访问Service?
    • 什么是ExternalIP和LoadBalancer IP?
    • 如何实现跨命名空间(Namespace)的Service访问?
    • 解释kubectl port-forward的作用和使用场景。
  • 总结


前言

工作多年,最近面试一直被问k8s相关的知识。k8s几年前搞过,最近几年一直在做开源项目相关的工作,又不是专业运维,好多知识点早已经模糊了。但是面试又喜欢问,叫什么,是什么,如何实现的,有没有这样的功能,原理是什么,原理的原理是什么,等等吧。
下面准备100道k8s面试题,不知道有没有人能顶得住。


一、部署与服务管理

如何部署一个应用到k8s集群

  1. 编写Deployment的YAML文件,定义容器镜像、副本数量、标签、挂载卷等参数
  2. 执行kubectl apply -f 应用配置
  3. Deploy自动创建ReplicaSet,后者负责启动和管理指定数量的Pod副本

Deployment的作用是什么?与ReplicaSet的关系?

Deployment的作用:

  • 提供声明式管理,定义应用的期望状态。如副本数、镜像版本等
  • 支持滚动更新、回滚、扩缩容等运维操作
    与ReplicaSet的管理
  • Deployment通过创建和管理ReplicaSet间接控制Pod。每次更新时生成新Replica,逐步替换旧版本
  • ReplicaSet仅确保指定数量的Pod副本运行,而Deployment负责更复杂的生命周期

如何通过Deployment实现滚动更新(Rolling Update)?

流程:

  • 修改Deployment的Pod模板
  • Deployment创建新的ReplicaSet,逐步启动新Pod并终止旧Pod,直到所有副本更新完成
    关键参数:
  • strategy.type:RollingUpdate(默认策略)
  • MaxSurge和Maxunavailable控制更新节奏

解释maxSurge和maxUnavailable参数的含义。

maxSurge:允许超出期望副本数的最大Pod数量(例如25%或固定值),用于加速新版本启动
maxUnavailable:更新期间允许不可用的Pod最大数量(例如25%或固定值),避免服务中断。

如何回滚Deployment到之前的版本?

#回滚到上一个版本
kubectl rollout undo deployment/<deployment-name> 
#回滚到指定版本
kubectl rollout undo deployment/<name> --to-revision=<revision-number>
# 查看历史记录
kubectl rollout history deployment/<name>

Deployment的更新策略(RollingUpdate/Recreate)区别?

RollingUpdate:逐步替换旧Pod,确保服务不中断,适合新环境
Recrete:先终止所有旧Pod,在启动新Pod,适用于需避免版本共存的情况。

如何暂停和恢复Deployment的滚动更新?

#暂停更新,允许多次修改配置
kubectl rollout pause deployment/<name>
#恢复 
kubectl rollout resume deployment/<name>

什么是minReadySeconds?如何影响Pod就绪状态?

定义:Pod就绪后等待的额外时间,用于确保应用稳定后在接受流量。
影响:若Pod在minReadySeconds内崩溃,会被视为未就绪,触发重新创建。

如何通过Deployment实现蓝绿发布或金丝雀发布?

蓝绿发布:维护新旧两套独立的环境,通过流量切换实现全量版本更新。新版本验证通过之后,将流量从蓝环境切换到绿环境。旧版本随时可回滚。

  1. 部署新版本Deployment并创建对应Service
  2. 修改源Service的selector指向新版本Pod标签,完成切换。
# Service 切换示例
selector:
  app: my-app
  version: green  # 原为 blue

金丝雀发布/灰度发布:逐步将部分流量导向新版本,验证稳定性后扩大范围,直至全量替换旧版本。金丝雀定向向小范围用户进行验证。灰度发布按照比例分配流量。

  1. 创建Canary ingress配置,设置流量权重:
annotations:
  nginx.ingress.kubernetes.io/canary: "true"
  nginx.ingress.kubernetes.io/canary-weight: "20"
  1. 逐步调整canary-weight至100%,完成全量切换。

如何查看Deployment的更新历史记录?

kubectl rollout history deployment/<name>

如何扩缩容Deployment的副本数?

命令式

kubectl scale deployment/<name> --replicas=<number>

声明式:修改YAML文件的replicas字段后重新引用


二、网络和安全

Service的作用是什么?解决什么问题?

核心作用:

  • 为动态变化的Pod提供稳定的访问入口(固定的IP和DNS名称),屏蔽Pod IP变化的影响
  • 通过标签选择器关联后端Pod,实现负载均衡和流量分发

ClusterIP、NodePort、LoadBalancer和ExternalName的区别?

类型 特点 适用场景
ClusterIP 默认类型,分配集群内部虚拟IP,仅集群内部访问 微服务间内部通信,如API调用
NodePort 在ClusterIP基础上,会在集群所有节点上开放固定端口,允许外部通过节点IP访问 临时测试或非云环境外部访问
LoadBalancer 集成云厂商负载均衡器,分配外部IP和端口 公有云环境对外暴露服务
ExternalName 映射到外部服务的DNS名称,不代理流量 访问集群外服务

如何通过Service暴露一个Deployment?

  1. 创建Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - name: my-app
        image: nginx:1.20
  1. 创建Service(以NodePort为例)
apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  type: NodePort
  selector:
    app: my-app
  ports:
    - protocol: TCP
      port: 80       # Service 端口
      targetPort: 80 # Pod 端口
      nodePort: 30080

Service通过selector关联Deployment的pod标签app:my-app

什么是kube-proxy的iptables模式和IPVS模式?

iptables模式

  • 通过iptables规则转发流量,规则逐条匹配,性能虽Service数量增加而下降
  • 适用于中小规模集群
    IPVS模式
  • 通过内核级哈希表实现负载均衡,支持更高效的流量分发。如轮训,加权等10多种算法
  • 适合大规模集群和高性能场景

Headless Service的用途是什么?如何定义?

用途:用于无代理场景(如StatefulSet),直接返回Pod IP列表,支持自定义轮训。或自定义负载均衡
适用于需要直接访问单个Pod的场景(如数据库主从节点)

  1. 示例YAML
apiVersion: v1
kind: Service
metadata:
  name: mysql-headless  # Service 名称
spec:
  clusterIP: None       # 标识为 Headless Service
  selector:
    app: mysql          # 匹配 Pod 标签
  ports:
    - protocol: TCP
      port: 3306        # Service 端口
      targetPort: 3306  # Pod 端口
  1. 关联StatefulSet(以Mysql集群为例)
    配合StatefuleSet使用,确保每个Pod拥有唯一且稳定的DNS名称
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mysql
spec:
  serviceName: mysql-headless  # 指定关联的 Headless Service
  replicas: 3
  selector:
    matchLabels:
      app: mysql
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
        - name: mysql
          image: mysql:8.0
          ports:
            - containerPort: 3306
          env:
            - name: MYSQL_ROOT_PASSWORD
              value: "password"
  volumeClaimTemplates:        # 为每个 Pod 分配独立存储
    - metadata:
        name: mysql-data
      spec:
        accessModes: [ "ReadWriteOnce" ]
        storageClassName: "standard"
        resources:
          requests:
            storage: 10Gi
  1. 验证Headless Service
    在集群内执行nslookup或dig命令,验证DNS返回所有Pod的IP地址
kubectl run -it --rm debug --image=busybox --restart=Never -- /bin/sh
# 进入容器后执行:
nslookup mysql-headless
# 输出示例:
# Name:   mysql-headless..svc.cluster.local
# Address 1: 10.244.1.5 mysql-0.mysql-headless
# Address 2: 10.244.2.4 mysql-1.mysql-headless
# Address 3: 10.244.3.3 mysql-2.mysql-headless

直接访问Pod
通过Pod的DNS名称直接访问(mysql-0.mysql-headless:3306),适用于主从复制需要定向通信的场景

  1. 关键场景说明
  • 有状态应用:适用于需要固定网络标识的数据库(如MySQL、MongoDB),消息队列,如Kafka。
  • 分布式系统:允许客户端直接与特定Pod通信,实现自定义负载均衡。

总结:通过clusterIP:None 定义Headless Service,配合StatefulSet实现Pod级别的直接访问,适用于需要稳定网络拓扑的有状态服务。

解释Ingress的作用及常见控制器(Nginx、Traefik)。

作用:

  • 管理外部HTTP/HTTPS流量,提供基于域名、路径等L7路由规则
  • 支持SSL终止、流量分发、灰度发布等高级功能。
    常见控志气
  • Nginx Ingress:基于Nginx,功能丰富,社区支持广泛
  • Traefik:动态配置,集成Let’s Encrypt自动证书

Ingress和Service的区别?

维度 Service Ingress
层级 L4 (TCP UDP) L7(HTTP/HTTPS)
功能 提供基础负载均衡和固定IP 支持复杂路由、SSL、流量拆分
依赖 无需额外组件 需部署Ingress控制器 如Nginx

如何配置Ingress实现基于路径的路由?

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-ingress
spec:
  rules:
  - host: example.com
    http:
      paths:
      - path: /app1
        pathType: Prefix
        backend:
          service:
            name: app1-service
            port: 80
      - path: /app2
        pathType: Prefix
        backend:
          service:
            name: app2-service
            port: 80

什么是Network Policy?如何限制Pod之间的网络流量?

作用:定义Pod间网络通信规划(如允许特定命名空间的Pod访问)
示例:限制frontend的Pod仅允许来自backend Pod的流量

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-backend
spec:
  podSelector:
    matchLabels:
      app: frontend
  ingress:
  - from:
    - podSelector:
        matchLabels:
          app: backend

如何调试Service无法访问的问题?

  1. 检查Service的selector是否匹配Pod标签
  2. 验证Endpoints是否存在该Service:kubectl get endpoints
  3. 检查kube-proxy是否正常运行:kubectl get pods -n kube-system
  4. 测试集群内访问:curl :

解释Kubernetes的DNS服务(CoreDNS)工作原理。

机制

  • CoreDNS为Service和Pod提供DNS解析,格式为..svc.cluster.local
  • 集群内Pod通过/etc/resolv.conf自动配置DNS服务器

Pod如何通过DNS名称访问Service?

访问示例

  • 同一命名空间:curl http://my-service
  • 跨命名空间:curl http://my-service.other-ns.svc.cluster.local

什么是ExternalIP和LoadBalancer IP?

ExternalIP:手动指定节点IP对外暴露服务(需节点有公网IP)
LoadBalancer IP:由云厂商自动分配,集成外部负载均衡器。

如何实现跨命名空间(Namespace)的Service访问?

直接通过DNS名臣访问:..svc.cluster.local
示例:命名空间nsl的Pod访问ns2中的服务

curl http://my-service.ns2.svc.cluster.local

解释kubectl port-forward的作用和使用场景。

作用:将本地端口转发到集群被的Pod或Service,用于临时调试

kubectl port-forward service/my-service 8080:80

本地访问localhost:8080即可访问集群内Service


总结

基于一些部署和服务,网络和安全面试题的一些总结。

你可能感兴趣的:(k8s面试题,kubernetes,容器,云原生)