本以为docker准备妥当之后,就可以直接上k8s了,结果yum install kubernetes,报错:Error: docker-ce conflicts with docker-1.9.1 .....

这才想起来,自己的docker不是从centos官方源获取的,而是用了docker的源安装docker-ce,参见上一遍docker的部署文档

centos官方源提供的k8s在版本1.2,配套docker 1.9,而我用的docker-ce在版本18.03,经查k8s的changelog,至少要到1.8才能支持到docker 17.03,然后到1.11,都未提到过docker 18;

但参考了较新的k8s部署教程,已经有k8s 1.10配套docker-ce 18.03的先例,可以一试;

参考了现网已有的大部分k8s部署教程,大都太流程化,不够细致;

安装k8s通常会提到flannel,它提供容器的跨主机通信支持,已经涉及到SDN的领域,这一篇对flannel的部署及原理介绍特别值得读一下;

考虑到k8s需要用最新版,flannel也就用最新版,不通过yum安装了,于是自己动手部署了flannel,把从细节收获的信息记下来,提供一个不一样的视角;

----以下是正文----

依赖

flannel依赖etcd提供配置管理;为简化,我只使用了一个单点的etcd,没有组etcd集群;

部署flannel

下载flannel,从github找到最新的发布版,我下到的是0.10.0;https://github.com/coreos/flannel/releases

解压后,得到一个二进制文件flanneld,一个脚本mk-docker-opts.sh,以及一个README.md;最后这个文件忽略就行了,其它两个放到/usr/bin下;

mv flanneld /usr/bin
mv mk-docker-opts.sh /usr/bin

flanneld服务配置

添加systemd的service管理文件:

# cat /usr/lib/systemd/system/flanneld.service
[Unit]
Description=flannel
Before=docker.service [Service]
ExecStart=/usr/bin/flanneld [Install]
WantedBy=multi-user.target
RequiredBy=docker.service

flanneld环境变量配置

环境变量的管理也仿照上一篇对docker的环境变量管理,添加了一个Drop-in file

# cat /etc/systemd/system/flanneld.service.d/flannel.conf
[Service]
Environment="FLANNELD_ETCD_ENDPOINTS=http://xxxx:2379"
Environment="FLANNELD_ETCD_PREFIX=/flannel/network"

flannel的环境变量全都是参数加上“FLANNELD_”前缀,见flanneld环境变量说明

启动flanneld

查看环境变量是否生效,然后启动flanneld:

systemctl daemon-reload

systemctl show flanneld --property Environment

systemctl start flanneld

查看启动日志:

systemctl status flanneld -l

发现报错了:Couldn't fetch network config: 100: Key not found

想起来etcd里还没写入网络配置信息呢;

flanneld网络配置

docker默认用172.17.0.0/16这个段,我想换个段,以明确知道是在使用flanneld提供的网络,于是就用了172.10.0.0/16

etcdctl mk /flannel/network/config '{"Network":"172.10.0.0/16", "SubnetMin": "172.10.1.0", "SubnetMax": "172.10.254.0"}'

因为flannel一直在尝试从etcd读配置信息,所以不需要重启flanneld,再看启动日志,flanneld已经获取到想要的子网地址了;

此时,在/run/flannel/subnet.env位置会生成这个host所分配到的子网信息:

# cat /run/flannel/subnet.env
FLANNEL_NETWORK=172.10.0.0/
FLANNEL_SUBNET=172.10.63.1/
FLANNEL_MTU=
FLANNEL_IPMASQ=false

而这个文件正是mk-docker-opts.sh脚本的输入文件:

# /usr/bin/mk-docker-opts.sh -c
# cat /run/docker_opts.env
DOCKER_OPTS=" --bip=172.10.63.1/24 --ip-masq=true --mtu=1472"

这时看一下etcd,多了一条信息:

# etcdctl get /flannel/network/subnets/172.10.63.0-
{"PublicIP":"xxxxxx"}

看一下主机网卡

# ip a |grep flannel
: flannel0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu qdisc pfifo_fast state UNKNOWN qlen

看一下网卡详情

# ip -d link show dev flannel0
: flannel0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu qdisc pfifo_fast state UNKNOWN mode DEFAULT qlen
link/none promiscuity
tun

将生成docker_opts.env的命令加到flanneld的systemd启动配置中:

[Unit]
Description=flannel
Before=docker.service [Service]
ExecStart=/usr/bin/flanneld
ExecStartPost=/usr/bin/mk-docker-opts.sh -c # 新加 [Install]
WantedBy=multi-user.target
RequiredBy=docker.service

flanneld vxlan网络配置

推荐Kernel 3.9以上的主机启用vxlan网络(来源记不清了),CentOS7的内核已经到3.10,可以支持;

修改网络配置:

etcdctl set /flannel/network/config '{"Network":"172.10.0.0/16", "SubnetMin": "172.10.1.0", "SubnetMax": "172.10.254.0", "Backend": {"Type": "vxlan"}}'

重启flanneld:

systemctl restart flanneld

查看启动日志,已经能看到在使用vxlan backend了;

看一下/run/flannel/subnet.env文件,发现子网没变,但是MTU变了:

# cat /run/flannel/subnet.env
FLANNEL_NETWORK=172.10.0.0/
FLANNEL_SUBNET=172.10.63.1/
FLANNEL_MTU=
FLANNEL_IPMASQ=false

再看一下etcd

# etcdctl get /flannel/network/subnets/172.10.63.0-
{"PublicIP":"xxxx","BackendType":"vxlan","BackendData":{"VtepMAC":"e2:73:8e:db:83:56"}}

再看一下主机网卡

# ip a|grep flannel
: flannel.: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu qdisc noqueue state UNKNOWN

再看一下网卡详情

# ip -d link show dev flannel.
: flannel.: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu qdisc noqueue state UNKNOWN mode DEFAULT
link/ether e2::8e:db:: brd ff:ff:ff:ff:ff:ff promiscuity
vxlan id local 10.10.10.127 dev bond0 srcport dstport nolearning ageing

Docker使用flannel网络

再重新生成一次docker_opts.env:

# /usr/bin/mk-docker-opts.sh -c
# cat /run/docker_opts.env
DOCKER_OPTS=" --bip=172.10.63.1/24 --ip-masq=true --mtu=1450"

修改/lib/systemd/system/docker.service:

EnvironmentFile=/run/docker_opts.env # 新加
ExecStart=/usr/bin/dockerd $DOCKER_OPTS

重启docker服务:

systemctl daemon-reload
systemctl restart docker

查看bridge网络的信息:

# docker network ls |grep bridge
d5ad3f19dc63 bridge bridge local
# docker network inspect d5ad3f19dc63 | grep Subnet
"Subnet": "172.10.63.1/24",

这就已经是在flannel提供的网段内了;

测试

然后在另一台主机上也照做一遍,分别启动一个container,互ping一下,测试通过;

CentOS7 手动部署flannel并启用vxlan的更多相关文章

  1. kubernetes之手动部署k8s 1.14.1高可用集群

    1. 架构信息 系统版本:CentOS 7.6 内核:3.10.0-957.el7.x86_64 Kubernetes: v1.14.1 Docker-ce: 18.09.5 推荐硬件配置:4核8G ...

  2. CentOS7中部署Showdoc

    目录 CentOS7中部署Showdoc 前置环境 部署 配置文件 解压安装包 添加启动服务 设置权限 运行安装 界面 CentOS7中部署Showdoc 文:铁乐与猫 前置环境 因为showdoc其 ...

  3. CentOS7上部署ASP.Net Core 2.2应用

    前言 在CentOS7上部署ASP.Net Core应用是我的技术路线验证的一部分,下一个产品计划采用ASP.Net Boilerplate Framework开发.因此需要求提前进行一下技术验证,在 ...

  4. (转)Centos7上部署openstack ocata配置详解

    原文:http://www.cnblogs.com/yaohong/p/7601470.html 随笔-124  文章-2  评论-82  Centos7上部署openstack ocata配置详解 ...

  5. 高可用Kubernetes集群-5. 部署flannel网络

    七.部署flannel网络 kubernetes支持基于vxlan方式的flannel与weave网络,基于BGP路由的Calico网络,本节采用flannel网络. Flannel网络采用etcd等 ...

  6. 手动部署 OpenStack Rocky 双节点

    目录 文章目录 目录 前言 OpenStack 架构 Conceptual architecture Logical architecture 网络选型 Networking Option 1: Pr ...

  7. kubernetes容器集群部署Flannel网络

    Overlay Network:覆盖网络,在基础网络上叠加的一种虚拟网络技术模式,该网络中的主机通过虚拟链路连接起来. VXLAN:将源数据包封装到UDP中,并使用基础网络的IP/MAC作为外层报文头 ...

  8. Centos7.6部署k8s v1.16.4高可用集群(主备模式)

    一.部署环境 主机列表: 主机名 Centos版本 ip docker version flannel version Keepalived version 主机配置 备注 master01 7.6. ...

  9. 在 CentOS7 上部署 MySQL 主从

    在 CentOS7 上部署 MySQL 主从 通过 SecureCRT 连接至 MySQL 主服务器: 找到 my.cnf 文件所在的目录: mysql --help | grep my.cnf 一般 ...

随机推荐

  1. mobile_竖向滑屏

    竖向滑屏 元素最终事件 = 元素初始位置 + 手指滑动距离 移动端,"手指按下","手指移动" 两个事件即可(且不需要嵌套),有需要时才使用 "手指离 ...

  2. 2018-2019-1 20189210 《LInux内核原理与分析》第六周作业

    系统调用实验(下): 将第四章的两个实验集成到MenuOS系统中,将其作为MenuOS系统的两个命令,新版本的menu中已经把两个系统调用添加进去了,只需重新克隆一个新版本的menu. 使用make ...

  3. 传统方式和插件方式 分别实现 分页 功能 pageHelper 插件

    实现分页  这里提供两种方式  一种是传统的分页方式  一种是基于pageHelper插件 实现的分类     推荐使用后者 前者是一般开发的方式   思路  先手动创建一个 pageUtil 工具 ...

  4. SQL Server 查询某个字段值在哪张表的哪个字段

    我要查找值为‘WSCOL1525’的字段. declare @cloumns varchar(40)declare @tablename varchar(40)declare @str varchar ...

  5. CDN请求失败,请求本地

    方法一: <script src="http://lib.sinaapp.com/js/jquery11/1.8/jquery.min.js"></script& ...

  6. checkPathValidity 检查所有agent的corridor的m_path是否有效

    在checkPathValidity(检查所有agent的corridor的m_path是否有效) 如果是无效的要进行重新设置并且设置replan 首先获得第一个polygon,m_path[0] 这 ...

  7. IntelliJ IDEA 2017.2.6 x64 配置 tomcat 启动 maven 项目

    IntelliJ IDEA 2017.2.6 x64 配置 tomcat 启动 maven 项目 1.确认 IDEA 是否启用了 tomcat 插件 2.添加 tomcat 选择 tomcat 存放路 ...

  8. NoSQL数据库常见分类

    1.列式数据库HBaseBigTable2.K-V数据库RedisCassandraLevelDBMemCacheEhcache3.文档数据库MongoDBCouchDB4.全文搜索引擎Elastic ...

  9. 【Python基础】lpthw - Exercise 38 列表的操作

    1.列表和字符串操作的混合练习 ten_things = "apples oranges crows telephone light sugar" print("Wait ...

  10. 使用sessionStorage进行数据存值

    <!DOCTYPE html> <head> <meta charset="UTF-8" /> <meta name="view ...