Day10-网络通信-calico

calico

calico的原理理解起来,不是那么容易,我们可以先进行搭建,在进行理解

calico 是一个纯三层的协议,为虚拟机和容器提供多主机通信
不适用重叠网络,例如flannel
纯三层方法,使用虚拟路由替代虚拟交换,通过bgp协议传播可达信息到剩余数据中心

下图是calico的跨主机通信

系统 centos7.9
# 这边复习下初始化,操作就不列举了
主机 
51   centos-jichao-101  安装dockder+etcd(集成) + calicoctl
52   centos-jichao-102  安装dockder+etcd(集成) + calicoctl
53   centos-jichao-103  安装dockder+etcd(集成) + calicoctl

开启中继路由、转发

vim /etc/sysctl.conf
net.ipv4.conf.all.rp_filter=1
net.ipv4.ip_forward=1

防火墙

iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -F
iptables -L -n

scp /etc/sysctl.conf root@192.168.0.102:/etc/
scp /etc/sysctl.conf root@192.168.0.103:/etc/

部署etcd集群

yum -y install etcd

# 备份etcd.conf  + 置空etcd.conf
cp /etc/etcd/etcd.conf /etc/etcd/etcd.conf.bak
> /etc/etcd/etcd.conf
cat > /etc/etcd/etcd.conf  << EOF
#[Member]
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_PEER_URLS="http://0.0.0.0:2380"
ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379"

ETCD_NAME="centos-jichao-101"

#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.0.101:2380"
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.0.101:2379"
ETCD_INITIAL_CLUSTER="centos-jichao-101=http://192.168.0.101:2380,centos-jichao-102=http://192.168.0.102:2380,centos-jichao-103=http://192.168.0.103:2380"
EOF

scp /etc/etcd/etcd.conf root@192.168.0.102:/etc/etcd/etcd.conf
scp /etc/etcd/etcd.conf root@192.168.0.103:/etc/etcd/etcd.conf

102,103 机器
vim /etc/etcd/etcd.conf 改一下主机名 ETCD_NAME="centos-jichao-102\103"
更改ip地址

这三台机器就组成了etcd集群
cat /etc/hosts文件是要注意要写的
# 启动etcd
systemctl start etcd
systemctl enable etcd
#三个节点同时启动

查看成员
etcdctl memebet list

ps -ef | grep etcd 
netstat -nultp | grep 2379

# 查看健康
etcdctl cluster-health

集成docker 和 etcd

在三台机器的docker.service中添加  --cluster-store=etcd://机器ip:2379
vim /usr/lib/systemd/system/docker.service
# 如下图所示,都是一样的更改

systemctl daemon-reload
systemctl restart docker.service

# 我们这里重启报错了,所以我们把原来docker除了我们添加的部分删除,即可重启成功

ps -ef | grep docker

下载calicoctl
# 下载calicoctl
https://github.com/projectcalico/calicoctl/releases
下载3.16的

chmod +x calicoctl
mv calicoctl /usr/local/bin

calicoctl version

docker pull quay.io/calico/node:v2.6.10

启动容器

启动容器

docker run --net=host --privileged --name=calico-node -d --restart=always -e NODENAME=centos-jichao-101 -e CALICO_NETWORKING_BACKEND=bird -e CALICO_LIBNETWORK_ENABLED=true -e IP=192.168.0.101 -e ETCD_ENDPOINTS=http://127.0.0.1:2379 -v /var/log/calico:/var/log/calico -v /var/run/calico:/var/run/calico -v /lib/modules:/lib/modules -v /run:/run -v /run/docker/plugins:/run/docker/plugins -v /var/run/docker.sock:/var/run/docker.sock quay.io/calico/node:v2.6.10

docker exec -it calico-node env

查看集群状态
# 查看calico集群状态
calicoctl node status

添加calico子网

ipPool.yaml
apiVersion: v1
kind: ipPool
metedate:
  cidr: 10.244.10.0/24
spec:
  ipip:
    enabled: true
  nat-outgoing: true
  disabled: false
  
  # 再把scp给102 103机器

calicoctl create -f ipPool.yaml
calicoctl get ipPool -o wide

创建ip池子网
在创建的ipPool中创建子网络
docker network create --driver calico --ipam-driver calico-ipam --subnet 10.244.10.0/24 calico-net1
docker network create --driver calico --ipam-driver calico-ipam --subnet 10.244.20.0/24 calico-net2
docker network create --driver calico --ipam-driver calico-ipam --subnet 10.244.30.0/24 calico-net3

--driver calico 网络使用calico驱动
--ipam-driver calico-ipam : 指定calico 的ipam 驱动管理ip
-subnet:指定calico-net1、calico-net2、calico-net3
这三个网段是global网段,etcd会将它们三个同步到所有的机器
# 开启ipv6转发
echo 1 > /proc/sys/net/ipv6/conf/default/disable_ipv6
echo 1 > /proc/sys/net/ipv6/conf/all/disable_ipv6

101 
docker run -itd --net calico-net1 --name docker-test1 busybox
docker run -itd --net calico-net2 --name docker-test11 busybox
docker run -itd --net calico-net3 --name docker-test111 busybox


102
docker run -itd --net calico-net1 --name docker-test2 busybox
docker run -itd --net calico-net2 --name docker-test22 busybox
docker run -itd --net calico-net3 --name docker-test222 busybox

103
docker run -itd --net calico-net1 --name docker-test3 busybox
docker run -itd --net calico-net2 --name docker-test33 busybox
docker run -itd --net calico-net3 --name docker-test333 busybox

查看节点Ip
101
docker exec -it docker-test1 ifconfig |grep inet
docker exec -it docker-test11 ifconfig |grep inet
docker exec -it docker-test111 ifconfig |grep inet
102
docker exec -it docker-test2 ifconfig |grep inet
docker exec -it docker-test22 ifconfig |grep inet
docker exec -it docker-test222 ifconfig |grep inet
103
docker exec -it docker-test3 ifconfig |grep inet
docker exec -it docker-test33 ifconfig |grep inet
docker exec -it docker-test333 ifconfig |grep inet

测试联通
docker exec -it docker-test1 ping -c 2 docker-test2.calico-net1
docker exec -it docker-test1 ping -c 2 docker-test3.calico-net1
docker exec -it docker-test11 ping -c 2 docker-test22.calico-net2
docker exec -it docker-test11 ping -c 2 docker-test33.calico-net2
docker exec -it docker-test111 ping -c 2 docker-test222.calico-net3
docker exec -it docker-test111 ping -c 2 docker-test333.calico-net3

 route -n

总结:
1、同一网段里面容器互相Ping的通(即使不在同一个节点上,只要创建容器时使用的是同一个子网段)
2、不在同一个子网段的容器是Ping不通的
3、宿主机能Ping通他自身的所有容器ip,但不能ping通其他节点上的容器Ip
4、所有节点的容器都能Ping通其他节点的宿主机ip 



即-在calico默认设置下,只允许位于同一网络中的容器之间通信,这样就实现了容器的跨主机互连,也可以更好实现网络隔离效果,位于不通网络下的容器想要通信,就要依赖calico的policy策略来实现了
felix : calico agent 需要跑到workload节点上,主要配置路由和ACLs等信息来确保endpoint的连通状态
etcd : 分布式键值存储,负责网络元数据一致性,确保calico网络的准确性
BGPClient (BGP-BIRD):负责把felix写入kernel的路由信息分发到calico网络。确保workload之间的通信有效性
BGP ROUTE REFLECTOR :主要用于大规模部署,摒弃所有节点互联的Mesh模式,通过一个或者多个BGP ROUTE REFLECTOR来完成中心路由转发