Ubuntu上Kubernetes网络策略制定指南
一、前置准备
在Ubuntu上制定Kubernetes网络策略前,需完成以下基础配置:
- 系统参数优化:修改
/etc/sysctl.d/kubernetes.conf,启用网桥转发并关闭IPv6,添加以下内容:
执行net.bridge.bridge-nf-call-iptables=1 net.ipv4.ip_forward=1 net.ipv6.conf.all.disable_ipv6=1sysctl -p使配置生效。 - 禁用Swap:Kubernetes不支持Swap,需执行以下命令禁用:
sudo swapoff -a sudo sed -i '/ swap / s/1/g' /etc/fstab - 加载内核模块:加载
overlay和br_netfilter模块(用于支持CNI网络插件):sudo modprobe overlay sudo modprobe br_netfilter - 安装Kubernetes组件:在所有节点上安装
kubelet、kubeadm、kubectl:sudo apt update sudo apt install -y kubelet kubeadm kubectl sudo apt-mark hold kubelet kubeadm kubectl # 锁定版本避免自动更新
二、安装网络插件(关键前提)
Kubernetes网络策略需通过网络插件实现,Calico是Ubuntu环境下常用的成熟选择(支持跨节点、高性能)。安装步骤如下:
# 应用Calico官方YAML(自动部署Operator和自定义资源)
kubectl apply -f https://docs.projectcalico.org/manifests/tigera-operator.yaml
kubectl apply -f https://docs.projectcalico.org/manifests/custom-resources.yaml
安装完成后,验证插件状态:
kubectl get pods -n calico-system # 所有Pod应为Running状态
三、网络策略核心概念
制定策略前需理解以下关键概念:
- Pod选择器(podSelector):通过标签选择目标Pod(如
app: frontend),空选择器表示当前命名空间内所有Pod。 - 策略类型(policyTypes):
Ingress:控制进入Pod的流量;Egress:控制Pod发出的流量;- 同时指定
Ingress和Egress则管控双向流量。
- 流量规则:
ingress.from:定义入站流量来源(如Pod选择器、命名空间选择器、IP块);ingress.ports:定义允许的入站端口及协议(如TCP 80);egress.to/egress.ports:对应出站流量的目标及端口。
四、常见网络策略示例
1. 允许同一命名空间内特定Pod通信
以下策略允许带有app: frontend标签的Pod访问带有app: backend标签的Pod的8080端口(TCP):
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-frontend-to-backend
namespace: default
spec:
podSelector:
matchLabels:
app: backend # 作用于带有app: backend标签的Pod
policyTypes:
- Ingress
ingress:
- from:
- podSelector:
matchLabels:
app: frontend # 来自带有app: frontend标签的Pod
ports:
- protocol: TCP
port: 8080
应用命令:kubectl apply -f allow-frontend-to-backend.yaml。
2. 拒绝所有入站流量(默认拒绝)
强制所有Pod默认拒绝入站流量,仅显式允许的流量可通过:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny-ingress
namespace: default
spec:
podSelector: {} # 匹配当前命名空间内所有Pod
policyTypes:
- Ingress
3. 允许Pod访问外部IP块
以下策略允许带有app: db标签的Pod访问外部10.0.0.0/24网段的3306端口(TCP):
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-db-to-external
namespace: default
spec:
podSelector:
matchLabels:
app: db
policyTypes:
- Egress
egress:
- to:
- ipBlock:
cidr: 10.0.0.0/24
ports:
- protocol: TCP
port: 3306
4. 允许特定命名空间的Pod访问
以下策略允许app: frontend命名空间的Pod访问当前命名空间内app: database标签的Pod的3306端口(TCP):
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-frontend-namespace-to-db
namespace: default
spec:
podSelector:
matchLabels:
app: database
policyTypes:
- Ingress
ingress:
- from:
- namespaceSelector:
matchLabels:
app: frontend
ports:
- protocol: TCP
port: 3306
五、应用与验证网络策略
- 应用策略:使用
kubectl apply命令部署策略文件:kubectl apply -f.yaml - 查看策略:列出当前命名空间的网络策略:
kubectl get networkpolicies -n - 验证策略:
- 创建临时测试Pod(如BusyBox):
kubectl run test-pod --image=busybox -it --rm --restart=Never -- sh - 在测试Pod中尝试访问目标Pod(如
app: backend的8080端口):wget -qO- http://:8080 - 根据策略预期,验证是否允许或拒绝访问。
- 创建临时测试Pod(如BusyBox):
六、最佳实践
- 最小权限原则:从
default-deny-ingress(默认拒绝入站)开始,逐步添加必要的允许规则,避免过度开放权限。 - 标签规范化:为Pod添加清晰的标签(如
app: frontend、env: production),便于策略的精准匹配。 - 渐进式部署:先在小范围测试策略(如
dev命名空间),确认无误后再推广至生产环境。 - 定期审计:使用
kubectl describe networkpolicy查看策略详情,定期审查是否符合当前业务需求。 - 网络插件选择:优先选择成熟的网络插件(如Calico),确保策略的高效执行和良好支持(如Calico提供更细粒度的流量控制和可视化功能)。
以上就是关于“Ubuntu上Kubernetes的网络策略制定”的相关介绍,筋斗云是国内较早的云主机应用的服务商,拥有10余年行业经验,提供丰富的云服务器、租用服务器等相关产品服务。云服务器资源弹性伸缩,主机vCPU、内存性能强悍、超高I/O速度、故障秒级恢复;电子化备案,提交快速,专业团队7×24小时服务支持!
简单好用、高性价比云服务器租用链接:https://www.jindouyun.cn/product/cvm