Kubernetes上的网络策略是否只允许UI与后端对话?

Kubernetes上的网络策略是否只允许UI与后端对话?,kubernetes,microservices,kubernetes-networkpolicy,Kubernetes,Microservices,Kubernetes Networkpolicy,警告似乎是后端(flask服务)需要与MongoDB对话以获取数据。如果在网络策略中,我将节点选择器添加为我的flask服务,并将UI添加到入口,将UI和出口上的MongoDB添加到规则,那么它仍然不起作用 NAME READY STATUS RESTARTS AGE pod/xyz-mongodb-replicaset-0 1/1 Running

警告似乎是后端(flask服务)需要与MongoDB对话以获取数据。如果在网络策略中,我将
节点选择器
添加为我的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--
故障排除:

我已经试着旋转一个吊舱,把它放进入口。当xyz svc在入口中被允许时,我能够从pod ping该svc,当我将其从入口中移除时,我能够从pod ping该svc,从而证明网络策略是有效的

我想了解和匹配标签

我已经阅读了这些链接,但我希望对我的网络策略有一个直观的解释,如:

podSelector:需要应用网络策略的pod(it) 可以是部署或应用程序名称或层名称或运行)

入口:允许或拒绝访问上述网络的流量 提到的豆荚

出口:允许或拒绝从出口进入的交通 上述豆荚。pod的名称应与哪些标签匹配

名称空间选择器

播客选择器

编辑:Ingress 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也无法工作,则很可能是由另一个问题(例如,配置为与通信的服务端点错误)引起的,因为允许在同一命名空间内的POD之间进行所有通信

下面的选择器看起来像是将NetworkPolicy应用于该命名空间中的所有POD。如果我理解正确,您实际上希望NetworkPolicy仅应用于后端POD(xyz svc)

因此,解决方案可能是这样的(假设后端服务盒的标签是app=xyz svc):


你好我已经更新了问题,并在matchExpression中包含了xyz svc。是的,我只想申请xyz svc。另外,我已经尝试旋转一个吊舱,并将其添加到入口。我能够从pod ping服务,当它在入口中被允许时,当我从入口中删除它时,它被拒绝,从而证明网络策略是有效的。你能分享更多关于Kubernetes群集的信息吗?是GKE,EKS,AKS吗?你能分享你的入口YAML定义吗?@DawidKruk升级为YAML.Kubernetes版本(onprem)-
服务器版本:version.Info{Major:“1”,Minor:“14”,
如果我理解正确:您需要允许从
xyz svc
mongodb
的流量。其余流量如何。默认情况下应允许所有流量。您的任何流量在没有网络策略的情况下都不起作用吗?

---
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
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

spec:
  podSelector: {}
spec:
  podSelector:
    matchLabels:
      app: xyz-svc