1. 首页 > Linux教程 > 正文

Linux教程FG545-大规模K8s网络插件与网络策略

本文档风哥主要介绍Linux系统大规模Kubernetes网络插件与网络策略,包括K8s网络基础概念、网络插件类型、网络策略基础、网络插件配置、网络策略配置、网络监控以及实战案例等内容,风哥教程参考Kubernetes官方文档、Linux官方文档Networking等内容,适合系统管理员在生产环境中使用。

from PG视频:www.itpux.com

Part01-基础概念与理论知识

1.1 K8s网络基础概念

Kubernetes网络是容器编排的重要组成部分,负责Pod间通信、服务暴露和网络安全。Kubernetes网络模型要求:

  • 所有Pod可以直接通信,无需NAT
  • 所有节点可以直接与Pod通信,无需NAT
  • Pod看到的IP地址与其他Pod看到的相同

为了实现这个网络模型,Kubernetes使用网络插件来管理网络配置。

K8s网络模型核心原则:

  • 扁平网络:所有Pod在同一个网络平面,无需端口映射
  • IP-per-Pod:每个Pod拥有唯一的IP地址
  • 服务发现:通过DNS实现服务发现
  • 负载均衡:通过Service实现负载均衡

1.2 网络插件类型

Kubernetes支持多种网络插件,根据不同的场景选择合适的插件:

# 网络插件类型
– Calico:基于BGP的网络插件,性能好,功能丰富,支持网络策略
– Flannel:简单易用,适合初学者,不支持网络策略
– Cilium:基于eBPF的网络插件,性能优异,支持网络策略和服务网格
– Weave Net:简单易用,支持多集群网络
– Canal:Calico和Flannel的结合,提供网络策略支持

# 网络插件选择因素
– 性能:网络吞吐量和延迟
– 功能:是否支持网络策略、服务网格等
– 可靠性:稳定性和故障恢复能力
– 可扩展性:支持的集群规模
– 维护成本:配置和管理的复杂度

1.3 网络策略基础

网络策略(NetworkPolicy)是Kubernetes中用于控制Pod间通信的资源。网络策略允许你定义:

  • 哪些Pod可以访问其他Pod
  • 哪些端口可以被访问
  • 来自哪些IP地址的流量可以访问Pod

网络策略需要网络插件的支持,不是所有网络插件都支持网络策略。

Part02-生产环境规划与建议

2.1 网络插件选择

生产环境网络插件选择要点:

# 网络插件选择
– 小规模集群(< 100节点):Flannel、Weave Net - 中规模集群(100-500节点):Calico、Cilium - 大规模集群(> 500节点):Calico、Cilium

# 功能需求
– 需要网络策略:Calico、Cilium、Canal
– 需要服务网格:Cilium
– 需要多集群网络:Weave Net
– 需要高性能:Cilium

# 部署环境
– 云环境:选择云服务商推荐的网络插件
– 裸金属环境:Calico、Cilium
– 混合环境:Calico

2.2 网络架构设计

生产环境网络架构设计要点:

# 网络架构
– 管理网络:用于集群管理通信
– 业务网络:用于Pod间通信
– 外部网络:用于服务暴露

# 网络配置
– 网络CIDR:为Pod和服务分配合适的CIDR
– 网络MTU:根据网络设备配置合适的MTU
– 网络隔离:使用VLAN或VXLAN隔离不同网络
– 网络冗余:多网卡绑定,提高可靠性

# 网络性能
– 带宽:确保足够的网络带宽
– 延迟:最小化网络延迟
– 丢包率:确保低丢包率

2.3 网络安全考虑

生产环境网络安全考虑要点:

# 网络安全
– 网络策略:配置严格的网络策略,限制Pod间通信
– TLS加密:为服务间通信配置TLS加密
– 网络隔离:使用NetworkPolicy隔离不同命名空间的Pod
– 防火墙:配置防火墙规则,限制网络访问
– 网络监控:监控网络流量,更多学习教程公众号风哥教程itpux_com检测异常行为

# 安全最佳实践
– 最小权限原则:只允许必要的网络通信
– 分层防御:使用多层网络安全措施
– 定期审计:定期审计网络策略和安全配置
– 及时更新:及时更新网络插件和安全补丁

Part03-生产环境项目实施方案

3.1 网络插件配置

3.1.1 配置Calico网络插件

# 安装Calico网络插件
$ kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml

# 查看Calico pods状态
$ kubectl get pods -n calico-system
NAME READY STATUS RESTARTS AGE
calico-kube-controllers-7d75c484b5-8x8x8 1/1 Running 0 5m
calico-node-2q4x2 1/1 Running 0 5m
calico-node-5b678 1/1 Running 0 5m
calico-node-7c89d 1/1 Running 0 5m

# 查看网络状态
$ kubectl get nodes -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
master1 Ready control-plane 20m v1.27.0 192.168.1.101 CentOS Linux 9 Stream 5.14.0-362.8.1.el9_3.x86_64 docker://24.0.7
worker1 Ready 10m v1.27.0 192.168.1.102 CentOS Linux 9 Stream 5.14.0-362.8.1.el9_3.x86_64 docker://24.0.7
worker2 Ready 8m v1.27.0 192.168.1.103 CentOS Linux 9 Stream 5.14.0-362.8.1.el9_3.x86_64 docker://24.0.7

3.学习交流加群风哥微信: itpux-com1.2 配置Cilium网络插件

# 安装Cilium网络插件
$ helm repo add cilium https://helm.cilium.io/
$ helm install cilium cilium/cilium –version 1.14.0 –namespace kube-system

# 查看Cilium pods状态
$ kubectl get pods -n kube-system | grep cilium
cilium-2q4x2 1/1 Running 0 5m
cilium-5b678 1/1 Running 0 5m
cilium-7c89d 1/1 Running 0 5m
cilium-operator-7d75c484b5-8x8x8 1/1 Running 0 5m

# 查看网络状态
$ kubectl get nodes -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
master1 Ready control-plane 20m v1.27.0 192.168.1.101 CentOS Linux 9 Stream 5.14.0-362.8.1.el9_3.x86_64 docker://24.0.7
worker1 Ready 10m v1.27.0 192.168.1.102 CentOS Linux 9 Stream 5.14.0-362.8.1.el9_3.x86_64 docker://24.0.7
worker2 Ready 8m v1.27.0 192.168.1.103 CentOS Linux 9 Stream 5.14.0-362.8.1.el9_3.x86_64 docker://24.0.7

3.2 网络策略配置

3.2.1 配置网络策略

# 创建命名空间
$ kubectl create namespace fgedu-app

# 创建应用Pod
$ kubectl run nginx –image=nginx –namespace fgedu-app
$ kubectl run busybox –image=busybox –namespace fgedu-app –command — sleep 3600

# 创建网络策略
$ kubectl apply -f – << EOF apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: allow-nginx namespace: fgedu-app spec: podSelector: matchLabels: run: nginx ingress: - from: - podSelector: matchLabels: run: busybox ports: - protocol: TCP port: 80 EOF # 查看网络策略 $ kubectl get networkpolicies -n fgedu-app NAME POD-SELECTOR AGE allow-nginx run=nginx 5m # 测试网络策略 $ kubectl exec -it busybox -n fgedu-app -- wget -O - http://nginx Connecting to nginx (10.244.1.2:80)

Welcome to nginx!

If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.

For online documentation and support please refer to
nginx.org.
Commercial support is available at
nginx.com.

Thank you for using nginx.

– 100% |*******************************| 612 0:00:00 ETA

# 测试网络策略拒绝访问
$ kubectl run alpine –image=alpine –namespace fgedu-app –command — sleep 3600
$ kubectl exec -it alpine -n fgedu-app — wget -O – http://nginx
wget: bad address ‘nginx’

3.3 网络监控

3.3.1 配置网络监控

# 安装Prometheus和Grafana
$ helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
$ helm install prometheus prometheus-community/kube-prometheus-stack

# 查看监控组件状态
$ kubectl get pods -n default | grep -E ‘prometheus|grafana’
prometheus-kube-prometheus-operator-7d75c484b5-8x8x8 1/1 Running 0 5m
prometheus-kube-state-metrics-7d75c484b5-8x8x8 1/1 Running 0 5m
prometheus-prometheus-0 2/2 Running 0 5m
grafana-7d75c484b5-8x8x8 1/1 Running 0 5m

# 访问Grafana
$ kubectl port-forward svc/grafana 3000:80

# 查看网络流量
$ kubectl top pod
NAME CPU(cores) MEMORY(bytes)
nginx-f4b547b54-2q4x2 1m 24Mi
busybox 0m 1Mi
alpine 0m 1Mi

Part04-生产案例与实战讲解

4.1 Calico网络插件案例

4.1.1 企业级Calico网络部署

# 案例:企业级Calico网络
# 环境:3节点K8s集群
# 目标:部署Calico网络插件,配置网络策略

# 1. 安装Calico网络插件
$ kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml

# 2. 查看Calico状态
$ kubectl get pods -n calico-system
NAME READY STATUS RESTARTS AGE
calico-kube-controllers-7d75c484b5-8x8x8 1/1 Running 0 5m
calico-node-2q4x2 1/1 Running 0 5m
calico-node-5b678 1/1 Running 0 5m
calico-node-7c89d 1/1 Running 0 5m

# 3. 创建应用
$ kubectl create namespace fgedu-prod
$ kubectl run web –image=nginx –replicas=3 –namespace fgedu-prod
$ kubectl run api –image=nginx –replicas=2 –namespace fgedu-prod
$ kubectl run db –image=mysql:8.0 –namespace fgedu-prod –env=MYSQL_ROOT_PASSWORD=password

# 4. 创建网络策略
$ kubectl apply -f – << EOF apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: web-policy namespace: fgedu-prod spec: podSelector: matchLabels: run: web ingress: - from: - ipBlock: cidr: 0.0.0.0/0 ports: - protocol: TCP port: 80 --- apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: api-policy namespace: fgedu-prod spec: podSelector: matchLabels: run: api ingress: - from: - podSelector: matchLabels: run: web ports: - protocol: TCP port: 80 --- apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: db-policy namespace: fgedu-prod spec: podSelector: matchLabels: run: db ingress: - from: - podSelector: matchLabels: run: api ports: - protocol: TCP port: 3306 EOF # 5. 测试网络策略 $ kubectl run test --image=busybox --namespace fgedu-prod --command -- sleep 3600 $ kubectl exec -it test -n fgedu-prod -- wget -O - http://web Connecting to web (10.244.1.2:80)

Welcome to nginx!

If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.

For online documentation and support please refer to
nginx.org.
Commercial support is available at
nginx.com.

Thank you for using nginx.

– 100% |*******************************| 612 0:00:00 ETA

$ kubectl exec -it test -n fgedu-prod — wget -O – http://api
wget: bad address ‘api’

$ kubectl exec -it test -n fgedu-prod — wget -O – http://db:3306
wget: bad address ‘db:3306’

4.2 Cilium网络插件案例

4.2.1 企业级Cilium网络部署

# 案例:企业级Cilium网络
# 环境:3节点K8s集群
# 目标:部署Cilium网络插件,配置网络策略

# 1. 安装Cilium网络插件
$ helm repo add cilium https://helm.cilium.io/
$ helm install cilium cilium/cilium –version 1.14.0 –namespace kube-system

# 2. 查看Cilium状态
$ kubectl get pods -n kube-system | grep cilium
cilium-2q4x2 1/1 Running 0 5m
cilium-5b678 1/1 Running 0 5m
cilium-7c89d 1/1 Running 0 5m
cilium-operator-7d75c484b5-8x8x8 1/1 Running 0 5m

# 3. 创建应用
$ kubectl create namespace fgedu-dev
$ kubectl run frontend –image=nginx –replicas=3 –namespace fgedu-dev
$ kubectl run backend –image=nginx –replicas=2 –namespace fgedu-dev
$ kubectl run redis –image=redis –namespace fgedu-dev

# 4. 创建网络策略
$ kubectl apply -f – << EOF apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: frontend-policy namespace: fgedu-dev spec: podSelector: matchLabels: run: frontend ingress: - from: - ipBlock: cidr: 0.0.0.0/0 ports: - protocol: TCP port: 80 --- apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: backend-policy namespace: fgedu-dev spec: podSelector: matchLabels: run: backend ingress: - from: - podSelector: matchLabels: run: frontend ports: - protocol: TCP port: 80 --- apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: redis-policy namespace: fgedu-dev spec: podSelector: matchLabels: run: redis ingress: - from: - podSelector: matchLabels: run: backend ports: - protocol: TCP port: 6379 EOF # 5. 测试网络策略 $ kubectl run test --image=busybox --namespace fgedu-dev --command -- sleep 3600 $ kubectl exec -it test -n fgedu-dev -- wget -O - http://frontend Connecting to frontend (10.244.1.2:80)

Welcome to nginx!

If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.

For online documentation and support please refer to
nginx.org.
Commercial support is available at
nginx.com.

Thank you for using nginx.

– 100% |*******************************| 612 0:00:00 ETA

$ kubectl exec -it test -n fgedu-dev — wget -O – http://backend
wget: bad address ‘backend’

$ kubectl exec -it test -n fgedu-dev — wget -O – http://redis:6379
wget: bad address ‘redis:6379’

4.3 网络策略实施案例

4.3.1 企业级网络策略实施

# 案例:企业级网络策略
# 环境:5节点K8s集群
# 目标:实施严格的网络策略,保护应用安全

# 1. 安装Calico网络插件
$ kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml

# 2. 创建多命名空间
$ kubectl create namespace fgedu-frontend
$ kubectl create namespace fgedu-backend
$ kubectl create namespace fgedu-database

# 3. 部署应用
$ kubectl run frontend –image=nginx –replicas=5 –namespace fgedu-frontend
$ kubectl run backend –image=nginx –replicas=3 –namespace fgedu-backend
$ kubectl run mysql –image=mysql:8.0 –namespace fgedu-database –env=MYSQL_ROOT_PASSWORD=password

# 4. 创建网络策略
$ kubectl apply -f – << EOF # Frontend namespace policy apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: frontend-policy namespace: fgedu-frontend spec: podSelector: matchLabels: run: frontend ingress: - from: - ipBlock: cidr: 0.0.0.0/0 ports: - protocol: TCP port: 80 --- # Backend namespace policy apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: backend-policy namespace: fgedu-backend spec: podSelector: matchLabels: run: backend ingress: - from: - namespaceSelector: matchLabels: name: fgedu-frontend ports: - protocol: TCP port: 80 --- # Database namespace policy apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: database-policy namespace: fgedu-database spec: podSelector: matchLabels: run: mysql ingress: - from: - namespaceSelector: matchLabels: name: fgedu-backend ports: - protocol: TCP port: 3306 EOF # 5. 测试网络策略 $ kubectl run test-frontend --image=busybox --namespace fgedu-frontend --command -- sleep 3600 $ kubectl run test-backend --image=busybox --namespace fgedu-backend --command -- sleep 3600 $ kubectl run test-database --image=busybox --namespace fgedu-database --command -- sleep 3600 # 测试前端访问 $ kubectl exec -it test-frontend -n fgedu-frontend -- wget -O - http://frontend Connecting to frontend (10.244.1.2:80)

Welcome to nginx!

If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.

For online documentation and support please refer to
nginx.org.
Commercial support is available at
nginx.com.

Thank you for using nginx.

– 100% |*******************************| 612 0:00:00 ETA

# 测试后端访问
$ kubectl exec -it test-frontend -n fgedu-frontend — wget -O – http://backend.fgedu-backend
Connecting to backend.fgedu-backend (10.244.2.2:80)

Welcome to nginx!

If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.

For online documentation and support please refer to
nginx.org.
Commercial support is available at
nginx.com.

Thank you for using nginx.

– 100% |*******************************| 612 0:00:00 ETA

# 测试数据库访问
$ kubectl exec -it test-backend -n fgedu-backend — wget -O – http://mysql.fgedu-database:3306
Connecting to mysql.fgedu-database:3306 (10.244.3.2:3306)
5.7.39-log
T
!Q%N3h9�1�A?mysql_native_password!
)

# 测试跨命名空间访问拒绝
$ kubectl exec -it test-frontend -n fgedu-frontend — wget -O – http://mysql.fgedu-database:3306
wget: bad address ‘mysql.fgedu-database:3306’

Part05-风哥经验总结与分享

5.1 网络插件与策略最佳实践

Kubernetes网络插件与网络策略最佳实践:

  • 选择合适的网络插件:根据集群规模、功能需求和部署环境选择合适的网络插件
  • 配置网络策略:为所有命名空间配置网络策略,限制Pod间通信
  • 网络隔离:使用命名空间和网络策略隔离不同环境的应用
  • 监控网络状态:实时监控网络流量和状态,及时发现问题
  • 定期审计:定期审计网络策略和安全配置,确保安全性
  • 使用TLS加密:为服务间通信配置TLS加密,提高安全性
  • 优化网络性能:根据应用特点优化网络配置,提高性能
  • 备份网络配置:定期备份网络插件和网络策略配置,确保可恢复性

5.更多视频教程www.fgedu.net.cn2 常见问题与解决方案

# 常见问题与解决方案

## 1. 网络插件安装失败
– 原因:资源不足、网络问题、配置错误
– 解决方案:增加资源、检查网络连接、检查配置文件

## 2. Pod无法通信
– 原因:网络插件配置错误、网络策略限制、防火墙阻止
– 解决方案:检查网络插件配置、检查网络策略、关闭防火墙或开放端口

## 3. 网络策略不生效
– 原因:网络插件不支持网络策略、配置错误、命名空间不匹配
– 解决方案:使用支持网络策略的网络插件、检查配置、确保命名空间正确

## 4. 网络性能下降
– 原因:网络带宽不足、网络插件性能问题、Pod数量过多
– 解决方案:增加网络带宽、选择高性能网络插件、优化Pod分布

## 5. 网络监控失败
– 原因:监控配置错误、网络插件不支持监控、权限问题
– 解决方案:检查监控配置、使用支持监控的网络插件、配置正确的权限

5.3 性能调优建议

风哥针对

Kubernetes网络插件与网络策略性能调优建议:

  • 优化网络插件配置:根据集群规模和应用特点配置网络插件参数
  • 选择合适的网络插件:对于高性能需求,选择Cilium等基于eBPF的网络插件
  • 优化网络策略:减少网络策略的复杂度,避免过度限制
  • 网络硬件优化:使用万兆网卡,配置适当的MTU,使用网络加速技术
  • Pod分布优化:合理分布Pod,减少跨节点通信
  • 使用本地存储:对于需要高I/O的应用,使用本地存储减少网络I/O
  • 监控与分析:使用Prometheus和Grafana监控网络性能,分析瓶颈
  • 定期维护:清理无用的网络策略和资源,更新网络插件版本

风哥提示:

Kubernetes网络插件与网络策略是企业级应用安全的重要组成部分,合理的配置和优化可以提高系统的安全性和性能。建议从网络插件选择开始,逐步优化网络策略配置。

持续监控:Kubernetes网络需要持续监控和维护,建议建立完善的监控体系,及时发现和解决问题,确保网络的稳定运行。

风哥提示:

安全是K学习交流加群风哥QQ113257174ubernetes网络的重要考虑因素,一定要采取严格的安全措施,防止未授权访问和攻击。from Linux:www.itpux.com

本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息