你好,很棒的社区。p>
我希望有人可以帮助理解这个概念,以加深对 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-a
和ping
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/