问题描述
我已经在我的命名空间中配置了下一个网络策略:
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-ingress的托管负载均衡器关闭了。如何在网络策略中将托管负载均衡器列入白名单?
我已经尝试将VPC CIDR和负载均衡器公共IP列入白名单,但这无济于事
我要实现的目标:必须允许“测试”命名空间为“ ci”和“监视”命名空间,但同时我想允许来自Digitalocean负载平衡器的流量。 >
您要从哪个命名空间发送流量?我的问题仅与入口流量有关,我们希望允许来自digitalocean负载均衡器的传入流量
您的Nginx入口在哪里?在“测试”命名空间中
您是否要从Nginx入口容器到另一个命名空间上的容器的流量?不,我们只需要在“测试”命名空间内进行流量
应将哪些内容和确切位置列入白名单应该在“测试”命名空间网络策略中将DigitalOcean负载均衡器列入白名单
解决方法
免责声明:我无权访问DigitalOcean。我已经在GCP上使用我的k8s 1.18.2集群对此进行了分析和测试。确保您还可以同时满足DigitalOcean上的prerequisites:
网络策略由网络插件实施。使用网络 策略,您必须使用支持以下内容的网络解决方案 网络政策。在没有控制器的情况下创建NetworkPolicy资源 实现它将无效
有些资源可以帮助您实现目标。首先,请查看本指南:ALLOW traffic from external clients:
此网络策略允许来自公共Internet的外部客户端 直接或通过负载均衡器访问吊舱。
为了正常工作,Service type=LoadBalancer
和Ingress
资源都必须允许所有访问这些资源所选择的Pod的流量。
请参见下面的example:
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
name: web-allow-external
spec:
podSelector:
matchLabels:
app: web
ingress:
- from: []
以下清单允许来自所有来源的流量(包括内部 来自群集和外部)。
我已按照以下步骤复制了您的用例:
-
已安装Nginx Ingress并将其标记为
purpose=testing
。 -
创建并标记了以下命名空间:
ingress-nginx
为purpose=testing
,monitoring
为purpose=monitoring
和ci
为purpose=ci
。 / p> -
在
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: 80
apiVersion: v1
kind: Service
metadata:
name: my1
namespace: <one_of_the_listed_above>
labels:
run: my1
spec:
ports:
- port: 80
protocol: TCP
selector:
run: my1
- 创建了一个Ingress:
apiVersion: 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: 80
-
验证了名称空间和负载平衡器之间的连接。
-
创建了以下
NetworkPolicy
:
apiVersion: 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
,则Ingress将具有运行Ingress pod的节点的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起,用于Ingress的apiVersion: networking.k8s.io/v1beta1
被v1
取代。确保您使用的版本正确。
最后要记住的是,您还应该将这些策略用于出口,而不仅仅是入口。在阻止出口时,您可能会遇到DNS解析问题,这将要求您添加规则,以便Pod能够将请求发送到DNS。更多详细信息here。