CentOS 7安裝etcd和flannel實現docker跨物理機通訊

菲宇發表於2018-08-21

在搭建Kubernetes的環境的時候,你可能會遇到一些問題,不!你會遇到很多問題。比如,首先你要實現跨物理機的容器訪問——是不同物理內的容器能夠互相訪問,而不是你平常所看到的亂七八糟的埠對映。方案有很多,比如OVS、flannel、socketplane什麼的,下面是我搭建etcd和flannel的過程,希望對需要這樣的環境的人有所幫助,少走彎路。再說一次:跨物理機的容器之間能直接訪問

架構

實驗的架構非常簡單,三臺機器,為了簡化,我只設定了一臺etcd,沒有做叢集,三臺機器安裝flannel和Docker。

  • 172.16.164.5 //etcd、flannel、docker
  • 172.16.164.6 //flannel、docker
  • 172.16.164.7 //flannel、docker

安裝etcd

  • 172.16.164.5
    etcd的安裝是尤其簡單的——如果你有翻牆的話,下載二進位制直接執行就是了,在這裡我設定成了一個新的叢集。
    1. #也許你需要翻牆,github使用的是amazon的s3儲存

    2. wget https://github.com/coreos/etcd/releases/download/v2.3.2/etcd-v2.3.2-linux-amd64.tar.gz

    3. tar xvf etcd-v2.3.2-linux-amd64.tar.gz

    4. cd etcd-v2.3.2-linux-amd64

    5. mv etcd* /usr/bin

    二進位制的程式可以直接啟動,為了方便,我們將其加入Systemd管理,並且為了以後擴充套件,我還設定了叢集,大家可以不必新增叢集設定。
    1. cat /usr/lib/systemd/system/etcd.service

    2. [Unit]

    3. Description=etcd

    4. [Service]

    5. Environment=ETCD_NAME=kubernetes

    6. Environment=ETCD_DATA_DIR=/var/lib/etcd

    7. Environment=ETCD_LISTEN_CLIENT_URLS=http://172.16.164.5:4001,http://localhost:4001

    8. Environment=ETCD_LISTEN_PEER_URLS=http://172.16.164.5:7001,http://localhost:7001

    9. Environment=ETCD_INITIAL_ADVERTISE_PEER_URLS=http://172.16.164.5:7001,http://localhost:7001

    10. Environment=ETCD_ADVERTISE_CLIENT_URLS=http://172.16.164.5:4001,http://localhost:4001

    11. Environment=ETCD_INITIAL_CLUSTER_STATE=new

    12. Environment=ETCD_INITIAL_CLUSTER_TOKEN=Kubernetes

    13. Environment=ETCD_INITIAL_CLUSTER=kubernetes=http://172.16.164.5:7001,kubernetes=http://localhost:7001

    14. ExecStart=/usr/bin/etcd

    15. [Install]

    16. WantedBy=multi-user.target

    新增後執行systemctl start etcd啟動etcd,可以通過etcdctl ls /或者etcdctl mkdir /test測試etcd可用性。

    新增網段

    確定etcd可以使用之後,我們需要設定分配給docker網路的網段
    etcdctl mk /coreos.com/network/config '{"Network":"172.17.0.0/16", "SubnetMin": "172.17.1.0", "SubnetMax": "172.17.254.0"}'

    安裝flannel

  • 172.16.164.5
  • 172.16.164.6
  • 172.16.164.7
    三臺主機都要執行
    其實flannel也是和etcd一樣,不用安裝的,直接從官方下載二進位制執行檔案就可以了,當然,你也可以自己編譯。
    1. wget https://github.com/coreos/flannel/releases/download/v0.5.5/flannel-0.5.5-linux-amd64.tar.gz

    2. tar xvf flannel-0.5.5-linux-amd64.tar.gz

    3. mv flannel-0.5.5-linux-amd64 /opt/flannel

    同樣,我們新增一個flannel服務的System單元,簡單的就可以。
    1. cat /usr/lib/systemd/system/flanneld.service

    2. [Unit]

    3. Description=flannel

    4. [Service]

    5. ExecStart=/opt/flannel/flanneld \

    6. -etcd-endpoints=http://172.16.164.5:4001

    7. [Install]

    8. WantedBy=multi-user.target

    通過systemctl start flanneld啟動服務,正常情況下,你執行ip a已經可以看到flannel0橋接網路卡了,etcd上執行etcdctl ls /coreos.com/network/subnets也能夠看到flannel申請的網段。

    修改Docker引數

    要像使docker使用flannel的網路傳遞資料,要修改一些啟動引數。
    1. cd /opt/flannel/

    2. ./mk-docker-opts.sh -i

    通過mk-docker-opts.sh --help可一直到這個指令碼會生成一些docker引數,放到/run/docker_opts.env檔案中,我們只需要將這些引數,加入到docker的啟動引數
    1. cat /etc/sysconfig/docker | grep OPT

    2. OPTIONS='--selinux-enabled --bip=172.17.64.1/24 --ip-masq=true --mtu=1472'

Paste_Image.png
配置完畢後,便可以啟動docker了。

  1. sytemctl stop docker

  2. ifconfig down docker0

  3. systemctl start docker

  4. ip a s docker0

  5. #可以看到docker0已經獲取了flannel網段的地址

Paste_Image.png

最後

三臺機器都配置好了之後,我們在三臺機器上分別開啟一個docker容器,測試它們的網路是不是通的。

  1. docker run -ti centos bash

  2. #一次檢視容器IP

  3. cat /etc/hosts

  4. 172.17.97.2 334cec104721

  5. #測試連通性,都成功就OK了

  6. #到跨物理機容器

  7. ping -c 1 172.16.164.7

  8. ping -c 1 172.17.67.1

  9. #到宿主機

  10. ping -c 1 172.16.164.7

  11. #到別的物理機

  12. ping -c 1 172.16.164.6

相關文章