Kubernetes上的网络策略是否只允许UI与后端对话?
警告似乎是后端(flask服务)需要与MongoDB对话以获取数据。如果在网络策略中,我将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服务,并将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