kubernetes - Kubernetes 上的 NetworkPolicy 只允许 UI 与后端对话?
问题描述
需要注意的是后端(烧瓶服务)需要与 MongoDB 对话以获取数据。如果在网络策略中,我将其添加nodeSelector
为我的烧瓶服务,并将 UI 添加到入口,并将 UI 和 MongoDB 上的 Egress 添加到规则,它仍然不起作用。
NAME READY STATUS RESTARTS AGE
pod/xyz-mongodb-replicaset-0 1/1 Running 0 10d
pod/xyz-mongodb-replicaset-1 1/1 Running 0 7d
pod/xyz-mongodb-replicaset-2 1/1 Running 0 6d23h
pod/xyz-svc-7b589fbd4-25qd6 1/1 Running 0 20h
pod/xyz-svc-7b589fbd4-9n8jh 1/1 Running 0 20h
pod/xyz-svc-7b589fbd4-r5q9g 1/1 Running 0 20h
pod/xyz-ui-7d6f44b57b-8s4mq 1/1 Running 0 3d20h
pod/xyz-ui-7d6f44b57b-bl8r6 1/1 Running 0 3d20h
pod/xyz-ui-7d6f44b57b-jwhc2 1/1 Running 0 3d20h
pod/mongodb-backup-check 1/1 Running 0 20h
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/xyz-mongodb-replicaset ClusterIP None <none> 27017/TCP 10d
service/xyz-prod-service ClusterIP 10.3.92.123 <none> 8000/TCP 20h
service/xyz-prod-ui ClusterIP 10.3.49.132 <none> 80/TCP 10d
--Deployment--
--Replicasset--
--Statefulset--
我的入口看起来像 -
Name: xyz-prod-svc
Namespace: prod-xyz
Address:
Default backend: default-http-backend:80 (<none>)
TLS:
prod terminates xyz.prod.domain.com
Rules:
Host Path Backends
---- ---- --------
xyz.prod.domain.com
/ xyz-prod-u:80 (10.7.2.4:80,10.7.4.22:80,10.7.5.24:80)
/endpoint4 xyz-prod-servic:8000 (IPS...)
/endpoint3 xyz-prod-servic:8000 (IPS...)
/endpoint2 xyz-prod-servic:8000 (IPS...)
/endpoint1 xyz-prod-servic:8000 (IPS...)
我是否必须在我的网络策略的 podSelector 选项中指定我的入口?
到目前为止,我的网络策略如下所示 -
---
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: application-network-policy
namespace: app-prod-xyz
labels:
app: application-network-policy
spec:
podSelector:
matchLabel:
run: xyz-svc
policyTypes:
- Ingress
- Egress
ingress:
- from:
- podSelector:
matchLabels:
app: xyz-ui
- podSelector:
matchLabels:
app: application-health-check
egress:
- to:
- podSelector:
matchLabels:
app: xyz-ui
- podSelector:
matchLabels:
app: xyz-mongodb-replicaset
- podSelector:
matchLabels:
app: mongodb-replicaset
故障排除:
我已经尝试启动一个 pod 并将该 pod 添加到入口中。当它被允许进入入口时,我能够从 pod ping xyz-svc,而当我从入口中删除它时,它被拒绝,因此证明网络策略正在运行。
我想了解标签、选择器和 matchLabels。
我已经阅读了这些链接,但我想对我的 NetworkPolicy 有一个直观的解释,例如:
podSelector:需要应用网络策略的 pod(可以是部署或应用名称或层名称或运行)
ingress:允许或拒绝访问上述 pod 的流量
egress:允许或拒绝访问从上述 pod 发出的流量。您的 pod 名称应与哪些标签匹配?
命名空间选择器?
吊舱选择器?
编辑:入口 YAML
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
kubernetes.io/ingress.class: "nginx"
nginx.ingress.kubernetes.io/affinity: "cookie"
nginx.ingress.kubernetes.io/session-cookie-expires: "3600"
nginx.ingress.kubernetes.io/session-cookie-max-age: "3600"
name: xyz-{{ .Values.environment }}-ingress-svc
namespace: acoe-{{ .Values.environment }}-xyz
labels:
app: xyz-{{ .Values.environment }}-ingress-svc
spec:
tls:
- hosts:
- xyz{{ .Values.ingressDomain }}
secretName: {{ .Values.tlsSecret }}
rules:
- host: xyz{{ .Values.ingressDomain }}
http:
paths:
- path: /
backend:
serviceName: xyz-{{ .Values.environment }}-ui
servicePort: 80
- path: /endpoint4
backend:
serviceName: xyz-{{ .Values.environment }}-svc
servicePort: 8000
- path: /endpoint3
backend:
serviceName: xyz-{{ .Values.environment }}-svc
servicePort: 8000
- path: /endpoint2
backend:
serviceName: xyz-{{ .Values.environment }}-svc
servicePort: 8000
- path: /endpoint1
backend:
serviceName: xyz-{{ .Values.environment }}-svc
servicePort: 8000
解决方案
它在没有应用 NetworkPolicy 的情况下工作吗?如果即使没有 NetworkPolicy 也无法工作,则很可能是由另一个问题引起的(例如,错误的服务端点配置为与之通信),因为默认的 NetworkPolicy允许同一命名空间内的 pod 之间的所有流量。
以下选择器看起来像您将 NetworkPolicy 应用于该命名空间中的所有 pod。如果我理解正确,您实际上希望 NetworkPolicy 仅应用于后端 pod (xyz-svc)。
spec:
podSelector: {}
因此,解决方案可能是这样的(假设后端服务 pod 获得了标签 app = xyz-svc):
spec:
podSelector:
matchLabels:
app: xyz-svc