前言
随着容器的普及,经常使用docker创建容器来跑应用,结合开源的kubernetes和istio等,对于无状态的服务有极好的支持能力,秒级调度,弹性伸缩等优势。实际上kube的容器仅仅是接口,实际的容器可以是docker,podman等,以docker为例。
默认网络
默认即bridge网络,虽然名为桥接,实际上是NAT,在Linux是原生运行docker的,在mac和win是虚拟机运行的,经常可以看到qemu的进程,以ubuntu为例,安装就不说了,按照官方文档安装:Install Docker Engine on Ubuntu | Docker Documentation
注意官方源有问题,使用其他源即可,比如清华源。,安装后执行ifconfig
docker0网桥,即NAT的实现,虚拟路由,创建了127.17的网关,意味着默认创建的容器IP都是172.17开头的IP,同理可以使用端口映射的方式对外提供服务,实际上在kube中会有kube proxy代理,提供更复杂的lvs等扁平网络。还有很多开源的网络方案,比如:Flannel,Calico 和 Cilium
docker必须root运行,笔者以ubuntu镜像为例
运行ubuntu
docker run -itd --name ubuntu-demo ubuntu #如果只有-d,容器很快就运行结束了。
docker exec -it ubuntu-demo bash
直接进入容器,进入容器就是root权限。但是ubuntu官方的镜像只有基础命令,只能换源安装net-tools命令
mv /etc/apt/sources.list /etc/apt/sources.list.bak
cat >> /etc/apt/sources.list << EOF
deb http://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ jammy-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ jammy-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ jammy-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ jammy-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ jammy-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ jammy-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ jammy-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ jammy-backports main restricted universe multiverse
EOF
换源后执行apt update ,不能使用https,因为镜像没有内置证书,需要手动下载证书,然而又没有wget等工具,😭。
apt install net-tools
打包备用
ifconfig后可以看到ip地址,在桥接下实际上是NAT网络,网关是172.17.255.255,实际上网关是可以设置的,即设置docker0虚拟网卡。 手动设置网络一样
结果
host
设置host试试,实际上host和none模式仅在特殊时候使用
可以看见宿主机的网卡信息,容器跟宿主机网络一模一样,公用宿主机网络
none
none模式就很特殊了,实际上就是localhost
可以看到仅有127.0.0.1的lo网卡了,是lo不是l0,😅,当然也只能localhost访问了
container
container表示,已有容器是什么网络,启动的容器就是什么网络,这个特性在kube尤其重要
以最后示例为例,创建none同网络容器
创建host同网络容器
创建bridge同网络容器
桥接
实际上docker也可以不使用docker0网卡,可以创建虚拟网卡,桥接使用
比如使用macvlan网络桥接
kube
kube实际上并不定义容器,通过接口调用容器接口,启动容器,kube默认创建pause容器(定义了网络),默认就是bridge网络,其他容器,比如初始化容器,伴生容器,应用容器都是container模式运行的。
总结
实际上kube就是容器的管理器,核心思想是调度,调度就需要网络、流量治理能力(kube目前薄弱环节),就出现了各种网络方案,istio等。容器的核心网络在kube是pause容器创建的,其他容器通过container沿用网络方案,即一个POD。