CKAD 复习:网络题压缩模板

把 CKAD 中 Service、Ingress、NetworkPolicy 和网络排障压缩成少量模板

网络题只围绕 3 个资源:Service 找 Pod,Ingress 找 Service,NetworkPolicy 限制 Pod 流量。排障时顺着这条链查:客户端 -> Service -> Endpoints -> Pod labels -> containerPort。

1. Service:selector 必须匹配 Pod label

ClusterIP 是默认类型,内部访问用它。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
apiVersion: v1
kind: Service
metadata:
  name: internal-app
  namespace: networking
spec:
  type: ClusterIP
  selector:
    app: backend
  ports:
  - port: 80
    targetPort: 8080

NodePort 暴露到节点端口:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
apiVersion: v1
kind: Service
metadata:
  name: public-web
  namespace: networking
spec:
  type: NodePort
  selector:
    app: web
  ports:
  - port: 80
    targetPort: 80
    nodePort: 30080

用命令从 Deployment 暴露 Service:

1
2
3
4
5
k expose deployment web-frontend -n networking \
  --name=public-web \
  --type=NodePort \
  --port=80 \
  --target-port=80

2. Service 排障:看 Endpoints

Service 不通时优先查 selector 和 endpoint。

1
2
3
4
k get svc web-service -n troubleshooting -o wide
k describe svc web-service -n troubleshooting
k get endpoints web-service -n troubleshooting
k get pod -n troubleshooting --show-labels

如果 ENDPOINTS 为空,通常是 Service selector 和 Pod label 不匹配:

1
2
3
4
5
# 方案 1:改 Service selector
k patch svc web-service -n troubleshooting -p '{"spec":{"selector":{"app":"web"}}}'

# 方案 2:给 Pod/Deployment 模板补 label
k label pod <pod> app=web -n troubleshooting

临时测试:

1
k run tmp --restart=Never --rm -i --image=busybox -- wget -O- web-service:80

3. Ingress:host/path -> service/port

Ingress 只是七层路由,后端必须是 Service。

k get ingressClass -A

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: api-ingress
  namespace: networking
spec:
  ingressClassName: nginx # 指定 Ingress Controller, 默认 nginx
  rules:
  - host: api.example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: api-service
            port:
              number: 80

检查:

1
2
k get ingress -n networking
k describe ingress api-ingress -n networking

4. NetworkPolicy:选择目标 Pod,再写允许来源

题型:“只允许 label 为 tier=frontend 的 Pod 访问 label 为 app=web 的 Pod 的 80 端口”。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-traffic
  namespace: networking
spec:
  podSelector:
    matchLabels:
      app: web
  policyTypes:
  - Ingress
  ingress:
  - from:
    - podSelector:
        matchLabels:
          tier: frontend
    ports:
    - protocol: TCP
      port: 80

记忆点:

  • spec.podSelector 选被保护的目标 Pod。
  • ingress.from.podSelector 选允许进来的来源 Pod。
  • 一旦 Pod 被 NetworkPolicy 选中,未显式允许的流量会被拒绝。

5. 自定义列输出

Killer Shell 常出现“输出特定列到文件”:

1
2
3
k get ns > /opt/course/1/namespaces
k get pod -A -o custom-columns='NS:.metadata.namespace,NAME:.metadata.name,IMAGE:.spec.containers[*].image'
k get svc -A -o wide

考场压缩记忆

  • Service:selector 找 Pod,port 是 Service 端口,targetPort 是容器端口。
  • Ingress:host/path 找 Service,不直接找 Pod。
  • NetworkPolicy:先选“被保护目标”,再写“允许来源”。
  • 排障固定看:svc -> endpoints -> pod labels -> logs/events
comments powered by Disqus