我已经在命名空间中配置了下一个网络策略:
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
name: np-testing-allow
namespace: testing
spec:
podSelector: {}
ingress:
- from:
- namespaceSelector:
matchLabels:
purpose: monitoring
- namespaceSelector:
matchLabels:
purpose: ci
- namespaceSelector:
matchLabels:
environmentName: testing但在那之后,nginx入口的负载平衡器就坏了。如何在网络策略中白名单管理负载均衡器?
我已经尝试过白名单VPC,CIDR和负载平衡器的公共IP,但它没有帮助
我想要达到的目标是:必须允许使用“测试”命名空间"ci“和”监视“名称空间,但同时我希望允许来自Digitalocean负载均衡器的通信量。
您想从哪个名称空间发送流量?我的问题仅与入口流量有关,我们希望允许来自数字海洋负载均衡器的传入流量。
你的入口处在哪里?在“测试”命名空间中
你想要从你的nginx入口舱到另一个Namespace上的豆荚的流量吗?不,我们只需要“测试”名称空间内的通信量。
在“测试”命名空间网络策略中应该白化什么以及应该在哪里白化DigitalOcean负载均衡器
发布于 2020-09-25 08:26:21
免责声明:我无权访问DigitalOcean。我在GCP上使用我的k8s 1.18.2集群进行了分析和测试。确保您也可以在DigitalOcean上满足DigitalOcean的要求:
网络策略由网络插件实现。要使用网络策略,必须使用支持NetworkPolicy的网络解决方案。如果没有实现NetworkPolicy资源的控制器,就不会产生任何效果。
有一些资源可以帮助你实现你的目标。首先,查看本指南:允许来自外部客户端的通信
此网络策略允许来自公共Internet的外部客户端直接或通过负载均衡器访问吊舱。
为了工作,Service type=LoadBalancer和Ingress资源都必须允许这些资源选择的豆荚的所有通信量。
请参见下面的示例:
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
name: web-allow-external
spec:
podSelector:
matchLabels:
app: web
ingress:
- from: []以下清单允许来自所有源的通信(包括来自集群的内部通信和来自外部的通信)。
我已经按照以下步骤复制了您的用例:
purpose=testing。ingress-nginx为purpose=testing,monitoring为purpose=monitoring,ci为purpose=ci。deployment和service应用于default、ingress-nginx、monitoring和ci名称空间:apiVersion: apps/v1
kind: Deployment
metadata:
name: my1
namespace: <one_of_the_listed_above>
spec:
selector:
matchLabels:
run: my1
replicas: 2
template:
metadata:
labels:
run: my1
spec:
containers:
- name: my1
image: nginx
ports:
- containerPort: 80apiVersion: v1
kind: Service
metadata:
name: my1
namespace: <one_of_the_listed_above>
labels:
run: my1
spec:
ports:
- port: 80
protocol: TCP
selector:
run: my1apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: my1
namespace: ingress-nginx
annotations:
# If the class annotation is not specified it defaults to "gce".
kubernetes.io/ingress.class: "nginx"
spec:
rules:
- http:
paths:
- path: /
backend:
serviceName: my1
servicePort: 80NetworkPolicyapiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-monitoring-ci
namespace: ingress-nginx
spec:
podSelector: {}
ingress:
- from:
- namespaceSelector:
matchLabels:
purpose: ci
- from:
- namespaceSelector:
matchLabels:
purpose: monitoring
- from:
- namespaceSelector:
matchLabels:
purpose: testing有了上面的配置,ingress-nginx名称空间中的pod应该能够接收来自monitoring和ci名称空间的通信量。此外,它们将在内部接收ingress-nginx命名空间内的通信量,该名称空间被标记为testing。
还要检查负载均衡器服务中的externalTrafficPolicy是否设置为Local或Cluster。如果将其设置为Cluster,则该节点的IP将运行在该节点上。如果发生这种情况,还需要创建以下配置:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-nginx-controller
namespace: ingress-nginx
spec:
podSelector:
matchLabels:
app.kubernetes.io/instance: ingress-nginx
ingress:
- from:
- ipBlock:
cidr: 0.0.0.0/0
except:
- 10.16.0.0/14 #pod ip range使用cidr: 0.0.0.0/0将允许所有传入的通信量,并添加except:将允许您根据DigitalOcean配置(我没有权限)调整您的需求。
还需要注意的是,在k8s v1.19中,apiVersion: networking.k8s.io/v1beta1 for In宿6被替换为v1。确保您正在使用正确的版本控制。
最后要记住的是,你也应该把这些政策用于出口,而不仅仅是进场。当阻塞出口时,您可能会遇到DNS解析的问题,这将要求您添加规则,以便荚能够向DNS发送请求。更多细节这里。
https://stackoverflow.com/questions/63988163
复制相似问题