一、知识准备

1.calico主要通过ipip协议与bgp协议来实现通信。前者通过ipip隧道作为通信基础,后者则是纯三层的路由交换

2.bgp协议主要由两种方式:BGP Speaker 全互联模式(node-to-node mesh)与BGP Speaker RR模式

3.本文主要探索一下calico bgp的两种模式

二、环境准备

组件 版本
OS Ubuntu 18.04.1 LTS
docker 18.06.0-ce
k8s 1.10.1
calico 3.1.3
ip hostname
192.168.56.101 k8s-master
192.168.56.102 k8s-node1
192.168.56.103 k8s-node2
192.168.56.104 k8s-node3

三、安装

k8s安装

参考官网安装以及社区诸多大神的安装帖子,这里就不班门弄斧了

本文的k8s的环境打开了rbac,etcd加入了证书

calico安装

主要参考官方文档 https://docs.projectcalico.org/v3.1/getting-started/kubernetes/installation/calico

1.calico rbac

  1. kubectl apply -f \
  2. https://docs.projectcalico.org/v3.1/getting-started/kubernetes/installation/rbac.yaml

2.下载calico.yaml

  1. curl \
  2. https://docs.projectcalico.org/v3.1/getting-started/kubernetes/installation/hosted/calico.yaml \
  3. -O

3.填入etcd地址

  1. ETCD_ENDPOINTS="https://192.168.56.101:2379"
  2. sed -i "s#.*etcd_endpoints:.*# etcd_endpoints: \"${ETCD_ENDPOINTS}\"#g" calico.yaml
  3. sed -i "s#__ETCD_ENDPOINTS__#${ETCD_ENDPOINTS}#g" calico.yaml

4.将etcd证书信息填入。我的etcd证书在/etc/etcd/ssl下

  1. ETCD_CERT=`cat /etc/etcd/ssl/etcd.pem | base64 | tr -d '\n'`
  2. ETCD_KEY=`cat /etc/etcd/ssl/etcd-key.pem | base64 | tr -d '\n'`
  3. ETCD_CA=`cat /etc/etcd/ssl/etcd-root-ca.pem | base64 | tr -d '\n'`
  4. sed -i "s#.*etcd-cert:.*# etcd-cert: ${ETCD_CERT}#g" calico.yaml
  5. sed -i "s#.*etcd-key:.*# etcd-key: ${ETCD_KEY}#g" calico.yaml
  6. sed -i "s#.*etcd-ca:.*# etcd-ca: ${ETCD_CA}#g" calico.yaml
  7. sed -i 's#.*etcd_ca:.*# etcd_ca: "/calico-secrets/etcd-ca"#g' calico.yaml
  8. sed -i 's#.*etcd_cert:.*# etcd_cert: "/calico-secrets/etcd-cert"#g' calico.yaml
  9. sed -i 's#.*etcd_key:.*# etcd_key: "/calico-secrets/etcd-key"#g' calico.yaml
  10. sed -i "s#__ETCD_KEY_FILE__#/etc/etcd/ssl/etcd-key.pem#g" calico.yaml
  11. sed -i "s#__ETCD_CERT_FILE__#/etc/etcd/ssl/etcd.pem#g" calico.yaml
  12. sed -i "s#__ETCD_CA_CERT_FILE__#/etc/etcd/ssl/etcd-root-ca.pem#g" calico.yaml
  13. sed -i "s#__KUBECONFIG_FILEPATH__#/etc/cni/net.d/calico-kubeconfig#g" calico.yaml

5.配置calico bgp 并且修改ip cidr:10.10.0.0/16

  1. sed -i '/CALICO_IPV4POOL_IPIP/{n;s/Always/off/g}' calico.yaml
  2. sed -i '/CALICO_IPV4POOL_CIDR/{n;s/192.168.0.0/10.10.0.0/g}' calico.yaml

6.kubectl安装calico

  1. kubectl apply -f calico.yaml

注意:因为calico-node需要获取操作系统的权限运行,所以要在apiserver、kubelet中加入--allow-privileged=true

查看一下状态:

  1. root@k8s-master:/tmp# kubectl get pods -n kube-system -owide
  2. NAME READY STATUS RESTARTS AGE IP NODE
  3. calico-kube-controllers-98989846-b4n72 1/1 Running 0 18d 192.168.56.102 k8s-node1
  4. calico-node-58pck 2/2 Running 0 18d 192.168.56.103 k8s-node2
  5. calico-node-s2txw 2/2 Running 0 18d 192.168.56.101 k8s-master
  6. calico-node-svmbp 2/2 Running 0 18d 192.168.56.102 k8s-node1
  7. ...

7.kubelet配置calico

  1. 找到kubelet的配置文件(我的环境在/etc/kubernetes/kubelet),加入
  2. --network-plugin=cni
  3. 重启kubelet

8.测试一个pod

  1. cat << EOF | kubectl create -f -
  2. apiVersion: v1
  3. kind: Pod
  4. metadata:
  5. name: network-test
  6. namespace: test
  7. spec:
  8. containers:
  9. - image: busybox:latest
  10. command:
  11. - sleep
  12. - "3600"
  13. name: network-test
  14. EOF
  1. root@k8s-master:~# kubectl -n test get pods -owide
  2. NAME READY STATUS RESTARTS AGE IP NODE
  3. network-test 1/1 Running 0 41s 10.10.169.139 k8s-node2

至此:calico安装已经完成

四、calicoctl使用

1.下载calicoctl

https://github.com/projectcalico/calicoctl/releases/download/v3.1.3/calicoctl-linux-amd64

2.查看当前的calico-node

  1. root@k8s-master:/tmp# calicoctl get node
  2. NAME
  3. k8s-master
  4. k8s-node1
  5. k8s-node2
  6. calicoctl get node -o yaml 查看详细信息

3.查看当前的ippool

  1. root@k8s-master:/tmp# calicoctl get ippool
  2. NAME CIDR
  3. default-ipv4-ippool 10.10.0.0/16
  4. default-ipv6-ippool fdc6:1a69:2b39::/48

4.查看当前模式

  1. root@k8s-master:/tmp# calicoctl node status
  2. Calico process is running.
  3. IPv4 BGP status
  4. +----------------+-------------------+-------+----------+-------------+
  5. | PEER ADDRESS | PEER TYPE | STATE | SINCE | INFO |
  6. +----------------+-------------------+-------+----------+-------------+
  7. | 192.168.56.102 | node-to-node mesh | up | 07:39:02 | Established |
  8. | 192.168.56.103 | node-to-node mesh | up | 07:39:02 | Established |
  9. +----------------+-------------------+-------+----------+-------------+
  10. IPv6 BGP status
  11. No IPv6 peers found.
  12. root@k8s-master:/tmp# netstat -anp | grep ESTABLISH | grep bird
  13. tcp 0 0 192.168.56.101:33029 192.168.56.102:179 ESTABLISHED 26558/bird
  14. tcp 0 0 192.168.56.101:58055 192.168.56.103:179 ESTABLISHED 26558/bird

当前运行在BGP Speaker 全互联模式(node-to-node mesh)模式,calico集群中的节点之间都会相互建立连接,用于路由交换。适合规模不大的集群中运行,一旦集群节点增大,mesh模式将形成一个巨大服务网格,连接数暴增

5.修改BGP Speaker RR模式

禁止mesh模式,配置bgpPeer

  1. cat << EOF | calicoctl create -f -
  2. apiVersion: projectcalico.org/v3
  3. kind: BGPConfiguration
  4. metadata:
  5. name: default
  6. spec:
  7. logSeverityScreen: Info
  8. nodeToNodeMeshEnabled: false
  9. asNumber: 61234
  10. EOF
  11. cat << EOF | calicoctl create -f -
  12. apiVersion: projectcalico.org/v3
  13. kind: BGPPeer
  14. metadata:
  15. name: bgppeer-global
  16. spec:
  17. peerIP: 192.168.56.103
  18. asNumber: 61234
  19. EOF

查看RR模式配置:

  1. root@k8s-master:~# calicoctl get bgpconfig
  2. NAME LOGSEVERITY MESHENABLED ASNUMBER
  3. default Info false 61234
  4. root@k8s-master:~# calicoctl get bgppeer
  5. NAME PEERIP NODE ASN
  6. bgppeer-global 192.168.56.103 (global) 61234

安装routereflector

  1. docker run --privileged --net=host -d \
  2. --name=calico-rr \
  3. -e IP=192.168.56.104 \
  4. -e ETCD_ENDPOINTS=https://192.168.56.101:2379 \
  5. -v /etc/etcd/ssl:/etc/calico/ssl \
  6. -e ETCD_CA_CERT_FILE=/etc/calico/ssl/etcd-root-ca.pem \
  7. -e ETCD_CERT_FILE=/etc/calico/ssl/etcd.pem \
  8. -e ETCD_KEY_FILE=/etc/calico/ssl/etcd-key.pem \
  9. calico/routereflector:v0.6.1

查看效果:

  1. root@k8s-master:~# calicoctl node status
  2. Calico process is running.
  3. IPv4 BGP status
  4. +----------------+-----------+-------+----------+-------------+
  5. | PEER ADDRESS | PEER TYPE | STATE | SINCE | INFO |
  6. +----------------+-----------+-------+----------+-------------+
  7. | 192.168.56.103 | global | up | 09:13:23 | Established |
  8. +----------------+-----------+-------+----------+-------------+
  9. IPv6 BGP status
  10. No IPv6 peers found.
  11. root@k8s-master:~# netstat -anp | grep ESTABLISH | grep bird
  12. tcp 0 0 192.168.56.101:179 192.168.56.103:54903 ESTABLISHED 26558/bird

每台机器都只会与rr建立一条连接,并且与rr通信即可拿到所有路由,大大减少了连接数量


至此,本文结束

在下才疏学浅,有撒汤漏水的,请各位不吝赐教...

k8s网络之calico学习的更多相关文章

  1. k8s网络之Calico网络

    k8s网络主题系列: 一.k8s网络之设计与实现 二.k8s网络之Flannel网络 三.k8s网络之Calico网络 简介 Calico 是一种容器之间互通的网络方案.在虚拟化平台中,比如 Open ...

  2. k8s网络之calico

    一.概述 前面我们部署calico由于集群规模不是很大,使用的是calico的bgp模式的node-to-node-mesh全节点互联,这种模式在小规模集群里面还可以用,3.4.0版本的calico支 ...

  3. k8s网络之设计与实现

    k8s网络主题系列: 一.k8s网络之设计与实现 二.k8s网络之Flannel网络 三.k8s网络之Calico网络 K8s网络设计与实现是在学习k8s网络过程中总结的内容.在学习k8s网络各种插件 ...

  4. k8s网络之Flannel网络

    k8s网络主题系列: 一.k8s网络之设计与实现 二.k8s网络之Flannel网络 三.k8s网络之Calico网络 简介 Flannel是CoreOS团队针对Kubernetes设计的一个网络规划 ...

  5. ASP.NET Core on K8S深入学习(11)K8S网络知多少

    本篇已加入<.NET Core on K8S学习实践系列文章索引>,可以点击查看更多容器化技术相关系列文章. 一.Kubernetes网络模型 我们都知道Kubernetes作为容器编排引 ...

  6. 【Kubernetes】K8S 网络隔离 方案

    参考资料: K8S-网络隔离参考 OpenContrail is an open source network virtualization platform for the cloud. – Kub ...

  7. Docker网络解决方案 - Calico部署记录

    简单来说,实现docker跨主机容器间通信,常用的第三方网络方案是Flannel,Weave,Calico:Flannel会为每个host分配一个subnet,容器从这个subnet中分配ip,这些i ...

  8. k8s网络配置管理

    docker容器的四种网络类型 1.桥接           2.联盟    3.主机    4.无 docker跨节点的容器通信必须通过NAT机制  宿主机上的容器一般都是私网地址 它可以通过宿主机 ...

  9. 19.网络插件calico

    19.网络插件calico 官网: https://docs.projectcalico.org/v3.8/introduction/ calico默认工作在192.168.0.0/16 的网络 ca ...

随机推荐

  1. malloc,calloc,realloc函数用法,原理及不同解析

    https://blog.csdn.net/lixungogogo/article/details/50887028 一.malloc malloc在MSDN中原型为: void *malloc( s ...

  2. 乘风破浪:LeetCode真题_038_Count and Say

    乘风破浪:LeetCode真题_038_Count and Say 一.前言     这一道题目,很类似于小学的问题,但是如果硬是要将输入和结果产生数值上的联系就会产生混乱了,因此我们要打破思维定势. ...

  3. Python os.md

    os 便携式访问操作系统的特定功能.os模块提供了对特定平台模块(如posix, nt, mac)的封装, 函数提供的api在很多平台上都可以相同使用, 所以使用os模块会变得很方便. 但不是所有函数 ...

  4. screen命令使用

    screen -S + name:创建一个名字叫做name的会话.在里面执行你想要执行的程序,再用Ctrl+a+d退出,让会话Detached,这样就能保证你的任务在后台一直运行,也不会随着终端的关闭 ...

  5. Java之时间转换

    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date date = sdf.parse( ...

  6. asdm不能登录问题;浏览器必须是ie,不能是chrome或者firefox;java的版本,尤其是安全等级和例外需要调整

    asdm不能登录问题:浏览器必须是ie,不能是chrome或者firefox;java的版本,尤其是安全等级和例外需要调整

  7. QGIS(2.18.15 源码)+Qt(5/5.9.3)+VS2015(X64)编译

    由于工作要求,今年需要基于Qt搞跨平台的GIS.前期未曾接触过Qt,最近也简单学习了下,开源的QGIS是非常不错的学习资源,下了最新版的QGIS源码,不过在VS2015下却没法直接打开.网上查了很多资 ...

  8. WorldWind源码剖析系列:地形访问器类TerrainAccessor

    地形访问器类TerrainAccessor 地形访问器类TerrainAccessor提供了对地形(高程)Terrain (elevation)访问的各种接口interface,是NltTerrain ...

  9. OO第1~3次作业总结

    作业1——多项式运算 基于度量和类图分析设计 先看Metrics插件做出的复杂度分析: 乍一看没有红色报警,其实是因为选中某一行时会自动将该行改为黑色,无论之前是红色还是蓝色emmm 真正展开第一行时 ...

  10. 关于mydumper的.metadata文件丢失

    今天要进行MySQL的数据迁移,所以把数据库通过mydumper工具备份的文件解压后.通过myloader进行导入 可是导入的时间出现这个报错: ** (myloader:766): CRITICAL ...