如何在kubernetes网络策略中将digitalocean负载均衡器列入白名单?

时间:2020-09-21 07:52:40

标签: kubernetes digital-ocean kubernetes-networkpolicy

我已经在我的命名空间中配置了下一个网络策略:

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负载均衡器列入白名单

1 个答案:

答案 0 :(得分:0)

免责声明:我无权访问DigitalOcean。我已经在GCP上使用我的k8s 1.18.2集群对此进行了分析和测试。确保您还可以同时满足DigitalOcean上的prerequisites

网络策略由网络插件实施。使用网络 策略,您必须使用支持以下内容的网络解决方案 网络政策。在没有控制器的情况下创建NetworkPolicy资源 实现它将无效

有些资源可以帮助您实现目标。首先,请查看本指南:ALLOW traffic from external clients

此网络策略允许来自公共Internet的外部客户端 直接或通过负载均衡器访问吊舱。

为了正常工作,Service type=LoadBalancerIngress资源都必须允许所有访问这些资源所选择的Pod的流量。

请参见下面的example

kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
  name: web-allow-external
spec:
  podSelector:
    matchLabels:
      app: web
  ingress:
  - from: []

以下清单允许来自所有来源的流量(包括内部 来自群集和外部)。

我已按照以下步骤复制了您的用例:

  1. 已安装Nginx Ingress并将其标记为purpose=testing

  2. 创建并标记了以下命名空间:ingress-nginxpurpose=testingmonitoringpurpose=monitoringcipurpose=ci。 / p>

  3. deploymentservicedefaultingress-nginx命名空间中应用monitoringci


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
  1. 创建了一个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
  1. 验证了名称空间和负载平衡器之间的连接。

  2. 创建了以下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上方的配置,应该能够接收来自monitoringci名称空间的流量。同样,它们将在内部ingress-nginx命名为testing的命名空间内接收流量。

还要检查您在负载均衡器服务中的externalTrafficPolicy是否设置为LocalCluster。如果将其设置为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/v1beta1v1取代。确保您使用的版本正确。

最后要记住的是,您还应该将这些策略用于出口,而不仅仅是入口。在阻止出口时,您可能会遇到DNS解析问题,这将要求您添加规则,以便Pod能够将请求发送到DNS。更多详细信息here