Azure Kubernetes 子网和网络安全组

标签 azure kubernetes azure-aks

你好,很棒的社区。

我希望有人可以帮助理解这个概念,以加深对 Azure 和网络中的 Kubernetes 的理解。

我有 azure 的 kubernetes 集群。 网络类型(插件)是:Azure CNI 网络策略:Azure

我只是运行以下 yaml 文件来部署 2 个运行 ubuntu 的 Pod:

ubuntu-app-a

apiVersion: apps/v1
kind: Deployment
metadata:
  name: ubuntu-app-a-deployment
  labels:
    app: ubuntu-app-a
spec:
  replicas: 1
  selector:
    matchLabels:
      app: ubuntu-app-a
  template:
    metadata:
      labels:
        app: ubuntu-app-a
    spec:
      containers:
        - name: ubuntu-app-b
          image: ubuntu
          command: ["/bin/sh"]
          args: ["-c", "sleep infinity"]
      restartPolicy: Always 
---
apiVersion: v1
kind: Service
metadata:
  name: ubuntu-app-a-clusterip-service
  labels:
    app: ubuntu-app-a
spec:
  type: ClusterIP
  selector:
    app: ubuntu-app-a
  ports:
    - port: 80
      targetPort: 80

---
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: ubuntu-app-b-network
spec:
  podSelector:
    matchLabels:
      app: ubuntu-app-b
  ingress:
  - from:
    - podSelector:
        matchLabels:
          app: ubuntu-app-a

ubuntu-app-b

apiVersion: apps/v1
kind: Deployment
metadata:
  name: ubuntu-app-b-deployment
  labels:
    app: ubuntu-app-b
spec:
  replicas: 1
  selector:
    matchLabels:
      app: ubuntu-app-b
  template:
    metadata:
      labels:
        app: ubuntu-app-b
    spec:
      containers:
        - name: ubuntu-app-b
          image: ubuntu
          command: ["/bin/sh"]
          args: ["-c", "sleep infinity"]
      restartPolicy: Always 
---
apiVersion: v1
kind: Service
metadata:
  name: ubuntu-app-b-clusterip-service
  labels:
    app: ubuntu-app-b
spec:
  type: ClusterIP
  selector:
    app: ubuntu-app-b
  ports:
    - port: 80
      targetPort: 80

一旦两个 Pod 都启动并运行,我就撞上了 app-aping app-b .

到目前为止,一切都很好,这正是我所期待的。所有 Pod 都可以在同一 vnet 和命名空间中相互通信。

但我很好奇通过使用网络安全组来限制这些 Pod 的内部通信并控制入站和出站流量。

例如,我希望只有 app-a 能够 ping app-b,而不是相反。

我一直在阅读微软文档,但我很困惑,因为他们建议不要使用子网,因为这可能会导致集群中的内部问题。

所以我想知道如何在集群中设置更多限制内部通信?

如果有人可以帮助我或引导我走上正确的道路,我将不胜感激。

提前非常感谢

最佳答案

默认情况下,Kubernetes 允许所有网络流量。因此,每个 Pod 都可以与同一集群内的所有其他 Pod/服务进行通信。 NetworkPolicies 几乎就是防火墙,用于限制 Pod 之间的流量。网络策略由 CNI(容器网络接口(interface))强制执行,在您的情况下是 Azure CNI,但 Azure 有两种不同的策略执行方法(取决于您的需求,但大多数情况下这些都是相当“特殊”的情况)。唯一显着的区别是 Calico 支持全局 Netpol,而 Azure NPM 仅支持命名空间范围的策略。

与 Kubernetes 中的大多数对象一样,NetworkPolicies 与某种类型的选择器一起工作,也就是它应该定位哪些 pod。

<小时/>

出于最佳实践的原因,应拒绝所有流量(如果您有多个团队或一个大型集群正在运行)。您可以通过在每个应用程序命名空间中创建以下资源来实现此目的。

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

完成此操作后,任何 Pod 都无法相互通信,因此您的 ping 应该会失败。

<小时/>

阻止所有入口和导出流量后,您可以明确允许来自所需 Pod 的流量。现在,我们必须允许 Pod A 的导出流量到达 Pod B,并允许 Pod B 中来自 Pod A 的入口流量。您的网络策略已经处于正确的路径中。以下内容应按预期工作。

---
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: ubuntu-app-b-network
spec:
  podSelector:
    matchLabels:
      app: ubuntu-app-b
  ingress:
  - from:
    - podSelector:
        matchLabels:
          app: ubuntu-app-a
---
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: ubuntu-app-a-network
spec:
  podSelector:
    matchLabels:
      app: ubuntu-app-a
  egress:
  - to:
    - podSelector:
        matchLabels:
          app: ubuntu-app-b

请告诉我这是否适合您,如果不适合,我会快速重现您的情况。

关于Azure Kubernetes 子网和网络安全组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74940741/

相关文章:

c# - 在数据库中处理和存储 Azure IoT 中心消息

azure - 访问虚拟网络内的事件中心

kubernetes - 如何从 Stackdriver 跟踪 Google Container Engine 服务?

kubernetes - 如何创建一个服务帐户以从Kubernetes集群内部获取Pod列表?

Azure oauth v2.0 interaction_required 错误与受信任的 ip 和 MFA

sql-server - 将 Guid 主键和聚集索引迁移到 INT (Azure SQL)

kubernetes - kubectl cp 在运行 nvidia-docker 的节点上失败并显示 "tar: this does not look like a tar archive"

kubernetes - 为什么 AKS 上需要 PodDisruptionBudget?

azure - 使用 Azure Kubernetes 在端口 80 上运行 Spring Boot

azure - 该容器服务处于失败状态