kubernetes實踐之四:Flannel網路外掛安裝

百聯達發表於2018-03-15
一:Flannel介紹

FlannelCoreOS團隊針對Kubernetes設計的一個網路規劃服務,簡單來說,它的功能是讓叢集中的不同節點主機建立的Docker容器都具有全叢集唯一的虛擬IP地址。

Kubernetes的網路模型中,假設了每個物理節點應該具備一段“屬於同一個內網IP段內”的“專用的子網IP”。例如:

節點110.1.46.0-24

節點210.1.77.0-24

但在預設的Docker配置中,每個節點上的Docker服務會分別負責所在節點容器的IP分配。這樣導致的一個問題是,不同節點上容器可能獲得相同的內外IP地址。並使這些容器之間能夠之間通過IP地址相互找到,也就是相互ping通。

Flannel的設計目的就是為叢集中的所有節點重新規劃IP地址的使用規則,從而使得不同節點上的容器能夠獲得“同屬一個內網”且”不重複的”IP地址,並讓屬於不同節點上的容器能夠直接通過內網IP通訊。

所有的node節點都需要安裝?絡外掛才能讓所有的Pod加入到同一個區域網中。


二:Flannel工作原理



Flannel實質上是一種“覆蓋網路(overlay network)”,也就是將TCP資料包裝在另一種網路包裡面進行路由轉發和通訊,目前已經支援UDPVxLANAWS VPCGCE路由等資料轉發方式。

1. 資料從源容器中發出後,經由所在主機的docker0虛擬網路卡轉發到flannel0虛擬網路卡,這是個P2P的虛擬網路卡,flanneld服務監聽在網路卡的另外一端。

2.Flannel通過Etcd服務維護了一張節點間的路由表。

3. 源主機的flanneld服務將原本的資料內容UDP封裝後根據自己的路由表投遞給目的節點的flanneld服務,資料到達以後被解包,然後直接進入目的節點的flannel0虛擬網路卡,然後被轉發到目的主機的docker0虛擬網路卡,最後就像本機容器通訊一下的有docker0路由到達目標容器。

三:Flannel的安裝與配置

1.通過yum install  flannel安裝

2.service配置?件 /usr/lib/systemd/system/flanneld.service


點選(此處)摺疊或開啟

  1. [Unit]
  2. Description=Flanneld overlay address etcd agent
  3. After=network.target
  4. After=network-online.target
  5. Wants=network-online.target
  6. After=etcd.service
  7. Before=docker.service

  8. [Service]
  9. Type=notify
  10. EnvironmentFile=/etc/sysconfig/flanneld
  11. EnvironmentFile=-/etc/sysconfig/docker-network
  12. ExecStart=/usr/bin/flanneld-start -etcd-endpoints=${FLANNEL_ETCD_ENDPOINTS} -etcd-prefix=${FLANNEL_ETCD_PREFIX} $FLANNEL_OPTIONS
  13. ExecStartPost=/usr/libexec/flannel/mk-docker-opts.sh -k DOCKER_NETWORK_OPTIONS -d /run/flannel/docker
  14. Restart=on-failure

  15. [Install]
  16. WantedBy=multi-user.target
  17. RequiredBy=docker.service
3.配置檔案/etc/sysconfig/flanneld

點選(此處)摺疊或開啟

  1. # Flanneld configuration options

  2. # etcd url location. Point this to the server where etcd runs
  3. FLANNEL_ETCD_ENDPOINTS="https://10.116.137.196:2379,https://10.116.82.28:2379,https://10.116.36.57:2379"

  4. # etcd config key. This is the configuration key that flannel queries
  5. # For address range assignment
  6. FLANNEL_ETCD_PREFIX="/kube-centos/network"

  7. # Any additional options that you want to pass
  8. FLANNEL_OPTIONS="-etcd-cafile=/etc/kubernetes/ssl/ca.pem -etcd-certfile=/etc/kubernetes/ssl/kubernetes.pem -etcd-keyfile=/etc/kubernetes/ssl/kubernetes-key.pem"
4.在etcd中建立網路配置

點選(此處)摺疊或開啟

  1. etcdctl --endpoints=https://10.116.137.196:2379,https://10.116.82.28:2379,https://10.116.36.57:2379 --ca-file=/etc/kubernetes/ssl/ca.pem --cert-file=/etc/kubernetes/ssl/kubernetes.pem --key-file=/etc/kubernetes/ssl/kubernetes-key.pem mk /kube-centos/network/config '{"Network":"10.1.37.0/16","SubnetLen":24,"Backend":{"Type":"vxlan"}}'
5.啟動flannel

systemctl daemon-reload

systemctl enable flanneld

systemctl start flanneld

systemctl status flanneld


檢視

點選(此處)摺疊或開啟

  1. etcdctl --endpoints=https://10.116.137.196:2379,https://10.116.82.28:2379,https://10.116.36.57:2379 --ca-file=/etc/kubernetes/ssl/ca.pem --cert-file=/etc/kubernetes/ssl/kubernetes.pem --key-file=/etc/kubernetes/ssl/kubernetes-key.pem ls /kube-centos/network/subnets



點選(此處)摺疊或開啟

  1. etcdctl --endpoints=https://10.116.137.196:2379,https://10.116.82.28:2379,https://10.116.36.57:2379 --ca-file=/etc/kubernetes/ssl/ca.pem --cert-file=/etc/kubernetes/ssl/kubernetes.pem --key-file=/etc/kubernetes/ssl/kubernetes-key.pem get /kube-centos/network/subnets/10.1.46.0-24



因為採用的是阿里雲ECS伺服器,這裡的PublicIP設定的是ECS的公網IP(
etcdctl set /flannel/network/subnets/10.1.46.0-24 '{ "PublicIP": "120.25.220.176" }'


四:flannel啟動過程解析

flannel服務需要先於docker啟動。flannel服務啟動時主要做了以下幾步的工作:

etcd中獲取network的配置資訊劃分subnet,並在etcd中進行註冊將子網資訊記錄到/run/flannel/subnet.env

cat /run/flannel/subnet.env



之後將會有一個指令碼將subnet.env轉寫成一個docker的環境變數檔案/run/flannel/docker

cat /run/flannel/docker

systemctl show docker將會發現 在安裝flannel後自動生成配置

DropInPaths=/usr/lib/systemd/system/docker.service.d/flannel.conf

並引用

/run/flannel/docker



五: docker 配置

service檔案, /usr/lib/systemd/system/docker.service


點選(此處)摺疊或開啟

  1. [Unit]
  2. Description=Docker Application Container Engine
  3. [Unit]
  4. Description=Docker Application Container Engine
  5. Documentation=http://docs.docker.com
  6. After=network.target
  7. Wants=docker-storage-setup.service
  8. Requires=docker-cleanup.timer

  9. [Service]
  10. Type=notify
  11. NotifyAccess=all
  12. KillMode=process
  13. EnvironmentFile=-/run/flannel/docker
  14. EnvironmentFile=-/run/flannel/subnet.env
  15. EnvironmentFile=-/etc/sysconfig/docker
  16. EnvironmentFile=-/etc/sysconfig/docker-storage
  17. EnvironmentFile=-/etc/sysconfig/docker-network
  18. Environment=GOTRACEBACK=crash
  19. Environment=DOCKER_HTTP_HOST_COMPAT=1
  20. Environment=PATH=/usr/libexec/docker:/usr/bin:/usr/sbin
  21. ExecStart=/usr/bin/dockerd \
  22.           --exec-opt native.cgroupdriver=systemd \
  23.           $DOCKER_OPT_BIP \
  24.           $DOCKER_OPT_IPMASQ \
  25.           $DOCKER_OPT_MTU \
  26.           -s=overlay \
  27.          --log-driver=json-file
  28. ExecReload=/bin/kill -s HUP $MAINPID
  29. LimitNOFILE=1048576
  30. LimitNPROC=1048576
  31. LimitCORE=infinity
  32. TimeoutStartSec=0
  33. Restart=on-abnormal
  34. MountFlags=slave

  35. [Install]
  36. WantedBy=multi-user.target
六: 驗證
節點node1,node2上各啟動一個容器,驗證能否相互ping通
docker run -i -t centos /bin/bash
 
yum install net-tools -y
ifconfig
ping ip

 







來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28624388/viewspace-2151891/,如需轉載,請註明出處,否則將追究法律責任。

相關文章