关于Kubernetes中的网络策略

默认情况下,pod接受来自任何来源的流量。网络策略有助于指定一组Pod如何相互通信以及与其他网络端点通信。NetworkPolicy使用标签来选择Pod,并定义规则以指定允许对选定Pod进行哪些通信。一旦在特定Pod上应用了NetworkPolicy,该Pod将拒绝不允许NetworkPolicy的连接。未由任何NetworkPolicy选择的Pod将继续接受所有流量。
在本文中,我们将看到Ingress和Egress NetworkPolicy的用法,其中Ingress是到Pod的传入流量,而Egress是从Pod传出的流量。
前提条件:具有至少1个工作节点的Kubernetes集群
一、入口网络政策
创建一个带有标签“ app-destination-pod”和服务的hello-web pod,在该服务上我们将允许端口8080上的传入流量。
kubectl run hello-web --labels app=destination-pod --image=gcr.io/google-samples/hello-app:1.0 --port 8080 --
kubectl get pod | grep hello-web
kubectl get service | grep hello-web
关于Kubernetes中的网络策略
使用以下内容创建入口定义文件,该文件允许端口8080上与标签“ app = source-pod”匹配的Pod在“ hello-web” pod上的流量在端口8080上带有标签“ app = destination-pod”。
vim ingress.yml
关于Kubernetes中的网络策略
在我们创建入口策略之前,请创建一个标签为“app = unknown”的Pod,该标签与策略规则不匹配。
kubectl run -l app=unknown --image=alpine --restart=Never --rm -i -t test-1
现在,当我们尝试从此容器访问端口8080上的“ hello-web”容器时,将可以访问该容器。
wget -qO- --timeout=2 http://hello-web:8080
关于Kubernetes中的网络策略
现在创建一个策略,以允许在带有标签“app = destination-pod”的容器上连接带有标签“ app = source-pod”的容器,并获取其详细信息。
kubectl apply -f ingress.yml
kubectl get networkpolicy destination-pod-allow-from-source-pod
关于Kubernetes中的网络策略
现在,再次创建一个带有标签的容器,该标签与策略中定义的规则不匹配。
kubectl run -l app=unknown --image=alpine --restart=Never --rm -i -t test-1
如果我们再次尝试从此窗格访问“ hello-web”窗格,则将无法访问“ hello-web”窗格。
wget -qO- --timeout=2 http://hello-web:8080
关于Kubernetes中的网络策略
这次,我们创建一个与网络策略规则匹配的Pod,即标签为“app = source-app”的Pod
kubectl run -l app=source-pod --image=alpine --restart=Never --rm -i -t test-1
现在,如果我们尝试从带有标签“ app = source-pod”的窗格访问“ hello-web”窗格,则可以访问“ hello-web”。
wget -qO- --timeout=2 http://hello-web:8080
关于Kubernetes中的网络策略
在上面的屏幕快照中,您可以看到带有标签“app = source-pod”的pod可以访问“ hello-web” pod。这意味着我们限制了“ hello-web”上的连接,只有标签为“ app = source-pod”的Pod才能连接到它。
二、出口网络政策
使用以下内容为出口网络策略创建一个新文件。
vim egress.yml
关于Kubernetes中的网络策略
上面的策略将允许从标签为“app = source-pod”的容器到标签为“ app = destination-pod”的容器以及在端口53上的DNS连接的传出连接。
在群集中应用出口策略之前,请创建与策略不匹配的Pod“ hello-web-2”和服务。
kubectl run hello-web-2 --labels app=hello-2 --image=gcr.io/google-samples/hello-app:1.0 --port 8080 --expose
kubectl get pod | grep hello-web-2
kubectl get service | grep hello-web-2
关于Kubernetes中的网络策略
现在,创建一个带有标签“app = source-pod”的容器。
kubectl run -l app=source-pod --image=alpine --restart=Never --rm -i -t test-2
在我们应用出口策略之前,可以从带有标签“ app = source-pod”的窗格中访问应用程序“ hello-web”和“ hello-web-2”
wget -qO- --timeout=2 http://hello-web:8080
wget -qO- --timeout=2 http://hello-web-2:8080
关于Kubernetes中的网络策略
现在,创建带有出口规则的网络策略。
kubectl create -f egress.yml
kubectl get networkpolicy | grep source-pod-allow-to-destination-pod
关于Kubernetes中的网络策略
让我们创建一个带有标签“app = source-pod”的容器,并尝试访问两个容器“ app = source-pod”
kubectl run -l app=source-pod --image=alpine --restart=Never --rm -i -t test-3
wget -qO- --timeout = 2 http:// hello-web:8080
wget -qO- --timeout=2 http://hello-web-2:8080
关于Kubernetes中的网络策略
在上面的屏幕截图中,您可以观察到这次无法访问Pod“ hello-web-2”,因为它与允许从带有标签“app = source-pod”的Pod连接到具有以下条件的Pod的出口策略不匹配标签“app = destination-pod”。
在本文中,我们看到了创建入口和出口网络策略的步骤。我们还看到了如何分别使用入口和出口来限制传入和传出连接,并且为了更好地理解这一点,我们看到了使用简单的Web应用程序的实现。
A5互联https://www.a5idc.net/

猜你喜欢

转载自blog.51cto.com/14414732/2517426