zoukankan      html  css  js  c++  java
  • CentOS7 手动部署flannel并启用vxlan

    本以为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/16
    FLANNEL_SUBNET=172.10.63.1/24
    FLANNEL_MTU=1472
    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-24
    {"PublicIP":"xxxxxx"}

    看一下主机网卡

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

    看一下网卡详情

    # ip -d link show dev flannel0
    147: flannel0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1472 qdisc pfifo_fast state UNKNOWN mode DEFAULT qlen 500
        link/none  promiscuity 0 
        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/16
    FLANNEL_SUBNET=172.10.63.1/24
    FLANNEL_MTU=1450
    FLANNEL_IPMASQ=false

    再看一下etcd

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

    再看一下主机网卡

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

    再看一下网卡详情

    # ip -d link show dev flannel.1
    145: flannel.1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UNKNOWN mode DEFAULT 
        link/ether e2:73:8e:db:83:56 brd ff:ff:ff:ff:ff:ff promiscuity 0 
        vxlan id 1 local 10.10.10.127 dev bond0 srcport 32768 65000 dstport 8472 nolearning ageing 300 

    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一下,测试通过;

  • 相关阅读:
    单线程写的下载器
    java反射详解
    查找替换文本文件内容
    设计模式工厂模式
    java写的多项式乘法
    java中类的生命周期
    java写的回溯法求迷宫问题
    MVC:如何使用站点地图
    WPF: RoutedEvent
    Silverlight 如何:指定和检索自定义初始化参数
  • 原文地址:https://www.cnblogs.com/ZisZ/p/9212820.html
Copyright © 2011-2022 走看看