摘要:結構大致為安裝如果檢測到多個會報錯,可以用指定一個指定啟動因為需要調用,所以需要把映射到容器內部,如果你使用了,那么需要設置對應的。我這里是啟動服務,這里需要注意的是這些環(huán)境變量,作用是的默認值,見名知意,在文檔中有詳細介紹。
基于容器的后端服務架構
在探索kubernetes的應用時,調研了幾個gateway,發(fā)現(xiàn)fabio支持發(fā)現(xiàn)服務,自動生成路由,結合consul,registrator, 可以很容易的部署一套服務,比較輕量,很容易玩起來。
結構大致為:
安裝 consul, 如果檢測到多個 private ip, 會報錯,可以用 -advertise 指定一個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
啟動 registrator, 因為需要調用docker api, 所以需要把docker.sock 映射到容器內部,如果你使用了tcp, 那么需要設置對應的url。
如果你希望上報容器內部ip:port, 那么需要在啟動參數(shù)中加入 -internal=true, 這樣注冊的 Service, 都是容器內部的ip, 而port對于同一個service而言,一般是固定的,例如 一個hello服務的兩個實例分別為 10.10.1.12:9090, 10.10.1.13:9090. 這樣的話,就需要配置一個容器跨host的網(wǎng)絡方案,例如 flannel, 等。 可以參考上一篇 Flannel with Docker
為了簡便測試,這里就不配置flannel了。-ip是指定注冊service時候使用的ip,建議要指定,選取當前機器的內網(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
啟動服務,這里需要注意的是這些環(huán)境變量,作用是 override Registrator的默認值,見名知意,在 registrator 文檔中有詳細介紹。例如 SERVICE_9090_NAME 就是指 端口為 9090 的service 的 name。
需要注意的是 tags 這個字段,urlprefix-/foo,hello, 這里 urlprefix- 是 gateway 的一種配置,意思為 把訪問 /foo 為前綴的請求轉發(fā)到當前應用來。他能夠匹配到例如 /foo/bar, footest, 等。如果你想加上域名的限制,可以這樣 urlprefix-mysite.com/foo。 后面還有一個 hello, 作用是給這個service打一個標記,可以用作查詢用。
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)在應該能看到剛啟動的hello服務了 {"consul":[],"hello":["urlprefix-mysite.com/foo","hello","urlprefix-/foo"]}
測試 DNS
sudo yum install bind-utils dig @172.28.128.3 hello.service.consul SRV
可以設置 /etc/resolv.conf
nameserver 172.28.128.3 search service.consul
這樣無論在容器內部,還是外部都可以直接解析 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中注冊的 service,生成對應的路由規(guī)則,把流量分發(fā)到各個節(jié)點。 這個項目還有一個 ui 管理 route信息,端口為 9998。
創(chuàng)建一個配置文件 fabio.properties
registry.consul.addr = 172.28.128.3:8500
在當前目錄運行
docker run -d -p 9999:9999 -p 9998:9998 -v $PWD/fabio.properties:/etc/fabio/fabio.properties magiconair/fabio
測試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
在啟動 consul的時候,我們使用了-ui 參數(shù),我們可以在 172.28.128.3:8500/ui 訪問到consul的web ui管理界面,看到各個服務的狀態(tài).
對比注冊容器外IP:
每個注冊的service的port都是變化的,并且因為映射內部port到了host,外部可以隨意訪問,私密性較弱。
注冊容器內IP:
每個注冊的service的port都是固定的,只能從容器內部訪問。如果用 flannel,可能有一些性能損失。
查了一下如何利用DNS SRV類型來發(fā)現(xiàn)服務。本來以為可以用類似 Dial("hello", SRV) 的魔法 (我們都是膜法師,+1s), 查了一些資料貌似沒有這么方便。看了下golang的net包,發(fā)現(xiàn)了兩個方法 LookupSRV, LookupHost, 于是測試了一下,看下結果,大家知道該怎么用了吧,嘿嘿。
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( )
文章版權歸作者所有,未經(jīng)允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/26764.html
摘要:而調用后端服務就應用了的高級特分布式配置管理平臺后端掘金輕量的分布式配置管理平臺。關于網(wǎng)絡深度解讀后端掘金什么是網(wǎng)絡呢總的來說,網(wǎng)絡中的容器們可以相互通信,網(wǎng)絡外的又訪問不了這些容器。 在 Java 路上,我看過的一些書、源碼和框架(持續(xù)更新) - 后端 - 掘金簡書 占小狼轉載請注明原創(chuàng)出處,謝謝!如果讀完覺得有收獲的話,歡迎點贊加關注 物有本末,事有終始,知所先后,則近道矣 ......
閱讀 3403·2021-11-24 09:38
閱讀 3189·2021-11-22 09:34
閱讀 2098·2021-09-22 16:03
閱讀 2349·2019-08-29 18:37
閱讀 371·2019-08-29 16:15
閱讀 1761·2019-08-26 13:56
閱讀 853·2019-08-26 12:21
閱讀 2198·2019-08-26 12:15