首页 > 解决方案 > 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

标签: kubernetesmicroserviceskubernetes-networkpolicy

解决方案


它在没有应用 NetworkPolicy 的情况下工作吗?如果即使没有 NetworkPolicy 也无法工作,则很可能是由另一个问题引起的(例如,错误的服务端点配置为与之通信),因为默认的 NetworkPolicy允许同一命名空间内的 pod 之间的所有流量。

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

spec:
  podSelector: {}

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

spec:
  podSelector:
    matchLabels:
      app: xyz-svc

推荐阅读