摘要:結(jié)構(gòu)大致為安裝如果檢測(cè)到多個(gè)會(huì)報(bào)錯(cuò),可以用指定一個(gè)指定啟動(dòng)因?yàn)樾枰{(diào)用,所以需要把映射到容器內(nèi)部,如果你使用了,那么需要設(shè)置對(duì)應(yīng)的。我這里是啟動(dòng)服務(wù),這里需要注意的是這些環(huán)境變量,作用是的默認(rèn)值,見(jiàn)名知意,在文檔中有詳細(xì)介紹。
基于容器的后端服務(wù)架構(gòu)
在探索kubernetes的應(yīng)用時(shí),調(diào)研了幾個(gè)gateway,發(fā)現(xiàn)fabio支持發(fā)現(xiàn)服務(wù),自動(dòng)生成路由,結(jié)合consul,registrator, 可以很容易的部署一套服務(wù),比較輕量,很容易玩起來(lái)。
結(jié)構(gòu)大致為:
安裝 consul, 如果檢測(cè)到多個(gè) private ip, 會(huì)報(bào)錯(cuò),可以用 -advertise 指定一個(gè)ip.
// config.json , 指定 DNS port { "recursors" : [ "8.8.8.8" ], "ports" : { "dns" : 53 } } sudo docker run -d --name=consul --net=host -v $PWD/config.json:/config/config.json gliderlabs/consul-server -bootstrap -advertise=172.28.128.3 curl 172.28.128.3:8500/v1/catalog/servicesStart Registrator
啟動(dòng) registrator, 因?yàn)樾枰{(diào)用docker api, 所以需要把docker.sock 映射到容器內(nèi)部,如果你使用了tcp, 那么需要設(shè)置對(duì)應(yīng)的url。
如果你希望上報(bào)容器內(nèi)部ip:port, 那么需要在啟動(dòng)參數(shù)中加入 -internal=true, 這樣注冊(cè)的 Service, 都是容器內(nèi)部的ip, 而port對(duì)于同一個(gè)service而言,一般是固定的,例如 一個(gè)hello服務(wù)的兩個(gè)實(shí)例分別為 10.10.1.12:9090, 10.10.1.13:9090. 這樣的話,就需要配置一個(gè)容器跨host的網(wǎng)絡(luò)方案,例如 flannel, 等。 可以參考上一篇 Flannel with Docker
為了簡(jiǎn)便測(cè)試,這里就不配置flannel了。-ip是指定注冊(cè)service時(shí)候使用的ip,建議要指定,選取當(dāng)前機(jī)器的內(nèi)網(wǎng) private ip即可。我這里是 172.28.128.3.
sudo docker run -d --name=registrator --volume=/var/run/docker.sock:/tmp/docker.sock gliderlabs/registrator:latest -ip=172.28.128.3 consul://172.28.128.3:8500Start service
啟動(dòng)服務(wù),這里需要注意的是這些環(huán)境變量,作用是 override Registrator的默認(rèn)值,見(jiàn)名知意,在 registrator 文檔中有詳細(xì)介紹。例如 SERVICE_9090_NAME 就是指 端口為 9090 的service 的 name。
需要注意的是 tags 這個(gè)字段,urlprefix-/foo,hello, 這里 urlprefix- 是 gateway 的一種配置,意思為 把訪問(wèn) /foo 為前綴的請(qǐng)求轉(zhuǎn)發(fā)到當(dāng)前應(yīng)用來(lái)。他能夠匹配到例如 /foo/bar, footest, 等。如果你想加上域名的限制,可以這樣 urlprefix-mysite.com/foo。 后面還有一個(gè) hello, 作用是給這個(gè)service打一個(gè)標(biāo)記,可以用作查詢用。
sudo docker run -d -P -e SERVICE_9090_CHECK_HTTP=/foo/healthcheck -e SERVICE_9090_NAME=hello -e SERVICE_CHECK_INTERVAL=10s -e SERVICE_CHECK_TIMEOUT=5s -e SERVICE_TAGS=urlprefix-/foo,hello silentred/alpine-hello:v2 curl 172.28.128.3:8500/v1/catalog/services //現(xiàn)在應(yīng)該能看到剛啟動(dòng)的hello服務(wù)了 {"consul":[],"hello":["urlprefix-mysite.com/foo","hello","urlprefix-/foo"]}
測(cè)試 DNS
sudo yum install bind-utils dig @172.28.128.3 hello.service.consul SRV
可以設(shè)置 /etc/resolv.conf
nameserver 172.28.128.3 search service.consul
這樣無(wú)論在容器內(nèi)部,還是外部都可以直接解析 sevice 名, 例如:
[vagrant@localhost ~]$ ping hello PING hello.service.consul (172.28.128.3) 56(84) bytes of data. 64 bytes from localhost.localdomain.node.dc1.consul (172.28.128.3): icmp_seq=1 ttl=64 time=0.016 ms [vagrant@localhost ~]$ sudo docker exec -it fdde1b8247b8 bash bash-4.4# ping hello PING hello (172.28.128.6): 56 data bytes 64 bytes from 172.28.128.6: seq=0 ttl=63 time=0.361 msStart Gateway
前端Gateway 根據(jù) consul中注冊(cè)的 service,生成對(duì)應(yīng)的路由規(guī)則,把流量分發(fā)到各個(gè)節(jié)點(diǎn)。 這個(gè)項(xiàng)目還有一個(gè) ui 管理 route信息,端口為 9998。
創(chuàng)建一個(gè)配置文件 fabio.properties
registry.consul.addr = 172.28.128.3:8500
在當(dāng)前目錄運(yùn)行
docker run -d -p 9999:9999 -p 9998:9998 -v $PWD/fabio.properties:/etc/fabio/fabio.properties magiconair/fabio
測(cè)試gateway:
curl 172.28.128.3:9999/foo/bar curl 172.28.128.3:9999/foo/bar -H "Host: mysite.com"Health Check
sudo ifdown eth1 curl http://localhost:8500/v1/health/state/critical [ { "Node":"localhost.localdomain", "CheckID":"service:afa2769cd049:loving_shannon:9090", "Name":"Service "hello" check", "Status":"critical", "Notes":"", "Output":"Get http://172.28.128.6:32768/foo/healthcheck: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)", "ServiceID":"afa2769cd049:loving_shannon:9090", "ServiceName":"hello", "CreateIndex":379, "ModifyIndex":457 } ] sudo ifup eth1
在啟動(dòng) consul的時(shí)候,我們使用了-ui 參數(shù),我們可以在 172.28.128.3:8500/ui 訪問(wèn)到consul的web ui管理界面,看到各個(gè)服務(wù)的狀態(tài).
對(duì)比注冊(cè)容器外IP:
每個(gè)注冊(cè)的service的port都是變化的,并且因?yàn)橛成鋬?nèi)部port到了host,外部可以隨意訪問(wèn),私密性較弱。
注冊(cè)容器內(nèi)IP:
每個(gè)注冊(cè)的service的port都是固定的,只能從容器內(nèi)部訪問(wèn)。如果用 flannel,可能有一些性能損失。
查了一下如何利用DNS SRV類(lèi)型來(lái)發(fā)現(xiàn)服務(wù)。本來(lái)以為可以用類(lèi)似 Dial("hello", SRV) 的魔法 (我們都是膜法師,+1s), 查了一些資料貌似沒(méi)有這么方便??戳讼耮olang的net包,發(fā)現(xiàn)了兩個(gè)方法 LookupSRV, LookupHost, 于是測(cè)試了一下,看下結(jié)果,大家知道該怎么用了吧,嘿嘿。
cname, addrs, err := net.LookupSRV("", "", "hello.service.consul") fmt.Printf("%s, %#v, %s ", cname, addrs, err) for _, srv := range addrs { fmt.Printf("%#v ", *srv) } newAddrs, err := net.LookupHost("hello.service.consul") fmt.Printf("%#v, %s ", newAddrs, err)
//output [vagrant@bogon dns]$ go run mx.go hello.service.consul., []*net.SRV{(*net.SRV)(0xc420010980), (*net.SRV)(0xc4200109a0)}, %!s() net.SRV{Target:"bogon.node.dc1.consul.", Port:0x8003, Priority:0x1, Weight:0x1} net.SRV{Target:"bogon.node.dc1.consul.", Port:0x8000, Priority:0x1, Weight:0x1} []string{"172.28.128.3", "172.28.128.4"}, %!s( )
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/26764.html
摘要:而調(diào)用后端服務(wù)就應(yīng)用了的高級(jí)特分布式配置管理平臺(tái)后端掘金輕量的分布式配置管理平臺(tái)。關(guān)于網(wǎng)絡(luò)深度解讀后端掘金什么是網(wǎng)絡(luò)呢總的來(lái)說(shuō),網(wǎng)絡(luò)中的容器們可以相互通信,網(wǎng)絡(luò)外的又訪問(wèn)不了這些容器。 在 Java 路上,我看過(guò)的一些書(shū)、源碼和框架(持續(xù)更新) - 后端 - 掘金簡(jiǎn)書(shū) 占小狼轉(zhuǎn)載請(qǐng)注明原創(chuàng)出處,謝謝!如果讀完覺(jué)得有收獲的話,歡迎點(diǎn)贊加關(guān)注 物有本末,事有終始,知所先后,則近道矣 ......
摘要:從容器到容器編排平臺(tái)以及周邊生態(tài)系統(tǒng)包含很多工具來(lái)管理容器的生命周期。終止運(yùn)行中的容器。發(fā)現(xiàn)在由運(yùn)行于多個(gè)主機(jī)上的容器組成的分布式部署容器發(fā)現(xiàn)至關(guān)重要。類(lèi)似的,當(dāng)容器崩潰時(shí),編排工具可以啟動(dòng)替換。 從容器到容器編排 Docker平臺(tái)以及周邊生態(tài)系統(tǒng)包含很多工具來(lái)管理容器的生命周期。例如,Docker Command Line Interface(CLI)支持下面的容器活動(dòng): 從注冊(cè)表...
閱讀 3420·2021-11-24 09:38
閱讀 3196·2021-11-22 09:34
閱讀 2112·2021-09-22 16:03
閱讀 2373·2019-08-29 18:37
閱讀 383·2019-08-29 16:15
閱讀 1774·2019-08-26 13:56
閱讀 867·2019-08-26 12:21
閱讀 2208·2019-08-26 12:15