假设我已经创建了一个具有如下清单的集群:
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 集群外部的任何服务器进行通信。我们不会阻止出口,只会阻止入口。您只需像平常一样在应用程序内指向您的数据库服务器即可。
您可以随时参考文档并了解有关此事的更多详细信息。