Kubernetes网络管理

🔥 核心概念

Kubernetes网络管理是确保容器间通信和外部访问的关键组件。它包括以下几个核心概念:

  • CNI插件:容器网络接口,负责为Pod分配IP地址和配置网络
  • Service:服务发现和负载均衡
  • Ingress:外部访问的入口点
  • NetworkPolicy:网络访问控制策略

🚀 CNI插件

1. 常见CNI插件

插件名称特点适用场景
Calico基于BGP的网络方案,支持NetworkPolicy大型集群,需要网络策略
Flannel简单易用,性能稳定中小型集群,快速部署
Cilium基于eBPF,支持服务网格功能需要高级网络功能
Weave Net自动发现,无需额外配置快速部署,临时环境

2. 安装Calico

# 安装Calico
kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml

# 验证安装
kubectl get pods -n kube-system | grep calico

3. 配置CNI插件

apiVersion: projectcalico.org/v3
kind: IPPool
metadata:
  name: default-ipv4-ippool
spec:
  cidr: 192.168.0.0/16
  ipipMode: Always
  natOutgoing: true
  disabled: false

📡 Service

1. Service类型

类型特点适用场景
ClusterIP默认类型,仅集群内部访问内部服务通信
NodePort在每个节点上暴露端口外部访问,测试环境
LoadBalancer自动创建云厂商负载均衡器生产环境,外部访问
ExternalName映射到外部域名访问外部服务

2. 创建Service

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

3. 服务发现

# 使用DNS进行服务发现
kubectl run -it --rm --image=busybox:1.28 busybox -- nslookup my-service

# 使用环境变量进行服务发现
kubectl exec -it my-app-pod -- env | grep MY_SERVICE

🌐 Ingress

1. 安装Ingress控制器

# 安装Nginx Ingress控制器
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update
helm install ingress-nginx ingress-nginx/ingress-nginx --namespace ingress-nginx --create-namespace

# 验证安装
kubectl get pods -n ingress-nginx

2. 创建Ingress资源

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

3. TLS配置

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

🔒 NetworkPolicy

1. 创建NetworkPolicy

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: default-deny
  namespace: default
spec:
  podSelector: {}
  policyTypes:
  - Ingress
  - Egress

2. 允许特定流量

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-frontend-to-backend
  namespace: default
spec:
  podSelector:
    matchLabels:
      app: backend
  policyTypes:
  - Ingress
  ingress:
  - from:
    - podSelector:
        matchLabels:
          app: frontend
    ports:
    - protocol: TCP
      port: 8080

3. 允许外部流量

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-external
  namespace: default
spec:
  podSelector:
    matchLabels:
      app: frontend
  policyTypes:
  - Ingress
  ingress:
  - from:
    - ipBlock:
        cidr: 0.0.0.0/0
        except:
        - 10.0.0.0/8
    ports:
    - protocol: TCP
      port: 80

🔄 网络故障排查

1. 检查网络插件状态

# 检查CNI插件状态
kubectl get pods -n kube-system | grep calico

# 检查网络插件日志
kubectl logs -n kube-system calico-node-xxx

2. 检查Pod网络

# 检查Pod IP地址
kubectl get pods -o wide

# 测试Pod间通信
kubectl exec -it pod1 -- ping pod2-ip

# 测试Pod到Service通信
kubectl exec -it pod1 -- curl my-service

3. 检查Ingress

# 检查Ingress状态
kubectl get ingress

# 检查Ingress控制器日志
kubectl logs -n ingress-nginx ingress-nginx-controller-xxx

# 测试Ingress访问
curl -H "Host: example.com" http://<node-ip>:<node-port>

📈 网络性能优化

1. 网络插件调优

apiVersion: projectcalico.org/v3
kind: FelixConfiguration
metadata:
  name: default
spec:
  bpfLogLevel: "info"
  bpfMemoryLimit: "100MB"
  bpfEnabled: true
  flowLogsEnabled: true
  flowLogsFlushInterval: 30s

2. Service调优

apiVersion: v1
kind: Service
metadata:
  name: my-service
  annotations:
    service.beta.kubernetes.io/aws-load-balancer-type: "nlb"
    service.beta.kubernetes.io/aws-load-balancer-internal: "true"
spec:
  selector:
    app: my-app
  ports:
  - port: 80
    targetPort: 8080
  type: LoadBalancer

3. Ingress调优

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-ingress
  annotations:
    nginx.ingress.kubernetes.io/ssl-redirect: "true"
    nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
    nginx.ingress.kubernetes.io/proxy-body-size: "10m"
    nginx.ingress.kubernetes.io/proxy-read-timeout: "60"
    nginx.ingress.kubernetes.io/proxy-send-timeout: "60"
spec:
  # ...

🔧 最佳实践

1. 网络规划

  • IP地址规划:为Pod和Service分配足够的IP地址空间
  • 网络分段:使用不同的命名空间和NetworkPolicy进行网络隔离
  • 服务发现:使用DNS进行服务发现,避免硬编码IP地址

2. 安全配置

  • NetworkPolicy:为每个应用设置适当的网络访问控制
  • TLS加密:为Ingress配置TLS证书,确保传输安全
  • 网络监控:监控网络流量和性能指标

3. 高可用性

  • 多节点部署:确保网络插件在所有节点上正常运行
  • 负载均衡:为关键服务配置负载均衡
  • 故障转移:确保网络服务的高可用性

🚨 常见问题

1. Pod无法通信

原因:网络插件配置错误,NetworkPolicy限制,或CNI插件未正常运行

解决方案

  • 检查CNI插件状态
  • 检查NetworkPolicy配置
  • 检查Pod网络配置

2. Service无法访问

原因:Service配置错误,Pod未就绪,或网络插件问题

解决方案

  • 检查Service配置
  • 检查Pod状态
  • 检查网络连通性

3. Ingress无法访问

原因:Ingress配置错误,Ingress控制器未正常运行,或DNS配置问题

解决方案

  • 检查Ingress配置
  • 检查Ingress控制器状态
  • 检查DNS配置

总结

Kubernetes网络管理是一个复杂但关键的组件,它涉及多个层面的配置和管理:

  1. CNI插件:为Pod提供网络连接,支持不同的网络方案
  2. Service:提供服务发现和负载均衡,支持多种访问方式
  3. Ingress:管理外部访问,支持TLS和路径路由
  4. NetworkPolicy:控制网络访问,提高安全性

通过合理配置和管理这些组件,可以构建一个高效、安全、可靠的Kubernetes网络环境。在生产环境中,建议根据实际需求选择合适的网络方案,并定期进行网络监控和优化。


💡 小贴士:网络管理是Kubernetes集群的基础,建议在部署集群时就规划好网络方案,并在运行过程中定期检查网络状态,确保集群的稳定运行。

更多推荐