实践 Network Policy 【转】

为了演示 Network Policy,我们先部署一个 httpd 应用,其配置文件 httpd.yaml 为:

实践 Network Policy 【转】

httpd 有三个副本,通过 NodePort 类型的 Service 对外提供服务。部署应用:

实践 Network Policy 【转】

当前没有定义任何 Network Policy,验证应用可以被访问:

  1. 启动一个 busybox Pod,可以访问 Service,也可以 Ping 到副本 Pod。
    实践 Network Policy 【转】

  2. 集群节点可以访问 Service, 也可以 Ping 到副本 Pod。
    实践 Network Policy 【转】

  3. 集群外(192.168.56.1)可以访问 Service。
    实践 Network Policy 【转】

现在创建如下 Network Policy:

实践 Network Policy 【转】

① 定义将此 Network Policy 中的访问规则应用于 label 为 run: httpd 的 Pod,即 httpd 应用的三个副本 Pod。

② ingress 中定义只有 label 为 access: "true" 的 Pod 才能访问应用。

③ 只能访问 80 端口。

通过 kubectl apply 创建 Network Policy。

实践 Network Policy 【转】

验证 Network Policy 的有效性:

  1. busybox Pod 已经不能访问 Service。
    实践 Network Policy 【转】
    如果 Pod 添加了 label access: "true" 就能访问到应用,但 Ping 已经被禁止。
    实践 Network Policy 【转】

  2. 集群节点已经不能访问 Service, 也 Ping 不到副本 Pod。
    实践 Network Policy 【转】

  3. 集群外(192.168.56.1)已经不能访问 Service。
    实践 Network Policy 【转】

如果希望让集群节点和集群外(192.168.56.1)也能够访问到应用,可以对 Network Policy 做如下修改:

实践 Network Policy 【转】

应用新的 Network Policy:

实践 Network Policy 【转】

现在,集群节点和集群外(192.168.56.1)已经能够访问了:

实践 Network Policy 【转】

实践 Network Policy 【转】

除了通过 ingress 限制进入的流量,也可以用 egress 限制外出的流量。大家可以参考官网相关文档和示例,这里就不赘述了。

小结

Kubernetes 采用的是扁平化的网络模型,每个 Pod 都有自己的 IP,并且可以直接通信。

CNI 规范使得 Kubernetes 可以灵活选择多种 Plugin 实现集群网络。

Network Policy 则赋予了 Kubernetes 强大的网络访问控制机制。