Kubernetes上的NetworkPolicy仅允许UI与后端对话?

时间:2019-12-27 15:22:50

标签: kubernetes microservices kubernetes-networkpolicy

需要说明的是,后端(烧瓶服务)需要与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

1 个答案:

答案 0 :(得分:0)

在未应用NetworkPolicy的情况下可以正常工作吗?如果即使没有NetworkPolicy也不起作用,则可能是由另一个问题(例如,配置为与之通信的错误服务端点)引起的,因为default NetworkPolicy允许在同一名称空间内的pod之间进行所有通信。

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

spec:
  podSelector: {}

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

spec:
  podSelector:
    matchLabels:
      app: xyz-svc