当下流行得容器化安全主要包括哪些

集群网络

本节以 Docker Swarm 和 Kubernetes 为例,具体阐述容器集群中的网络实现。
2.3.3.1 Docker Swarm
Docker 1.19 及以后的版本增加了对 Overlay 网络的原生支持(Docker Swarm),主要是利用网络隧道在主 机之间通信。这将允许处于同一 Overlay 网络的不同主机中的容器实现跨主机通信,而同一主机处于不同 Overlay 网络的容器间是不能通信的。这个概念跟云计算
中通常认知的 Overlay 网络基本是一致的。Swarm 的 Overlay 网 络采用 VXLAN实现,要求 Linux Kernel 版本不低于 3.19,主要包括如下网络。(1)Docker_gwbridge 网络
Docker_gwbridge 是在初始化 Docker Swarm 集群后产生的桥接网络,存在于集群中的每个主机节点上,通 过它来实现容器和容器所运行的主机间的通信。可以通过下列命令查看 Docker_gwbridge 网络。

  • docker network inspect
    docker_gwbridge…
    “Options”: {
    “com.docker.network
    .bridge.enable_icc”: “false”, “com.docker.network.bridge.enable_ip_masquerade”: “true”, “com.docker.network.bridge.name”: “docker_gwbridge”},

    由上 --icc 配置项为 false 可知,连接到 docker_gwbridge 网桥的容器之间通过 docker_gwbridge 上的接口时 不可以通信。

(2)Ingress 网络
Ingress 网络是在初始化 Docker Swarm 集群后产生的 Overlay 网络,其存在于集群中的每一个主机节点上, 主要用来实现服务的对外暴露以及 Routing Mesh。有关 Ingress 网络如何实现服务的对外暴露详见 4.5.1 节。
(3)自定义 Overlay 网络
此网络是用户在初始化 Docker Swarm 集群后,创建服务之前自定义的 Overlay 网络,主要用来实现处于同 一 Overlay 网络内的容器间通信。

Host1 Host2当下流行得容器化安全主要包括哪些_第1张图片当下流行得容器化安全主要包括哪些_第2张图片
Container Container
vxlan
-tunneleth1 test-br test-br eth1 docker_dwbridge
veth docker_dwbridge
eth1
Container
eth0 eth0
上图的三个 Container 是属于同一服务的容器,在 Docker Swarm 模式下同一服务的容器共享用户自定义的 Overlay网络。图中 test 网络就是自定义的 Overlay网络,虽然各节点主机上的容器都会连接到docker_gwbridge 上, 但其上的接口并不能实现同一主机不同容器间的通信,处于同一服务下容器之间的通信是通过 test overlay 网络 实现的。

2.3.3.2 Kubernetes
Kubernetes 设计了 Pod 对象,对应某特定应用中的逻辑主机(Logical Host),将每个服务按任务拆分,分 别将相应进程包装到相应的 Pod 中。一个 Pod 中包含一个或多个相关的容器,这些容器都会运行在同一个主机中, 并且共享相同的网络命名空间和相同的 Linux协议栈。
一个 Kubernetes 集群通常会涉及到以下三种通信:

  • 同一个 Pod 内,容器和容器之间的通信;
  • 同一个主机内不同 Pod 之间的通信;
  • 跨主机 Pod 之间通信。

    Pod当下流行得容器化安全主要包括哪些_第3张图片
    Container1 Container2
    Namespa
    ceeth0 veth
    docker0
    Routing Host
    eth0
    同一个 Pod 内容器之间的通信,由于其共享网络命名空间、共享 Linux协议栈,因此它们之间的通信是最简 单的,这些容器好像是运行在同一台机器上,直接使用 Linux本地的 IPC 进行通信,它们之间的互相访问只需要 使用 localhost 加端口号就可以。

    Pod1 Pod2当下流行得容器化安全主要包括哪些_第4张图片
    Container1 Container2 Container1 Container2 Namespace Namespace
    eth0 eth0 veth veth
    docker0
    Routing Host
    eth0
    同一个主机上不同的 Pod 通过 veth 连接在同一个 docker0 网桥上,每个 Pod 从 docker0 动态获取 IP 地址,

该 IP 地址和 docker0 的 IP 地址是处于同一网段的。这些 pod 的默认路由都是 docker0 的 IP 地址,所有非本地 的网络数据都会默认送到 docker0 网桥上,由 docker0 网桥直接转发,相当于一个本地的二层网络。

Pod1 Pod2当下流行得容器化安全主要包括哪些_第5张图片当下流行得容器化安全主要包括哪些_第6张图片
Container1 Container2 Container1 Container2
Namespace Namespace
eth0 eth0 veth veth
docker0 docker0
routing routing
Host1 Host2
eth0 eth0
Switch
跨主机的 Pod 之间通信较复杂,每个 Pod 的地址和其所在主机的 docker0 在同一个网段,而 docker0 和主 机的物理网络是不同的网段,如何保证 Pod 内的网络数据能够通过物理网络,找到对端 Pod 所在物理主机地址, 并且完成数据传输是通信成功的关键。
因此在 Kubernetes 的网络中,需要有一个全局网络地址规划的模块,当 Pod1 向 Pod2 发送数据时,能够知 道目的 Pod2 所在主机的 IP 地址。这样数据从 Pod1 发出,经 Host1 的 docker0 网桥路由到 Host1 的物理网卡 eth0 ,然后通过物理网络到达 Host2 的物理网卡 eth0 、docker0 网桥,进而送达 Pod2。
在多数的私有容器云环境中还可以借助第三方开源的网络插件来实现集群网络,比如 Flannel[21]、Calico[[22] 等。例如,Flannel 是 CoreOS 团队针对 Kubernetes 设计的一个 Overlay 网络工具,其目的在于帮助每一个使用 Kubernetes 的主机拥有一个完整的子网。

Host1当下流行得容器化安全主要包括哪些_第7张图片
192.168.0.100 Pod 10.1.ve1th05.2/24 10d.1.ocker015.1/24 Routing Table eth0
Container1
flanneld
Etcd
Host2 flanneld
Pod 10.1.ve2th00.2/24 10d.1.ocker020.1/24 Routing Table eth0
Container2 192.168.0.200

23

参考资料

绿盟 容器安全技术报告

友情链接

CSA 亚太经合组织隐私框架 (2015)

你可能感兴趣的:(安全,docker,kubernetes)