Ubuntu K8s如何配置网络策略
导读:Ubuntu上Kubernetes配置网络策略指南 一、前置准备 在配置网络策略前,需完成以下基础步骤: 安装Kubernetes集群:使用kubeadm在Ubuntu节点上初始化Master节点(sudo kubeadm init --...
Ubuntu上Kubernetes配置网络策略指南
一、前置准备
在配置网络策略前,需完成以下基础步骤:
- 安装Kubernetes集群:使用
kubeadm
在Ubuntu节点上初始化Master节点(sudo kubeadm init --pod-network-cidr=10.244.0.0/16
),并将Worker节点加入集群。 - 配置
kubectl
:将Master节点的admin.conf
复制到用户目录的.kube
文件夹(mkdir -p $HOME/.kube; sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config; sudo chown $(id -u):$(id -g) $HOME/.kube/config
)。 - 安装支持网络策略的插件:Kubernetes原生
NetworkPolicy
需依赖网络插件实现,推荐使用Calico(轻量、易配置)。通过以下命令安装:
安装完成后,验证插件状态: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
状态)。
二、核心:定义NetworkPolicy
NetworkPolicy
是Kubernetes中控制Pod流量的关键资源,通过标签选择器匹配目标Pod,定义**入站(Ingress)和出站(Egress)**规则(默认拒绝所有流量,需显式允许)。
1. 基础示例:允许特定Pod访问
假设集群中有frontend
(标签app: frontend
)和backend
(标签app: backend
)两个服务,需限制仅frontend
能访问backend
的6379
端口(Redis):
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-frontend-to-backend
namespace: default # 指定命名空间(默认为default)
spec:
podSelector: # 目标Pod:匹配标签app=backend
matchLabels:
app: backend
policyTypes: # 生效方向:入站+出站(若仅需控制入站,可设为["Ingress"])
- Ingress
- Egress
ingress: # 入站规则:允许frontend访问
- from:
- podSelector:
matchLabels:
app: frontend # 来源Pod:匹配标签app=frontend
ports:
- protocol: TCP
port: 6379 # 允许的端口
egress: # 出站规则:允许backend访问外部(可选)
- to:
- ipBlock:
cidr: 0.0.0.0/0 # 允许访问所有外部IP(根据需求调整)
ports:
- protocol: TCP
port: 53 # 允许DNS查询(示例)
应用策略:kubectl apply -f allow-frontend-to-backend.yaml
。
2. 进阶示例:多命名间隔离
若需隔离dev
(命名空间)与prod
(命名空间)的流量,仅允许dev
中的monitoring
服务(标签app: monitoring
)访问prod
中的所有Pod:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-dev-monitoring-to-prod
namespace: prod # 在prod命名空间生效
spec:
podSelector: # 目标Pod:所有Pod(默认)
matchLabels: {
}
policyTypes:
- Ingress
ingress:
- from:
- namespaceSelector: # 来源命名空间:匹配标签name=dev
matchLabels:
name: dev
podSelector:
matchLabels:
app: monitoring # 来源Pod:匹配标签app=monitoring
ports:
- protocol: TCP
port: 8080 # 允许访问的端口
应用策略:kubectl apply -f allow-dev-monitoring-to-prod.yaml
。
三、验证策略生效
- 测试允许的流量:进入
frontend
Pod,尝试访问backend
的6379
端口:kubectl exec -it < frontend-pod-name> -- sh apk add redis-cli # 若使用alpine镜像,安装redis-cli redis-cli -h < backend-pod-ip> -p 6379 ping # 应返回"PONG"
- 测试拒绝的流量:进入
dev
命名空间外的Pod(如kube-system
中的Pod),尝试访问prod
中的Pod,应无法连接。
四、最佳实践
- 最小权限原则:仅允许必要的流量(如
frontend
只需访问backend
的6379
端口,无需开放所有端口)。 - 标签准确性:为Pod添加清晰的标签(如
app: frontend
、role: database
),便于策略管理。 - 默认拒绝:未定义
NetworkPolicy
的命名空间,默认允许所有流量;建议先定义deny-all
策略(如Calico的globalnetworkpolicy
),再逐步添加允许规则。 - 定期审计:通过
kubectl get networkpolicy -A
查看所有命名空间的策略,确保符合当前业务需求。
五、常见问题
- 策略未生效:检查网络插件是否支持
NetworkPolicy
(如Calico、Cilium支持,Flannel默认不支持);确认策略的namespace
、podSelector
是否正确。 - 性能影响:复杂策略(如大量
ipBlock
)可能增加网络插件负载,建议简化规则。
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: Ubuntu K8s如何配置网络策略
本文地址: https://pptw.com/jishu/733300.html