Azure kubernetes 网络策略仅允许某些外部主机用于 pod

Azure kubernetes 网络策略仅允许某些外部主机用于 pod

假设我已经创建了一个具有如下清单的集群:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
spec:
  replicas: 1
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
        use_db: "true"
        backend: "true"
    spec:
      nodeSelector:
        "beta.kubernetes.io/os": linux
      containers:
      - name: my-app
        image: <...>
        resources:
          requests:
            cpu: 100m
            memory: 128Mi
          limits:
            cpu: 250m
            memory: 256Mi
        ports:
        - containerPort: 80
        - containerPort: <...>
---
apiVersion: v1
kind: Service
metadata:
  name: my-app
  annotations:
    service.beta.kubernetes.io/azure-load-balancer-internal: "true"
spec:
  type: LoadBalancer
  ports:
  - port: 80
  selector:
    app: my-app

我已经激活了网络插件和网络策略。它运行良好。但我想设置一些网络策略。我发现了许多关于如何管理 pod 之间的流量、如何允许外部流量以及来自所有单个种子的流量的示例。但我不明白在我的情况下该怎么做。这就是我想要的:

  • 默认拒绝 Kubernetes 内部所有 Pod 之间的流量(我可以这样做)。
  • 允许外部流量到带有标签的 Pod后端从某些外部子网到端口 80(但不是从内部种子)
  • 允许带有标签的 Pod 与某些数据库(我知道它的 DNS 名称和端口)进行外部流量交换使用数据库

请问,有人可以提供一个这种情况的网络策略 YAML 文件的示例吗?

答案1

如果将该spec.podSelector字段指定为空,则网络策略将匹配命名空间中的所有 Pod,默认情况下会阻止 Pod 之间的所有流量。在这种情况下,您必须明确创建网络策略,将 Pod 之间的所有通信列入白名单。

您可以通过在 Kubernetes 集群中应用以下清单来启用此类策略 (来源):

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: default-deny-all
spec:
  podSelector: {}
  policyTypes:
  - Ingress

允许外部流量到标有 后端 从某个外部子网到端口 80(但不是从内部 pod)可能NetworkPolicy看起来像这样:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-backend
spec:
  podSelector:
    matchLabels:
      app: backend
  policyTypes:
  - Ingress
  ingress:
  - from:
    - ipBlock:
        cidr: 0.0.0.0/0
        except:
        - 10.4.0.0/16
    ports:
    - protocol: TCP
      port: 80

这里简单解释一下发生的事情:我们允许所有连接到具有后端标签,允许所有来自的连接0.0.0.0/0(您可以更改为不同的范围)并阻止来自的连接10.4.0.0/16(这是我的内部网络,您需要更改为您拥有的任何网络)。我们还允许80仅连接到端口的连接。

允许带有标签的 Pod 与某些数据库(我知道它的 DNS 名称和端口)进行外部流量交换 使用数据库您只需遵循前面示例中的相同逻辑即可。

这样,您的 Pod 就可以与 Kubernetes 集群外部的任何服务器进行通信。我们不会阻止出口,只会阻止入口。您只需像平常一样在应用程序内指向您的数据库服务器即可。

您可以随时参考文档并了解有关此事的更多详细信息。

相关内容