虚拟化运维--容器网络--Calico(十二)

一、Calico简介

  Calico为容器和虚拟机工作负载提供一个安全的网络连接。Calico 是一种容器之间互通的网络方案。在虚拟化平台中,比如 OpenStack、Docker 等都需要实现 workloads 之间互连,但同时也需要对容器做隔离控制,就像在 Internet 中的服务仅开放80端口、公有云的多租户一样,提供隔离和管控机制。而在多数的虚拟化平台实现中,通常都使用二层隔离技术来实现容器的网络,这些二层的技术有一些弊端,比如需要依赖 VLAN、bridge 和隧道等技术,其中 bridge 带来了复杂性,vlan 隔离和 tunnel 隧道则消耗更多的资源并对物理环境有要求,随着网络规模的增大,整体会变得越加复杂。我们尝试把 Host 当作 Internet 中的路由器,同样使用 BGP 同步路由,并使用 iptables 来做安全访问策略,最终设计出了 Calico 方案。

适用场景:k8s环境中的pod之间需要隔离。

设计思想:Calico 不使用隧道或 NAT 来实现转发,而是巧妙的把所有二三层流量转换成三层流量,并通过 host 上路由配置完成跨 Host 转发。

官网:https://www.projectcalico.org/
文档地址:https://docs.projectcalico.org/v3.10/getting-started/

二、设计优势:

1.更优的资源利用
  二层网络通讯需要依赖广播消息机制,广播消息的开销与 host 的数量呈指数级增长,Calico 使用的三层路由方法,则完全抑制了二层广播,减少了资源开销。
  另外,二层网络使用 VLAN 隔离技术,天生有 4096 个规格限制,即便可以使用 vxlan 解决,但 vxlan 又带来了隧道开销的新问题。而 Calico 不使用 vlan 或 vxlan 技术,使资源利用率更高。
2.可扩展性
  Calico 使用与 Internet 类似的方案,Internet 的网络比任何数据中心都大,Calico 同样天然具有可扩展性。
3.简单而更容易 debug
  因为没有隧道,意味着 workloads 之间路径更短更简单,配置更少,在 host 上更容易进行 debug 调试。
4.更少的依赖
  Calico 仅依赖三层路由可达。
5.可适配性
  Calico 较少的依赖性使它能适配所有 VM、Container、白盒或者混合环境场景。

Calico 架构:
  Calico 是一个三层的数据中心网络方案,而且方便集成 OpenStack 这种 IaaS 云架构,能够提供高效可控的 VM、容器、裸机之间的通信。

三、Calico网络方式:

  1. IPIP
      从字面来理解,就是把一个IP数据包又套在一个IP包里,即把 IP 层封装到 IP 层的一个 tunnel,看起来似乎是浪费,实则不然。它的作用其实基本上就相当于一个基于IP层的网桥!一般来说,普通的网桥是基于mac层的,根本不需 IP,而这个 ipip 则是通过两端的路由做一个 tunnel,把两个本来不通的网络通过点对点连接起来。ipip 的源代码在内核 net/ipv4/ipip.c 中可以找到。
      IPIP是一种将各Node的路由之间做一个tunnel,再把两个网络连接起来的模式。启用IPIP模式时,Calico将在各Node上创建一个名为"tunl0"的虚拟网络接口。


    虚拟化运维--容器网络--Calico(十二)_第1张图片
    IPIP
  2. BGP
      边界网关协议(Border Gateway Protocol, BGP)是互联网上一个核心的去中心化自治路由协议。它通过维护IP路由表或‘前缀’表来实现自治系统(AS)之间的可达性,属于矢量路由协议。
      BGP不使用传统的内部网关协议(IGP)的指标,而使用基于路径、网络策略或规则集来决定路由。因此,它更适合被称为矢量性协议,而不是路由协议。BGP,通俗的讲就是讲接入到机房的多条线路(如电信、联通、移动等)融合为一体,实现多线单IP。


    虚拟化运维--容器网络--Calico(十二)_第2张图片
    BGP

    Calico BGP模式在小规模集群中可以直接互联,在大规模集群中可以通过额外的BGP route reflector来完成。

BGP 机房的优点:
  服务器只需要设置一个IP地址,最佳访问路由是由网络上的骨干路由器根据路由跳数与其它技术指标来确定的,不会占用服务器的任何系统。
  每个主机上都部署了calico/node作为虚拟路由器,并且可以通过calico将宿主机组织成任意的拓扑集群。当集群中的容器需要与外界通信时,就可以通过BGP协议将网关物理路由器加入到集群中,使外界可以直接访问容器IP,而不需要做任何NAT之类的复杂操作。

四、Calico网络模型主要工作组件

1.Felix:运行在每一台 Host 的 agent 进程,主要负责网络接口管理和监听、路由、ARP 管理、ACL 管理和同步、状态上报等。
2.etcd:分布式键值存储,主要负责网络元数据一致性,确保Calico网络状态的准确性,可以与kubernetes共用;
3.BGP Client(BIRD):Calico 为每一台 Host 部署一个 BGP Client,使用 BIRD 实现,BIRD 是一个单独的持续发展的项目,实现了众多动态路由协议比如 BGP、OSPF、RIP 等。在 Calico 的角色是监听 Host 上由 Felix 注入的路由信息,然后通过 BGP 协议广播告诉剩余 Host 节点,从而实现网络互通。
4.BGP Route Reflector:在大型网络规模中,如果仅仅使用 BGP client 形成 mesh 全网互联的方案就会导致规模限制,因为所有节点之间俩俩互联,需要 N^2 个连接,为了解决这个规模问题,可以采用 BGP 的 Router Reflector 的方法,使所有 BGP Client 仅与特定 RR 节点互联并做路由同步,从而大大减少连接数。

五、服务器架构

名称 IP 服务
master 192.168.247.130 etcd、calicoctl、docker、calico
node1 192.168.247.131 calico、docker
node2 192.168.247.132 calico、docker

六、安装配置

  1. 安装etcd
[root@master ~]# yum install etcd -y
[root@node1 ~]# yum install etcd -y
[root@node2 ~]# yum install etcd -y

  1. 配置etcd集群
    master:
# 配置etcd
[root@master ~]# vi /etc/etcd/etcd.conf
ETCD_LISTEN_PEER_URLS="http://0.0.0.0:2380"
ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379"
ETCD_NAME="master"

#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.247.130:2380"
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.247.130:2379"
ETCD_INITIAL_CLUSTER="master=http://192.168.247.130:2380,node1=http://192.168.247.131:2380,node2=http://192.168.247.132:2380"
# docker配置
[root@master ~]# vi /usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock --cluster-store=etcd://192.168.247.130:2379 -H tcp://0.0.0.0:7654
# 启动
[root@master ~]# systemctl start etcd
# 开机启动
[root@master ~]# systemctl enable etcd

node1:

[root@node1 ~]# vi /etc/etcd/etcd.conf

ETCD_LISTEN_PEER_URLS="http://0.0.0.0:2380"
ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379"
ETCD_NAME="node1"

#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.247.131:2380"
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.247.131:2379"
ETCD_INITIAL_CLUSTER="master=http://192.168.247.130:2380,node1=http://192.168.247.131:2380,node2=http://192.168.247.132:2380"
# docker配置
[root@master ~]# vi /usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock --cluster-store=etcd://192.168.247.131:2379 -H tcp://0.0.0.0:7654
# 启动
[root@node1 ~]# systemctl start etcd
# 开机启动
[root@node1 ~]# systemctl enable etcd

node2:


ETCD_LISTEN_PEER_URLS="http://0.0.0.0:2380"
ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379"
ETCD_NAME="node2"

#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.247.132:2380"
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.247.132:2379"
ETCD_INITIAL_CLUSTER="master=http://192.168.247.130:2380,node1=http://192.168.247.131:2380,node2=http://192.168.247.132:2380"
# docker配置
[root@master ~]# vi /usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock --cluster-store=etcd://192.168.247.132:2379 -H tcp://0.0.0.0:7654
# 启动
[root@node2 ~]# systemctl start etcd
# 开机启动
[root@node2 ~]# systemctl enable etcd

进程查看:

[root@master ~]#  ps -ef|grep etcd    
root       8013      1  0 01:51 ?        00:00:01 /usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock --cluster-store=etcd://192.168.247.130:2379 -H tcp://0.0.0.0:7654
etcd       8301      1  2 02:05 ?        00:00:22 /usr/bin/etcd --name=master --data-dir=/var/lib/etcd/default.etcd --listen-client-urls=http://0.0.0.0:2379

# 查看集群成员(在三个节点机任意一个上面查看都可以,因为做的是集群环境)
[root@master ~]# etcdctl  member list
2ebf7f58629a910c: name=node1 peerURLs=http://192.168.247.131:2380 clientURLs=http://192.168.247.131:2379 isLeader=false
644b83595c2adc40: name=master peerURLs=http://192.168.247.130:2380 clientURLs=http://192.168.247.130:2379 isLeader=true
8caab246e8249dd1: name=node2 peerURLs=http://192.168.247.132:2380 clientURLs=http://192.168.247.132:2379 isLeader=false
# 查看集群状态
[root@master ~]# etcdctl cluster-health
member 2ebf7f58629a910c is healthy: got healthy result from http://192.168.247.131:2379
member 644b83595c2adc40 is healthy: got healthy result from http://192.168.247.130:2379
member 8caab246e8249dd1 is healthy: got healthy result from http://192.168.247.132:2379
cluster is healthy

  1. 安装calicoctl(master\node1\node2)工具
    下载地址:https://github.com/projectcalico/calicoctl/releases
    所有节点:
[root@master ~]# curl -O -L  https://github.com/projectcalico/calicoctl/releases/download/v3.10.0/calicoctl
# 添加权限
[root@master ~]# chmod +x calicoctl
# 移动文件
[root@master ~]# mv calicoctl /usr/local/bin/
# 查看版本
[root@master ~]# calicoctl version
Client Version:    v3.10.0
Git commit:        7968b525
no etcd endpoints specified

  1. 配置calicoctl
# 运行calicoctl时,默认调用/etc/calico/calicoctl.cfg文件,其中指定了datastoreType与etcdEndpoints等重要参数;
# 或在运行calicoctl时,通--config参数指定文件
[root@master ~]# cat >/etc/calico/calicoctl.cfg <
  1. 设置docker连接etcd
# 设置docker连接etcd
# 修改docker服务的启动参数,即”ExecStart=/usr/bin/dockerd”;
# -H(option): 指定api端口;
# --cluster-store:连接etcd,docker支持跨主机的多节点网络时,需要设置此参数,否则网络元数据无法协同
#ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock --cluster-store=etcd://192.168.247.130:2379,192.168.247.131:2379,192.168.247.132:2379 -H tcp://0.0.0.0:7654
[root@master ~]# systemctl daemon-reload && systemctl restart docker

  1. ip转发功能打开(所有主机)
[root@node1 ~]# vi /etc/sysctl.conf
# 添加内容
net.ipv4.conf.all.rp_filter = 1
net.ipv4.ip_forward = 1

[root@node1 ~]#  sysctl -p
net.ipv4.conf.all.rp_filter = 1
net.ipv4.ip_forward = 1

七、安装Calico

  Calico服务以container的方式运行,container内包含bird路由管理、Felix协议等,并采用host网络与外部通信。
  所有workload节点启用Calico服务,做为calico节点(通过etcd)互相通信。

  1. 安装calico
    三个节点最好都要先下载calico容器镜像:
[root@master ~]# docker pull calico/node:v3.10.0
v3.10.0: Pulling from calico/node
8d691f585fa8: Pull complete 
8ef7b0583da7: Pull complete 
8acefbc23005: Pull complete 
c2bfb6bc5ad2: Pull complete 
6dfaaec51364: Pull complete 
070827ff8bdc: Pull complete 
5e5d67e8363a: Pull complete 
e9a69d06f68c: Pull complete 
a298b2035bc8: Pull complete 
dd6b1978d57b: Pull complete 
312392dfc56c: Pull complete 
Digest: sha256:722f4926940cbf01695413beb0f00b11e85a5ee7e2fa3b8ab3c11c2e1aaa07be
Status: Downloaded newer image for calico/node:v3.10.0
docker.io/calico/node:v3.10.0

[root@master ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
calico/node         v3.10.0             4365ab87e7e0        2 weeks ago         192MB

  1. Calico node会以container方式运行

calico节点管理
该命令下又包含四个子命令:run、status、diags和checksystem。
其中:
run命令可用于在该服务器上运行一个calico实例;
status命令可检查整个calico网络的状态;
diags用于手机calico节点的诊断信息;
checksystem命令用于检查改服务器是否可以运行一个calico实例。

# Calico node会以container方式运行
[root@master ~]# calicoctl node run --node-image=calico/node:v3.10.0
[root@node1 ~]# calicoctl node run --node-image=calico/node:v3.10.0
[root@node2 ~]# calicoctl node run --node-image=calico/node:v3.10.0

# 查看calico状态
[root@master ~]# calicoctl node status
Calico process is running.

IPv4 BGP status
+-----------------+-------------------+-------+----------+-------------+
|  PEER ADDRESS   |     PEER TYPE     | STATE |  SINCE   |    INFO     |
+-----------------+-------------------+-------+----------+-------------+
| 192.168.247.131 | node-to-node mesh | up    | 19:23:56 | Established |
| 192.168.247.132 | node-to-node mesh | up    | 19:24:00 | Established |
+-----------------+-------------------+-------+----------+-------------+

# 查看节点
[root@master ~]#  calicoctl get nodes
NAME     
master   
node1    
node2  

  1. 创建calico的环境变量
    生命周期是由linux系统的systemd来进行管理,以容器的形式运行:
# 添加配置(所有节点)
[root@master ~]# vi /etc/calico/calico.env
# 内容
ETCD_ENDPOINTS=http://192.168.247.130:2379,http://192.168.247.131:2379,http://192.168.247.132:2379
# 启用ssl/tls时,认证相关文件位置
ETCD_CA_FILE=""
ETCD_CERT_FILE=""
ETCD_KEY_FILE=""
# 留空时默认采用主机hostname作为辨识,所以留空时请确保主机名唯一
CALICO_NODENAME=""
CALICO_NO_DEFAULT_POOLS=""
# 设置路由下一跳,留空时从主机当前端口中自动选择,有参数”autodetect”强制每次启动时间自动检测
CALICO_IP=""
CALICO_IP6=""
# as number,默认从全局默认设置继承
CALICO_AS=""
# 启用libnetwork drive
CALICO_LIBNETWORK_ENABLED=true
# 路由协议,可选”bird”,“gobgp”,“none”,默认即”bird”, “gobgp”无ipip模式
CALICO_NETWORKING_BACKEND=bird

注意:
CALICO_NODENAME 如果不设置的话,默认为主机名,要保证主机名唯一
CALICO_NETWORKING_BACKEND:有效值如下:
bird(默认值)
gobgp(无ipip模式)
node

  1. 创建calico-node.service配置文件
#  master 节点
[root@master ~]# vi /lib/systemd/system/calico-node.service
[Unit]
Description=calico-node
After=docker.service
Requires=docker.service

[Service]
EnvironmentFile=/etc/calico/calico.env
ExecStartPre=-/usr/bin/docker rm -f calico-node
ExecStart=/usr/bin/docker run --net=host --privileged \
 --name=calico-node \
 -e NODENAME=master \
 -e IP=192.168.247.130 \
 -e CALICO_NETWORKING_BACKEND=${CALICO_NETWORKING_BACKEND} \
 -e ETCD_ENDPOINTS=http://127.0.0.1:2379 \
 -v /var/log/calico:/var/log/calico \
 -v /run/docker/plugins:/run/docker/plugins \
 -v /var/run/docker.sock:/var/run/docker.sock \
 -v /lib/modules:/lib/modules \
 -v /var/run/calico:/var/run/calico \
 quay.io/calico/node:v2.6.10

ExecStop=-/usr/bin/docker stop calico-node

Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s

[Install]
WantedBy=multi-user.target

# 启动容器
[root@master ~]# systemctl start calico-node
[root@master ~]# systemctl status calico-node

[root@master ~]# docker ps
CONTAINER ID        IMAGE                 COMMAND             CREATED             STATUS              PORTS               NAMES
658768ddb894        calico/node:v3.10.0   "start_runit"       6 minutes ago       Up 6 minutes                            calico-node

# 需3个节点全部启动 
[root@master ~]# calicoctl get nodes --out=wide
NAME     ASN       IPV4                 IPV6   
master   (64512)   192.168.247.130/32          
node1    (64512)   192.168.247.131/32          
node2    (64512)   192.168.247.132/32     

# 查看节点状态
# 任意节点可查看;
# 显示邻居节点地址,节点之间是”node-to-node mesh”状态(区别于bgp rr)
[root@master ~]#  calicoctl node status
Calico process is running.

IPv4 BGP status
+-----------------+-------------------+-------+----------+-------------+
|  PEER ADDRESS   |     PEER TYPE     | STATE |  SINCE   |    INFO     |
+-----------------+-------------------+-------+----------+-------------+
| 192.168.247.131 | node-to-node mesh | up    | 14:13:52 | Established |
| 192.168.247.132 | node-to-node mesh | up    | 14:16:35 | Established |
+-----------------+-------------------+-------+----------+-------------+

node1节点、与nod2节点配置:

-e NODENAME=node1 \
-e NODENAME=node2 \

其它与master相同。

八、Calico网络

IP-in-IP和VXLAN仅支持IPv4地址。

  1. 查看当前ipPool
# 运行calico服务后,默认含1个192.168.0.0/16的ipv4地址池,1个64位的ipv6的地址池,后续网络分配即地址池获取;
# NAT:容器获得的地址是否可nat出host;
# IPIP:ipip是在宿主机网络不完全支持bgp时,一种妥协的overlay机制,在宿主机创建1个”tunl0”虚拟端口;设置为false时,路由即纯bgp模式,理论上ipip模式的网络传输性能低于纯bgp模式;设置为true时,又分ipip always模式(纯ipip模式)与ipip cross-subnet模式(ipip-bgp混合模式),后者指“同子网内路由采用bgp,跨子网路由采用ipip”
[root@master ~]# calicoctl get ipPool -o wide
NAME                  CIDR                  NAT     IPIPMODE   VXLANMODE   DISABLED   SELECTOR   
default-ipv4-ippool   192.168.0.0/16        true    Never      Never       false      all()      
default-ipv6-ippool   fd32:109b:5171::/48   false   Never      Never       false      all()  

  1. 创建ipPool
# 在任意节点上定义都可以,ipPool属于全局;
# calicov2与v3对资源的定义逻辑基本相同,但命令参数区别较大
[root@master ~]# vi new-pool-1.yaml 
# 内容
apiVersion: projectcalico.org/v3
kind: IPPool
metadata:
  name: external-pool
spec:
  cidr: 172.16.0.0/26
  blockSize: 29
  ipipMode: Always
  natOutgoing: true
---
apiVersion: projectcalico.org/v3
kind: IPPool
metadata:
  name: internal-pool
spec:
  cidr: 192.169.0.0/24
  blockSize: 29
  ipipMode: Always
  natOutgoing: true

# 下发ipPool资源
[root@master ~]# calicoctl create -f new-pool-1.yaml
Successfully created 2 'IPPool' resource(s)

# 查看ipPool
[root@master ~]# calicoctl get ipPool
NAME                  CIDR                  SELECTOR   
default-ipv4-ippool   192.168.0.0/16        all()      
default-ipv6-ippool   fd32:109b:5171::/48   all()      
external-pool         172.16.0.0/26         all()      
internal-pool         192.169.0.0/24        all()   

[root@master ~]# calicoctl get ipPool -o wide
NAME                  CIDR                  NAT     IPIPMODE   VXLANMODE   DISABLED   SELECTOR   
default-ipv4-ippool   192.168.0.0/16        true    Never      Never       false      all()      
default-ipv6-ippool   fd32:109b:5171::/48   false   Never      Never       false      all()      
external-pool         172.16.0.0/26         true    Always     Never       false      all()      
internal-pool         192.169.0.0/24        true    Always     Never       false      all()   

# 删除默认ipPool(option)
[root@master ~]# calicoctl delete ipPool default-ipv6-ippool
Successfully deleted 1 'IPPool' resource(s)

# 资源下发后,各节点从ipPool获得1个/26位的subnet网段;
# 同时注意前往其余节点的下一跳网口是“tunl0”,这里因为ipip设置为enable: true;
# 如果不启用ipip模式,则不会新增”tunl0”网口,下一跳网口应是“eth0”
[root@node1 ~]# ip route show
default via 192.168.247.2 dev ens33  proto static  metric 100 
172.17.0.0/16 dev docker0  proto kernel  scope link  src 172.17.0.1 
192.168.247.0/24 dev ens33  proto kernel  scope link  src 192.168.247.131  metric 100 

如果不启用ipip模式,则不会新增”tunl0”网口,下一跳网口应是“eth0”

  1. IPIP模式设置为crosssubnet

[root@master ~]# vi new-pool-1.yaml 
内容:
apiVersion: projectcalico.org/v3
kind: IPPool
metadata:
  name: ippool-ipip-cross-subnet-1
spec:
  cidr: 172.16.0.0/26
  ipipMode: CrossSubnet
  natOutgoing: true

# 资源下发
[root@master ~]# calicoctl create -f new-pool-1.yaml 
Successfully created 1 'IPPool' resource(s)

# master 节点
[root@master ~]# ip route show
default via 192.168.247.2 dev ens33 proto dhcp metric 100 
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 
192.168.247.0/24 dev ens33 proto kernel scope link src 192.168.247.130 metric 100 
# node1节点
[root@node1 ~]# ip route show
default via 192.168.247.2 dev ens33  proto static  metric 100 
172.17.0.0/16 dev docker0  proto kernel  scope link  src 172.17.0.1 
192.168.247.0/24 dev ens33  proto kernel  scope link  src 192.168.247.131  metric 100 

# 显示Calico分配的IP地址的详细信息
[root@master ~]# calicoctl ipam show
+----------+----------------+-----------+------------+--------------+
| GROUPING |      CIDR      | IPS TOTAL | IPS IN USE |   IPS FREE   |
+----------+----------------+-----------+------------+--------------+
| IP Pool  | 192.168.0.0/16 |     65536 | 0 (0%)     | 65536 (100%) |
| IP Pool  | 172.16.0.0/26  |        64 | 0 (0%)     | 64 (100%)    |
+----------+----------------+-----------+------------+--------------+

  1. 工作负载间通信配置IP-in-IP
    ipipMode设置为Always时,Calico使用IP-in-IP将来自启用Calico的主机的所有流量路由到IP池中的所有Calico网络容器和虚拟机。
apiVersion: projectcalico.org/v3
kind: IPPool
metadata:
  name: ippool-ipip-1
spec:
  cidr: 192.168.0.0/16
  ipipMode: Always
  natOutgoing: true

  1. 跨子网通信配置VXLAN
apiVersion: projectcalico.org/v3
kind: IPPool
metadata:
  name: ippool-vxlan-cross-subnet-1
spec:
  cidr: 192.168.0.0/16
  vxlanMode: CrossSubnet
  natOutgoing: true

  1. 所有工作负载间通信配置vxlan
    当vxlanmode设置为always时,calico使用vxlan将来自启用calico的主机的所有流量路由到ip池中的所有calico网络容器和vm。
apiVersion: projectcalico.org/v3
kind: IPPool
metadata:
  name: ippool-vxlan-1
spec:
  cidr: 192.168.0.0/16
  vxlanMode: Always
  natOutgoing: true

如果只使用vxlan池,则不需要bgp网络。可以禁用BGP。

九、验证容器之间的通信

节点主机名和ETCD_NAME以及NODENAME一定要保持相同。

# 查看各个节点上的路由情况
[root@master ~]# route -n

  1. 容器与宿主机通信
[root@master ~]# docker run -ti centos bash
Unable to find image 'centos:latest' locally
latest: Pulling from library/centos
729ec3a6ada3: Pull complete 
Digest: sha256:f94c1d992c193b3dc09e297ffd54d8a4f1dc946c37cbeceb26d35ce1647f88d9
Status: Downloaded newer image for centos:latest
[root@4eefcbc7e85e /]# ip addr
1: lo:  mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    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: eth0@if5:  mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever
[root@4eefcbc7e85e /]# ping 192.168.247.130
PING 192.168.247.130 (192.168.247.130) 56(84) bytes of data.
64 bytes from 192.168.247.130: icmp_seq=1 ttl=64 time=0.185 ms

  1. 容器与物理主机通信
# master主机
[root@master ~]# docker run -ti centos bash
Unable to find image 'centos:latest' locally
latest: Pulling from library/centos
729ec3a6ada3: Pull complete 
Digest: sha256:f94c1d992c193b3dc09e297ffd54d8a4f1dc946c37cbeceb26d35ce1647f88d9
Status: Downloaded newer image for centos:latest
[root@4eefcbc7e85e /]# ip addr
1: lo:  mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    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: eth0@if5:  mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever
# 容器与物理主机通信-node1
[root@4eefcbc7e85e /]# ping 192.168.247.131
PING 192.168.247.131 (192.168.247.131) 56(84) bytes of data.
64 bytes from 192.168.247.131: icmp_seq=1 ttl=63 time=2.05 ms

  1. 容器与容器通信
    master主机容器:

node1主机容器:


常见问题

  1. Loaded: loaded (/usr/lib/systemd/system/calico-node.service; bad; vendor preset: disabled)
    重启Docker。
[root@master ~]# systemctl restart docker

  1. calicoctl 发现不了节点 的解决方法 No IPv4 peers found.
    原因:
    其它节点服务没有启动。
    IP地址错误。
    一定要使用:
    quay.io/calico/node:v2.6.10
    而不要使用:
    calico/node:v3.10.0

  2. 卸载tunl0

# 查看网络设备信息
[root@master ~]# nmcli device status 
DEVICE        TYPE      STATE         CONNECTION 
ens33         ethernet  connected     ens33      
docker0       bridge    connected     docker0    
tunl0         iptunnel  disconnected  --         
vxlan.calico  vxlan     disconnected  -- 
# 列出模块
[root@master ~]# lsmod
# 卸载模块ipip
[root@master ~]# modprobe -r ipip

# 卸载模块vxlan
[root@master ~]# modprobe -r vxlan
[root@master ~]# nmcli device status 
DEVICE   TYPE      STATE      CONNECTION 
ens33    ethernet  connected  ens33      
docker0  bridge    connected  docker0    
lo       loopback  unmanaged  --  

你可能感兴趣的:(虚拟化运维--容器网络--Calico(十二))