Docker網(wǎng)絡(luò):可以在docker run的時候指定
bridge:這是Docker默認的網(wǎng)絡(luò)驅(qū)動轧苫,此模式會為每一個容器分配Network Namespace和設(shè)置IP等呼胚,并將容器連接到一個虛擬網(wǎng)橋上。
如果未指定網(wǎng)絡(luò)驅(qū)動,這默認使用此驅(qū)動挖藏。
1瑞凑、安裝docker的時候默認會啟動一個docker0的虛擬網(wǎng)橋? docker network inspect bridge可以查看容器ip范圍以及網(wǎng)關(guān)
2、創(chuàng)建容器的時候宿主機會創(chuàng)建虛擬網(wǎng)卡 veth pair ,成對出現(xiàn)师幕,一端容器中eth0,另一端放在宿主機的dcoker0,以veth
為前 綴的名字命名 使用brctl show 查看
3、向外通訊的時候使用-p參數(shù)綁定主機的端口,采用NAT模式向外發(fā)送報文
NAT:網(wǎng)絡(luò)地址轉(zhuǎn)換懂诗,下一層封裝上一層的ip信息進行偽裝并且記錄ip供報文返回尋找源ip
容器使用虛擬網(wǎng)卡eth0--veth--->docker0(網(wǎng)橋)---->eth0(宿主機的)
host:此網(wǎng)絡(luò)驅(qū)動直接使用宿主機的網(wǎng)絡(luò)嵌戈。
none:此驅(qū)動不構(gòu)造網(wǎng)絡(luò)環(huán)境。采用了none 網(wǎng)絡(luò)驅(qū)動笔链,那么就只能使用loopback網(wǎng)絡(luò)設(shè)備,容器只能使用127.0.0.1的本機網(wǎng)絡(luò)
joined containers:使用某個已經(jīng)存在的容器的網(wǎng)絡(luò)命名空間
------------------------------------------------------------------------------------------------------------------------
overlay:此網(wǎng)絡(luò)驅(qū)動可以使多個Docker daemons連接在一起手素,并能夠使用swarm服務(wù)之間進行通訊。也可以使用overlay網(wǎng)絡(luò)進行
swarm服務(wù)和容器之間、容器之間進行通訊
macvlan:此網(wǎng)絡(luò)允許為容器指定一個MAC地址邓嘹,允許容器作為網(wǎng)絡(luò)中的物理設(shè)備钉嘹,這樣Docker daemon就可以通過MAC地址進行訪問的
路由缨睡。對于希望直接連接網(wǎng)絡(luò)網(wǎng)絡(luò)的遺留應(yīng)用,這種網(wǎng)絡(luò)驅(qū)動有時可能是最好的選擇震贵。
Network plugins:可以安裝和使用第三方的網(wǎng)絡(luò)插件。可以在Docker Store或第三方供應(yīng)商處獲取這些插件
------------------------------------------------------------------------------------------------------------------------
kubernets網(wǎng)絡(luò)模式
1、容器與容器之間的通信
每一個pod啟動都會創(chuàng)建一個pause容器绽淘,該容器負責為pod提供統(tǒng)一的網(wǎng)絡(luò)空間其他容器綁定該容器的網(wǎng)絡(luò)命名空間,容器間使用
通訊localhost
2、Pod和Pod之間的通信
需要網(wǎng)絡(luò)插件(cni)解決常用的有flannel(網(wǎng)絡(luò)分配)、calico(提供網(wǎng)絡(luò)策略)离钝、目前組合使用
flannel:(不支持容器間網(wǎng)絡(luò)策略鲤竹,默認用的vxlan傳輸機制)一個為k8s提供疊加網(wǎng)絡(luò)(overlay)的插件
采用L3 Overlay模式設(shè)計flannel碘橘, 規(guī)定宿主機下各個Pod屬于同一個子網(wǎng)氮墨,不同宿主機下的Pod屬于不同的子網(wǎng)
flannel會在每一個宿主機上運行名為flanneld代理桥氏,其負責為宿主機預(yù)先分配一個子網(wǎng)诚镰,并為Pod分配IP地址
使用Kubernetes或etcd來存儲網(wǎng)絡(luò)配置刃跛、分配的子網(wǎng)和主機公共IP等信息
數(shù)據(jù)包則通過VXLAN检号、UDP或host-gw這些類型的后端機制進行轉(zhuǎn)發(fā)
VxLAN:可擴展虛擬局域網(wǎng)桂塞,使用內(nèi)核中的vxlan模塊封裝報文,推薦使用方式
directrouting模式:vxlan使用隧道網(wǎng)絡(luò)轉(zhuǎn)發(fā)疊加網(wǎng)絡(luò)的報文勢必會造成不少的流量開銷,所以設(shè)計的該模式,僅
僅在主機跨二層網(wǎng)絡(luò)時才采取隧道方式轉(zhuǎn)發(fā)通訊,其余時候直接采用二層網(wǎng)絡(luò)轉(zhuǎn)發(fā)pod報文萤捆,
從而省去隧道首部開銷岁忘。
宿主機二層直達的時候會采取route模式其他使用vxlan,(集群規(guī)模不超過200臺)
iptables -nL 查看forword鏈
ip route show 查看路由規(guī)則
UDP:使用普通udp報文封裝完成隧道轉(zhuǎn)發(fā)戚篙,性能低岔擂。
host-gw:通過在節(jié)點上創(chuàng)建目標地址的路由來完成報文的轉(zhuǎn)發(fā)位喂,性能好,但需要主機在同一個二層網(wǎng)絡(luò)中乱灵,大型集群無
法滿足
flannel運行過程:
1)設(shè)置集群網(wǎng)絡(luò)
flannel默認使用etcd作為配置和協(xié)調(diào)中心塑崖,首先使用etcd設(shè)置集群的整體網(wǎng)絡(luò)。通過如下的命令能夠查詢網(wǎng)絡(luò)配置
信息:
etcdctl ls /coreos.com/network/config (安裝etcd工具)
2)設(shè)置Node節(jié)點上的子網(wǎng)
基于在etcd中設(shè)置的網(wǎng)絡(luò)痛倚,flannel為每一個Node分配IP子網(wǎng)弃舒。
獲取子網(wǎng)列表etcdctl ls /coreos.com/network/subnets
獲取子網(wǎng)信息etcdctl ls /coreos.com/network/subnets/{IP網(wǎng)段}
3)在每個Node上啟動flannelid
flannel在每個Node上啟動了一個flanneld的服務(wù),在flanneld啟動后状原,將從etcd中讀取配置信息聋呢,并請求獲取子網(wǎng)
的租約。所有Node上的flanneld都依賴etcd cluster來做集中配置服務(wù)颠区,etcd保證了所有node上flanned所看到的配
置是一致 的削锰。同時每個node上的flanned監(jiān)聽etcd上的數(shù)據(jù)變化,實時感知集群中node的變化毕莱。flanneld一旦獲取
子網(wǎng)租約器贩、配置后端后,會將一些信息寫入/run/flannel/subnet.env文件
cat /var/run/flannel/subnet.env
4)創(chuàng)建虛擬網(wǎng)卡
在Node節(jié)點上朋截,會創(chuàng)建一個名為flannel.1的虛擬網(wǎng)卡 ip addr show flannel.1
5)創(chuàng)建Docker網(wǎng)橋
并為容器配置名為docker0的網(wǎng)橋蛹稍,實際是通過修改Docker的啟動參數(shù)–bip來實現(xiàn)的。通過這種方式部服,為每個節(jié)點
的Docker0網(wǎng)橋設(shè)置在整個集群范圍內(nèi)唯一的網(wǎng)段唆姐,從保證創(chuàng)建出來的Pod的IP地址是唯一。
ip addr show docker0
6)修改路由表
flannel會對路由表進行修改廓八,從而能夠?qū)崿F(xiàn)容器跨主機的通信
數(shù)據(jù)傳遞過程:container源--->docker0網(wǎng)橋(本機)--->flannel.1虛擬網(wǎng)卡(本機)--->宿主機eth0網(wǎng)卡--->目標主機
eth0網(wǎng)卡--->flannel.1虛擬網(wǎng)卡(目標)--->docker0網(wǎng)橋(目標)--->container目標
ip route查看路由規(guī)則
calico:bgp協(xié)議方式 ipip(三層隧道)提供網(wǎng)絡(luò)策略
通過定義NetworkPolicy資源來進行
networkpolicy奉芦,定義時候ingress和egress 如果定義了生效又沒有定義規(guī)則則執(zhí)行默認(都拒絕)
拒絕所有出入站規(guī)則赵抢,放行本地namesapce的通信,其他的單獨定義声功。
3烦却、Pod和service之間的通信
通過iptables規(guī)則中得到serviceip代理的其中一個pod的ip進行通訊
------------------------------------------------------------------------------------------------------------------------
service
service:service為一組pod提供一個統(tǒng)一的代理服務(wù)ip解決了podip經(jīng)常變化的問題,并且提供負載均衡先巴。
service負載均衡策略設(shè)置:
service可以通過servicename解析需要強依賴coredns組件
kube-proxy:監(jiān)聽集群中的對 api-server 中的 service & endpoint 進行 watch ,一旦檢測到更新則往 iptables 里全量推送
新的轉(zhuǎn)發(fā)規(guī)則
mode參數(shù):控制使用iptables或者ipvs
iptables和ipvs
ipvs:IPVS為大型集群提供了更好的可擴展性和性能其爵。
IPVS支持比iptables更復(fù)雜的負載平衡算法(最小負載,最少連接伸蚯,位置摩渺,加權(quán)等)。
IPVS支持服務(wù)器健康檢查和連接重試等
service有四種類型
ExternalName:用來做集群外部服務(wù)引用的朝卒,需要externalIPs參數(shù)等
ClusterIP:通過集群的內(nèi)部 IP 暴露服務(wù)证逻,選擇該值,服務(wù)只能夠在集群內(nèi)部可以訪問抗斤,這也是默認的 ServiceType
NodePort:通過每個 Node 上的 IP 和靜態(tài)端口(NodePort)暴露服務(wù)
LoadBalancer:使用云提供商的負載局衡器囚企,可以向外部暴露服務(wù)
------------------------------------------------------------------------------------------------------------------------
Ingress
Service雖然解決了服務(wù)發(fā)現(xiàn)和負載均衡的問題,但它在使用上還是有一些限制
只支持4層負載均衡瑞眼,沒有7層功能
對外訪問時龙宏,NodePort類型需要在外部搭建額外的負載均衡,而LoadBalancer要求kubernetes必須跑在支持的cloud provider上
ingress controller
ngress controller通過與kubernetes API交互伤疙,動態(tài)的去感知集群中Ingress規(guī)則變化银酗,然后讀取它,按照它自己的模板生成一
段nginx配置徒像,再寫到nginx Pod中黍特,最后reload以下
ingress:
就是一段nginx負載的配置文件
三種常用的模式
1:ingress-controller service
2:Traefik 微云應(yīng)用而生無需重啟操作
3:Envoy(服務(wù)網(wǎng)格目前習慣使用的 查看)
------------------------------------------------------------------------------------------------------------------------
網(wǎng)絡(luò)策略:networkpolicy
------------------------------------------------------------------------------------------------------------------------
虛擬機設(shè)置靜態(tài)ip
編輯ifcfg-eno16777736文件
#static assignment
NM_CONTROLLED=no #表示該接口將通過該配置文件進行設(shè)置,而不是通過網(wǎng)絡(luò)管理器進行管理
ONBOOT=yes #開機啟動
BOOTPROTO=static #靜態(tài)IP
IPADDR=192.168.1.122 #本機地址
NETMASK=255.255.255.0 #子網(wǎng)掩碼
GATEWAY=192.168.1.1 #默認網(wǎng)關(guān)
------------------------------------------------------------------------------------------------------------------------
隧道網(wǎng)絡(luò):
二層虛擬化網(wǎng)絡(luò):只識別MAC地址锯蛀,不識IP地址
三層虛擬化網(wǎng)絡(luò):不但識別MAC地址灭衷,還能把MAC幀中的IP地址
core-dns:提供域名解析服務(wù)
flannel:負責集群的網(wǎng)絡(luò)分配
calico:負責集群的網(wǎng)絡(luò)策略
NAT:網(wǎng)絡(luò)地址轉(zhuǎn)換
macvlan:網(wǎng)卡虛擬化方案,它可以為一張物理網(wǎng)卡設(shè)置多個mac地址旁涤,相當于物理網(wǎng)卡施展了影分身之術(shù)翔曲,由一個變多個,同時要求物理
網(wǎng)卡打開混雜模式劈愚。
vxlan:虛擬可擴展局域網(wǎng)瞳遍,是一種 overlay 網(wǎng)絡(luò)技術(shù)
Overlay網(wǎng)絡(luò):一種網(wǎng)絡(luò)架構(gòu)上疊加的虛擬化技術(shù)模式,疊加網(wǎng)絡(luò)
MTU值:數(shù)據(jù)鏈路層提供租后的mtu值菌羽,用來保證vxlan報文的順利傳輸掠械,