kubernetes(K8s)学习笔记:第七期核心知识点自测与详解

kubernetes(K8s)学习笔记:第七期核心知识点自测与详解

本自测解析针对 Kubernetes 系列第七期(网络与服务暴露------Service + kube-proxy + Ingress)的核心内容。共 10 题,每题包含题目回顾、考查知识点、详细解答与分析,帮助读者巩固 Kubernetes 网络与服务暴露的核心技能。
文章索引:kubernetes(K8s)学习笔记(第七期):网络与服务暴露

更多自我检测系列欢迎浏览:每日知识点小问答

题目一:Service 的核心作用与 Endpoints 机制

题目:Kubernetes 中 Service 的核心作用是什么?Service 与 Endpoints 之间是什么关系?当后端 Pod 发生变动时,Endpoints 会自动更新吗?

考查知识点

  • Service 概述与基本管理 ------ 第七期 §1
  • Service 与 Endpoints 的关系

详细解答

Service 的核心作用

  1. 固定 IP 和 DNS 名称:无论后端 Pod 如何变化,Service 的 IP 和 DNS 保持不变
  2. 负载均衡:将流量分发到多个后端 Pod
  3. 服务发现:通过 DNS 或环境变量让应用自动发现服务

Service 与 Endpoints 的关系

  • Service 通过标签选择器(selector) 匹配后端 Pod
  • 被匹配的 Pod IP 和端口会记录在 Endpoints 对象中
  • Endpoints 是 Service 和 Pod 之间的桥梁------Service 不直接连接 Pod,而是通过 Endpoints 获取所有匹配 Pod 的地址列表

自动更新机制

  • ✅ 当后端 Pod 发生变动(创建/删除/重启)时,Endpoints 会自动更新
  • Service 无需任何配置变更即可感知新 Pod
  • 这一机制是 Kubernetes 服务发现的核心基础

验证命令

bash 复制代码
kubectl get endpoints
kubectl describe svc web

题目二:Service 的三种发现方式

题目:Kubernetes 中 Pod 发现 Service 有哪三种方式?各有什么优缺点?生产环境推荐使用哪种?

考查知识点

  • Service 发现 ------ 第七期 §2

详细解答

发现方式 说明 优点 缺点
IP 访问 直接使用 Service 的 ClusterIP 简单直接 IP 可能变化,硬编码不推荐
环境变量 Pod 启动时自动注入 Service 信息 自动注入,使用方便 依赖创建顺序(Service 必须在 Pod 之前创建)
DNS 访问 通过 CoreDNS 解析 Service 名称 灵活、动态、无需依赖顺序 需要 CoreDNS 组件

生产环境推荐DNS 访问方式

原因

  1. 不依赖创建顺序
  2. 支持跨命名空间访问(<service>.<namespace>.svc.cluster.local
  3. 同命名空间可直接使用 Service 名称
  4. 动态更新,Pod 重启后无需修改配置

DNS 记录格式

text 复制代码
<service-name>.<namespace>.svc.cluster.local

验证命令

bash 复制代码
kubectl run test --rm -it --image=busybox -- nslookup web

题目三:五种 Service 类型的区别

题目:Kubernetes Service 支持哪五种类型?请分别说明其特点和适用场景。NodePort 的三个端口(nodePort / port / targetPort)分别是什么含义?

考查知识点

  • Service 类型 ------ 第七期 §3

详细解答

类型 说明 访问范围 适用场景
ClusterIP(默认) 集群内部 IP 仅集群内 内部服务通信
NodePort 节点端口映射 集群内外(节点 IP+端口) 简单外部暴露、测试环境
LoadBalancer 外部负载均衡器 IP 集群内外(LB IP) 生产环境外部暴露
ExternalName DNS CNAME 映射 集群内(DNS 级别) 外部服务别名
Headless ClusterIP=None 集群内(直接访问 Pod IP) StatefulSet 直接访问 Pod

NodePort 三个端口的含义

端口 含义 示例
nodePort 节点上监听的端口(用户访问入口) 31917
port ClusterIP 上监听的端口 8080
targetPort Pod 监听的端口 80

访问方式

bash 复制代码
# 通过任意节点 IP + nodePort 访问
curl http://10.1.8.30:31917
curl http://10.1.8.31:31917

题目四:会话保持(sessionAffinity)

题目:如何让来自同一客户端的请求始终访问同一个后端 Pod?请写出配置命令并说明原理。

考查知识点

  • Service 高级特性 ------ 第七期 §4.1
  • 会话保持

详细解答

配置方法

bash 复制代码
# 启用会话保持(基于客户端 IP)
kubectl patch svc web -p '{"spec":{"sessionAffinity":"ClientIP"}}'

YAML 配置

yaml 复制代码
apiVersion: v1
kind: Service
metadata:
  name: web
spec:
  sessionAffinity: ClientIP
  sessionAffinityConfig:
    clientIP:
      timeoutSeconds: 7200   # 2 小时
  selector:
    app: web
  ports:
  - port: 80

工作原理

  • Service 记录客户端 IP 和 Pod 的对应关系
  • 同一客户端的后续请求继续转发给同一个 Pod
  • 默认超时时间为 10800 秒(3 小时)

验证

bash 复制代码
# 启用前:请求轮询分发
for i in {1..20}; do curl -s 10.111.90.183; done | sort | uniq -c
     10 web-6db76cb4fc-5gbx2
     10 web-6db76cb4fc-b8f7l

# 启用后:所有请求发往同一个 Pod
kubectl patch svc web -p '{"spec":{"sessionAffinity":"ClientIP"}}'
for i in {1..20}; do curl -s 10.111.90.183; done | sort | uniq -c
     20 web-6db76cb4fc-5gbx2

与 IPVS 的关系

  • Service 配置 sessionAffinity: ClientIP → kube-proxy 自动使用 IPVS 的 SH(源地址哈希) 算法

题目五:金丝雀发布的流量控制原理

题目:如何利用 Service 的标签选择器实现金丝雀发布?请说明核心原理,并写出关键命令。

考查知识点

  • Service 高级特性 ------ 第七期 §4.2
  • 金丝雀发布

详细解答

核心原理

  • 同一个 Service 匹配多个 Deployment(它们有相同的 apptier 标签,但 track 不同)
  • 通过调整不同 Deployment 的副本数来控制流量比例
  • 新版本(金丝雀)与旧版本(稳定版)同时运行,共享同一个 Service

关键步骤

bash 复制代码
# 1. 准备 ConfigMap(不同版本的页面内容)
echo "hello nginx 1.28" > web/index28.html
echo "hello nginx 1.29" > web/index29.html
kubectl create configmap web --from-file=./web

# 2. 部署稳定版(track: stable)
kubectl apply -f webapp-1.28.yaml

# 3. 部署金丝雀版(track: canary)
kubectl apply -f webapp-1.29.yaml

# 4. 创建 Service(匹配 app: web, tier: frontend)
kubectl apply -f webapp-svc.yaml

# 5. 调整副本数控制流量比例
kubectl scale deployment web-28 --replicas=8   # 稳定版 8 个副本
kubectl scale deployment web-29 --replicas=2   # 金丝雀版 2 个副本

# 6. 验证流量比例
for i in {1..50}; do curl -s 10.98.235.36; done | sort | uniq -c
     39 hello nginx 1.28
     11 hello nginx 1.29

题目六:kube-proxy 的 iptables 模式工作原理

题目:请简述 kube-proxy 在 iptables 模式下的工作原理,并画出流量转发链路。该模式存在什么缺点?

考查知识点

  • kube-proxy 原理 ------ 第七期 §5.2
  • iptables 模式

详细解答

iptables 模式工作原理

  • kube-proxy 监听 Service 和 Endpoint 变化
  • 在宿主机内核中动态生成 iptables 规则链
  • 流量进入时通过 netfilter 框架逐条匹配规则
  • 实现 DNAT(目标地址转换)和负载均衡

流量转发链路

text 复制代码
客户端访问 ClusterIP
    ↓
PREROUTING 链 (nat 表)
    ↓
KUBE-SERVICES(服务总入口链)
    ↓ 匹配目的 IP = ClusterIP
KUBE-SVC-XXX(Service 专属调度链)
    ├── SNAT 标记(非 Pod 网段流量)
    ├── 概率 1/3 → KUBE-SEP-A → DNAT → Pod 1
    ├── 概率 1/3 → KUBE-SEP-B → DNAT → Pod 2
    └── 概率 1/3 → KUBE-SEP-C → DNAT → Pod 3

缺点

  • 每增加一个 Service 或 Endpoint,都会新增/修改 iptables 规则
  • 服务数超过 1000 时,规则链膨胀,CPU 占用飙升
  • 规则查找是 O(n) 线性 复杂度

iptables 模式适合小规模集群(服务数 < 1000)

题目七:kube-proxy 的 IPVS 模式

题目:IPVS 模式相比 iptables 模式有哪些优势?如何将 kube-proxy 从 iptables 模式切换到 IPVS 模式?IPVS 支持哪些调度算法?

考查知识点

  • kube-proxy 原理 ------ 第七期 §5.3
  • IPVS 模式

详细解答

IPVS 模式优势

对比项 iptables IPVS
规则查找 O(n) 线性 O(1) 哈希
服务数上限 ~1000 100000+
规则同步延迟 随规则数增加 恒定
调度算法 仅随机概率 8 种算法

切换步骤

bash 复制代码
# 1. 修改 kube-proxy ConfigMap
kubectl edit configmap -n kube-system kube-proxy
# 将 mode: "" 改为 mode: "ipvs"

# 2. 重启 kube-proxy
kubectl rollout restart daemonset -n kube-system kube-proxy

# 3. 验证模式
kubectl logs -n kube-system kube-proxy-72b7j | grep "Using ipvs"

IPVS 支持的调度算法

算法 说明
rr 轮询(默认)
wrr 加权轮询
lc 最少连接
sh 源地址哈希
sed 最短预期延迟
nq 最少队列

验证 IPVS 规则

bash 复制代码
ipvsadm -Lnt 10.103.143.120:80

题目八:Ingress 与 Service 的关系

题目:Ingress 和 Service 有什么区别?为什么要使用 Ingress 而不是直接用 NodePort 或 LoadBalancer?

考查知识点

  • Ingress 概述 ------ 第七期 §6.1
  • Ingress vs Service

详细解答

Ingress vs Service

对比项 Service(NodePort/LoadBalancer) Ingress
协议 TCP/UDP HTTP/HTTPS(7 层)
路由能力 仅端口映射 域名、路径、SSL 等
成本 每个服务一个 LB IP 多个服务共享一个 LB IP

为什么使用 Ingress

  1. 降低成本:多个服务共享一个负载均衡器 IP,而不是每个服务单独一个 LB
  2. 7 层路由:支持基于域名和路径的细粒度路由
  3. SSL/TLS 终止:统一管理证书
  4. 高级功能:支持限流、重写、跨域等

Ingress 架构

text 复制代码
客户端 → Ingress Controller (Nginx) → Service → Pod
  • Ingress 资源:定义路由规则(YAML)
  • Ingress Controller:负责执行路由规则(如 ingress-nginx)

题目九:Ingress 路径重写(rewrite-target)

题目 :前端访问 /webapp01/api/hello,但后端只识别 /api/hello,需要剥离 /webapp01 前缀。请写出对应的 Ingress YAML 配置。

考查知识点

  • Ingress 规则实践 ------ 第七期 §7.2
  • 路径重写

详细解答

yaml 复制代码
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: rewrite-ingress
  annotations:
    nginx.ingress.kubernetes.io/use-regex: "true"
    nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:
  ingressClassName: nginx
  rules:
  - host: www.whisky.cloud
    http:
      paths:
      - path: /webapp01/(.*)
        pathType: ImplementationSpecific
        backend:
          service:
            name: webapp01
            port:
              number: 80

关键注解说明

注解 作用
use-regex "true" 启用正则表达式匹配
rewrite-target /$1 将正则表达式中第一个括号匹配的内容作为新路径

效果

  • 请求:/webapp01/api/hello → 重写为 /api/hello 转发给后端

题目十:Ingress 生产级注解实践

题目:在生产环境中,Ingress 常用的安全与防护配置有哪些?请写出以下配置的 YAML 注解:① 强制 HTTPS 跳转 ② 单 IP 限流(20 RPS)③ IP 白名单。

考查知识点

  • Ingress 规则实践 ------ 第七期 §7.2-7.3
  • 生产级注解

详细解答

完整 YAML 示例

yaml 复制代码
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: production-ingress
  annotations:
    # ① 强制 HTTPS 跳转
    nginx.ingress.kubernetes.io/ssl-redirect: "true"
    nginx.ingress.kubernetes.io/force-ssl-redirect: "true"

    # ② 单 IP 限流(20 RPS,50 并发连接)
    nginx.ingress.kubernetes.io/limit-rps: "20"
    nginx.ingress.kubernetes.io/limit-connections: "50"

    # ③ IP 白名单
    nginx.ingress.kubernetes.io/whitelist-source-range: "10.1.8.0/24,127.0.0.1/32"

    # ④ 自定义超时(可选)
    nginx.ingress.kubernetes.io/proxy-read-timeout: "60"
    nginx.ingress.kubernetes.io/proxy-connect-timeout: "10"
spec:
  ingressClassName: nginx
  tls:
  - hosts:
    - www.whisky.cloud
    secretName: www-tls
  rules:
  - host: www.whisky.cloud
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: webapp01
            port:
              number: 80

生产常用注解速查表

注解 作用 示例值
ssl-redirect 80 端口强制跳转 HTTPS "true"
limit-rps 单 IP 每秒请求数限制 "20"
limit-connections 单 IP 最大并发连接数 "50"
whitelist-source-range IP 白名单 "10.1.8.0/24,127.0.0.1/32"
enable-cors 启用跨域 "true"
proxy-read-timeout 读取超时 "60"

附:知识点对应总表

题号 主要考查知识点(对应笔记章节)
1 第七期 §1 Service 概述与 Endpoints
2 第七期 §2 Service 发现(IP/环境变量/DNS)
3 第七期 §3 Service 五种类型与 NodePort
4 第七期 §4.1 会话保持(sessionAffinity)
5 第七期 §4.2 金丝雀发布
6 第七期 §5.2 kube-proxy iptables 模式
7 第七期 §5.3 kube-proxy IPVS 模式
8 第七期 §6.1 Ingress vs Service
9 第七期 §7.2 路径重写(rewrite-target)
10 第七期 §7.3 生产高频注解速查表

学习建议:对于答错的题目,请回看第七期对应章节,并动手在集群环境中执行相关命令。Service 和 Ingress 是 Kubernetes 对外提供服务的关键组件,熟练掌握其配置是生产运维的基本要求。
--- Compiled and Authored by Whisky --- July 1 st, 2026