Skip to content

附录:速查表、模板与练习题

本附录汇总全教材的核心命令、YAML 模板、概念对照表和练习题参考答案。


A.1 命令速查表

Service 基础

bash
# 查看 Service
kubectl get svc -o wide
kubectl get svc <svc-name> -o yaml
kubectl describe svc <svc-name>

# 创建/更新/删除
kubectl apply -f service.yaml
kubectl delete -f service.yaml

Endpoints/EndpointSlice

bash
kubectl get endpoints <svc-name>
kubectl get endpointslices -l kubernetes.io/service-name=<svc-name>

Pod 与标签

bash
kubectl get pods --show-labels
kubectl get pods -l app=web

DNS 测试

bash
kubectl run -it --rm debug --image=busybox:1.28 --restart=Never -- nslookup <svc-name>
kubectl run -it --rm debug --image=busybox:1.28 --restart=Never -- wget -O- http://<svc-name>:<port>

kube-proxy

bash
kubectl logs -n kube-system -l k8s-app=kube-proxy
iptables -t nat -L KUBE-SERVICES -n -v
iptables -t nat -L KUBE-NODEPORTS -n -v
ipvsadm -Ln
ipvsadm -Lnc

抓包

bash
tcpdump -i any -nn host <cluster-ip>
tcpdump -i any -nn port <node-port>
tcpdump -i any -nn host <pod-ip> and port <target-port>

A.2 YAML 模板集

ClusterIP Service

yaml
apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  type: ClusterIP
  selector:
    app: my-app
  ports:
    - name: http
      port: 80
      targetPort: 8080

NodePort Service

yaml
apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  type: NodePort
  selector:
    app: my-app
  ports:
    - name: http
      port: 80
      targetPort: 8080
      nodePort: 30080

LoadBalancer Service

yaml
apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  type: LoadBalancer
  externalTrafficPolicy: Local
  selector:
    app: my-app
  ports:
    - name: http
      port: 80
      targetPort: 8080

ExternalName Service

yaml
apiVersion: v1
kind: Service
metadata:
  name: external-api
spec:
  type: ExternalName
  externalName: api.example.com

Headless Service

yaml
apiVersion: v1
kind: Service
metadata:
  name: my-headless
spec:
  clusterIP: None
  selector:
    app: my-app
  ports:
    - name: http
      port: 80
      targetPort: 8080

无 Selector Service + 手动 Endpoints

yaml
apiVersion: v1
kind: Service
metadata:
  name: external-db
spec:
  type: ClusterIP
  ports:
    - port: 3306
---
apiVersion: v1
kind: Endpoints
metadata:
  name: external-db
subsets:
  - addresses:
      - ip: 192.168.1.100
    ports:
      - port: 3306

Ingress

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

A.3 核心概念对照表

概念一句话解释
Pod最小调度单元,动态、IP 不固定
Service为一组 Pod 提供稳定访问入口的抽象
ClusterIPService 的虚拟 IP,仅集群内可达
NodePort每个节点上暴露的端口
LoadBalancer云厂商提供的外部负载均衡器入口
ExternalNameDNS CNAME 别名
Headless Service不分配 ClusterIP,DNS 直接返回 Pod IP
selector通过 Label 选择后端 Pod
Endpoints旧版后端列表
EndpointSlice新版分片后端列表
kube-proxy在每个节点上配置 Service 转发规则的组件
iptablesLinux 防火墙/包过滤框架
ipvsLinux 内核四层负载均衡模块
conntrack连接跟踪,处理 DNAT 返回包
CoreDNS集群 DNS 服务器
Ingress七层 HTTP/HTTPS 路由规则
readinessProbe决定 Pod 是否能接收流量的健康检查
externalTrafficPolicy外部流量转发策略(Cluster/Local)
internalTrafficPolicy内部流量转发策略(Cluster/Local)
sessionAffinity会话保持

A.4 练习题参考答案(要点)

第1章

  1. 创建 Deployment,观察 Pod IP 变化。
  2. 直接写 Pod IP 会导致 IP 变化后访问失败。

第2章

  1. 画图展示 Pod 动态性和 Service 稳定入口。
  2. ClusterIP 提供稳定 IP,selector 自动发现 Pod,kube-proxy 实现负载均衡。

第3章

  1. 创建 Deployment 和 Service,用临时 Pod 测试访问。
  2. 副本数变化后 Endpoints 自动更新。

第4章

  1. 分别创建四种 Service 并测试。
  2. 生产环境优先 LoadBalancer/Ingress,因为 NodePort 直接暴露不稳定、不安全。

第5章

  1. 创建 Deployment 监听 5000,Service port 80,targetPort 5000。
  2. 验证访问路径。
  3. targetPort 错误时 Endpoints 有记录但 Pod 端口不通。

第6章

  1. 观察 Endpoints 和 EndpointSlice 自动生成。
  2. readinessProbe 失败时 Pod 从 Endpoints 移除。

第7章

  1. 查看 kube-proxy 模式:kubectl logs -n kube-system -l k8s-app=kube-proxy
  2. 在节点上查看 iptables 链。

第8章

  1. 用 busybox 验证 DNS 解析。
  2. 跨命名空间使用 <svc>.<namespace>

第9章

  1. Headless Service DNS 返回 Pod IP 列表。
  2. StatefulSet 提供稳定 Pod 名称和 DNS。

第10章

  1. 创建 NodePort,从外部访问。
  2. 创建 LoadBalancer,查看 EXTERNAL-IP。
  3. Local 模式保留源 IP,Cluster 模式不保留。

第11章

  1. 部署 NGINX Ingress Controller。
  2. 按路径路由到不同 Service。

第12章

  1. 开启 sessionAffinity 后同一客户端命中同一 Pod。
  2. Local 模式保留源 IP。

第13章

  1. 画出两种访问方式路径。
  2. Pod 分布均匀且 LB 有健康检查时 Local 更优。

第14章

  1. 两个 ClusterIP Service 用 8080 不会冲突。
  2. 相同 nodePort 会报 provided port is already allocated
  3. 同一 Pod 内两个容器监听 8080 会启动失败。

第15章

  1. 根据业务需求设计完整方案。
  2. 检查 NodePort 暴露情况。

第16章

  1. 按排查清单定位 selector 不匹配问题。
  2. 编写团队 Service 故障排查 SOP。

A.5 推荐延伸阅读

  • Kubernetes 官方文档:Services
  • 《Kubernetes 权威指南》
  • 《Kubernetes in Action》
  • 本目录下的原始文档:
    • k8s-service-guide.md
    • nodeip-vs-vip-nodeport.md
    • port-targetport-nodeport-explained.md
    • service-full-chain-deep-dive.md
    • service-port-conflict-explained.md

附录完成