默认情况下,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 使用以下内容创建入口定义文件,该文件允许端口8080上与标签“ app = source-pod”匹配的Pod在“ hello-web” pod上的流量在端口8080上带有标签“ app = destination-pod”。 vim ingress.yml 在我们创建入口策略之前,请创建一个标签为“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 现在创建一个策略,以允许在带有标签“app = destination-pod”的容器上连接带有标签“ app = source-pod”的容器,并获取其详细信息。 kubectl apply -f ingress.yml kubectl get networkpolicy destination-pod-allow-from-source-pod 现在,再次创建一个带有标签的容器,该标签与策略中定义的规则不匹配。 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 这次,我们创建一个与网络策略规则匹配的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 在上面的屏幕快照中,您可以看到带有标签“app = source-pod”的pod可以访问“ hello-web” pod。这意味着我们限制了“ hello-web”上的连接,只有标签为“ app = source-pod”的Pod才能连接到它。 二、出口网络政策 使用以下内容为出口网络策略创建一个新文件。 vim egress.yml 上面的策略将允许从标签为“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 现在,创建一个带有标签“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 现在,创建带有出口规则的网络策略。 kubectl create -f egress.yml kubectl get networkpolicy | grep source-pod-allow-to-destination-pod 让我们创建一个带有标签“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 在上面的屏幕截图中,您可以观察到这次无法访问Pod“ hello-web-2”,因为它与允许从带有标签“app = source-pod”的Pod连接到具有以下条件的Pod的出口策略不匹配标签“app = destination-pod”。 在本文中,我们看到了创建入口和出口网络策略的步骤。我们还看到了如何分别使用入口和出口来限制传入和传出连接,并且为了更好地理解这一点,我们看到了使用简单的Web应用程序的实现。 A5互联https://www.a5idc.net/