本章介绍如何通过限制pod可以与其他哪些pod通信,来确保pod之间的网络安全。

  是否可以进行这些配置取决于集群中使用的容器网络插件。如果网络插件支持,可以通过NetworkPolicy资源配置网络隔离。

  一个NetworkPolicy会应用在匹配它的标签选择器的pod上,指明这些允许访问这些pod的源地址,或这些pod可以访问的目标地址。这些分别由入向(ingress) 和出向(egress)规则指定。这两种规则都可以匹配由标签选择器选出的pod,或者一个namespace中的所有pod,或者通过无类别域间路由(Classless Inter-Domain Routing, CIDR)指定的IP地址段。

  将介绍这两种规则及全部三种匹配选项。

  注意:入向规则与Ingress资源无关。

1.在一个命名空间中启用网络隔离

  在默认情况下,某一命名空间中的pod可以被任意来源访问。首先,需要改变这个设定。需要创建一个default-deny NetworkPolicy,它会阻止任何客户端访问中的pod。这个NetworkPolicy的定义如以下代码所示。

#代码13.21 default-deny NetworkPolicy定义: network-policy-default-deny.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny
spec:
podSelector: #空的标签选择器匹配命名空间中的所有pod

  在任何一个特定的命名空间中创建该NetworkPolicy之后,任何客户端都不能访问该命名空间中的pod。

  注意:集群中的CNI插件或其他网络方案需要支持NetworkPolicy,否则NetworkPolicy将不会影响pod之间的可达性。

2.允许同一命名空间中的部分pod访问一个服务端pod

  为了允许同一命名空间中的客户端pod访问该命名空间的pod,需要指明哪些pod可以访问。接下来,通过例子来探究如何做到这些。

  假设在foo namespace中有一个pod运行PostgreSQL数据库,以及一个使用该数据库的网页服务器pod,其他pod也在这个命名空间中运行,然而你不允许它们连接数据库。为了保障网络安全,需要在数据库pod所在的命名空间中创建一个如以下代码清单所示的NetworkPolicy资源。

#代码13.22 为Postgres pod使用的NetworkPolicy:network-policy-postgres.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: postgres-netpolicy
spec: #这个策略确保了对具有app=database标签的pod的访问安全性
podSelector:
matchLabels:
app: database
ingress: #它予许来自具有app=webserver标签的pod的访问
- from:
- podSelector:
matchLabels:
app: webserver
ports: #予许对这个端口访问
- port: 5432

  例子中的NetworkPolicy允许具有app=webserver标签的pod访问具有app=database的pod的访问,并且仅限访问5432端口。

  客户端pod通常通过Service而非直接访问pod来访问服务端pod,但这对结果没有改变。NetworkPolicy在通过Service访问时仍然会被执行。

3.在不同 Kubernetes 命名空间之间进行网络隔离

  现在来看有另一个多个租户使用同一Kubernetes集群的例子。每个租户有多个命名空间,每个命名空间中有一个标签指明它们属于哪个租户。例如,有一个租户Manning,它的所有命名空间中都有标签tenant:manning。其中的一个命名空间中运行了一个微服务Shopping Cart,它需要允许同一租户下所有命名空间的所有pod访问。显然,其他租户禁止访问这个微服务。

  为了保障该微服务安全,可以创建如下的NetworkPolicy资源,如以下代码所示。

#代码13.23 为shopping cart微服务中的pod使用的NetworkPolicy: network-policy-cart.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: shoppingcart-netpolicy
spec:
podSelector: #该策略应用于具有app=shopping-cart标签的pod
matchLabels:
app: shopping-cart
ingress:
- from:
- namespaceSelector: #只有在具有tenant=manning标签的命名空间中运行的pod可以访问该微服务
matchLabels:
tenant: manning
ports:
- port: 80

  以上NetworkPolicy保证了只有具有tenant=manning标签的命名空间中运行的pod可以访问Shopping Cart微服务。

  如果shopping cart服务的提供者需要允许其他租户(可能是他们的合作公司)访问该服务,他们可以创建一个新的NetworkPolicy资源,或者在之前的Networkpolicy中添加一条入向规则。

  注意:在多租户的Kubernetes集群中,通常租户不能为他们的命名空间添加标签(或注释)。否则,他们可以规避基于namespaceSelector的入向规则。

4.使用CIDR隔离网络

  除了通过在pod选择器或命名空间选择器定义哪些pod可以访问NetworkPolicy资源中指定的目标pod,还可以通过CIDR表示法指定一个IP段。例如,为了允许IP在192.168.1.1到192.168.1.255范围内的客户端访问之前提到的shopping-cart的pod, 可以在入向规则中加入如以下代码清单所示的代码。

#代码13.24 在入向规则中指明IP段:network-policy-cidr.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: ipblock-netpolicy
spec:
podSelector:
matchLabels:
app: shopping-cart
ingress:
- from:
- ipBlock: #这条入向规则来自192.168.1.0/24段的客户端的流量
cidr: 192.168.1.0/24

5.限制pod的对外访问流量

  在之前的所有例子中,已经通过入向规则限制了进入pod的访问流量。然而,也可以通过出向规则限制pod的对外访问流量。以下代码清单展示了一个例子。

#代码13.25 在NetworkPolicy中使用出现规则:network-policy-egress.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: egress-net-policy
spec:
podSelector: #这个策略应用于包含app=webserver标签的pod
matchLabels:
app: webserver
egress: #限制pod的出网流量
- to:
- podSelector: #webserver的pod只能与有app=webserver标签的pod通信
matchLabels:
app: database
ports:
- port: 5432

  以上的NetworkPolicy仅允许具有标签app=webserver的pod访问具有标签app=database的pod,除此之外不能访问任何地址(不论是其他pod,还是任何其他的IP,无论在集群内部还是外部。

Kubernetes隔离pod的网络的更多相关文章

  1. Kubernetes之canal的网络策略(NetworkPolicy)

    安装要求: 1.我们这里安装的是3.3的版本.kubernetes的要求: 支持的版本 1.10 1.11 1.12 2.CNI插件需要启用,Calico安装为CNI插件.必须通过传递--networ ...

  2. Kubernetes之Pod使用

    一.什么是Podkubernetes中的一切都可以理解为是一种资源对象,pod,rc,service,都可以理解是 一种资源对象.pod的组成示意图如下,由一个叫”pause“的根容器,加上一个或多个 ...

  3. Kubernetes 学习18配置网络插件flannel

    一.概述 1.我们在学习docker时知道docker有四种常用的网络模型 a.bridge:桥接式网络 b.joined:联盟式网络,共享使用另外一个容器的网络名称空间 b.opened:容器直接共 ...

  4. Kubernetes基石-pod容器

    引用三个问题来叙述Kubernetes的pod容器 1.为什么不直接在一个Docker容器中运行所有的应用进程. 2.为什么pod这种容器中要同时运行多个Docker容器(可以只有一个) 3.为什么k ...

  5. 041.Kubernetes集群网络-K8S网络策略

    一 Kubernetes网络策略 1.1 策略说明 为实现细粒度的容器间网络访问隔离策略,Kubernetes发布Network Policy,目前已升级为networking.k8s.io/v1稳定 ...

  6. 06 . Kubernetes之Pod控制器详细介绍及应用

    Pod API属性详解 Pod是k8s集群中的最小编排单位.将这个设计落实到API对象上,容器就成了Pod属性里一个普通的字段.那么到底哪些属性属于Pod对象,哪些属性属于容器的呢?先看下面的一段描述 ...

  7. Kubernetes探索学习004--深入Kubernetes的Pod

    深入研究学习Pod 首先需要认识到Pod才是Kubernetes项目中最小的编排单位原子单位,凡是涉及到调度,网络,存储层面的,基本上都是Pod级别的!官方是用这样的语言来描述的: A Pod is ...

  8. 基于Kubernetes(k8s)网络方案演进

    VIP PaaS在接近两年时间里,基于kubernetes主要经历四次网络方案的变迁: 1. kubernetes + flannel 2. 基于Docker libnetwork的网络定制 3. k ...

  9. kubernetes之pod健康检查

    目录 kubernetes之pod健康检查 1.概述和分类 2.LivenessProbe探针(存活性探测) 3.ReadinessProbe探针(就绪型探测) 4.探针的实现方式 4.1.ExecA ...

随机推荐

  1. Linux 操作系统(四)用户组管理&进程管理&任务调度

    以下实例均在Centos7下验证 Centos7 查看命令帮助 man xxx 用户组管理 useradd useradd user1 password user1 cat /etc/passwd # ...

  2. 如何解决在WordPress安装Redis插件时需要输入FTP问题?

    用LAMP或者LNMP搭建Worepress的时候,安装主题或者插件时候,往往提示需要输入FTP服务端信息的问题,其实这是一个坑,可以完全避免的 我们只需在wp-config.php文件最后添加以下代 ...

  3. CentOS下cpu分析 top

    CentOS下 cpu 分析-top 时间:2017-03-20 12:09来源:linux.it.net.cn 作者:IT   一. 前言 我们都知道windows下对各个运行的任务,要通过任务管理 ...

  4. shell初学之nginx(域名)

    创建两个以域名区分的虚拟网站: 1 #!/bin/bash 2 curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/ ...

  5. 启动kafaka失败了,提示zk保存kafka的ids已经在使用。

    FATAL [Kafka Server 1], Fatal error during KafkaServer startup. Prepare to shutdown (kafka.server.Ka ...

  6. idea 使用Springboot 编译报错

    报错信息如下 Argument for @NotNull parameter 'url' of org/jetbrains/jps/model/impl/JpsUrlListImpl.addUrl m ...

  7. 痞子衡嵌入式:快速定位i.MXRT600板级设计ISP[2:0]启动模式引脚上电时序问题的方法

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是一种快速定位i.MXRT600板级设计ISP[2-0]启动模式引脚上电时序问题的方法. 我们知道恩智浦i.MXRT600是主打音频市场的 ...

  8. 计划任务 at & crond tbc

    一次性任务 at 工具 由包 at 提供 依赖与atd服务,需要启动才能实现at任务 at队列存放在/var/spool/at目录中 执行任务时PATH变量的值和当前定义任务的用户身份一致 作业执行命 ...

  9. Win10 安装 Python3 (上)

    Python3 For Windows 10 installer 参考 The full installer 安装 随后可以看到,installer 在用户环境变量PATH中,添加了三项: 卸载 使用 ...

  10. linux 安装配置NFS服务器

    一.Ubuntu安装配置NFS 1.安装NFS服务器 sudo apt-get install nfs-kernel-server 安装nfs-kernel-server时,apt会自动安装nfs-c ...