需要说明的是,后端(烧瓶服务)需要与MongoDB进行通信以获取数据。如果在网络策略中,我将nodeSelector
添加为Flask服务,然后将UI添加到入口,将UI和MongoDB添加到规则中,则它仍然不起作用。
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 ping xyz-svc,而当我从入口移除它时,我拒绝了它,因此证明了网络策略是有效的。
我想了解labels, selectors和matchLabel。
我已经阅读了这些链接,但是我想对NetworkPolicy进行直观的解释,例如:
podSelector:需要对其应用网络策略的Pod(它 可以是部署或应用程序名称或层名称或运行)
入口:允许或拒绝访问上述内容的流量 提到的豆荚
出口:允许或拒绝访问的流量从 以上提到的豆荚。您的广告连播名称应与哪些标签匹配?
namespaceSelector?
podSelector?
编辑:入口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
答案 0 :(得分:0)
在未应用NetworkPolicy的情况下可以正常工作吗?如果即使没有NetworkPolicy也不起作用,则可能是由另一个问题(例如,配置为与之通信的错误服务端点)引起的,因为default NetworkPolicy允许在同一名称空间内的pod之间进行所有通信。
以下选择器看起来像您正在将NetworkPolicy应用于该命名空间中的所有pod。如果我对您的理解正确,那么您实际上只希望将NetworkPolicy仅应用于后端pod(xyz-svc)。
spec:
podSelector: {}
因此解决方案因此可能是这样的(假设后端服务吊舱的标签为app = xyz-svc):
spec:
podSelector:
matchLabels:
app: xyz-svc