部署思路是:master機器可以訪問公網,其它機器都在內網,因此master機器有兩張網卡,其它機器與master機器的內網網卡相聯。
一、網絡配置
master節點的網絡配置
# 機器 k8s-master, 此台機器除了作為 master 本身,還承擔網關的功能 # 訪問公網的網卡為centos系統中的eth1 # 內網通信的網卡為Centos系統中的eth0 # 由於在 k8s-master 機器中, eth0為連接其它機器的內網網卡,所以這張網卡需要標為 ZONE=trusted,確保防火牆不干擾內網數據 # eth1網卡配置 TYPE=Ethernet DEVICE=eth1 IPADDR=192.168.206.30 NETMASK=255.255.255.0 GATEWAY=192.168.206.1 ONBOOT=yes BOOTPROTO=static NM_CONTROLLED=yes # eth0網卡配置 TYPE=Ethernet DEVICE=eth0 IPADDR=25.10.10.0 NETMASK=255.255.0.0 ZONE=trusted ONBOOT=yes BOOTPROTO=static NM_CONTROLLED=yes
node節點的網絡配置
# 機器 k8s-node1,此台機器承擔kubernetes節點服務,僅設置一張內網網卡eth0,GATEWAY設置為master節點的內網IP地址。 # eth0網卡配置 TYPE=Ethernet DEVICE=eth0 IPADDR=25.10.10.1 NETMASK=255.255.0.0 GATEWAY=25.10.10.0 ONBOOT=yes BOOTPROTO=static NM_CONTROLLED=yes
注意:在配置node節點的網卡時,一定要把網關配置為master節點的內網IP地址,如上標紅的部分,否則在calico組件構建kubernetes網絡時會報錯。
二、設置kubeadm init配置文件(kubeadm.yaml)的參數
kubeadm init操作會自動發現master節點的網卡設備,並且將其設置成默認網關。如果想使用另外的網卡設備,那么需要在執行kubeadm init命令之前修改配置文件,修改api.advertiseAddress和api.bindPort兩個參數。
api.advertiseAddress=25.10.10.0 api.bindPort=6443
這兩個參數決定kubeadm join命令中的IP:port,api.advertiseAddress的ip地址必須設置為master節點的內網地址,不然node節點在執行kubeadm join命令的時候,會報錯。
三、部署calico組件的配置
1、啟/禁用 ip-ip
目前官方提供的模板里,默認打開了ip-ip功能,該功能會在node上創建一個設備:tunl0,容器的網絡數據會經過該設備被封裝一個ip頭再轉發。這里,calico.yaml中通過修改calico-node的環境變量:CALICO_IPV4POOL_IPIP來實現ipip功能的開關:默認是Always,表示開啟;Off表示關閉ipip; cross-subnet表示開啟並支持跨子網,目前用不到這種類型。
- name: CALICO_IPV4POOL_IPIP value: "always"
2、部署:
注意:部署前,要配置一個參數,讓calico-node組件能夠識別node的IP,node上可能有多塊網卡,官方提供的yaml文件中,ip識別策略(IPDETECTMETHOD)沒有配置,即默認為first-found,這會導致一個網絡異常的ip作為nodeIP被注冊,從而影響node-to-node mesh。我們可以修改成can-reach的策略,嘗試連接某一個Ready的node的IP,以此選擇出正確的IP。
- name: IP_AUTODETECTION_METHOD value: can-reach=25.10.10.0 - name: IP value: "autodetect"
在官方提供的yaml文件中,添加如上兩個參數設置,第一個參數一定要設置為master節點的內網IP,否則會導致創建的tunl0無法連通,從而導致跨節點的POD無法通信等問題。