Kubernetes网络管理:从CNI到Ingress的全面指南
Kubernetes网络管理从CNI到Ingress的全面指南 硬核开场各位技术大佬们今天咱们来聊聊Kubernetes网络管理。别跟我说你还在为K8s网络问题头疼那都2023年了在云原生时代网络是Kubernetes的核心组件之一从容器间通信到服务暴露从网络策略到负载均衡每一个环节都至关重要。今天susu就带你们从CNI插件到Ingress控制器一步步掌握Kubernetes网络管理的精髓全给你整明白 核心内容1. Kubernetes网络模型Pod网络每个Pod都有一个唯一的IP地址Pod内的容器共享网络命名空间Service网络为Pod提供稳定的访问地址实现服务发现和负载均衡集群网络连接所有节点和Pod的网络基础设施网络策略控制Pod间的通信实现网络隔离2. CNI插件容器网络接口CNIContainer Network Interface是Kubernetes网络的标准接口负责为Pod配置网络。2.1 常用CNI插件Calico基于BGP的网络插件支持网络策略Flannel简单易用的网络插件适合初学者Cilium基于eBPF的网络插件提供高级网络功能Weave Net自配置的网络插件支持加密通信2.2 安装Calico网络插件# 安装Calico kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml # 查看Calico组件状态 kubectl get pods -n kube-system # 验证网络状态 kubectl get nodes3. Service服务发现与负载均衡Service是Kubernetes中用于暴露应用的抽象提供了稳定的访问地址和负载均衡功能。3.1 Service类型ClusterIP默认类型只在集群内部可访问NodePort在每个节点上开放一个端口可从集群外部访问LoadBalancer使用云服务商的负载均衡器自动分配公网IPExternalName通过DNS CNAME记录将服务映射到外部域名3.2 创建ServiceapiVersion: v1 kind: Service metadata: name: nginx-service spec: selector: app: nginx ports: - port: 80 targetPort: 80 type: ClusterIP --- apiVersion: v1 kind: Service metadata: name: nginx-nodeport spec: selector: app: nginx ports: - port: 80 targetPort: 80 nodePort: 30080 type: NodePort --- apiVersion: v1 kind: Service metadata: name: nginx-loadbalancer spec: selector: app: nginx ports: - port: 80 targetPort: 80 type: LoadBalancer3.3 服务发现# 查看Service kubectl get svc # 从Pod内部访问Service kubectl exec -it nginx-pod -- curl http://nginx-service # 从集群外部访问NodePort服务 curl http://node-ip:300804. IngressHTTP/HTTPS路由Ingress是Kubernetes中用于管理HTTP/HTTPS路由的资源允许将外部流量路由到集群内部的服务。4.1 安装Ingress控制器# 安装Nginx Ingress控制器 helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx helm repo update helm install nginx-ingress ingress-nginx/ingress-nginx --namespace ingress-nginx --create-namespace # 查看Ingress控制器状态 kubectl get pods -n ingress-nginx4.2 创建Ingress资源apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: nginx-ingress annotations: nginx.ingress.kubernetes.io/rewrite-target: / spec: rules: - host: example.com http: paths: - path: /nginx pathType: Prefix backend: service: name: nginx-service port: number: 804.3 配置TLSapiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: nginx-ingress-tls spec: tls: - hosts: - example.com secretName: tls-secret rules: - host: example.com http: paths: - path: / pathType: Prefix backend: service: name: nginx-service port: number: 805. NetworkPolicy网络策略NetworkPolicy是Kubernetes中用于控制Pod间通信的资源实现网络隔离和访问控制。5.1 创建NetworkPolicyapiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: default-deny namespace: default spec: podSelector: {} policyTypes: - Ingress - Egress --- apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: allow-nginx namespace: default spec: podSelector: matchLabels: app: nginx policyTypes: - Ingress ingress: - from: - podSelector: matchLabels: app: frontend ports: - protocol: TCP port: 805.2 验证NetworkPolicy# 查看NetworkPolicy kubectl get networkpolicy # 测试网络策略 kubectl exec -it frontend-pod -- curl http://nginx-pod kubectl exec -it other-pod -- curl http://nginx-pod6. 网络故障排查6.1 常见网络问题Pod无法通信检查CNI插件状态、网络策略Service无法访问检查Service配置、端点状态Ingress无法访问检查Ingress控制器状态、路由规则网络延迟检查网络带宽、节点负载6.2 排查工具# 检查Pod网络 kubectl exec -it nginx-pod -- ping 8.8.8.8 kubectl exec -it nginx-pod -- curl http://nginx-service # 检查节点网络 kubectl node-shell node-name -- ping 8.8.8.8 # 检查CNI插件日志 kubectl logs -n kube-system calico-node-pod-name # 检查Service端点 kubectl get endpoints nginx-service7. 网络性能优化7.1 网络调优使用高性能CNI插件如Cilium基于eBPF提供更好的性能配置网络MTU根据网络环境调整MTU大小启用带宽限制为Pod配置合理的带宽限制使用本地流量优先减少跨节点通信7.2 负载均衡优化使用会话亲和性确保同一客户端的请求路由到同一Pod配置健康检查及时发现并剔除不健康的Pod调整负载均衡算法根据应用特点选择合适的负载均衡算法8. 实际应用案例8.1 构建多租户网络apiVersion: v1 kind: Namespace metadata: name: tenant-a --- apiVersion: v1 kind: Namespace metadata: name: tenant-b --- apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: tenant-a-isolation namespace: tenant-a spec: podSelector: {} policyTypes: - Ingress - Egress ingress: - from: - namespaceSelector: matchLabels: name: tenant-a egress: - to: - namespaceSelector: matchLabels: name: tenant-a8.2 配置Ingress路由apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: multi-service-ingress annotations: nginx.ingress.kubernetes.io/rewrite-target: / spec: rules: - host: api.example.com http: paths: - path: /user pathType: Prefix backend: service: name: user-service port: number: 8080 - path: /order pathType: Prefix backend: service: name: order-service port: number: 8080️ 最佳实践网络规划选择合适的CNI插件根据集群规模和需求合理规划Pod网络CIDR避免与其他网络冲突为不同环境配置独立的网络资源服务暴露内部服务使用ClusterIP外部访问使用NodePort或LoadBalancerHTTP/HTTPS流量使用Ingress网络安全配置默认拒绝的NetworkPolicy为每个应用配置细粒度的网络策略限制Pod间的通信只允许必要的流量性能优化使用高性能CNI插件合理配置网络资源优化负载均衡策略监控与排查监控网络指标如延迟、丢包率配置网络相关的告警熟悉网络排查工具和方法 总结Kubernetes网络管理是云原生环境中的重要组成部分。通过本文的实践你应该已经掌握了CNI插件的选择和安装Service的配置和使用Ingress的部署和路由配置NetworkPolicy的配置和网络隔离网络故障排查和性能优化记住网络是Kubernetes的基础良好的网络配置是系统稳定运行的保障。在实际生产环境中要根据业务需求和集群特点选择合适的网络方案配置合理的网络策略确保网络的可靠性和安全性。susu碎碎念网络规划要提前避免后期调整的复杂性网络策略要细粒度实现最小权限原则网络监控要全面及时发现和解决问题网络安全要重视防止未授权访问网络性能要优化提升应用响应速度觉得有用点个赞再走咱们下期见