Docker部署Nacos & CoreDNS 實(shí)現(xiàn)動(dòng)態(tài)DNS功能

本文通過(guò)Docker部署CoreDNS和Nacos-coredns-plugin測(cè)試Nacos 動(dòng)態(tài)DNS功能

相關(guān)鏈接

版本約定:
Nacos:v1.0.0-RC2(Mar 22, 2019)
CoreDNS:v1.2.6
Nacos-coredns-plugin: 最新

1. 制作Docker鏡像

為了兼容性考慮,我們直接采用nacos-coredns-plugin插件提供的編譯腳本來(lái)構(gòu)建Docker鏡像。(該腳本會(huì)自動(dòng)安裝CoreDNS v1.2.6和相關(guān)依賴)

1.1 將Nacos-coredns-plugin下載到本地

git clone https://github.com/nacos-group/nacos-coredns-plugin.git

1.2 修改接口版本【重點(diǎn)】

將文件"nacos-coredns-plugin/nacos/util_and_comms.go"中的Version = "Nacos-go-client:v0.1.0"修改為Version = "Nacos-DNS:v1.0.1";

image.png

插件會(huì)將該Version信息加入請(qǐng)求Nacos服務(wù)的request頭信息中,服務(wù)端以此區(qū)分響應(yīng)內(nèi)容格式。

2. 編寫(xiě)Dockerfile

文件目錄如下:

- docker
  - nacos-coredns-plugin
  - Dockerfile (*當(dāng)前創(chuàng)建*)
  - docker-compose.yml (*稍后創(chuàng)建*)
  - conf (*稍后創(chuàng)建*)
    - Corefile (*稍后創(chuàng)建*)

將工作目錄切換到docker下,創(chuàng)建Dockerfile文件,加入如下內(nèi)容:

FROM golang:1.12

ADD ./nacos-coredns-plugin /tmp/nacos-coredns-plugin

# 編譯構(gòu)建
RUN sh /tmp/nacos-coredns-plugin/bin/build.sh 

# 導(dǎo)出默認(rèn)端口,tcp和udp的都要導(dǎo)出
EXPOSE 53 53/udp

VOLUME ["/etc/coredns/Corefile"]

CMD ["/go/src/coredns/coredns", "-conf", "/etc/coredns/Corefile"]

然后,構(gòu)建鏡像

docker build -t zzw/nacos-coredns .

3. 安裝Nacos

在Nacos的release頁(yè)面下載需要的包,采用單機(jī)形式啟動(dòng)Nacos服務(wù)。

Linux/Unix/Mac
啟動(dòng)命令(standalone代表著單機(jī)模式運(yùn)行,非集群模式):

sh startup.sh -m standalone

Windows
啟動(dòng)命令:

cmd startup.cmd

或者雙擊startup.cmd運(yùn)行文件。

啟動(dòng)后,在http://192.168.1.105:8848/nacos/index.html即可訪問(wèn)管理界面,默認(rèn)賬戶信息:nacos#nacos。

image.png

4. 注冊(cè)Nacos服務(wù)

在此通過(guò)Java client向Nacos注冊(cè)服務(wù),引入maven依賴:

    <dependency>
        <groupId>com.alibaba.nacos</groupId>
        <artifactId>nacos-client</artifactId>
        <version>1.0.0-RC2</version>
    </dependency>

編寫(xiě)注冊(cè)代碼:

NamingService naming = NamingFactory.createNamingService("127.0.0.1:8848");

Instance instance = new Instance();
instance.setClusterName("KanBan");
instance.setEnabled(true);
instance.setHealthy(true);
instance.setIp("192.168.0.105");
instance.setPort(8848);
instance.setServiceName("nacos.test.3");
instance.setWeight(1);

naming.registerInstance("nacos.test.3", instance);
// 保持當(dāng)前線程,使服務(wù)健康檢測(cè)能順利通過(guò)
Thread.currentThread().sleep(999999999);
image.png

5. 通過(guò)docker-compose啟動(dòng)容器

編寫(xiě)docker-compose.yml文件:

version: '3'

services:
  coredns:
    image: zzw/nacos-coredns:latest
    container_name: coredns
    restart: always
    network_mode: "bridge"
    expose:
      - '53'
      - '53/udp'
    ports:
      - "53:53"
      - "53:53/udp"
    volumes:
      - ./conf/Corefile:/etc/coredns/Corefile

./conf/Corefile即為CoreDNS配置文件,內(nèi)容如下:

. {
    nacos {
        upstream /etc/resolv.conf
        nacos_server 192.168.1.105
        nacos_server_port 8848
    }
    log
    errors
}

啟動(dòng)容器:

docker-compose up

#輸出如下

Recreating coredns ...
Recreating coredns ... done
Attaching to coredns
coredns    | log directory: /root/logs/nacos-go-client/
coredns    | register nacos plugin
coredns    | setup nacos plugin
coredns    | init nacos plugin...
coredns    | upstreams:  [192.168.65.1:53]
coredns    | init nacos client.
coredns    | .:53
coredns    | 2019-03-31T02:49:01.374Z [INFO] CoreDNS-1.2.6
coredns    | 2019-03-31T02:49:01.374Z [INFO] linux/amd64, go1.12.1,
coredns    | CoreDNS-1.2.6
coredns    | linux/amd64, go1.12.1,

啟動(dòng)成功。

6. 測(cè)試

  • 在宿主機(jī)測(cè)試是否可以正確解析“nacos.test.3”域名:
# 命令行輸入
dig @127.0.0.1 nacos.test.3

# 解析結(jié)果
; <<>> DiG 9.10.6 <<>> @127.0.0.1 nacos.test.3
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 19338
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 2

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;nacos.test.3.          IN  A

;; ANSWER SECTION:
nacos.test.3.       1   IN  A   192.168.0.105

;; ADDITIONAL SECTION:
_udp.nacos.test.3.  1   IN  SRV 0 0 8848 .

;; Query time: 2 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Sun Mar 31 10:49:15 CST 2019
;; MSG SIZE  rcvd: 105

# 命令行輸入
dig @127.0.0.1 www.baidu.com
# 解析結(jié)果
; <<>> DiG 9.10.6 <<>> @127.0.0.1 www.baidu.com
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 40970
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;www.baidu.com.         IN  A

;; ANSWER SECTION:
www.baidu.com.      376 IN  CNAME   www.a.shifen.com.
www.a.shifen.com.   376 IN  A   119.75.217.109
www.a.shifen.com.   376 IN  A   119.75.217.26

;; Query time: 47 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Sun Mar 31 10:49:59 CST 2019
;; MSG SIZE  rcvd: 149

7. 常見(jiàn)問(wèn)題

image.png
2019-03-29 10:59:32.570 ERROR failed to unmarshal json: {"count":1,"doms":{"public":["nacos.test.3"]}}json: cannot unmarshal object into Go struct field AllDomNames.doms of type []string

參考本章:1.2小結(jié)即可解決

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容