免责声明:我无权访问 DigitalOcean。我已经在 GCP 上使用我的 k8s 1.18.2 集群对此进行了分析和测试。确保您也可以在 DigitalOcean 上与prerequisites 会面:
网络策略由网络插件实现。使用网络
策略,您必须使用支持的网络解决方案
网络策略。在没有控制器的情况下创建 NetworkPolicy 资源
实现它不会有任何效果
有一些资源可以帮助您实现目标。首先,查看本指南:ALLOW traffic from external clients:
此网络策略允许来自公共 Internet 的外部客户端
直接或通过负载均衡器访问 pod。
为了工作,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。
-
在 default、ingress-nginx、monitoring 和 ci 命名空间中应用了 deployment 和 service:
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
- 创建了一个入口:
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 命名空间的流量。此外,它们将在内部接收标记为testing 的ingress-nginx 命名空间内的流量。
还要检查负载平衡器服务中的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.