容器化之路Docker网络核心知识小结,理清楚了吗?
Docker网络是容器化中最难理解的一点也是整个容器化中最容易出问题又难以排查的地方,加上使用Kubernets后大部分人即使是专业运维如果没有扎实的网络知识也很难定位容器网络问题,因此这里就容器网络单独拿出来理一理。
先了解一下Docker的一点基础架构知识,Docker 技术架构图:
Docker是不能直接在 Windows 平台上运行的,只支持 linux 系统,因为Docker 依赖 linux kernel 三项最基本的技术。
- Namespaces 充当隔离的第一级,是对 Docker 容器进行隔离,让容器拥有独立的 hostname,ip,pid,同时确保一个容器中运行一个进程而且不能看到或影响容器外的其它进程 。
- Cgroups 是容器对使用的宿主机资源进行核算并限制的关键功能,比如 CPU, 内存, 磁盘等。
- Union FS 主要是对镜像也就是 image 这一块作支持,采用 copy-on-write 技术,让大家可以共用某一层,对于某些差异层的话就可以在差异的内存存储,
- Libcontainer 是一个库,是对上面这三项技术做一个封装。
- Docker engine 用来控制容器 container 的运行,以及镜像文件的拉取。
Docker的工作原理:每个容器都在自己的命名空间中运行,但使用与所有其他容器完全相同的内核。发生隔离是因为内核知道分配给进程的命名空间,并且在API调用期间确保进程只能访问其自己的命名空间中的资源。
Docker部署关键配置
daemon.json文件
指定私有仓库地址insecure-registries,否则拉取镜像出现问题:
1 {
2 "data-root": "/docker/data",
3 "exec-opts": ["native.cgroupdriver=cgroupfs"],
4 "registry-mirrors": [
5 "https://docker.mirrors.ustc.edu.cn",
6 "http://hub-mirror.c.163.com"
7 ],
8 "hosts": ["tcp://0.0.0.0:2375", "unix:///var/run/docker.sock"],
9 "insecure-registries": ["192.168.0.23:5000"],
10 "max-concurrent-downloads": 10,
11 "live-restore": false,
12 "log-driver": "json-file",
13 "log-level": "warn",
14 "log-opts": {
15 "max-size": "50m",
16 "max-file": "1"
17 },
18 "storage-driver": "overlay2"
19 }
1.指定data-root 配置容器数据地址,在服务器中单独规划磁盘空间,避免占用系统空间
2.指定hosts,放开2375对外接口
3.Docker使用storage driver(存储驱动程序)来管理image和container的数据,要使用overlayfs
,要确保系统的内核版本大于等于3.18,overlay
要比aufs和device mapper快一点,OverlayFS仅有两层,镜像中的每一层对应/var/lib/docker/overlay
中的一个文件夹,文件夹以该层的UUID命名。然后使用硬连接将下面层的文件引用到上层。这在一定程度上节省了磁盘空间。
4.指定文件驱动native.cgroupdriver=cgroupfs控制的资源主要包括CPU、内存、block I/O、网络带宽等,也可以指定为systemd,这里要注意的是后续布署k8s时要与k8s设置的文件驱动操持一致,否时会报错:
failed to create kubelet: misconfiguration: kubelet cgroup driver: "cgroupfs" is different from docker cgroup driver: "systemd"
需要修改kubelet.service Environment中添加--cgroup-driver=cgroupfs或systemd
docker.service文件
[Unit]
Description=Docker Application Container Engine
Documentation=http://docs.docker.io [Service]
Environment="PATH=/docker/bin:/bin:/sbin:/usr/bin:/usr/sbin"
ExecStart=/docker/bin/dockerd
ExecStartPost=/sbin/iptables -I FORWARD -s 0.0.0.0/0 -j ACCEPT
ExecReload=/bin/kill -s HUP $MAINPID
Restart=always
RestartSec=5
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
TimeoutStartSec=0
Delegate=yes
KillMode=process [Install]
WantedBy=multi-user.target
docker 从 1.13 版本开始,将`iptables` 的`filter` 表的`FORWARD` 链的默认策略设置为`DROP`,从而导致 ping 其它 Node 上的 Pod IP 失败,因此必须在 `filter` 表的`FORWARD` 链增加一条默认允许规则 `iptables -I FORWARD -s 0.0.0.0/0 -j ACCEPT`
通过了解以上docker基础框架后排查网络问题思路会更清晰。
Docker容器的网络模型
Docker容器网络的原始模型主要有三种:Bridge(桥接)、Host(主机)及Container(容器)
Docker默认使用Bridge+NAT的通讯模型,Bridge模型借助于虚拟网桥设备为容器建立网络连接,Docker守护进程首次启动时,它会在当前节点上创建一个名为docker0的桥设备,并默认配置其使用172.17.0.0/16网络,此主机上启动的Docker容器会连接到这个虚拟网桥上。
容器与外部网络间的通信
为了解决容器访问外部网络,docker引入NAT,通过iptables规则控制,网桥 docker0 通过 iptables 中的配置与宿主机器上的网卡相连,所有符合条件的请求都会通过 iptables 转发到 docker0 并由网桥分发给对应的机器。创建MASQUERADE规则:
查看nat表
# iptables -t nat -S
-A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE
数据包流程
这条规则将所有从容器发出的、目的地址为Host外部网络的包的IP都修改成Host的IP,并由Host发送出去。
外部网络访问容器
Docker容器是通过dnat映射或docker-proxy服务对外提供访问,如指定端口映射:docker run -p 9001:9000。
使用docker run -p时,docker实际是在iptables做了DNAT规则,实现端口转发功能,为容器分配一个 IP 地址,同时向 iptables 中追加一条新的规则。
可以使用iptables -t nat -vnL查看。
-A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER
-A DOCKER ! -i docker0 -p tcp -m tcp --dport 9001 -j DNAT --to-destination 172.17.0.2:9000
外部访问外部服务器访问10.3.20.87:9001
匹配到DNAT规则,访问到容器-A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER
-A DOCKER ! -i docker0 -p tcp -m tcp --dport 9001 -j DNAT --to-destination 172.17.0.2:9000
本机访问127.0.0.1:9001 没有匹配到任何iptable,走docker-proxy
另外容器要访问外部网络需要宿主机进行转发,要在宿主机中打开转发设置:
#sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 1
为0说明没有开启,需要手动打开。
#docker network lsNETWORK ID NAME DRIVER7fca4eb8c647 bridge bridge9f904ee27bf5 none nullcf03ee007fb4 host host
docker network create -d macvlan \--subnet=172.16.86.0/24 \--gateway=172.16.86.1 \-o parent=eth0 pub_net
Docker跨主机容器间网络通信
具体的介绍可参考 之前的文章 Kubernetes集群部署关键知识总结 地址 https://www.cnblogs.com/zhangs1986/p/10749721.html
注意:flannel 使用 vxlan 技术为各节点创建一个可以互通的 Pod 网络,使用的端口为 UDP 8472,需要开放该端口。
本文所用到Docker版本为19.03.15
Kubernetes 1.20 版本开始将弃用 Docker
kubelet目前推荐方式是直连containerd。
被去掉的部分是删除 dockershim(Dockershim 作用
:把外部收到的请求转化成 Docker Daemon
能听懂的请求,让 Docker Daemon 执行创建、删除等容器操作。)
可以用Containerd 或 Podman 替换。
容器化之路Docker网络核心知识小结,理清楚了吗?的更多相关文章
- 国内最具影响力科技创投媒体36Kr的容器化之路
本文由1月19日晚36Kr运维开发工程师田翰明在Rancher技术交流群的技术分享整理而成.微信搜索rancher2,添加Rancher小助手为好友,加入技术群,实时参加下一次分享~ 田翰明,36Kr ...
- 案例 | 腾讯广告 AMS 的容器化之路
作者 张煜,15年加入腾讯并从事腾讯广告维护工作.20年开始引导腾讯广告技术团队接入公司的TKEx-teg,从业务的日常痛点并结合腾讯云原生特性来完善腾讯广告自有的容器化解决方案 项目背景 腾讯广告承 ...
- 最佳案例 | 游戏知几 AI 助手的云原生容器化之路
作者 张路,运营开发专家工程师,现负责游戏知几 AI 助手后台架构设计和优化工作. 游戏知几 随着业务不断的拓展,游戏知几AI智能问答机器人业务已经覆盖了自研游戏.二方.海外的多款游戏.游戏知几研发团 ...
- AMS 新闻视频广告的云原生容器化之路
作者 卓晓光,腾讯广告高级开发工程师,负责新闻视频广告整体后台架构设计,有十余年高性能高可用海量后台服务开发和实践经验.目前正带领团队完成云原生技术栈的全面转型. 吴文祺,腾讯广告开发工程师,负责新闻 ...
- 成本降低40%、资源利用率提高20%的 AI 应用产品云原生容器化之路
作者 郭云龙,腾讯云高级工程师,目前就职于 CSIG 云产品三部-AI 应用产品中心,现负责中心后台业务框架开发. 导语 为了满足 AI 能力在公有云 SaaS 场景下,服务和模型需要快速迭代交付的需 ...
- 用户案例 | 腾讯小视频&转码平台云原生容器化之路
作者 李汇波,腾讯业务运维高级工程师,目前就职于TEG 云架构平台部 技术运营与质量中心,现负责微信.QQ社交类业务的视频转码运维. 摘要 随着短视频兴起和快速发展,对于视频转码处理的需求也越来越多. ...
- 最佳案例 | QQ 相册云原生容器化之路
关于我们 更多关于云原生的案例和知识,可关注同名[腾讯云原生]公众号~ 福利: ①公众号后台回复[手册],可获得<腾讯云原生路线图手册>&<腾讯云原生最佳实践>~ ②公 ...
- 网络应用软件结构-----CS与BS结构(网络基本知识小结)
1.网络的大致结构 2.网络编程 通过直接或间接地使用网络通讯的协议实现计算机与计算机之间的通讯.在TCP/IP协议层主要麦网络主机的定位,数据传输的路由,由IP地址可以唯一地确定Internet上的 ...
- 【转帖】使用容器化和 Docker 实现 DevOps 的基础知识
使用容器化和 Docker 实现 DevOps 的基础知识 https://www.kubernetes.org.cn/6730.html 2020-02-24 15:20 灵雀云 分类:容器 阅读( ...
随机推荐
- 简单明了的Java线程池
线程池 线程池从功能上来看,就是一个任务管理器.在Java中,Executor接口是线程池的根接口,其中只包含一个方法: Executor void execute(Runnable command) ...
- RT-Thread 4.0 + STM32F407 学习笔记1
RT Thread 4.0提供了新的BSP框架 新 BSP 框架的主要特性如下: 提供多系列 BSP 模板,大大降低新 BSP 的添加难度: 每个 BSP 都配有齐全的驱动文件,开发者可以方便地使用所 ...
- Mysql常用sql语句(10)- is null 空值查询
测试必备的Mysql常用sql语句系列 https://www.cnblogs.com/poloyy/category/1683347.html 前言 is null是一个关键字来的,用于判断字段的值 ...
- Spring整合MyBatis小结
MyBatis在Spring中的配置 我们在Spring中写项目需要运用到数据库时,现在一般用的是MyBatis的框架来帮助我们书写代码,但是学习了SSM就要知道M指的就是MyBatis,在此,在Sp ...
- SpringBoot-初见
目录 简单介绍 什么是SpingBoot? 微服务 单体应用架构 微服务架构 怎么构建微服务 第一个SpringBoot程序 官方网站快速构建 IDEA 代码 自动装配(要点) pom.xml 启动器 ...
- Centos下Yum安装PHP7.0
默认的版本太低了,手动安装有一些麻烦,想采用Yum安装的可以使用下面的方案: 1.检查当前安装的PHP包 yum list installed | grep php 如果有安装的PHP包,先删除他们 ...
- centos7 下安装 mysql5.7
由于CentOS7的yum源中没有mysql,需要到mysql的官网下载yum repo配置文件. 下载命令: wget https://dev.mysql.com/get/mysql57-commu ...
- CentOS linux系统将UTC时间修改为CST时间
1.编辑时间配置文件 1 2 3 4 # vi /etc/sysconfig/clock ZONE="Asia/Shanghai" UTC=false ...
- Elasticsearch(ES)的滚动搜索与批量操作
1. 概述 今天我们来聊一下Elasticsearch(ES)的滚动搜索与批量操作. 2. Elasticsearch(ES)的滚动搜索 2.1 概述 滚动搜索我们经常能够用到,例如:推荐列表,此类 ...
- PHP的OpenSSL加密扩展学习(一):对称加密
我们已经学过不少 PHP 中加密扩展相关的内容了.而今天开始,我们要学习的则是重点中的重点,那就是 OpenSSL 加密扩展的使用.为什么说它是重点中的重点呢?一是 OpenSSL 是目前 PHP 甚 ...