精华内容
下载资源
问答
  • Flannel

    2019-03-14 20:41:00
    0.组件版本docker-1.13.1kubernetes-master-1.5.2flannel-0.7.1 1.部署(默认已安装k8s基础环境a. yum install flannel b.配置/etc/sysconfig/flanneld, sample如下:FLANNEL_ETCD_ENDPOINTS=...

    0.组件版本
    docker-1.13.1
    kubernetes-master-1.5.2
    flannel-0.7.1

     

    1.部署(默认已安装k8s基础环境
    a. yum install flannel


    b.配置/etc/sysconfig/flanneld, sample如下:
    FLANNEL_ETCD_ENDPOINTS="http://192.168.56.201:2379"
    FLANNEL_ETCD_PREFIX="/flannel/network"
    FLANNEL_OPTIONS="--iface=enp0s9"


    b.创建flannel配置文件,如下例flannel.cfg:
    {

    "Network": "172.31.0.0/16",

    "SubnetLen": 24,

    "Backend": {

    "Type": "host-gw"

    }
    }


    c.将上面的配置内容导入etcd
    etcdctl --endpoints=192.168.56.201:2379 set /flannel/network/config < flannel.cfg
    #数据节点路径与/etc/sysconfig/flanneld的FLANNEL_ETCD_PREFIX一致(注意key=>config)


    d.启用服务
    systemctl enable flanneld
    systemctl start flanneld
    systemctl restart docker
    #/run/flannel/docker 默认应用到docker服务

     


    2.vxlan
    a. 从指定的Network范围内为每个host分配24掩码的subnet, 将子网应用到docker的--bip
    b. 创建vtep设备flannl.1, 整个Network的路由都批指向flannel.1 sample如下:
    [root@k01 todo]# ip addr show flannel.1
    31: flannel.1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UNKNOWN
    link/ether fe:e4:6f:ea:5d:8e brd ff:ff:ff:ff:ff:ff
    inet 172.31.35.0/32 scope global flannel.1
    valid_lft forever preferred_lft forever
    inet6 fe80::fce4:6fff:feea:5d8e/64 scope link
    valid_lft forever preferred_lft forever

    [root@k01 todo]# ip -d link show flannel.1
    31: flannel.1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UNKNOWN mode DEFAULT
    link/ether fe:e4:6f:ea:5d:8e brd ff:ff:ff:ff:ff:ff promiscuity 0
    vxlan id 1 local 192.168.100.201 dev enp0s9 srcport 0 0 dstport 8472 nolearning ageing 300 addrgenmode eui64

    [root@k01 todo]# route -n
    Kernel IP routing table
    Destination Gateway Genmask Flags Metric Ref Use Iface
    0.0.0.0 10.0.2.2 0.0.0.0 UG 0 0 0 enp0s3
    10.0.2.0 0.0.0.0 255.255.255.0 U 0 0 0 enp0s3
    172.31.0.0 0.0.0.0 255.255.0.0 U 0 0 0 flannel.1
    172.31.35.0 0.0.0.0 255.255.255.0 U 0 0 0 docker0
    192.168.100.0 0.0.0.0 255.255.255.0 U 0 0 0 enp0s9

     

    3.host-gw
    a. 从指定的Network范围内为每个host分配24掩码的subnet, 将子网应用到docker的--bip
    b. flanneld下发docker0和其它host的路由表,sample如下:
    [root@k01 todo]# route -n
    Kernel IP routing table
    Destination Gateway Genmask Flags Metric Ref Use Iface
    0.0.0.0 10.0.2.2 0.0.0.0 UG 0 0 0 enp0s3
    10.0.2.0 0.0.0.0 255.255.255.0 U 0 0 0 enp0s3
    172.31.34.0 0.0.0.0 255.255.255.0 U 0 0 0 docker0
    172.31.57.0 192.168.100.202 255.255.255.0 UG 0 0 0 enp0s9
    192.168.100.0 0.0.0.0 255.255.255.0 U 0 0 0 enp0s9

     

    4.kube-proxy
    Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)
    num pkts bytes target prot opt in out source destination
    1 51 4038 KUBE-SERVICES all -- * * 0.0.0.0/0 0.0.0.0/0 /* kubernetes service portals */
    2 38 1928 DOCKER all -- * * 0.0.0.0/0 0.0.0.0/0 ADDRTYPE match dst-type LOCAL

    Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
    num pkts bytes target prot opt in out source destination

    Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
    num pkts bytes target prot opt in out source destination
    1 288 18898 KUBE-SERVICES all -- * * 0.0.0.0/0 0.0.0.0/0 /* kubernetes service portals */
    2 239 14340 DOCKER all -- * * 0.0.0.0/0 !127.0.0.0/8 ADDRTYPE match dst-type LOCAL

    Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
    num pkts bytes target prot opt in out source destination
    1 303 19798 KUBE-POSTROUTING all -- * * 0.0.0.0/0 0.0.0.0/0 /* kubernetes postrouting rules */
    2 0 0 MASQUERADE all -- * !docker0 172.17.0.0/16 0.0.0.0/0

    Chain DOCKER (2 references)
    num pkts bytes target prot opt in out source destination
    1 0 0 RETURN all -- docker0 * 0.0.0.0/0 0.0.0.0/0

    Chain KUBE-MARK-DROP (0 references)
    num pkts bytes target prot opt in out source destination
    1 0 0 MARK all -- * * 0.0.0.0/0 0.0.0.0/0 MARK or 0x8000

    Chain KUBE-MARK-MASQ (5 references)
    num pkts bytes target prot opt in out source destination
    1 0 0 MARK all -- * * 0.0.0.0/0 0.0.0.0/0 MARK or 0x4000

    Chain KUBE-NODEPORTS (1 references)
    num pkts bytes target prot opt in out source destination
    1 0 0 KUBE-MARK-MASQ tcp -- * * 0.0.0.0/0 0.0.0.0/0 /* default/mysql: */ tcp dpt:30006
    2 0 0 KUBE-SVC-M7XME3WTB36R42AM tcp -- * * 0.0.0.0/0 0.0.0.0/0 /* default/mysql: */ tcp dpt:30006

    Chain KUBE-POSTROUTING (1 references)
    num pkts bytes target prot opt in out source destination
    1 0 0 MASQUERADE all -- * * 0.0.0.0/0 0.0.0.0/0 /* kubernetes service traffic requiring SNAT */ mark match 0x4000/0x4000

    Chain KUBE-SEP-3XAE4RZ4QKNBWHVI (1 references)
    num pkts bytes target prot opt in out source destination
    1 0 0 KUBE-MARK-MASQ all -- * * 172.17.0.2 0.0.0.0/0 /* default/mysql: */
    2 0 0 DNAT tcp -- * * 0.0.0.0/0 0.0.0.0/0 /* default/mysql: */ tcp to:172.17.0.2:3306

    Chain KUBE-SEP-BVDILWNHJHJ6GYVG (1 references)
    num pkts bytes target prot opt in out source destination
    1 0 0 KUBE-MARK-MASQ all -- * * 172.17.0.4 0.0.0.0/0 /* default/mysql: */
    2 0 0 DNAT tcp -- * * 0.0.0.0/0 0.0.0.0/0 /* default/mysql: */ tcp to:172.17.0.4:3306

    Chain KUBE-SEP-FO43SMKHP7ESNS5F (1 references)
    num pkts bytes target prot opt in out source destination
    1 0 0 KUBE-MARK-MASQ all -- * * 172.17.0.3 0.0.0.0/0 /* default/mysql: */
    2 0 0 DNAT tcp -- * * 0.0.0.0/0 0.0.0.0/0 /* default/mysql: */ tcp to:172.17.0.3:3306

    Chain KUBE-SEP-OGNOLD2JUSLFPOMZ (2 references)
    num pkts bytes target prot opt in out source destination
    1 0 0 KUBE-MARK-MASQ all -- * * 10.0.2.15 0.0.0.0/0 /* default/kubernetes:https */
    2 0 0 DNAT tcp -- * * 0.0.0.0/0 0.0.0.0/0 /* default/kubernetes:https */ recent: SET name: KUBE-SEP-OGNOLD2JUSLFPOMZ side: source mask: 255.255.255.255 tcp to:10.0.2.15:6443

    Chain KUBE-SERVICES (2 references)
    num pkts bytes target prot opt in out source destination
    1 0 0 KUBE-SVC-NPX46M4PTMTKRN6Y tcp -- * * 0.0.0.0/0 10.254.0.1 /* default/kubernetes:https cluster IP */ tcp dpt:443
    2 0 0 KUBE-SVC-M7XME3WTB36R42AM tcp -- * * 0.0.0.0/0 10.254.104.18 /* default/mysql: cluster IP */ tcp dpt:3306
    3 0 0 KUBE-NODEPORTS all -- * * 0.0.0.0/0 0.0.0.0/0 /* kubernetes service nodeports; NOTE: this must be the last rule in this chain */ ADDRTYPE match dst-type LOCAL

    Chain KUBE-SVC-M7XME3WTB36R42AM (2 references)
    num pkts bytes target prot opt in out source destination
    1 0 0 KUBE-SEP-3XAE4RZ4QKNBWHVI all -- * * 0.0.0.0/0 0.0.0.0/0 /* default/mysql: */ statistic mode random probability 0.33332999982
    2 0 0 KUBE-SEP-FO43SMKHP7ESNS5F all -- * * 0.0.0.0/0 0.0.0.0/0 /* default/mysql: */ statistic mode random probability 0.50000000000
    3 0 0 KUBE-SEP-BVDILWNHJHJ6GYVG all -- * * 0.0.0.0/0 0.0.0.0/0 /* default/mysql: */

    Chain KUBE-SVC-NPX46M4PTMTKRN6Y (1 references)
    num pkts bytes target prot opt in out source destination
    1 0 0 KUBE-SEP-OGNOLD2JUSLFPOMZ all -- * * 0.0.0.0/0 0.0.0.0/0 /* default/kubernetes:https */ recent: CHECK seconds: 10800 reap name: KUBE-SEP-OGNOLD2JUSLFPOMZ side: source mask: 255.255.255.255
    2 0 0 KUBE-SEP-OGNOLD2JUSLFPOMZ all -- * * 0.0.0.0/0 0.0.0.0/0 /* default/kubernetes:https */

    转载于:https://www.cnblogs.com/gaozhengwei/p/10533332.html

    展开全文
  • flannel

    2018-12-25 16:54:00
    Docker跨主机容器间网络通信实现的工具有Pipework、Flannel、Weave、Open vSwitch(虚拟交换机)、Calico实现跨主机容器间的通信。其中Pipework、Weave、Flannel,三者的区别是: Weave的思路 1 2 ...

    Docker跨主机容器间网络通信实现的工具有Pipework、Flannel、Weave、Open vSwitch(虚拟交换机)、Calico实现跨主机容器间的通信。其中Pipework、Weave、Flannel,三者的区别是:

    Weave的思路

    1
    2
    在每个宿主机上布置一个特殊的route的容器,不同宿主机的route容器连接起来。 route拦截所有普通容器的ip请求,并通过udp包发送到其他宿主机上的普通容器。
    这样在跨机的多个容器端看到的就是同一个扁平网络。 weave解决了网络问题,不过部署依然是单机的。

    flannel的思路

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    Flannel是CoreOS团队针对Kubernetes设计的一个网络规划服务,简单来说,它的功能是让集群中的不同节点主机创建的Docker容器都具有全集群唯一的虚拟IP地址。
    但在默认的Docker配置中,每个节点上的Docker服务会分别负责所在节点容器的IP分配。这样导致的一个问题是,不同节点上容器可能获得相同的内外IP地址。并使
    这些容器之间能够之间通过IP地址相互找到,也就是相互ping通。
       
    Flannel的设计目的就是为集群中的所有节点重新规划IP地址的使用规则,从而使得不同节点上的容器能够获得"同属一个内网""不重复的"IP地址,并让属于不同节
    点上的容器能够直接通过内网IP通信。
       
    Flannel实质上是一种"覆盖网络(overlay network)",即表示运行在一个网上的网(应用层网络),并不依靠ip地址来传递消息,而是采用一种映射机制,把ip地址和
    identifiers做映射来资源定位。也就是将TCP数据包装在另一种网络包里面进行路由转发和通信,目前已经支持UDP、VxLAN、AWS VPC和GCE路由等数据转发方式。
       
    原理是每个主机配置一个ip段和子网个数。例如,可以配置一个覆盖网络使用 10.100.0.0/16段,每个主机/24个子网。因此主机a可以接受10.100.5.0/24,主机B可以
    接受10.100.18.0/24的包。flannel使用etcd来维护分配的子网到实际的ip地址之间的映射。对于数据路径,flannel 使用udp来封装ip数据报,转发到远程主机。选择
    UDP作为转发协议是因为他能穿透防火墙。例如,AWS Classic无法转发IPoIP or GRE 网络包,是因为它的安全组仅仅支持TCP/UDP/ICMP
       
    flannel 使用etcd存储配置数据和子网分配信息。flannel 启动之后,后台进程首先检索配置和正在使用的子网列表,然后选择一个可用的子网,然后尝试去注册它。
    etcd也存储这个每个主机对应的ip。flannel 使用etcd的watch机制监视/coreos.com/network/subnets下面所有元素的变化信息,并且根据它来维护一个路由表。为了
    提高性能,flannel优化了Universal TAP/TUN设备,对TUN和UDP之间的ip分片做了代理。

    默认的节点间数据通信方式是UDP转发.在Flannel的GitHub页面有如下的一张原理图:

    对上图的简单解释:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    1)数据从源容器中发出后,经由所在主机的docker0虚拟网卡转发到flannel0虚拟网卡,这是个P2P的虚拟网卡,flanneld服务监听在网卡的另外一端。
    2)Flannel通过Etcd服务维护了一张节点间的路由表,在稍后的配置部分我们会介绍其中的内容。
    3)源主机的flanneld服务将原本的数据内容UDP封装后根据自己的路由表投递给目的节点的flanneld服务,数据到达以后被解包,然后直接进入目的节点的flannel0虚拟网卡,
    然后被转发到目的主机的docker0虚拟网卡,最后就像本机容器通信一下的有docker0路由到达目标容器。
     
    这样整个数据包的传递就完成了,这里需要解释三个问题:
    1)UDP封装是怎么回事?
    在UDP的数据内容部分其实是另一个ICMP(也就是ping命令)的数据包。原始数据是在起始节点的Flannel服务上进行UDP封装的,投递到目的节点后就被另一端的Flannel服务
    还原成了原始的数据包,两边的Docker服务都感觉不到这个过程的存在。
     
    2)为什么每个节点上的Docker会使用不同的IP地址段?
    这个事情看起来很诡异,但真相十分简单。其实只是单纯的因为Flannel通过Etcd分配了每个节点可用的IP地址段后,偷偷的修改了Docker的启动参数。
    在运行了Flannel服务的节点上可以查看到Docker服务进程运行参数(ps aux|grep docker|grep "bip"),例如“--bip=182.48.25.1/24”这个参数,它限制了所在节
    点容器获得的IP范围。这个IP范围是由Flannel自动分配的,由Flannel通过保存在Etcd服务中的记录确保它们不会重复。
     
    3)为什么在发送节点上的数据会从docker0路由到flannel0虚拟网卡,在目的节点会从flannel0路由到docker0虚拟网卡?
    例如现在有一个数据包要从IP为172.17.18.2的容器发到IP为172.17.46.2的容器。根据数据发送节点的路由表,它只与172.17.0.0/16匹配这条记录匹配,因此数据从docker0
    出来以后就被投递到了flannel0。同理在目标节点,由于投递的地址是一个容器,因此目的地址一定会落在docker0对于的172.17.46.0/24这个记录上,自然的被投递到了docker0网卡。

    pipework的思路

    pipework是一个单机的工具,组合了brctl等工具,可以认为pipework解决的是宿主机上的设置容器的虚拟网卡、网桥、ip等,可以配合其他网络使用。

    如果容器数量不多,想简单的组一个大的3层网络,可以考虑weave
    如果容器数量很多,而且你们的环境复杂,需要多个子网,可以考虑open vswitch或者fannel
    weave的总体网络性能表现欠佳, flannel VXLAN 能满足要求,一般推荐用flannel

    Flannel环境部署记录

    1)机器环境(centos7系统)

    1
    2
    182.48.115.233     部署etcd,flannel,docker      主机名:node-1   主控端(通过etcd)
    182.48.115.235     部署flannel,docker            主机名:node-2   被控端

    2)node-1(182.48.115.233)机器操作

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    设置主机名及绑定hosts
    [root@node-1 ~]# hostnamectl --static set-hostname  node-1
    [root@node-1 ~]# vim /etc/hosts
    182.48.115.233    node-1
    182.48.115.233    etcd
    182.48.115.235    node-2
      
    关闭防火墙,如果开启防火墙,则最好打开2379和4001端口
    [root@node-1 ~]# systemctl disable firewalld.service
    [root@node-1 ~]# systemctl stop firewalld.service
      
    先安装docker环境
    [root@node-1 ~]# yum install -y docker
      
    安装etcd
    k8s运行依赖etcd,需要先部署etcd,下面采用yum方式安装:
    [root@node-1 ~]# yum install etcd -y
        
    yum安装的etcd默认配置文件在/etc/etcd/etcd.conf,编辑配置文件:
    [root@node-1 ~]# cp /etc/etcd/etcd.conf /etc/etcd/etcd.conf.bak
    [root@node-1 ~]# cat /etc/etcd/etcd.conf
    #[member]
    ETCD_NAME=master                                            #节点名称
    ETCD_DATA_DIR="/var/lib/etcd/default.etcd"                  #数据存放位置
    #ETCD_WAL_DIR=""
    #ETCD_SNAPSHOT_COUNT="10000"
    #ETCD_HEARTBEAT_INTERVAL="100"
    #ETCD_ELECTION_TIMEOUT="1000"
    #ETCD_LISTEN_PEER_URLS="http://0.0.0.0:2380"
    ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379,http://0.0.0.0:4001"             #监听客户端地址
    #ETCD_MAX_SNAPSHOTS="5"
    #ETCD_MAX_WALS="5"
    #ETCD_CORS=""
    #
    #[cluster]
    #ETCD_INITIAL_ADVERTISE_PEER_URLS="http://localhost:2380"
    # if you use different ETCD_NAME (e.g. test), set ETCD_INITIAL_CLUSTER value for this name, i.e. "test=http://..."
    #ETCD_INITIAL_CLUSTER="default=http://localhost:2380"
    #ETCD_INITIAL_CLUSTER_STATE="new"
    #ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
    ETCD_ADVERTISE_CLIENT_URLS="http://etcd:2379,http://etcd:4001"           #通知客户端地址
    #ETCD_DISCOVERY=""
    #ETCD_DISCOVERY_SRV=""
    #ETCD_DISCOVERY_FALLBACK="proxy"
    #ETCD_DISCOVERY_PROXY=""
        
    启动etcd并验证状态
    [root@node-1 ~]# systemctl start etcd
        
    [root@node-1 ~]# ps -ef|grep etcd
    etcd     28145     1  1 14:38 ?        00:00:00 /usr/bin/etcd --name=master --data-dir=/var/lib/etcd/default.etcd --listen-client-urls=http://0.0.0.0:2379,http://0.0.0.0:4001
    root     28185 24819  0 14:38 pts/1    00:00:00 grep --color=auto etcd
    [root@node-1 ~]# lsof -i:2379
    COMMAND   PID USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
    etcd    28145 etcd    6u  IPv6 1283822      0t0  TCP *:2379 (LISTEN)
    etcd    28145 etcd   18u  IPv6 1284133      0t0  TCP localhost:53203->localhost:2379 (ESTABLISHED)
    ........
        
    [root@node-1 ~]# etcdctl set testdir/testkey0 0
    0
    [root@node-1 ~]# etcdctl get testdir/testkey0
    0
    [root@node-1 ~]# etcdctl -C http://etcd:4001 cluster-health
    member 8e9e05c52164694d is healthy: got healthy result from http://etcd:2379
    cluster is healthy
    [root@node-1 ~]# etcdctl -C http://etcd:2379 cluster-health
    member 8e9e05c52164694d is healthy: got healthy result from http://etcd:2379
    cluster is healthy
      
    安装覆盖网络Flannel
    [root@node-1 ~]# yum install flannel
       
    配置Flannel
    [root@node-1 ~]# cp /etc/sysconfig/flanneld /etc/sysconfig/flanneld.bak
    [root@node-1 ~]# vim /etc/sysconfig/flanneld
    # Flanneld configuration options
       
    # etcd url location.  Point this to the server where etcd runs
    FLANNEL_ETCD_ENDPOINTS="http://etcd:2379"
       
    # etcd config key.  This is the configuration key that flannel queries
    # For address range assignment
    FLANNEL_ETCD_PREFIX="/atomic.io/network"
       
    # Any additional options that you want to pass
    #FLANNEL_OPTIONS=""
      
    配置etcd中关于flannel的key(这个只在安装了etcd的机器上操作)
    Flannel使用Etcd进行配置,来保证多个Flannel实例之间的配置一致性,所以需要在etcd上进行如下配置('/atomic.io/network/config'这个key与上文/etc/sysconfig/flannel中的配置项FLANNEL_ETCD_PREFIX是相对应的,错误的话启动就会出错):
    [root@node-1 ~]# etcdctl mk /atomic.io/network/config '{ "Network": "182.48.0.0/16" }'
    "Network""182.48.0.0/16" }
     
    温馨提示:上面flannel设置的ip网段可以任意设定,随便设定一个网段都可以。容器的ip就是根据这个网段进行自动分配的,ip分配后,容器一般是可以对外联网的(网桥模式,只要宿主机能上网就可以)
      
    启动Flannel
    [root@node-1 ~]# systemctl enable flanneld.service
    [root@node-1 ~]# systemctl start flanneld.service
    [root@node-1 ~]# ps -ef|grep flannel
    root      9305  9085  0 09:12 pts/2    00:00:00 grep --color=auto flannel
    root     28876     1  0 May15 ?        00:00:07 /usr/bin/flanneld -etcd-endpoints=http://etcd:2379 -etcd-prefix=/atomic.io/network
     
    启动Flannel后,一定要记得重启docker,这样Flannel配置分配的ip才能生效,即docker0虚拟网卡的ip会变成上面flannel设定的ip段
    [root@node-1 ~]# systemctl restart docker

    3)node-2(182.48.115.235)机器操作

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    设置主机名及绑定hosts
    [root@node-2 ~]# hostnamectl --static set-hostname  node-2
    [root@node-2 ~]# vim /etc/hosts
    182.48.115.233    node-1
    182.48.115.233    etcd
    182.48.115.235    node-2
      
    关闭防火墙,如果开启防火墙,则最好打开2379和4001端口
    [root@node-2 ~]# systemctl disable firewalld.service
    [root@node-2 ~]# systemctl stop firewalld.service
      
    先安装docker环境
    [root@node-2 ~]# yum install -y docker
      
    安装覆盖网络Flannel
    [root@node-2 ~]# yum install flannel
       
    配置Flannel
    [root@node-2 ~]# cp /etc/sysconfig/flanneld /etc/sysconfig/flanneld.bak
    [root@node-2 ~]# vim /etc/sysconfig/flanneld
    # Flanneld configuration options
       
    # etcd url location.  Point this to the server where etcd runs
    FLANNEL_ETCD_ENDPOINTS="http://etcd:2379"
       
    # etcd config key.  This is the configuration key that flannel queries
    # For address range assignment
    FLANNEL_ETCD_PREFIX="/atomic.io/network"
       
    # Any additional options that you want to pass
    #FLANNEL_OPTIONS=""
      
    启动Flannel
    [root@node-2 ~]# systemctl enable flanneld.service
    [root@node-2 ~]# systemctl start flanneld.service
    [root@node-2 ~]# ps -ef|grep flannel
    root      3841  9649  0 09:11 pts/0    00:00:00 grep --color=auto flannel
    root     28995     1  0 May15 ?        00:00:07 /usr/bin/flanneld -etcd-endpoints=http://etcd:2379 -etcd-prefix=/atomic.io/network
     
    启动Flannel后,一定要记得重启docker,这样Flannel配置分配的ip才能生效,即docker0虚拟网卡的ip会变成上面flannel设定的ip段
    [root@node-2 ~]# systemctl restart docker

    4)创建容器,验证跨主机容器之间的网络联通性

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    首先在node-1(182.48.115.233)上容器容器,如下,登陆容器发现已经按照上面flannel配置的分配了一个ip段(每个宿主机都会分配一个182.48.0.0/16的网段)
       
    [root@node-1 ~]# docker run -ti -d --name=node-1.test docker.io/nginx /bin/bash
    5e403bf93857fa28b42c9e2abaa5781be4e2bc118ba0c25cb6355b9793dd107e
    [root@node-1 ~]# docker exec -ti node-1.test /bin/bash
    root@5e403bf93857:/# ip addr
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default
        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
        inet6 ::1/128 scope host
           valid_lft forever preferred_lft forever
    2953: eth0@if2954: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1472 qdisc noqueue state UP group default
        link/ether 02:42:b6:30:19:04 brd ff:ff:ff:ff:ff:ff link-netnsid 0
        inet 182.48.25.4/24 scope global eth0
           valid_lft forever preferred_lft forever
        inet6 fe80::42:b6ff:fe30:1904/64 scope link
           valid_lft forever preferred_lft forever
       
       
    接着在node-2(182.48.115.233)上容器容器
    [root@node-2 ~]# docker exec -ti node-2.test /bin/bash
    root@052a6a2a4a19:/# ip addr
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default
        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
        inet6 ::1/128 scope host
           valid_lft forever preferred_lft forever
    10: eth0@if11: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1472 qdisc noqueue state UP group default
        link/ether 02:42:b6:30:43:03 brd ff:ff:ff:ff:ff:ff link-netnsid 0
        inet 182.48.67.3/24 scope global eth0
           valid_lft forever preferred_lft forever
        inet6 fe80::42:b6ff:fe30:4303/64 scope link
           valid_lft forever preferred_lft forever
       
    root@052a6a2a4a19:/# ping 182.48.25.4
    PING 182.48.25.4 (182.48.25.4): 56 data bytes
    64 bytes from 182.48.25.4: icmp_seq=0 ttl=60 time=2.463 ms
    64 bytes from 182.48.25.4: icmp_seq=1 ttl=60 time=1.211 ms
    .......
     
    root@052a6a2a4a19:/# ping www.baidu.com
    PING www.a.shifen.com (14.215.177.37): 56 data bytes
    64 bytes from 14.215.177.37: icmp_seq=0 ttl=51 time=39.404 ms
    64 bytes from 14.215.177.37: icmp_seq=1 ttl=51 time=39.437 ms
    .......
     
    发现,在两个宿主机的容器内,互相ping对方容器的ip,是可以ping通的!也可以直接连接外网(桥接模式)
       
    查看两台宿主机的网卡信息,发现docker0虚拟网卡的ip(相当于容器的网关)也已经变成了flannel配置的ip段,并且多了flannel0的虚拟网卡信息
    [root@node-1 ~]# ifconfig
    docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1472
            inet 182.48.25.1  netmask 255.255.255.0  broadcast 0.0.0.0
            inet6 fe80::42:31ff:fe0f:cf0f  prefixlen 64  scopeid 0x20<link>
            ether 02:42:31:0f:cf:0f  txqueuelen 0  (Ethernet)
            RX packets 48  bytes 2952 (2.8 KiB)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 31  bytes 2286 (2.2 KiB)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
       
    eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
            inet 182.48.115.233  netmask 255.255.255.224  broadcast 182.48.115.255
            inet6 fe80::5054:ff:fe34:782  prefixlen 64  scopeid 0x20<link>
            ether 52:54:00:34:07:82  txqueuelen 1000  (Ethernet)
            RX packets 10759798  bytes 2286314897 (2.1 GiB)
            RX errors 0  dropped 40  overruns 0  frame 0
            TX packets 21978639  bytes 1889026515 (1.7 GiB)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
       
    flannel0: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST>  mtu 1472
            inet 182.48.25.0  netmask 255.255.0.0  destination 182.48.25.0
            unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  txqueuelen 500  (UNSPEC)
            RX packets 12  bytes 1008 (1008.0 B)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 12  bytes 1008 (1008.0 B)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
      
      
    通过下面命令,可以查看到本机的容器的ip所在的范围
    [root@node-1 ~]# ps aux|grep docker|grep "bip"
    root      2080  0.0  1.4 796864 28168 ?        Ssl  May15   0:18 /usr/bin/dockerd-current --add-runtime docker-runc=/usr/libexec/docker/docker-runc-current --default-runtime=docker-runc --exec-opt native.cgroupdriver=systemd --userland-proxy-path=/usr/libexec/docker/docker-proxy-current --insecure-registry registry:5000 --bip=182.48.25.1/24 --ip-masq=true --mtu=1472
      
    这里面的“--bip=182.48.25.1/24”这个参数,它限制了所在节点容器获得的IP范围。
    这个IP范围是由Flannel自动分配的,由Flannel通过保存在Etcd服务中的记录确保它们不会重复。

    ==========================================================================
    温馨提示:
    如上面操作后,发现各容器内分配的ip之间相互ping不通,基本就是由于防火墙问题引起的!
    可是明明已经在前面部署的时候,通过"systemctl stop firewalld.service"关闭了防火墙,为什么还有防火墙问题??
    这是因为linux还有底层的iptables,所以解决办法是在各节点上执行下面操作:

    1
    2
    3
    4
    5
    6
    [root@node-1 ~]# iptables -P INPUT ACCEPT
    [root@node-1 ~]# iptables -P FORWARD ACCEPT
    [root@node-1 ~]# iptables -F
    [root@node-1 ~]# iptables -L -n
     
    执行上面操作后,基本各容器间就能相互ping通了。

    docker通过Flannel可以实现各容器间的相互通信,即宿主机和容器,容器和容器之间都能相互通信。

    ***************当你发现自己的才华撑不起野心时,就请安静下来学习吧***************

    转载于:https://www.cnblogs.com/zhengchunyuan/p/10175033.html

    展开全文
  • <div><p>It seems that the upcoming flannel-0.5.5 uses different variable names in /etc/sysconfig/flannel. <h5>Version <p>rhel 7.3 flannel-0.5.5-1.el7.x86_64 openshift-ansible commit 553ce409a40305a...
  • flannel.dockerimg

    2020-06-06 07:03:01
    flanneld-v0.12.0-amd64.docker 就是flannel的docker镜像, docker image load -i flannel.dockerimg
  • Flannel介绍

    千次阅读 2017-09-08 21:09:35
    一、flannel是什么(what)(一)概述Flannel是CoreOS团队针对Kubernetes设计的一个网络规划服务,简单来说,它的功能是让集群中的不同节点主机创建的Docker容器都具有全集群唯一的虚拟IP地址。 Flannel官网:...

    本文个人博客地址:http://www.huweihuang.com/article/flannel/flannel-introduction/

    一、flannel是什么(what)

    (一)概述

    Flannel是CoreOS团队针对Kubernetes设计的一个网络规划服务,简单来说,它的功能是让集群中的不同节点主机创建的Docker容器都具有全集群唯一的虚拟IP地址。
    Flannel官网:https://github.com/coreos/flannel

    (二)补充知识点

    1、覆盖网络[overlay network]

    运行在一个网上的网(应用层网络),并不依靠ip地址来传递消息,而是采用一种映射机制,把ip地址和identifiers做映射来资源定位。

    2、路由

    互联网是由路由器连接的网络组合而成,路由器按照路由表、路由协议等机制实现对数据包正确地转发,从而到达目标主机。路由器根据数据包中目标主机的IP地址和路由控制表比较得出下一个接收数据的路由器。

    1)静态路由:事先设置好路由器和主机中的路由表信息。

    这里写图片描述

    2)动态路由:让路由协议在运行中自动修改并设置路由表信息。

    这里写图片描述

    二、为什么使用flannel(why)

    在默认的Docker配置中,每个节点上的Docker服务会分别负责所在节点容器的IP分配。这样导致的一个问题是,不同节点上容器可能获得相同的内外IP地址。

    Flannel的设计目的就是为集群中的所有节点重新规划IP地址的使用规则,从而使得不同节点上的容器能够获得“同属一个内网”且”不重复的”IP地址,并让属于不同节点上的容器能够直接通过内网IP通信。

    三、如何实现flannel(how)

    Flannel实质上是一种“覆盖网络(overlay network)”,也就是将TCP数据包装在另一种网络包里面进行路由转发和通信,目前已经支持UDP、VxLAN、AWS VPC和GCE路由等数据转发方式,默认的节点间数据通信方式是UDP转发。

    (一)flannel原理图

    这里写图片描述

    1. 数据从源容器中发出后,经由所在主机的docker0虚拟网卡转发到flannel0虚拟网卡,这是个P2P的虚拟网卡,flanneld服务监听在网卡的另外一端。
    2. Flannel通过Etcd服务维护了一张节点间的路由表。
    3. 源主机的flanneld服务将原本的数据内容UDP封装后根据自己的路由表投递给目的节点的flanneld服务,数据到达以后被解包,然后直 接进入目的节点的flannel0虚拟网卡,然后被转发到目的主机的docker0虚拟网卡,最后就像本机容器通信一下的有docker0路由到达目标容 器。

    (二)实现说明

    1、UDP封装

    原始数据是在起始节点的Flannel服务上进行UDP封装的,投递到目的节点后就被另一端的Flannel服务还原成了原始的数据包,两边的Docker服务都感觉不到这个过程的存在。 UDP的数据内容部分其实是另一个ICMP(也就是ping命令)的数据包。

    这里写图片描述

    2、为docker分配不同的IP段

    Flannel通过Etcd分配了每个节点可用的IP地址段后,偷偷的修改了Docker的启动参数。

    这里写图片描述

    注意其中的“–bip=172.17.18.1/24”这个参数,它限制了所在节点容器获得的IP范围。

    这个IP范围是由Flannel自动分配的,由Flannel通过保存在Etcd服务中的记录确保它们不会重复。

    3、路由规则

    1)数据发送节点的路由表

    这里写图片描述

    2)数据接收节点的路由表

    这里写图片描述

    例如现在有一个数据包要从IP为172.17.18.2的容器发到IP为172.17.46.2的容器。根据数据发送节点的路由表,它只与 172.17.0.0/16匹配这条记录匹配,因此数据从docker0出来以后就被投递到了flannel0。同理在目标节点,由于投递的地址是一个容 器,因此目的地址一定会落在docker0对于的172.17.46.0/24这个记录上,自然的被投递到了docker0网卡。

    (三)flannel的安装与配置

    1、安装

    wget http://<官网>/flannel/flannel-0.2.0-10.el7.x86_64.rpm
    yum localinstall -y flannel-0.2.0-10.el7.x86_64.rpm

    2、配置

    vi /etc/sysconfig/flanneld

    # Flanneld configuration options
    
    # etcd url location. Point this to the server where etcd runs
    FLANNEL_ETCD="http://127.0.0.1:4001"
    
    # etcd config key. This is the configuration key that flannel queries
    # For address range assignment
    FLANNEL_ETCD_KEY="/my/flannel/product/network"
    
    # Any additional options that you want to pass
    FLANNEL_OPTIONS=" -iface=eth0"

    3、初始化flannel的etcd配置

    etcdctl set /my/flannel/network/config '{
       "Network": "10.0.0.0/16",
       "Backend": {
           "Type": "vxlan"
       }
    }'
    展开全文
  • kube-flannel-rbac.yml # Create the clusterrole and clusterrolebinding: # $ kubectl create -f kube-flannel-rbac.yml # Create the pod using the same namespace used by the flannel serviceaccount: # $ ...
  • flannel 部署 flannel 的yaml文件

    千次阅读 2020-04-26 01:01:05
    k8s安装flannel kubectl apply -f flanneld.yaml flanneld.yaml 下载好镜像,有需要的可以评论留邮箱,看到发给你 flannel需要tag 把镜像tag成quay.io/coreos/flannel:v0.12.0-arm64 cat > kube-flannel.yml <...

    k8s安装flannel

    kubectl apply -f flanneld.yaml

    flanneld.yaml

    下载好镜像,有需要的可以评论留邮箱,看到发给你

    flannel需要tag

    把镜像tag成quay.io/coreos/flannel:v0.12.0-arm64

    cat > kube-flannel.yml << eof
    ---
    apiVersion: policy/v1beta1
    kind: PodSecurityPolicy
    metadata:
      name: psp.flannel.unprivileged
      annotations:
        seccomp.security.alpha.kubernetes.io/allowedProfileNames: docker/default
        seccomp.security.alpha.kubernetes.io/defaultProfileName: docker/default
        apparmor.security.beta.kubernetes.io/allowedProfileNames: runtime/default
        apparmor.security.beta.kubernetes.io/defaultProfileName: runtime/default
    spec:
      privileged: false
      volumes:
        - configMap
        - secret
        - emptyDir
        - hostPath
      allowedHostPaths:
        - pathPrefix: "/etc/cni/net.d"
        - pathPrefix: "/etc/kube-flannel"
        - pathPrefix: "/run/flannel"
      readOnlyRootFilesystem: false
      # Users and groups
      runAsUser:
        rule: RunAsAny
      supplementalGroups:
        rule: RunAsAny
      fsGroup:
        rule: RunAsAny
      # Privilege Escalation
      allowPrivilegeEscalation: false
      defaultAllowPrivilegeEscalation: false
      # Capabilities
      allowedCapabilities: ['NET_ADMIN']
      defaultAddCapabilities: []
      requiredDropCapabilities: []
      # Host namespaces
      hostPID: false
      hostIPC: false
      hostNetwork: true
      hostPorts:
      - min: 0
        max: 65535
      # SELinux
      seLinux:
        # SELinux is unused in CaaSP
        rule: 'RunAsAny'
    ---
    kind: ClusterRole
    apiVersion: rbac.authorization.k8s.io/v1beta1
    metadata:
      name: flannel
    rules:
      - apiGroups: ['extensions']
        resources: ['podsecuritypolicies']
        verbs: ['use']
        resourceNames: ['psp.flannel.unprivileged']
      - apiGroups:
          - ""
        resources:
          - pods
        verbs:
          - get
      - apiGroups:
          - ""
        resources:
          - nodes
        verbs:
          - list
          - watch
      - apiGroups:
          - ""
        resources:
          - nodes/status
        verbs:
          - patch
    ---
    kind: ClusterRoleBinding
    apiVersion: rbac.authorization.k8s.io/v1beta1
    metadata:
      name: flannel
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: ClusterRole
      name: flannel
    subjects:
    - kind: ServiceAccount
      name: flannel
      namespace: kube-system
    ---
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: flannel
      namespace: kube-system
    ---
    kind: ConfigMap
    apiVersion: v1
    metadata:
      name: kube-flannel-cfg
      namespace: kube-system
      labels:
        tier: node
        app: flannel
    data:
      cni-conf.json: |
        {
          "name": "cbr0",
          "cniVersion": "0.3.1",
          "plugins": [
            {
              "type": "flannel",
              "delegate": {
                "hairpinMode": true,
                "isDefaultGateway": true
              }
            },
            {
              "type": "portmap",
              "capabilities": {
                "portMappings": true
              }
            }
          ]
        }
      net-conf.json: |
        {
          "Network": "10.244.0.0/16",
          "Backend": {
            "Type": "vxlan"
          }
        }
    ---
    apiVersion: apps/v1
    kind: DaemonSet
    metadata:
      name: kube-flannel-ds-amd64
      namespace: kube-system
      labels:
        tier: node
        app: flannel
    spec:
      selector:
        matchLabels:
          app: flannel
      template:
        metadata:
          labels:
            tier: node
            app: flannel
        spec:
          affinity:
            nodeAffinity:
              requiredDuringSchedulingIgnoredDuringExecution:
                nodeSelectorTerms:
                  - matchExpressions:
                      - key: beta.kubernetes.io/os
                        operator: In
                        values:
                          - linux
                      - key: beta.kubernetes.io/arch
                        operator: In
                        values:
                          - amd64
          hostNetwork: true
          tolerations:
          - operator: Exists
            effect: NoSchedule
          serviceAccountName: flannel
          initContainers:
          - name: install-cni
            image: quay.io/coreos/flannel:v0.12.0-amd64
            command:
            - cp
            args:
            - -f
            - /etc/kube-flannel/cni-conf.json
            - /etc/cni/net.d/10-flannel.conflist
            volumeMounts:
            - name: cni
              mountPath: /etc/cni/net.d
            - name: flannel-cfg
              mountPath: /etc/kube-flannel/
          containers:
          - name: kube-flannel
            image: quay.io/coreos/flannel:v0.12.0-amd64
            command:
            - /opt/bin/flanneld
            args:
            - --ip-masq
            - --kube-subnet-mgr
            resources:
              requests:
                cpu: "100m"
                memory: "50Mi"
              limits:
                cpu: "100m"
                memory: "50Mi"
            securityContext:
              privileged: false
              capabilities:
                add: ["NET_ADMIN"]
            env:
            - name: POD_NAME
              valueFrom:
                fieldRef:
                  fieldPath: metadata.name
            - name: POD_NAMESPACE
              valueFrom:
                fieldRef:
                  fieldPath: metadata.namespace
            volumeMounts:
            - name: run
              mountPath: /run/flannel
            - name: flannel-cfg
              mountPath: /etc/kube-flannel/
          volumes:
            - name: run
              hostPath:
                path: /run/flannel
            - name: cni
              hostPath:
                path: /etc/cni/net.d
            - name: flannel-cfg
              configMap:
                name: kube-flannel-cfg
    eof            
    
    
    
    

    kubectl get pods -n kube-system

    展开全文
  • flannel Flannel is a simple and easy way to configure a layer 3 network fabric designed for Kubernetes. How it works Flannel runs a small, single binary agent called flanneld on each host, and is ...
  • kube-flannel.yml

    2019-08-11 14:59:22
    name: psp.flannel.unprivileged annotations: seccomp.security.alpha.kubernetes.io/allowedProfileNames: docker/default seccomp.security.alpha.kubernetes.io/defaultProfileName: docker/default ...
  • Flannel log

    2020-11-22 19:44:38
    flannel", "logLevel": "debug", ... } </code></pre> <p>It can be set to "panic", "error", "verbose" or "debug", and defaults to "panic"....
  • Flannel Note

    2019-11-11 14:34:40
    eth0:物理网卡 flannel0: flannel引入的网桥 docker0: docker引入的网桥
  • Fail when deploying flannel

    2020-12-02 15:35:23
    TASK [geerlingguy.kubernetes : Configure Flannel networking.] ************************************************************************************************************** failed: [174.35.241.200] ...
  • flannel.tar

    2019-08-20 15:39:56
    kubernetes部署网络插件国内镜像 flannel镜像文件tar包!!! 新手部署kubernetes集群必备、建议收藏
  • Flannel解读

    2018-11-30 07:40:55
    由我上篇博文Docker网络解读可知,flannel主要用来解决容器的跨主机通信问题,同时也是kubernetes主要实现网络互通的方式,那么flannel是如何实现容器间跨主机通信的呢,下面我们引入flannel github上的一张原理图来...
  • flannel镜像安装文件

    2019-01-17 11:03:56
    flannel安装文件
  • Flannel not working

    2020-12-09 04:26:32
    <div><p>Flannel is always showing "Waiting for Flannel" in Canonical Kubernetes and Core Kubernetes on Ubuntu 16 04. <p>kubernetes-master/0<em> waiting idle 3 10.41.17.101 6443/tcp Waiting for...
  • flannel v0.10.0

    2018-04-14 15:14:18
    flannel v0.10.0 github经常打不开,特地下载传到这里
  • flannel网络配置

    2018-04-17 09:46:35
    k8s管理使用flannel网络管理,docker集群的网络管理工具
  • Flannel v0.9.0

    2020-12-26 13:03:59
    <div><p>Initial experimental branch to update the flannel version with several bugfixes. Default CoreOS stable uses v0.7.1. <p>Still need to figure out why flannel is started first with the wrong ...
  • flannel和etcd

    2017-12-13 16:03:50
    kubernetes 安装需要的组件 flannel-amd64_v0.8.0 etcd_v3.0.17
  • Adding Flannel documentation

    2020-12-25 21:13:15
    <div><p>This is some initial documentation for flannel within OpenShift. This includes: <ul><li>Adding the openshift_use_flannel variable to the cluster variables table in the Advanced Installation ...
  • Fix flannel check

    2020-12-01 10:03:07
    <div><p>As ovs is enabled by default and will get installed all the rpms and configuration enabled even though flannel is enabled. So this PR is for not installing and configuring if flannel enabled. ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,916
精华内容 1,566
关键字:

flannel