主题
附录:速查表、模板与练习题
本附录汇总全教材的核心命令、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.yamlEndpoints/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=webDNS 测试
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: 8080NodePort 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: 30080LoadBalancer 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: 8080ExternalName Service
yaml
apiVersion: v1
kind: Service
metadata:
name: external-api
spec:
type: ExternalName
externalName: api.example.comHeadless 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: 3306Ingress
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: 80A.3 核心概念对照表
| 概念 | 一句话解释 |
|---|---|
| Pod | 最小调度单元,动态、IP 不固定 |
| Service | 为一组 Pod 提供稳定访问入口的抽象 |
| ClusterIP | Service 的虚拟 IP,仅集群内可达 |
| NodePort | 每个节点上暴露的端口 |
| LoadBalancer | 云厂商提供的外部负载均衡器入口 |
| ExternalName | DNS CNAME 别名 |
| Headless Service | 不分配 ClusterIP,DNS 直接返回 Pod IP |
| selector | 通过 Label 选择后端 Pod |
| Endpoints | 旧版后端列表 |
| EndpointSlice | 新版分片后端列表 |
| kube-proxy | 在每个节点上配置 Service 转发规则的组件 |
| iptables | Linux 防火墙/包过滤框架 |
| ipvs | Linux 内核四层负载均衡模块 |
| conntrack | 连接跟踪,处理 DNAT 返回包 |
| CoreDNS | 集群 DNS 服务器 |
| Ingress | 七层 HTTP/HTTPS 路由规则 |
| readinessProbe | 决定 Pod 是否能接收流量的健康检查 |
| externalTrafficPolicy | 外部流量转发策略(Cluster/Local) |
| internalTrafficPolicy | 内部流量转发策略(Cluster/Local) |
| sessionAffinity | 会话保持 |
A.4 练习题参考答案(要点)
第1章
- 创建 Deployment,观察 Pod IP 变化。
- 直接写 Pod IP 会导致 IP 变化后访问失败。
第2章
- 画图展示 Pod 动态性和 Service 稳定入口。
- ClusterIP 提供稳定 IP,selector 自动发现 Pod,kube-proxy 实现负载均衡。
第3章
- 创建 Deployment 和 Service,用临时 Pod 测试访问。
- 副本数变化后 Endpoints 自动更新。
第4章
- 分别创建四种 Service 并测试。
- 生产环境优先 LoadBalancer/Ingress,因为 NodePort 直接暴露不稳定、不安全。
第5章
- 创建 Deployment 监听 5000,Service port 80,targetPort 5000。
- 验证访问路径。
- targetPort 错误时 Endpoints 有记录但 Pod 端口不通。
第6章
- 观察 Endpoints 和 EndpointSlice 自动生成。
- readinessProbe 失败时 Pod 从 Endpoints 移除。
第7章
- 查看 kube-proxy 模式:
kubectl logs -n kube-system -l k8s-app=kube-proxy。 - 在节点上查看 iptables 链。
第8章
- 用 busybox 验证 DNS 解析。
- 跨命名空间使用
<svc>.<namespace>。
第9章
- Headless Service DNS 返回 Pod IP 列表。
- StatefulSet 提供稳定 Pod 名称和 DNS。
第10章
- 创建 NodePort,从外部访问。
- 创建 LoadBalancer,查看 EXTERNAL-IP。
- Local 模式保留源 IP,Cluster 模式不保留。
第11章
- 部署 NGINX Ingress Controller。
- 按路径路由到不同 Service。
第12章
- 开启 sessionAffinity 后同一客户端命中同一 Pod。
- Local 模式保留源 IP。
第13章
- 画出两种访问方式路径。
- Pod 分布均匀且 LB 有健康检查时 Local 更优。
第14章
- 两个 ClusterIP Service 用 8080 不会冲突。
- 相同 nodePort 会报
provided port is already allocated。 - 同一 Pod 内两个容器监听 8080 会启动失败。
第15章
- 根据业务需求设计完整方案。
- 检查 NodePort 暴露情况。
第16章
- 按排查清单定位 selector 不匹配问题。
- 编写团队 Service 故障排查 SOP。
A.5 推荐延伸阅读
- Kubernetes 官方文档:Services
- 《Kubernetes 权威指南》
- 《Kubernetes in Action》
- 本目录下的原始文档:
k8s-service-guide.mdnodeip-vs-vip-nodeport.mdport-targetport-nodeport-explained.mdservice-full-chain-deep-dive.mdservice-port-conflict-explained.md
附录完成