1. 程式人生 > >flannel 實戰與原始碼分析(一)

flannel 實戰與原始碼分析(一)

Flannel 是由 CoreOS 維護的一個虛擬網路方案。目前是kubernetes預設的網路,它有golang編寫,在原始碼分析之前還是先看看怎樣使用。這裡不得不提一下kubernetes網路約束:
1. 所有容器之間都可以無須SNAT即可相互直接以IP通訊。
2. 所有主機與容器之間都可以無須SNAT即可相互直接以IP通訊。
3. 容器看到的自身IP與其他容器看到的容器IP相同。
當然flannel的網路是符合這三點約束的。
在部署完kubernetes之後,那麼kubernetes可以啟動容器了,但此時容器跨宿主機網路是無法聯通,需要一些技術如vxlan、埠對映、SDN等。下面就開始flannel網路部署安裝。
flannel的安裝可謂簡單至極

yum -y install flannel

配置也是極其簡單,配置檔案/etc/sysconfig/flanneld ,主要配置etcd的地址

# Flanneld configuration options  

# etcd url location.  Point this to the server where etcd runs
FLANNEL_ETCD_ENDPOINTS="http://10.39.0.6:2379"

# etcd config key.  This is the configuration key that flannel queries
# For address range assignment
FLANNEL_ETCD_PREFIX="/flannel/network" # Any additional options that you want to pass FLANNEL_OPTIONS="-iface=eth0"

flannel是依賴etcd做網路分配以及埠資訊獲取的,所以還需要etcd的支援,下面是我本地環境的設定:

etcdctl get /flannel/network/config
{"Network": "192.168.0.0/16","SubnetLen": 24,"SubnetMin": "192.168.1.0","SubnetMax": "192.168.100.0","Backend"
: {"Type": "vxlan"}}

這樣設定了192.168.0.0/16這樣一個網段作為容器的IP。每個子網掩碼24。後面設定了最小和最大子網,最後一個是設定backend網路型別包括UDP、vxlan、host-gw等。下面就可以通過systemctl管理flannel的程序flanneld了。

systemctl status flanneld
● flanneld.service - Flanneld overlay address etcd agent
   Loaded: loaded (/usr/lib/systemd/system/flanneld.service; enabled; vendor preset: disabled)
   Active: active (running) since 一 2017-04-24 13:15:51 CST; 37min ago
  Process: 14513 ExecStartPost=/usr/libexec/flannel/mk-docker-opts.sh -k DOCKER_NETWORK_OPTIONS -d /run/flannel/docker (code=exited, status=0/SUCCESS)
 Main PID: 14506 (flanneld)
   Memory: 3.8M
   CGroup: /system.slice/flanneld.service
           └─14506 /usr/bin/flanneld -etcd-endpoints=http://10.39.0.6:2379 -etcd-prefix=/flannel/network -iface=eth0

4月 24 13:15:50 slave3 systemd[1]: Starting Flanneld overlay address etcd agent...
4月 24 13:15:50 slave3 flanneld-start[14506]: I0424 13:15:50.966112   14506 main.go:132] Installing signal handlers
424 13:15:50 slave3 flanneld-start[14506]: I0424 13:15:50.967099   14506 manager.go:149] Using interface with name eth0 and address 10.39.0.53
424 13:15:50 slave3 flanneld-start[14506]: I0424 13:15:50.967417   14506 manager.go:166] Defaulting external address to interface address (10.39.0.53)
424 13:15:51 slave3 flanneld-start[14506]: I0424 13:15:51.001224   14506 local_manager.go:179] Picking subnet in range 192.168.1.0 ... 192.168.100.0
424 13:15:51 slave3 flanneld-start[14506]: I0424 13:15:51.007527   14506 manager.go:250] Lease acquired: 192.168.69.0/24
424 13:15:51 slave3 flanneld-start[14506]: I0424 13:15:51.009495   14506 network.go:58] Watching for L3 misses
424 13:15:51 slave3 flanneld-start[14506]: I0424 13:15:51.009875   14506 network.go:66] Watching for new subnet leases
424 13:15:51 slave3 systemd[1]: Started Flanneld overlay address etcd agent.

我之所以把整個systemctl輸出貼出來,是想和大家介紹一下flanneld的啟動過程從日誌可以看出,第一步是signal handlers這個是安裝一個監聽核心訊號量的handler,第二步是使用eth0為自己流量出口,第三步是獲取我之前config設定的子網範圍,第四步是租用一個網段,第五步是啟動L3 Miss監聽,第六步是監聽子網事件。那麼這個flannel就啟動了。
測試一下效果:

ip a
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
19: [email protected]: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UP group default 
    link/ether 02:42:c0:a8:05:02 brd ff:ff:ff:ff:ff:ff
    inet 192.168.5.2/24 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:c0ff:fea8:502/64 scope link tentative dadfailed 
       valid_lft forever preferred_lft forever

ping 192.168.90.7
PING 192.168.90.7 (192.168.90.7): 56 data bytes
64 bytes from 192.168.90.7: icmp_seq=0 ttl=62 time=8.250 ms
64 bytes from 192.168.90.7: icmp_seq=1 ttl=62 time=12.359 ms
64 bytes from 192.168.90.7: icmp_seq=2 ttl=62 time=8.293 ms

ping另一個主機上面的容器ok!
這裡大家可能有疑惑,我這個flannel沒有cni的部分,那麼它是怎樣接入的k8s裡面的呢?其實flannel有個cni,只是不常用,在這裡面偷了個懶,直接修改docker的bip達到網路分配的目的。

cat /usr/lib/systemd/system/docker.service.d/flannel.conf
[Service]
EnvironmentFile=-/run/flannel/docker


cat /run/flannel/docker 
DOCKER_OPT_BIP="--bip=192.168.69.1/24"
DOCKER_OPT_IPMASQ="--ip-masq=true"
DOCKER_OPT_MTU="--mtu=1450"
DOCKER_NETWORK_OPTIONS=" --bip=192.168.69.1/24 --ip-masq=true --mtu=1450"

通過修改docker啟動引數修改docker的bip,如下:

ps -ef|grep docker

root     15239     1  0 13:17 ?        00:00:08 /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 --selinux-enabled --log-driver=journald --signature-verification=false --bip=192.168.69.1/24 --ip-masq=true --mtu=1450

那麼啟動的容器還是掛到docker自己網橋上面,只不過網橋的地址段被flannel設定了,flannel為每個宿主機分配了一個網段。所以這裡有坑需要注意,就是flannel如果修改了網段配置,需要重啟docker才能生效。關於flannel的基本安裝使用就說到這裡

相關推薦

flannel 實戰原始碼分析

Flannel 是由 CoreOS 維護的一個虛擬網路方案。目前是kubernetes預設的網路,它有golang編寫,在原始碼分析之前還是先看看怎樣使用。這裡不得不提一下kubernetes網路約束: 1. 所有容器之間都可以無須SNAT即可相互直接以IP

Ceph 學習——OSD讀寫流程原始碼分析

直接上圖: 同樣當前最新的版本,和之前的版本有所不同,有一些模組簡化了,類的名字也改了。先介紹圖中涉及的相關的類,然後在對類中具體函式主要呼叫流程進行分析。 OSD 模組主要的類 盜圖:其中ReplicatedPG 在最新的版本中

GCC原始碼分析——介紹安裝

原文連結:http://blog.csdn.net/sonicling/article/details/6702031     上半年一直在做有關GCC和LD的專案,到現在還沒做完。最近幾天程式設計的那臺電腦壞了,所以趁此間隙寫一點相關的分析和

Flume NG原始碼分析基於靜態properties檔案的配置模組

日誌收集是網際網路公司的一個重要服務,Flume NG是Apache的頂級專案,是分散式日誌收集服務的一個開源實現,具有良好的擴充套件性,與其他很多開源元件可以無縫整合。搜了一圈發現介紹Flume NG的文章有不少,但是深入分析Flume NG原始碼的卻沒有。準備寫一個系列分析一下Flume NG的

OpenCV學習筆記31KAZE 演算法原理原始碼分析KAZE的原始碼優化及SIFT的比較

  KAZE系列筆記: 1.  OpenCV學習筆記(27)KAZE 演算法原理與原始碼分析(一)非線性擴散濾波 2.  OpenCV學習筆記(28)KAZE 演算法原理與原始碼分析(二)非線性尺度空間構建 3.  Op

OpenCV學習筆記30KAZE 演算法原理原始碼分析KAZE特徵的效能分析比較

      KAZE系列筆記: 1.  OpenCV學習筆記(27)KAZE 演算法原理與原始碼分析(一)非線性擴散濾波 2.  OpenCV學習筆記(28)KAZE 演算法原理與原始碼分析(二)非線性尺度空間構

Glide原始碼分析從用法來看之with方法

繼續啃原始碼,用過Glide的人,肯定都覺得它好好用,我們一般只需要幾行程式碼,就可以達到我們想要的效果,可以在這個背後是什麼呢?就需要我們來看了。 我一般看原始碼,我喜歡先從用法來看,然後一步一步的再細扣,所以就先從用法來看Glide的整體流程。 用過Glide的人,用下面這段

zigbee 之ZStack-2.5.1a原始碼分析

先看main, 在檔案Zmain.c裡面 main osal_init_system(); osalInitTasks(); ... ... SampleApp_Init( taskID ); // 使用者定義的任務

Docker Client原始碼分析

主要內容: Docker Client在Docker中的定位,以及Docker Client原始碼的初步分析。 本文選取Docker拆分為DockerCE(社群版)和DockerEE(企業版)之後的Docker-CE的第一個穩定版本v17.06.0-ce。 https://github.com/docker

Hibernate使用及原始碼分析

Hibernate使用及原始碼分析(一) 本篇文章主要通過hibernate初級使用分析一下原始碼,只是給初學者一點小小的建議,不喜勿噴,謝謝! hibernate環境搭建 簡單使用 原始碼走讀 一 hibernate環境搭建 這裡直接

SpringCloud原始碼分析--客戶端搭建

一、前言 上一節的註冊中心搭建完成了,本節開始搭建客戶端,其實對於springcloud的Eureka註冊中心而言,他本身就是服務端也是客戶端,我們上節待見服務端註冊中心的時候,已經通過配置來設定其不向自己註冊,和不去檢索服務的功能,保持了其作為服務註冊中心的相對的功能單一性。 二、pom檔案

Vue原始碼分析:入口檔案

Vue原始碼分析(一):入口檔案   首先開啟命令列,從github下載原始碼,下載到自己的工作目錄。 git clone https://github.com/vuejs/vue.git   這裡我下載的是2.5.17版本的,vue 原始碼是由各種模組用 rollup 工具

okhttp原始碼分析——基本流程超詳細

1.okhttp原始碼分析(一)——基本流程(超詳細) 2.okhttp原始碼分析(二)——RetryAndFollowUpInterceptor過濾器 3.okhttp原始碼分析(三)——CacheInterceptor過濾器 4.okhttp原始碼分析(四)——Conn

spring事務管理原始碼分析配置和事務增強代理的生成流程

在本篇文章中,將會介紹如何在spring中進行事務管理,之後對其內部原理進行分析。主要涉及 @EnableTransactionManagement註解為我們做了什麼? 為什麼標註了@Transactional註解的方法就可以具有事務的特性,保持了資料的ACID特性?spring到底是如何具有這樣

Android系統播放器MediaPlayer原始碼分析

前言 對於MediaPlayer播放器的原始碼分析內容相對來說比較多,會從Java->JNI->C/C++慢慢分析,後面會慢慢更新。另外,部落格只作為自己學習記錄的一種方式,對於其他的不過多的評論。 MediaPlayerDemo public class MainA

Android7.1 [Camera] Camera Hal 原始碼分析

原始碼平臺:rk3399   命令列ls看下原始碼的結構 hardware/rockchip/camera/CameraHal: lib目錄 原始碼的檔案看起來有點多,我們看看Android.mk檔案, 這些檔案最終編譯成camera.rk30bo

Cat原始碼分析:Client端

前言 cat的Client端所做的工作就是收集埋點資訊,將埋點資訊處理成messageTree,放到傳送佇列中,在啟動另一個執行緒,非同步消費佇列,進行訊息的傳送。 本文涉及到三個內容: 客戶端初始化:做了哪些準備工作 message的建立過程 客戶端的傳

laravel框架原始碼分析自動載入

一、前言   使用php已有好幾年,laravel的使用也是有好長時間,但是一直對於框架原始碼的理解不深,原因很多,歸根到底還是php基礎不紮實,所以原始碼看起來也比較吃力。最近有時間,所以開啟第5、6遍的框架原始碼探索之旅,前面幾次都是看了一些就放棄,希望這次能夠看完。每一次看原始碼都會有新的收穫,因為框

github上hamsternz/FPGA_DisplayPort 的VHDL原始碼分析

原始碼來源於https://github.com/hamsternz/FPGA_DisplayPort。由於我也是第一次接觸這個介面,所以文中肯定有我理解錯誤的地方,懇請指正。要看懂程式碼首先還是要對協議有一定了解。所以我做的原始碼分析中會和協議結合起來。 激勵檔案test_source_800

vue-element-admin原始碼分析

這兩天看花褲衩大大的手摸手系列,使用vue+element+vuex+axios實現了一個後臺模板(專案地址),在閱讀原始碼的過程中收益匪淺,以下做一些筆記。(由於是學習大大專案的思想,所以略去了很多大大的程式碼)。 這裡只是做一個登陸頁面,然後能提交資料給後臺