Docker 是一個(gè)開(kāi)源的應(yīng)用容器引擎,讓開(kāi)發(fā)者可以打包他們的應(yīng)用以及依賴包到一個(gè)可移植的容器中,然后發(fā)布到任何流行的 Linux 機(jī)器上,也可以實(shí)現(xiàn)虛擬化.
confd:confd通過(guò)讀取配置(支持etcd,consul,環(huán)境變量),通過(guò)go的模板,生成最終的配置文件.
安裝:安裝和etcd一樣,非常方便,已經(jīng)提供了64位的可執(zhí)行程序,下載下來(lái)之后直接放到PATH中(/usr/local/bin)即可(別忘了+x).
haproxy配置生成:
confd配置文件默認(rèn)在/etc/confd中,可以通過(guò)參數(shù)-confdir指定,目錄中包含兩個(gè)子目錄,分別是:conf.d templates.
confd會(huì)先讀取conf.d目錄中的配置文件(toml格式),然后根據(jù)文件指定的模板路徑去渲染模板,基于之前配置的etcd集群,讀取/services/web中的目錄和key,結(jié)構(gòu)為:
- /services/web/$DOMAIN/$HOST/ip
- |-port
其中DOMAIN表示注冊(cè)應(yīng)用的域名,HOST表示注冊(cè)機(jī)器的主機(jī)名,首先創(chuàng)建confd配置文件,代碼如下:
- [template]
- src = "haproxy.cfg.tmpl"
- dest = "/home/babydragon/haproxy/haproxy.cfg"
- keys = [
- "/services/web",
- ]
- #reload_cmd = "/etc/init.d/haproxy reload"
現(xiàn)在只測(cè)試模板生成,所以不關(guān)注檢查、重啟等命令,配置模板名稱、目標(biāo)路徑和獲取的key即可,著重看下模板變動(dòng)部分,前面就是寫死的一些haproxy的標(biāo)準(zhǔn)配置,如日志等,代碼如下:
- frontend webin
- bind :80
- {{$domains := lsdir "/services/web"}}
- {{range $domain := $domains}}
- acl is_{{$domain}} hdr(host) -i {{$domain}}
- {{end}}
- {{range $domain := $domains}}
- use_backend {{$domain}}_cluster if is_{{$domain}}
- {{end}}
- {{range $domain := $domains}}
- backend {{$domain}}_cluster
- cookie SERVERID insert indirect nocache
- {{$domain_dir := printf "/services/web/%s" $domain}}{{range $host := lsdir $domain_dir}}
- server {{base $host}} {{$ip_key := printf "/services/web/%s/%s/ip" $domain $host}}{{getv $ip_key}}:{{$port_key := printf "/services/web/%s/%s/port" $domain $host}}{{getv $port_key}} cookie {{base $host}} check
- {{end}}
- {{end}}
這里主要有兩個(gè)循環(huán),第一個(gè)循環(huán)所有的域名,第一個(gè)循環(huán)每一個(gè)域名下的所有主機(jī),haproxy需要通過(guò)設(shè)置acl的方式來(lái)進(jìn)行按照域名做負(fù)載均衡,因此首先循環(huán)域名,為每個(gè)域名創(chuàng)建一個(gè)acl規(guī)則和一個(gè)規(guī)則的使用.
下面再通過(guò)一個(gè)循環(huán),創(chuàng)建沒(méi)個(gè)域名對(duì)應(yīng)的后段,confd模板詳細(xì)文檔可以參考github上的文檔,大致的意思是通過(guò)lsdir獲取當(dāng)前目錄下的所有子目錄,第一層子目錄為域名,根據(jù)域名即可生成acl規(guī)則、規(guī)則使用、后端名稱等數(shù)據(jù).
再重新通過(guò)瓶裝域名目錄,對(duì)域名目錄執(zhí)行l(wèi)sdir,讀取目錄下的每個(gè)主機(jī)名,創(chuàng)建后端的server條目,一個(gè)域名下的負(fù)載均衡后段服務(wù)器,同時(shí)獲取掛在這個(gè)目錄下的屬性鍵值對(duì)(這里只有ip和port),創(chuàng)建完模板和配置之后,先構(gòu)造一些測(cè)試數(shù)據(jù),代碼如下:
- etcdctl mkdir /services/web
- etcdctl mkdir /services/web/a.abc.com
- etcdctl mkdir /services/web/b.abc.com
- etcdctl mkdir /services/web/a.abc.com/server1
- etcdctl mkdir /services/web/a.abc.com/server2
- etcdctl mkdir /services/web/b.abc.com/server1
- etcdctl set /services/web/a.abc.com/server1/ip 10.0.0.1
- etcdctl set /services/web/a.abc.com/server1/port 10000
- etcdctl set /services/web/a.abc.com/server2/port 10001
- etcdctl set /services/web/a.abc.com/server2/ip 10.0.0.1
- etcdctl set /services/web/b.abc.com/server1/ip 10.0.0.2
- etcdctl set /services/web/b.abc.com/server1/port 12345
這里模擬三個(gè)容器,其中兩個(gè)作為域名a.abc.com運(yùn)行容器,一個(gè)作為b.abc.com容器,然后執(zhí)行confd,檢查生成的配置文件,代碼如下:
confd -confdir ./confd -onetime -backend etcd -node 127.0.0.1:4001
剛才那段模板渲染后為如下代碼:
- frontend webin
- bind :80
- acl is_a.abc.com hdr(host) -i a.abc.com
- acl is_b.abc.com hdr(host) -i b.abc.com
- use_backend a.abc.com_cluster if is_a.abc.com
- use_backend b.abc.com_cluster if is_b.abc.com
- backend a.abc.com_cluster
- cookie SERVERID insert indirect nocache
- server server1 10.0.0.1:10000 cookie server1 check
- server server2 10.0.0.1:10001 cookie server2 check
- //Vevb.com
- backend b.abc.com_cluster
- cookie SERVERID insert indirect nocache
- server server1 10.0.0.2:12345 cookie server1 check
- No Comments
新聞熱點(diǎn)
疑難解答
圖片精選