【问题标题】:How to whitelist digitalocean load balancer in kubernetes network policy?如何在 kubernetes 网络策略中将 digitalocean 负载均衡器列入白名单?
【发布时间】:2021-01-07 07:20:39
【问题描述】:

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

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-ingress 位于哪里?在“testing”命名空间中

你想让流量从你的 nginx-ingress pod 到另一个命名空间上的 pod 吗?不,我们只需要“testing”命名空间内的流量

应将哪些内容和位置准确列入白名单 DigitalOcean 负载均衡器应在“测试”命名空间网络策略中列入白名单

【问题讨论】:

  • 我们需要在这里了解更多细节以便为您提供帮助。你到底想达到什么目的?您想从哪个命名空间发送流量?你的 nginx 入口在哪里?你想让你的 nginx-ingress pod 到另一个命名空间上的 pod 的流量吗?什么和在哪里应该被准确地列入白名单。请使用必要的详细信息编辑您的问题。
  • 另外,您是本地集群还是使用 Digitalocean 托管的 kubernetes?
  • 我已经添加了细节,希望这就足够了
  • 您是否尝试过this?另外,当您进行请求时,您在 nginx-ingrss 控制器中看到的传入 IP 是什么?我的意思是它是您的公共 IP 还是负载均衡器 IP?

标签: kubernetes digital-ocean kubernetes-networkpolicy


【解决方案1】:

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

网络策略由网络插件实现。使用网络 策略,您必须使用支持的网络解决方案 网络策略。在没有控制器的情况下创建 NetworkPolicy 资源 实现它不会有任何效果

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

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

为了工作,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

  3. defaultingress-nginxmonitoringci 命名空间中应用了 deploymentservice


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. 创建了一个入口:

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 命名空间的流量。此外,它们将在内部接收标记为testingingress-nginx 命名空间内的流量。

还要检查负载平衡器服务中的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/v1beta1 被替换为 v1。确保您使用的是正确的版本控制。

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

【讨论】:

    猜你喜欢
    • 2019-05-27
    • 1970-01-01
    • 2021-10-07
    • 2016-06-23
    • 1970-01-01
    • 1970-01-01
    • 2019-07-04
    • 2020-05-07
    • 1970-01-01
    相关资源
    最近更新 更多