范文健康探索娱乐情感热点
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

如何使用Calico实现跨主机Docker网络通信

  写在前面学习 K8s  ,学到这里,整理记忆,本文用于理解 K8s  网络中Calico网路方案  的原理优缺点内容包括: 常见的容器跨主机通信方案简介 Caliao  实现Container  跨主机通信简述Calico  多个主机通信的实战Demo  .没有涉及K8s  ,通过Docker  实现博文部分理论来自 《基于Kubernetes的容器云平台实战》  ,看的PDF,书很不错,感兴趣小伙伴可以支持作者一波。Demo部分操作使用了ansible,但是不影响阅读
  户外依然大雨滂沱,只是这回彷彿不仅命运一人独自哭泣,不晓得由来,窗外的雨水似乎渗上我心头,有些寒冻,有些缩麻,还有些苦涩。城市万家灯火,橘黄街灯与家户里的温暖流洩,我总觉得这时候的我,最脆弱。 -----《Unser Leben Unser Traum》 跨主机Docker网络通信
  常见的跨主机通信方案主要有以下几种 :
  形式
  描述
  Host模式
  容器直接使用宿主机的网络,这样天生就可以支持跨主机通信。这种方式虽然可以解决跨主机通信问题,但应用场景很有限, 容易出现端口冲突,也无法做到隔离网络环境,一个容器崩溃很可能引起整个宿主机的崩溃。
  端口绑定
  通过绑定容器端口到宿主机端口,跨主机通信时使用"主机IP+端口的方式访问容器中的服务。显然,  这种方式仅能支持网络栈的4层及以上的应用,·并且容器与宿主机紧耦合,很难灵活地处理问题,可扩展性不佳  。
  定义容器网络
  使用 Open vSwitch  或Flannel  等第三方SDN  工具,为容器构建可以跨主机通信的网络环境。 这类方案一般要求各个主机上的Dockero网桥的cidr  不同,以避免出现IP冲突的问题,限制容器在宿主机上可获取的IP范围。并且在容器需要对集群外提供服务时,需要比较复杂的配置,对部署实施人员的网络技能要求比较高。
  容器网络发展到现在,形成了两大阵营:  Docker  的CNM  ;Google  , Coreos  ,Kuberenetes  主导的CNI
  CNM  和CNI  是**网络规范或者网络体系**,并不是网络实现因此并不关心容器网络的实现方式( Flannel或者Calico等), CNM和CNI关心的只是网络管理。
  网络类型
  描述
  CNM (Container Network Model)
  CNM的优势在于原生,容器网络和Docker容器,生命周期结合紧密;缺点是被Docker "绑架"。支持CNM网络规范的容器网络实现包括:Docker Swarm overlay, Macvlan & IP networkdrivers, Calico, Contiv, Weave等。
  CNI ( Container Network Interface)
  CNI的优势是兼容其他容器技术(如rkt)及上层编排系统(Kubernetes&Mesos),而且社区活跃势头迅猛;缺点是非Docker原生。支持CNI网络规范的容器网络实现包括: Kubernetes、 Weave,Macvlan, Calico, Flannel, Contiv.Mesos CNI等。
  但从   网络实现角度  ,又可分为:
  网络实现角度
  描述
  隧道方案
  隧道方案在laas层的网络中应用也比较多,它的主要缺点是随着节点规模的增长复杂度会提升,而且出了网络问题后跟踪起来比较麻烦,大规模集群情况下这是需要考虑的一个问题
  路由方案
  一般是  基于3层或者2层实现网络隔离和跨主机容器互通的  ,出了问题也很容易排查出来。
  Calico  :基于BGP协议的路由方案,支持很细致的ACL控制,对混合云亲和度比较高。
  Macvlan  :从逻辑和Kernel层来看,是隔离性和性能最优的方案。基于二层隔离,所以需要一层路由器支持,大多数云服务商不支持,所以混合云上比较难以实现。calico通信过程
  Calico把每个操作系统的协议栈当作一个路由器 ,认为所有的容器是连在这个路由器上的网络终端, 在路由器之间运行标准的路由协议-BGP ,然后让它们自己去学习这个网络拓扑该如何转发。
  Calico方案其实是一个纯三层的方案 ,也就是说让  每台机器的协议栈的三层去确保两个容器、跨主机容器之间的三层连通性 。其网络模型如图所示。
  网络模型
  对于控制平面,其  每个Calico节点上会运行两个主要的程序
  程序
  描述
  一个是 Felix
  它会监听 etcd  ,并从etcd  获取事件,如该节点新增容器或者增加IP地址等。当在这个节点上创建出一个容器,并将其网卡、IP, MAC  都设置好后,Felix在内核的路由表  里面写一条数据,注明这个IP应该配置到这张网卡  。
  一个  标准的路由程序
  ,它会从  内核  里面获取哪一些IP的路由  发生了变化,然后通过标准BGP的路由协议扩散  到整个其他宿主机上,通知外界这个IP在这里。
  由于 Calico  是一种纯三层(网络层)  的实现,因此可以避免与二层方案相关的数据包封装的操作,·中间没有任何的NAT  ,没有任何的Overlay  ,所以它的转发效率可能是所有方案中最高  的。因为它的包直接走原生TCP/IP的协议栈  ,它的隔离也因为这个栈而变得好做。因为TCP/IP的协议栈  提供了一整套的防火墙规则  ,所以它可以通过iptables的规则达到比较复杂的隔离逻辑  。Calico实现方案
  拓扑模式
  环境准备
  这里我们通过calico来进行跨主机容器网络通信过程演示 ,
  ansible网络测试  [root@vms81.liruilongs.github.io]-[~/ansible]  $ansible etcd -m ping 192.168.26.101 | SUCCESS => {     "ansible_facts": {         "discovered_interpreter_python": "/usr/bin/python"     },     "changed": false,     "ping": "pong" } 192.168.26.102 | SUCCESS => {     "ansible_facts": {         "discovered_interpreter_python": "/usr/bin/python"     },     "changed": false,     "ping": "pong" } 192.168.26.100 | SUCCESS => {     "ansible_facts": {         "discovered_interpreter_python": "/usr/bin/python"     },     "changed": false,     "ping": "pong" }  [root@vms81.liruilongs.github.io]-[~/ansible]  $
  etcd集群测试,这里我们已经搭建好一个etcd集群, etcdctl member list  查看集群列表 [root@vms81.liruilongs.github.io]-[~/ansible]  $ansible etcd -m shell -a "etcdctl member list" 192.168.26.102 | CHANGED | rc=0 >> 6f2038a018db1103, started, etcd-100, http://192.168.26.100:2380, http://192.168.26.100:2379,http://localhost:2379 bd330576bb637f25, started, etcd-101, http://192.168.26.101:2380, http://192.168.26.101:2379,http://localhost:2379 fbd8a96cbf1c004d, started, etcd-102, http://192.168.26.102:2380, http://192.168.26.100:2379,http://localhost:2379 192.168.26.101 | CHANGED | rc=0 >> 6f2038a018db1103, started, etcd-100, http://192.168.26.100:2380, http://192.168.26.100:2379,http://localhost:2379 bd330576bb637f25, started, etcd-101, http://192.168.26.101:2380, http://192.168.26.101:2379,http://localhost:2379 fbd8a96cbf1c004d, started, etcd-102, http://192.168.26.102:2380, http://192.168.26.100:2379,http://localhost:2379 192.168.26.100 | CHANGED | rc=0 >> 6f2038a018db1103, started, etcd-100, http://192.168.26.100:2380, http://192.168.26.100:2379,http://localhost:2379 bd330576bb637f25, started, etcd-101, http://192.168.26.101:2380, http://192.168.26.101:2379,http://localhost:2379 fbd8a96cbf1c004d, started, etcd-102, http://192.168.26.102:2380, http://192.168.26.100:2379,http://localhost:2379  [root@vms81.liruilongs.github.io]-[~/ansible]  $
  docker安装启动,修改数据存储位置  [root@vms81.liruilongs.github.io]-[~/ansible]  $ansible etcd -m shell -a "yum -y install docker-ce"  [root@vms81.liruilongs.github.io]-[~/ansible]  $ansible etcd -m shell -a "systemctl enable docker --now"  [root@vms81.liruilongs.github.io]-[~/ansible]  $ansible etcd -m shell -a "systemctl status docker" 192.168.26.100 | CHANGED | rc=0 >>   docker.service - Docker Application Container Engine    Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)    Active: active (running) since Sat 2022-01-01 20:27:17 CST; 10min ago      Docs: https://docs.docker.com      ...
  修改docker启动参数:数据存储位置 --cluster-store=   [root@vms81.liruilongs.github.io]-[~/ansible]  $ansible etcd -m shell -a "cat /usr/lib/systemd/system/docker.service | grep containerd.sock" 192.168.26.100 | CHANGED | rc=0 >> ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock 192.168.26.102 | CHANGED | rc=0 >> ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock 192.168.26.101 | CHANGED | rc=0 >> ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
  这里我们直接使用SED来修改  [root@vms81.liruilongs.github.io]-[~/ansible]  $ansible 192.168.26.100 -m shell -a "sed -i "s#containerd.sock#containerd.sock  --cluster-store=etcd ://192.168.26.100:2379#" /usr/lib/systemd/system/docker.service " 192.168.26.100 | CHANGED | rc=0 >>   [root@vms81.liruilongs.github.io]-[~/ansible]  $ansible 192.168.26.101 -m shell -a "sed -i "s#containerd.sock#containerd.sock  --cluster-store=etcd://192.168.26.101:2379#" /usr/lib/systemd/system/docker.service " 192.168.26.101 | CHANGED | rc=0 >>   [root@vms81.liruilongs.github.io]-[~/ansible]  $ansible 192.168.26.102 -m shell -a "sed -i "s#containerd.sock#containerd.sock  --cluster-store=etcd ://192.168.26.102:2379#" /usr/lib/systemd/system/docker.service " 192.168.26.102 | CHANGED | rc=0 >>   [root@vms81.liruilongs.github.io]-[~/ansible]  $
  刷新Service文件,重启docker  [root@vms81.liruilongs.github.io]-[~/ansible]  $ansible etcd -m shell -a "systemctl daemon-reload; systemctl restart docker" 192.168.26.100 | CHANGED | rc=0 >>  192.168.26.102 | CHANGED | rc=0 >>  192.168.26.101 | CHANGED | rc=0 >>   [root@vms81.liruilongs.github.io]-[~/ansible]  $ansible etcd -m shell -a "systemctl status docker" 搭建Calico网络
  然后我们需要创建calico配置文件,这里我们通过ansilbe 的方式
  使用file模块新建文件夹mkdir /etc/calico   [root@vms81.liruilongs.github.io]-[~/ansible]  $ansible etcd -m file -a "path=/etc/calico/ state=directory force=yes"
  使用template模块创建配置文件   新建模板,这里使用到j2模板,魔法变量  [root@vms81.liruilongs.github.io]-[~/ansible]  $cat calicoctl.j2 apiVersion: v1 kind: calicoApiConfig metadata: spec:   datastoreType: "etcdv2"   etcdEndpoints: "http://{{inventory_hostname}}:2379"  [root@vms81.liruilongs.github.io]-[~/ansible]  $
  calico集群创建配置文件  [root@vms81.liruilongs.github.io]-[~/ansible]  $ansible etcd -m template -a "src=calicoctl.j2 dest=/etc/calico/calicoctl.cfg force=yes"
  核对创建的配置文件  [root@vms81.liruilongs.github.io]-[~/ansible]  $ansible etcd -m shell -a "cat /etc/calico/calicoctl.cfg" 192.168.26.100 | CHANGED | rc=0 >> apiVersion: v1 kind: calicoApiConfig metadata: spec:   datastoreType: "etcdv2"   etcdEndpoints: "http://192.168.26.100:2379" 192.168.26.102 | CHANGED | rc=0 >> apiVersion: v1 kind: calicoApiConfig metadata: spec:   datastoreType: "etcdv2"   etcdEndpoints: "http://192.168.26.102:2379" 192.168.26.101 | CHANGED | rc=0 >> apiVersion: v1 kind: calicoApiConfig metadata: spec:   datastoreType: "etcdv2"   etcdEndpoints: "http://192.168.26.101:2379"
  Calico相关镜像导入  [root@vms81.liruilongs.github.io]-[~/ansible]  $ansible etcd -m copy -a "src=/root/calico-node-v2.tar dest=/root/"  [root@vms81.liruilongs.github.io]-[~/ansible]  $ansible etcd -m shell -a "docker load -i /root/calico-node-v2.tar" 192.168.26.100 | CHANGED | rc=0 >> Loaded image: quay.io/calico/node:v2.6.12 192.168.26.102 | CHANGED | rc=0 >> Loaded image: quay.io/calico/node:v2.6.12 192.168.26.101 | CHANGED | rc=0 >> Loaded image: quay.io/calico/node:v2.6.12  [root@vms81.liruilongs.github.io]-[~/ansible]  $
  镜像查看  [root@vms81.liruilongs.github.io]-[~/ansible]  $ansible etcd -m shell -a "docker images" 192.168.26.102 | CHANGED | rc=0 >> REPOSITORY            TAG       IMAGE ID       CREATED       SIZE quay.io/calico/node   v2.6.12   401cc3e56a1a   3 years ago   281MB 192.168.26.100 | CHANGED | rc=0 >> REPOSITORY            TAG       IMAGE ID       CREATED       SIZE quay.io/calico/node   v2.6.12   401cc3e56a1a   3 years ago   281MB 192.168.26.101 | CHANGED | rc=0 >> REPOSITORY            TAG       IMAGE ID       CREATED       SIZE quay.io/calico/node   v2.6.12   401cc3e56a1a   3 years ago   281MB  [root@vms81.liruilongs.github.io]-[~/ansible]  $
  calicoctl 工具导入  [root@vms81.liruilongs.github.io]-[~/ansible]  $ansible etcd -m copy -a "src=/root/calicoctl dest=/bin/ mode=+x"
  开始建立 calico node 信息:每个主机上都部署了Calico/Node作为虚拟路由器  [root@vms81.liruilongs.github.io]-[~/ansible]  $ansible etcd -m shell -a "calicoctl node run --node-image=quay.io/calico/node:v2.6.12 -c /etc/calico/calicoctl.cfg"
  查看node状态,通过Calico将宿主机组织成任意的拓扑集群
  [root@vms81.liruilongs.github.io]-[~/ansible]  $ansible etcd -m shell -a "calicoctl node status" 192.168.26.102 | CHANGED | rc=0 >> Calico process is running.  IPv4 BGP status +----------------+-------------------+-------+----------+-------------+ |  PEER ADDRESS  |     PEER TYPE     | STATE |  SINCE   |    INFO     | +----------------+-------------------+-------+----------+-------------+ | 192.168.26.100 | node-to-node mesh | up    | 14:46:35 | Established | | 192.168.26.101 | node-to-node mesh | up    | 14:46:34 | Established | +----------------+-------------------+-------+----------+-------------+  IPv6 BGP status No IPv6 peers found. 192.168.26.101 | CHANGED | rc=0 >> Calico process is running.  IPv4 BGP status +----------------+-------------------+-------+----------+-------------+ |  PEER ADDRESS  |     PEER TYPE     | STATE |  SINCE   |    INFO     | +----------------+-------------------+-------+----------+-------------+ | 192.168.26.100 | node-to-node mesh | up    | 14:46:31 | Established | | 192.168.26.102 | node-to-node mesh | up    | 14:46:34 | Established | +----------------+-------------------+-------+----------+-------------+  IPv6 BGP status No IPv6 peers found. 192.168.26.100 | CHANGED | rc=0 >> Calico process is running.  IPv4 BGP status +----------------+-------------------+-------+----------+-------------+ |  PEER ADDRESS  |     PEER TYPE     | STATE |  SINCE   |    INFO     | +----------------+-------------------+-------+----------+-------------+ | 192.168.26.101 | node-to-node mesh | up    | 14:46:31 | Established | | 192.168.26.102 | node-to-node mesh | up    | 14:46:35 | Established | +----------------+-------------------+-------+----------+-------------+  IPv6 BGP status No IPv6 peers found.  [root@vms81.liruilongs.github.io]-[~/ansible]  $
  当集群中的容器需要与外界通信时,就可以通过BGP协议将网关物理路由器加入到集群中,使外界可以直接访问容器IP,而不需要做任何NAT之类的复杂操作。 通过Calico网络实现跨主机通信
  在某一个Node上创建一个 docker  内部calico  网络 [root@vms81.liruilongs.github.io]-[~/ansible]  $ansible 192.168.26.100 -m shell -a "docker network create --driver calico --ipam-driver calico-ipam calnet1" 192.168.26.100 | CHANGED | rc=0 >> 58121f89bcddec441770aa207ef662d09e4413625b0827ce4d8f601fb10650d0
  会发现这个内网网络变成的一个全局的网络,在所有节点可见,58121f89bcdd  [root@vms81.liruilongs.github.io]-[~/ansible]  $ansible etcd -m shell -a "docker network list" 192.168.26.100 | CHANGED | rc=0 >> NETWORK ID     NAME      DRIVER    SCOPE caa87ba3dd86   bridge    bridge    local 58121f89bcdd   calnet1   calico    global 1d63e3ad385f   host      host      local adc94f172d5f   none      null      local 192.168.26.102 | CHANGED | rc=0 >> NETWORK ID     NAME      DRIVER    SCOPE cc37d3c66e2f   bridge    bridge    local 58121f89bcdd   calnet1   calico    global 3b138015d4ab   host      host      local 7481614a7084   none      null      local 192.168.26.101 | CHANGED | rc=0 >> NETWORK ID     NAME      DRIVER    SCOPE d0cb224ed111   bridge    bridge    local 58121f89bcdd   calnet1   calico    global 106e1c9fb3d3   host      host      local f983021e2a02   none      null      local  [root@vms81.liruilongs.github.io]-[~/ansible]  $
  查看节点中的网卡信息,这个时候没有容器运行,所以没有caliao网卡  [root@vms81.liruilongs.github.io]-[~/ansible]  $ansible etcd -m shell -a "ip a" 192.168.26.102 | CHANGED | rc=0 >> 1: lo:  mtu 65536 qdisc noqueue state UNKNOWN qlen 1     link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00     inet 127.0.0.1/8 scope host lo        valid_lft forever preferred_lft forever     inet6 ::1/128 scope host        valid_lft forever preferred_lft forever 2: ens32:  mtu 1500 qdisc pfifo_fast state UP qlen 1000     link/ether 00:0c:29:0f:98:f1 brd ff:ff:ff:ff:ff:ff     inet 192.168.26.102/24 brd 192.168.26.255 scope global ens32        valid_lft forever preferred_lft forever     inet6 fe80::20c:29ff:fe0f:98f1/64 scope link        valid_lft forever preferred_lft forever 3: docker0:  mtu 1500 qdisc noqueue state DOWN     link/ether 02:42:c3:28:19:78 brd ff:ff:ff:ff:ff:ff     inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0        valid_lft forever preferred_lft forever 192.168.26.100 | CHANGED | rc=0 >> 1: lo:  mtu 65536 qdisc noqueue state UNKNOWN qlen 1     link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00     inet 127.0.0.1/8 scope host lo        valid_lft forever preferred_lft forever     inet6 ::1/128 scope host        valid_lft forever preferred_lft forever 2: ens32:  mtu 1500 qdisc pfifo_fast state UP qlen 1000     link/ether 00:0c:29:8c:e8:1a brd ff:ff:ff:ff:ff:ff     inet 192.168.26.100/24 brd 192.168.26.255 scope global ens32        valid_lft forever preferred_lft forever     inet6 fe80::20c:29ff:fe8c:e81a/64 scope link        valid_lft forever preferred_lft forever 3: docker0:  mtu 1500 qdisc noqueue state DOWN     link/ether 02:42:f7:1a:2e:30 brd ff:ff:ff:ff:ff:ff     inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0        valid_lft forever preferred_lft forever 192.168.26.101 | CHANGED | rc=0 >> 1: lo:  mtu 65536 qdisc noqueue state UNKNOWN qlen 1     link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00     inet 127.0.0.1/8 scope host lo        valid_lft forever preferred_lft forever     inet6 ::1/128 scope host        valid_lft forever preferred_lft forever 2: ens32:  mtu 1500 qdisc pfifo_fast state UP qlen 1000     link/ether 00:0c:29:3b:6e:ef brd ff:ff:ff:ff:ff:ff     inet 192.168.26.101/24 brd 192.168.26.255 scope global ens32        valid_lft forever preferred_lft forever     inet6 fe80::20c:29ff:fe3b:6eef/64 scope link        valid_lft forever preferred_lft forever 3: docker0:  mtu 1500 qdisc noqueue state DOWN     link/ether 02:42:70:a7:4e:7e brd ff:ff:ff:ff:ff:ff     inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0        valid_lft forever preferred_lft forever  [root@vms81.liruilongs.github.io]-[~/ansible]  $
  每个节点运行一个容器  [root@vms81.liruilongs.github.io]-[~/ansible]  $ansible etcd -m shell -a "docker run --name {{inventory_hostname}} -itd --net=calnet1 --restart=always busybox " 192.168.26.101 | CHANGED | rc=0 >> cf2ff4b65e6343fa6e9afba6e75376b97ac47ea59c35f3c492bb7051c15627f0 192.168.26.100 | CHANGED | rc=0 >> 065724c073ded04d6df41d295be3cd5585f8683664fd42a3953dc8067195c58e 192.168.26.102 | CHANGED | rc=0 >> 82e4d6dfde5a6e51f9a4d4f86909678a42e8d1e2d9bfa6edd9cc258b37dfc2db
  查看容器节点信息  [root@vms81.liruilongs.github.io]-[~/ansible]  $ansible etcd -m shell -a "docker ps" 192.168.26.102 | CHANGED | rc=0 >> CONTAINER ID   IMAGE                         COMMAND         CREATED              STATUS              PORTS     NAMES 82e4d6dfde5a   busybox                       "sh"            About a minute ago   Up About a minute             192.168.26.102 c2d2ab904d6d   quay.io/calico/node:v2.6.12   "start_runit"   2 hours ago          Up 2 hours                    calico-node 192.168.26.100 | CHANGED | rc=0 >> CONTAINER ID   IMAGE                         COMMAND         CREATED              STATUS              PORTS     NAMES 065724c073de   busybox                       "sh"            About a minute ago   Up About a minute             192.168.26.100 f0b150a924d9   quay.io/calico/node:v2.6.12   "start_runit"   2 hours ago          Up 2 hours                    calico-node 192.168.26.101 | CHANGED | rc=0 >> CONTAINER ID   IMAGE                         COMMAND         CREATED              STATUS              PORTS     NAMES cf2ff4b65e63   busybox                       "sh"            About a minute ago   Up About a minute             192.168.26.101 0e4e6f005797   quay.io/calico/node:v2.6.12   "start_runit"   2 hours ago          Up 2 hours                    calico-node  [root@vms81.liruilongs.github.io]-[~/ansible]  $
  查看每个容器的内部网卡和IP  [root@vms81.liruilongs.github.io]-[~/ansible]  $ansible etcd -m shell -a "docker exec -it {{inventory_hostname}} ip a | grep  cali0 -A 4" 192.168.26.100 | CHANGED | rc=0 >> 4: cali0@if5:  mtu 1500 qdisc noqueue     link/ether ee:ee:ee:ee:ee:ee brd ff:ff:ff:ff:ff:ff     inet 192.168.239.128/32 scope global cali0        valid_lft forever preferred_lft forever 192.168.26.102 | CHANGED | rc=0 >> 4: cali0@if5:  mtu 1500 qdisc noqueue     link/ether ee:ee:ee:ee:ee:ee brd ff:ff:ff:ff:ff:ff     inet 192.168.63.64/32 scope global cali0        valid_lft forever preferred_lft forever 192.168.26.101 | CHANGED | rc=0 >> 4: cali0@if5:  mtu 1500 qdisc noqueue     link/ether ee:ee:ee:ee:ee:ee brd ff:ff:ff:ff:ff:ff     inet 192.168.198.0/32 scope global cali0        valid_lft forever preferred_lft forever  [root@vms81.liruilongs.github.io]-[~/ansible]  $
  查看容器内的路由关系,即所有的出口都是通过cali0网卡来实现的  [root@vms81.liruilongs.github.io]-[~/ansible]  $ansible etcd -m shell -a "docker exec -it {{inventory_hostname}} ip route | grep  cali0 " 192.168.26.101 | CHANGED | rc=0 >> default via 169.254.1.1 dev cali0 169.254.1.1 dev cali0 scope link 192.168.26.102 | CHANGED | rc=0 >> default via 169.254.1.1 dev cali0 169.254.1.1 dev cali0 scope link 192.168.26.100 | CHANGED | rc=0 >> default via 169.254.1.1 dev cali0 169.254.1.1 dev cali0 scope link
  每创建一个容器,则会在物理机上创建一张虚拟网卡出来,对应容器中的网卡,从这里可以看到容器里的虚拟网卡 cali0 和物理机的 cali6f956c2ada9 是  veth pair   关系。
  关于  veth pair   小伙伴可以百度下,这里简单描述,作用很简单,就是要把从一个 network namespace   发出的数据包转发到另一个 namespace  。veth   设备是成对的,一个是container  之中,另一个在container  之外(宿主机),即在真实机器上能看到的。VETH  设备总是成对出现,送到一端请求发送的数据总是从另一端以请求接受的形式出现。创建并配置正确后,向其一端输入数据,VETH  会改变数据的方向并将其送入内核网络子系统  ,完成数据的注入  ,而在另一端则能读到此数据  。(Namespace,其中往veth设备上任意一端上RX到的数据,都会在另一端上以TX的方式发送出去)veth工作在L2数据链路层  ,veth-pair设备在转发数据包过程中并不串改数据包内容  。
  更多小伙伴可以参考:https://blog.csdn.net/sld880311/article/details/77650937  [root@vms81.liruilongs.github.io]-[~/ansible]  $ansible etcd -m shell -a "ip a | grep -A 4 cali" 192.168.26.102 | CHANGED | rc=0 >> 5: cali6f956c2ada9@if4:  mtu 1500 qdisc noqueue state UP     link/ether 6a:65:54:1a:19:e6 brd ff:ff:ff:ff:ff:ff link-netnsid 0     inet6 fe80::6865:54ff:fe1a:19e6/64 scope link        valid_lft forever preferred_lft forever 192.168.26.100 | CHANGED | rc=0 >> 5: cali0b7f49da20a@if4:  mtu 1500 qdisc noqueue state UP     link/ether 9e:da:0e:cc:b3:7e brd ff:ff:ff:ff:ff:ff link-netnsid 0     inet6 fe80::9cda:eff:fecc:b37e/64 scope link        valid_lft forever preferred_lft forever 192.168.26.101 | CHANGED | rc=0 >> 5: calib6f7ddae7e3@if4:  mtu 1500 qdisc noqueue state UP     link/ether 1e:e6:16:ae:f0:91 brd ff:ff:ff:ff:ff:ff link-netnsid 0     inet6 fe80::1ce6:16ff:feae:f091/64 scope link        valid_lft forever preferred_lft forever  [root@vms81.liruilongs.github.io]-[~/ansible]  $
  查看宿主机路由关系  [root@vms81.liruilongs.github.io]-[~/ansible]  $ansible etcd -m shell -a "ip route " 192.168.26.101 | CHANGED | rc=0 >> default via 192.168.26.2 dev ens32 169.254.0.0/16 dev ens32 scope link metric 1002 172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 192.168.26.0/24 dev ens32 proto kernel scope link src 192.168.26.101 192.168.63.64/26 via 192.168.26.102 dev ens32 proto bird blackhole 192.168.198.0/26 proto bird 192.168.198.1 dev cali2f9e2c68bad scope link 192.168.239.128/26 via 192.168.26.100 dev ens32 proto bird 192.168.26.100 | CHANGED | rc=0 >> default via 192.168.26.2 dev ens32 169.254.0.0/16 dev ens32 scope link metric 1002 172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 192.168.26.0/24 dev ens32 proto kernel scope link src 192.168.26.100 192.168.63.64/26 via 192.168.26.102 dev ens32 proto bird 192.168.198.0/26 via 192.168.26.101 dev ens32 proto bird 192.168.239.128 dev cali0b7f49da20a scope link blackhole 192.168.239.128/26 proto bird 192.168.26.102 | CHANGED | rc=0 >> default via 192.168.26.2 dev ens32 169.254.0.0/16 dev ens32 scope link metric 1002 172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 192.168.26.0/24 dev ens32 proto kernel scope link src 192.168.26.102 192.168.63.64 dev cali6f956c2ada9 scope link blackhole 192.168.63.64/26 proto bird 192.168.198.0/26 via 192.168.26.101 dev ens32 proto bird 192.168.239.128/26 via 192.168.26.100 dev ens32 proto bird  [root@vms81.liruilongs.github.io]-[~/ansible]  $
  我们那其中一台机器来看:192.168.26.100宿主机来讲
  192.168.239.128 dev cali0b7f49da20a scope link
  进去:本机到目的地址到 容器IP(192.168.239.128 ) 的数据包都从 cali6f956c2ada9 (新产生的虚拟网卡)走。
  192.168.63.64/26 via 192.168.26.102 dev ens32 proto bird
  192.168.198.0/26 via 192.168.26.101 dev ens32 proto bird
  出来:本机目的地址到 容器IP(192.168.63.64/26) 容器IP(192.168.198.0/26) 网段的数据包都从 ens32 发到 其他的两个宿主机上去。
  每台主机都知道不同的容器在哪台主机上,所以会动态的设置路由。
  [root@vms81.liruilongs.github.io]-[~/ansible]  $ansible etcd -m shell -a "route -n " 192.168.26.101 | CHANGED | rc=0 >> Kernel IP routing table Destination     Gateway         Genmask         Flags Metric Ref    Use Iface 0.0.0.0         192.168.26.2    0.0.0.0         UG    0      0        0 ens32 169.254.0.0     0.0.0.0         255.255.0.0     U     1002   0        0 ens32 172.17.0.0      0.0.0.0         255.255.0.0     U     0      0        0 docker0 192.168.26.0    0.0.0.0         255.255.255.0   U     0      0        0 ens32 192.168.63.64   192.168.26.102  255.255.255.192 UG    0      0        0 ens32 192.168.198.0   0.0.0.0         255.255.255.192 U     0      0        0 * 192.168.198.1   0.0.0.0         255.255.255.255 UH    0      0        0 cali2f9e2c68bad 192.168.239.128 192.168.26.100  255.255.255.192 UG    0      0        0 ens32 192.168.26.100 | CHANGED | rc=0 >> Kernel IP routing table Destination     Gateway         Genmask         Flags Metric Ref    Use Iface 0.0.0.0         192.168.26.2    0.0.0.0         UG    0      0        0 ens32 169.254.0.0     0.0.0.0         255.255.0.0     U     1002   0        0 ens32 172.17.0.0      0.0.0.0         255.255.0.0     U     0      0        0 docker0 192.168.26.0    0.0.0.0         255.255.255.0   U     0      0        0 ens32 192.168.63.64   192.168.26.102  255.255.255.192 UG    0      0        0 ens32 192.168.198.0   192.168.26.101  255.255.255.192 UG    0      0        0 ens32 192.168.239.128 0.0.0.0         255.255.255.255 UH    0      0        0 cali0b7f49da20a 192.168.239.128 0.0.0.0         255.255.255.192 U     0      0        0 * 192.168.26.102 | CHANGED | rc=0 >> Kernel IP routing table Destination     Gateway         Genmask         Flags Metric Ref    Use Iface 0.0.0.0         192.168.26.2    0.0.0.0         UG    0      0        0 ens32 169.254.0.0     0.0.0.0         255.255.0.0     U     1002   0        0 ens32 172.17.0.0      0.0.0.0         255.255.0.0     U     0      0        0 docker0 192.168.26.0    0.0.0.0         255.255.255.0   U     0      0        0 ens32 192.168.63.64   0.0.0.0         255.255.255.255 UH    0      0        0 cali6f956c2ada9 192.168.63.64   0.0.0.0         255.255.255.192 U     0      0        0 * 192.168.198.0   192.168.26.101  255.255.255.192 UG    0      0        0 ens32 192.168.239.128 192.168.26.100  255.255.255.192 UG    0      0        0 ens32  [root@vms81.liruilongs.github.io]-[~/ansible]  $
  简单测试一下: 192.168.26.100  宿主机上的容器(192.168.239.128  )去ping 192.168.63.64  (192.168.26.100  上的容器),实现跨主机互通。 [root@vms100.liruilongs.github.io]-[~]  $ docker exec -it 192.168.26.100 /bin/sh / # ls bin   dev   etc   home  proc  root  sys   tmp   usr   var / # ip a 1: lo:  mtu 65536 qdisc noqueue qlen 1     link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00     inet 127.0.0.1/8 scope host lo        valid_lft forever preferred_lft forever 4: cali0@if5:  mtu 1500 qdisc noqueue     link/ether ee:ee:ee:ee:ee:ee brd ff:ff:ff:ff:ff:ff     inet 192.168.239.128/32 scope global cali0        valid_lft forever preferred_lft forever / # ping 192.168.63.64 PING 192.168.63.64 (192.168.63.64): 56 data bytes 64 bytes from 192.168.63.64: seq=0 ttl=62 time=18.519 ms 64 bytes from 192.168.63.64: seq=1 ttl=62 time=0.950 ms 64 bytes from 192.168.63.64: seq=2 ttl=62 time=1.086 ms 64 bytes from 192.168.63.64: seq=3 ttl=62 time=0.846 ms 64 bytes from 192.168.63.64: seq=4 ttl=62 time=0.840 ms 64 bytes from 192.168.63.64: seq=5 ttl=62 time=1.151 ms 64 bytes from 192.168.63.64: seq=6 ttl=62 time=0.888 ms ^C --- 192.168.63.64 ping statistics --- 7 packets transmitted, 7 packets received, 0% packet loss round-trip min/avg/max = 0.840/3.468/18.519 ms / #
  在K8s集群的中,有一个容器,就会生成一个calico网卡  [root@vms81.liruilongs.github.io]-[~/ansible]  $ip a 1: lo:  mtu 65536 qdisc noqueue state UNKNOWN qlen 1     link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00     inet 127.0.0.1/8 scope host lo        valid_lft forever preferred_lft forever     inet6 ::1/128 scope host        valid_lft forever preferred_lft forever 2: ens32:  mtu 1500 qdisc pfifo_fast state UP qlen 1000     link/ether 00:0c:29:ad:e3:93 brd ff:ff:ff:ff:ff:ff     inet 192.168.26.81/24 brd 192.168.26.255 scope global ens32        valid_lft forever preferred_lft forever     inet6 fe80::20c:29ff:fead:e393/64 scope link        valid_lft forever preferred_lft forever 3: docker0:  mtu 1500 qdisc noqueue state DOWN     link/ether 02:42:0a:9e:7d:44 brd ff:ff:ff:ff:ff:ff     inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0        valid_lft forever preferred_lft forever 4: tunl0@NONE:  mtu 1480 qdisc noqueue state UNKNOWN qlen 1     link/ipip 0.0.0.0 brd 0.0.0.0     inet 10.244.88.64/32 scope global tunl0        valid_lft forever preferred_lft forever 5: cali12cf25006b5@if4:  mtu 1480 qdisc noqueue state UP     link/ether ee:ee:ee:ee:ee:ee brd ff:ff:ff:ff:ff:ff link-netnsid 0     inet6 fe80::ecee:eeff:feee:eeee/64 scope link        valid_lft forever preferred_lft forever 6: cali5a282a7bbb0@if4:  mtu 1480 qdisc noqueue state UP     link/ether ee:ee:ee:ee:ee:ee brd ff:ff:ff:ff:ff:ff link-netnsid 1     inet6 fe80::ecee:eeff:feee:eeee/64 scope link        valid_lft forever preferred_lft forever 7: calicb34164ec79@if4:  mtu 1480 qdisc noqueue state UP     link/ether ee:ee:ee:ee:ee:ee brd ff:ff:ff:ff:ff:ff link-netnsid 2     inet6 fe80::ecee:eeff:feee:eeee/64 scope link        valid_lft forever preferred_lft forever  [root@vms81.liruilongs.github.io]-[~/ansible]  $

澎湃芯片卷土重来?澎湃c1仅是一颗isp,难堪大用沉寂已久的小米澎湃芯片终于有了新动作!在3月30日的小米新品发布会上,雷军高调发布了一款小米澎湃芯片,然而这款芯片并不是众所期待的澎湃s2,而是c1,澎湃c1是一颗图像处理芯片,这中兴首发第二代屏下摄像头技术,3d结构光引领真全面屏时代曾经作为国产手机中华酷联之首的中兴手机早已不复当年的雄风,近年来的市场份额和影响力日益减少,但是瘦死的骆驼比马大,首发5g手机的中兴通讯仍然拥有强大的技术研发能力,而且其十分重视对神机确认升级鸿蒙系统,鸿蒙OS即将全面上线,未来不可限量在华为matex2发布会上,华为消费者业务ceo余承东表示要在今年四月份全面上线鸿蒙手机系统正式版,近日,华为鸿蒙系统负责人王成录也确认了这一消息,他还透露除了华为旗舰手机以外其他win11发布,同样兼容安卓,难道也是换皮?鸿蒙OS2毋庸置疑备受关注的华为鸿蒙操作系统2。0正式版终于在6月2日正式发布了,这是一款华为研发了十年之久的国产自主操作系统,为此华为投入了5000位研发人员和无数的财力物力,如今的成果来之不易,谷歌自研5纳米处理器,补齐短板,华为全力突破,未来三足鼎立得益于iphone12的大卖,苹果在2020年重新成为全球第一大智能手机厂商,iphone再度成为全球销量最大的智能手机。与iphone的春风得意相比,安卓阵营的颓势则十分明显,不因4S店提车加价,女子跳楼维权,网友4S店该被淘汰了汽车是如今受到芯片短缺影响最大的行业之一,因此许多车型的售价也有所上涨。环境如此,消费者购车时也只能接受。不过,如果是已经签好了协议,提车时临时加价,恐怕情况就大不相同了。近日,合IOS14。7正式版跑分总的来说,相对14。6版本,iphone8和12pro均有一些下降,但下降幅度较小,基本可认为持平。另外发热问题,12pro有些许改善玄学警告,在外面太阳光下还是会出现屏幕亮度变低墨迹天气版本升级了?这可能是全网最全的功能评测近日,墨迹天气对外宣布正式发布最新的9。0版本。作为10年的资深老粉,笔者迫不及待的尝鲜体验了一把。不得不说,新版本在视觉设计预报服务及用户体验方面都较前一版有了较大的改变,整体感蒋凡被拟认定为杭州高层次人才,网友不淡定了看来出轨都是小事最近一段时间,淘宝天猫总裁蒋凡又获得了新的荣誉他被被认定为杭州高层次人才,并且被公示期三天,今天是12月25日,也就是公示的最后一天。这个公示是杭州人社局两天前12月23日发布的,杭州女孩恋爱7年做人流6次,后来又怀孕了,男友的母亲说话了现在,随着社会越来越开放,很多年轻人在找对象的时候不再介意对方之前是否有过恋爱经历,因为多数年轻人最后结婚的配偶,都不是自己的第一次。不过也有些年轻人谈恋爱也就罢了,而且还多次怀孕杭州小学生书包里多了一本性教育知识手册有孩子当小黄书看最近几年,不少专家呼吁要对小学生进行性教育,这样对孩子有好处。当然了,专家这么说可能是有道理的,而且一些地方的小学也已经开始引进性教育方面的科普课程了,但是这里面也有一个尺度的问题
8点1氪腾讯回应派息式减持京东李佳琦被浙江消保委点名百度公司起诉百度烤肉获赔230万腾讯回应派息式减持京东被投企业有持续自筹资金能力时退出,目前没有进一步减持计划。名创优品市场消息名创优品据悉考虑2022年在香港上市。对此,名创优品相关负责人表示没有收到消息。(新AppStore年度精选!8个iPhone必装的APP,超级实用哈喽!大家好,我是小易,欢迎来到我的知识分享站!之前给大家分享过安卓手机必装的APP,那今天就给大家分享8个AppStore年度精选必装APP,超级实用,建议收藏起来哟!1国家反诈年底购机避坑指南牢记买手机的三不碰原则,别再花冤枉钱了年底了,今年的最后一波换机潮也要来了,面对市场上各大手机品牌的年底优惠活动,以及众多手机新品的预热,让消费者又爱又恨,爱的是形形色色琳琅满目的商品给了大家更多的选择空间,恨得是一时手机能取代相机吗?三星GalaxyS10给你一个满意的答案手机能取代相机吗?这个争论一直存在。我能够做到,让手里的设备发挥最大的价值,这就够了。一部手机拍颐和园,美不胜收。厂商samsung型号SMG9730光圈2。4ISO50曝光时间0余承东升级鸿蒙系统的华为设备数已超过2。2亿部新京报贝壳财经讯(记者许诺)12月23日下午,在华为冬季旗舰新品发布会上,华为常务董事消费者BGCEO华为智能汽车解决方案BUCEO余承东表示,到目前为止,升级鸿蒙系统(Harmo电脑硬件选购指南适合入手的CPU型号参数价格含天梯图电脑硬件的所有产品均具有时效性,性价比是否合适入手需要结合当时的价格来做参考。很多小可爱会在看到文章图片后的半年1年或更久来作为参考是没有用处哒。所以本次更新猫猫在明细图中注明了时如何看待没有小米,也会有其它厂商把手机价格拉低的言论?这个观点我认同,这是生意的本质,如果和竞争对手拼不了品牌效应,那就拼价格!因为只有足够震惊的价格才能真正地出圈!要么是非常高,然后再降维打击要么是通过低价撕开市场的缺口!这都是经营俄罗斯自研48核处理器BaikalS点亮,性能比华为鲲鹏920低约15IT之家12月23日消息,近日俄罗斯公司BaikalElectronics正式点亮了其新的BaikalS处理器,该处理器有48个基于Arm指令集架构(ISA)的内核。这款CPU的代96电梯都可进!TCL真正实现超大屏电视轻松入户2021年已进入尾声,在过去的一年中,家电市场上的大屏电视也卖得非常火爆。据奥维云网对外发布的2021年11月家电市场总结显示,15000的彩电零售额占比3。8,同比增长0。7不同英特尔公开玩火,烧着的是国产芯片的后院点击右上方关注,第一时间获取科技资讯技能攻略产品体验,私信我回复01,送你一份玩机技能大礼包。前段时间,有媒体在英特尔官网上发现,英特尔在写给供应商的一封信中宣称禁止供应商使用来自英特尔致信供应商禁用新疆产品iPhone14系列芯片或继续沿用A15英特尔在供应商的公开信引起了众议。1英特尔致信供应商禁用新疆产品英特尔在其公司官网以简体中文繁体中文英语日语等语言向供应商写的一封信中,有一句话引起众议我们的投资者和客户已询问英特