本文描述了如何在 Kubernetes 集群中通过创建 NetworkPolicy 的方式来声明网络策略,以管理 Pod 之间的网络通信流量。

前提条件


您已经安装了 Kubernetes 集群,如果没有,请参考文档 安装Kubernetes单Master节点

您可以使用 kubectl 访问您的集群,请参考文档 安装Kubectl

请确保您使用的网络插件支持 Network Policy,如下的网络插件都是可以的:

排序 按字母顺序排序,不代表推荐顺序。本文中的例子对上述所有网络插件都有效

创建一个Deployment并配置Service


  • 创建一个 nginx Deployment 用于演示 Kubernetes 的 NetworkPolicy: ```bash kubectl create deployment nginx —image=nginx
  1. <br /> 输出结果
  2. ```bash
  3. deployment.apps/nginx created
  • 通过Service暴露该Deployment ```bash kubectl expose deployment nginx —port=80
  1. <br /> 输出结果
  2. ```bash
  3. service/nginx exposed
  • 查询结果 ```bash kubectl get svc,pod
  1. 输出结果
  2. ```bash
  3. NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
  4. service/kubernetes 10.100.0.1 <none> 443/TCP 46m
  5. service/nginx 10.100.0.16 <none> 80/TCP 33s
  6. NAME READY STATUS RESTARTS AGE
  7. pod/nginx-701339712-e0qfq 1/1 Running 0 35s

从另外一个pod访问Service


默认是可以从另外一个Pod访问 nginx Service 的。下面的方法可以执行此测试:

在 default 名称空间中创建 busybox 容器,并执行 wget 命令:

  1. kubectl run --generator=run-pod/v1 busybox --rm -ti --image=busybox -- /bin/sh

请按照下面的例子,在命令行中执行 wget —spider —timeout=1 nginx

  1. Waiting for pod default/busybox-472357175-y0m47 to be running, status is Pending, pod ready: false
  2. Hit enter for command prompt
  3. / # wget --spider --timeout=1 nginx
  4. Connecting to nginx (10.100.0.16:80)
  5. / #

限制对nginx的访问


下面的 NetworkPolicy 可以声明:只有带 access=true 标签的 Pod 可以访问 nginx 服务:

  1. apiVersion: networking.k8s.io/v1
  2. kind: NetworkPolicy
  3. metadata:
  4. name: access-nginx
  5. spec:
  6. podSelector:
  7. matchLabels:
  8. app: nginx
  9. ingress:
  10. - from:
  11. - podSelector:
  12. matchLabels:
  13. access: "true"
  1. <br /> 输出结果如下:
  2. ```bash
  3. networkpolicy.networking.k8s.io/access-nginx created

从不带标签的Pod访问nginx服务


如果从不带标签的 Pod 访问该 nginx 服务,请求将超时:

  1. kubectl run --generator=run-pod/v1 busybox --rm -ti --image=busybox -- /bin/sh

请按照下面的例子在命令行中执行 wget —spider —timeout=1 nginx

  1. Waiting for pod default/busybox-472357175-y0m47 to be running, status is Pending, pod ready: false
  2. Hit enter for command prompt
  3. / # wget --spider --timeout=1 nginx
  4. Connecting to nginx (10.100.0.16:80)
  5. wget: download timed out
  6. / #

从带有标签的Pod访问nginx服务


从带有 access=true 标签的 Pod 中访问 nginx 服务,将能够执行成功:

  1. kubectl run --generator=run-pod/v1 busybox --rm -ti --labels="access=true" --image=busybox -- /bin/sh

请按照下面的例子在命令行中执行 wget —spider —timeout=1 nginx

  1. Waiting for pod default/busybox-472357175-y0m47 to be running, status is Pending, pod ready: false
  2. Hit enter for command prompt
  3. / # wget --spider --timeout=1 nginx
  4. Connecting to nginx (10.100.0.16:80)
  5. / #