Kubernetes网络模型与实现详解 🌐 CNI 插件配置 🔌 Flannel 安装与配置 🚀 CNI(Container Network Interface) 是Kubernetes标准化的网络插件接口规范,负责容器网络接口的动态配置与管理,实现跨节点Pod间通信和网络资源分配。安装命令:
1 2 3 4 5 6 7 8 9 10 wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml docker pull quay.io/coreos/flannel:v0.14.0 kubectl create -f kube-flannel.yml kubectl get pod -n kube-system kubectl delete -f kube-flannel.yml
关键配置参数:
网络配置:"Network": "10.244.0.0/16" # Pod网络CIDR
后端类型:"Type": "vxlan" # 虚拟可扩展局域网
部署方式:DaemonSet # 每个节点运行一个实例
CNI 配置路径:/etc/cni/net.d/10-flannel.conflist
Calico 安装与配置 🐱 Calico 是高性能的CNI插件,提供网络策略、BGP路由和细粒度安全控制,支持大规模企业级Kubernetes集群。安装命令:
1 2 3 4 5 6 7 8 wget https://docs.projectcalico.org/manifests/calico.yaml kubectl apply -f calico.yaml kubectl get pod -n kube-system | grep calico kubectl apply -f calico-installation.yaml
关键配置参数:
CNI 网络配置:"name": "k8s-pod-network" # 网络名称
支持网络策略功能 # Pod间访问控制
etcd 配置(可选) # 分布式键值存储
MTU 值可调整 # 最大传输单元
Service 类型配置 🌐 ClusterIP Service 🏠 ClusterIP 是Kubernetes默认的Service类型,为集群内部应用提供虚拟IP地址,实现Pod间负载均衡和服务发现。创建命令:
1 2 3 4 5 6 kubectl create service clusterip my-service --tcp=80:80 kubectl expose deployment my-app --name=my-service --port=80 --target-port=8080 kubectl get services
配置文件示例:
1 2 3 4 5 6 7 8 9 10 11 12 apiVersion: v1 kind: Service metadata: name: my-clusterip-service spec: type: ClusterIP selector: app: my-app ports: - protocol: TCP port: 80 targetPort: 8080
NodePort Service 🚪 NodePort 通过每个节点的IP和固定端口向集群外部暴露服务,适合测试环境和小规模部署。创建命令:
1 2 3 4 5 6 kubectl create service nodeport my-service --tcp=80:80 --node-port=30080 kubectl expose deployment my-app --name=my-nodeport-service --port=80 --target-port=8080 --type =NodePort kubectl get services
配置文件示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 apiVersion: v1 kind: Service metadata: name: my-nodeport-service spec: type: NodePort selector: app: my-app ports: - protocol: TCP port: 80 targetPort: 8080 nodePort: 30080
LoadBalancer Service ⚖️ LoadBalancer 通过云提供商的负载均衡器向外部暴露服务,自动分配外部IP,适合生产环境。创建命令:
1 2 3 4 5 6 kubectl create service loadbalancer my-service --tcp=80:80 kubectl get services kubectl get service my-service -o wide
配置文件示例:
1 2 3 4 5 6 7 8 9 10 11 12 apiVersion: v1 kind: Service metadata: name: my-loadbalancer-service spec: type: LoadBalancer selector: app: my-app ports: - protocol: TCP port: 80 targetPort: 8080
Ingress Controller 配置 🛣️ NGINX Ingress Controller 安装 🎯 Ingress Controller 是Kubernetes的HTTP/HTTPS路由控制器,基于域名和路径规则将外部流量路由到内部Service,提供七层负载均衡。安装命令:
1 2 3 4 5 6 7 8 kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.8.1/deploy/static/provider/cloud/deploy.yaml kubectl apply -f deployments/deployment/nginx-ingress.yaml kubectl get pods -n ingress-nginx kubectl get svc -n ingress-nginx
Ingress 资源配置:
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: Ingress metadata: name: my-ingress annotations: nginx.ingress.kubernetes.io/rewrite-target: / spec: ingressClassName: nginx rules: - host: my-app.example.com http: paths: - path: / pathType: Prefix backend: service: name: my-service port: number: 80
NGINX Ingress Controller Service 配置:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 apiVersion: v1 kind: Service metadata: name: nginx-ingress-lb namespace: kube-system labels: app: nginx-ingress-lb spec: type: LoadBalancer ports: - port: 80 targetPort: 80 protocol: TCP name: http - port: 443 targetPort: 443 protocol: TCP name: https selector: app: nginx-ingress-lb
通用管理命令 🛠️ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 kubectl get services --all-namespaces kubectl describe service my-service kubectl get endpoints kubectl get ingress --all-namespaces kubectl describe ingress my-ingress kubectl get pods -n kube-system | grep -E 'flannel|calico' kubectl get nodes -o wide
注意事项 ⚠️
确保所有命令和配置文件准确无误
根据实际环境调整网络配置参数
定期检查网络组件状态,确保集群网络正常运行