#[Member] #ETCD_CORS="" ETCD_DATA_DIR="/var/lib/etcd/default.etcd" #ETCD_WAL_DIR="" #ETCD_LISTEN_PEER_URLS="http://localhost:2380" ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379" #ETCD_MAX_SNAPSHOTS="5" #ETCD_MAX_WALS="5" ETCD_NAME="default" #ETCD_SNAPSHOT_COUNT="100000" #ETCD_HEARTBEAT_INTERVAL="100" #ETCD_ELECTION_TIMEOUT="1000" #ETCD_QUOTA_BACKEND_BYTES="0" #ETCD_MAX_REQUEST_BYTES="1572864" #ETCD_GRPC_KEEPALIVE_MIN_TIME="5s" #ETCD_GRPC_KEEPALIVE_INTERVAL="2h0m0s" #ETCD_GRPC_KEEPALIVE_TIMEOUT="20s" # #[Clustering] #ETCD_INITIAL_ADVERTISE_PEER_URLS="http://localhost:2380" ETCD_ADVERTISE_CLIENT_URLS="http://192.168.2.155:2379" #ETCD_DISCOVERY="" #ETCD_DISCOVERY_FALLBACK="proxy" #ETCD_DISCOVERY_PROXY="" #ETCD_DISCOVERY_SRV="" #ETCD_INITIAL_CLUSTER="default=http://localhost:2380" #ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster" #ETCD_INITIAL_CLUSTER_STATE="new" #ETCD_STRICT_RECONFIG_CHECK="true" #ETCD_ENABLE_V2="true" # #[Proxy] #ETCD_PROXY="off" #ETCD_PROXY_FAILURE_WAIT="5000" #ETCD_PROXY_REFRESH_INTERVAL="30000" #ETCD_PROXY_DIAL_TIMEOUT="1000" #ETCD_PROXY_WRITE_TIMEOUT="5000" #ETCD_PROXY_READ_TIMEOUT="0" # #[Security] ETCD_CERT_FILE="/ssl/server.pem" ETCD_KEY_FILE="/ssl/server-key.pem" #ETCD_CLIENT_CERT_AUTH="false" #ETCD_TRUSTED_CA_FILE="" #ETCD_AUTO_TLS="false" #ETCD_PEER_CERT_FILE="" #ETCD_PEER_KEY_FILE="" #ETCD_PEER_CLIENT_CERT_AUTH="false" #ETCD_PEER_TRUSTED_CA_FILE="" #ETCD_PEER_AUTO_TLS="false" # #[Logging] #ETCD_DEBUG="false" #ETCD_LOG_PACKAGE_LEVELS="" #ETCD_LOG_OUTPUT="default" # #[Unsafe] #ETCD_FORCE_NEW_CLUSTER="false" # #[Version] #ETCD_VERSION="false" #ETCD_AUTO_COMPACTION_RETENTION="0" # #[Profiling] #ETCD_ENABLE_PPROF="false" #ETCD_METRICS="basic" # #[Auth] #ETCD_AUTH_TOKEN="simple"
export ETCDCTL_API=3
[Unit] Description=Etcd Server After=network.target After=network-online.target Wants=network-online.target [Service] Type=notify WorkingDirectory=/var/lib/etcd/ EnvironmentFile=-/etc/etcd/etcd.conf User=etcd # set GOMAXPROCS to number of processors ExecStart=/bin/bash -c "GOMAXPROCS=$(nproc) /usr/bin/etcd --name=\"${ETCD_NAME}\" --data-dir=\"${ETCD_DATA_DIR}\" --listen-client-urls=\"${ETCD_LISTEN_CLIENT_URLS}\" --cert-file=\"${ETCD_CERT_FILE}\" --key-file=\"${ETCD_KEY_FILE}\" --advertise-client-urls=\"${ETCD_ADVERTISE_CLIENT_URLS}\"" Restart=on-failure LimitNOFILE=65536 [Install] WantedBy=multi-user.target
.:53 { health # 監聽tcp和udp的53端口 etcd { # 配置啓用etcd插件,後面能夠指定域名,例如 etcd test.com { stubzones # 啓用存根區域功能。 stubzone僅在位於指定的第一個區域下方的etcd樹中完成 path /coredns # etcd裏面的路徑 默認爲/skydns,之後全部的dns記錄就是存儲在該存根路徑底下 endpoint http://localhost:2379 # etcd訪問地址,多個空格分開 # upstream設置要使用的上游解析程序解決指向外部域名的在etcd(認爲CNAME)中找到的外部域名。 upstream 114.114.114.114:53 8.8.8.8:53 /etc/resolv.conf fallthrough # 若是區域匹配但不能生成記錄,則將請求傳遞給下一個插件 # tls CERT KEY CACERT # 可選參數,etcd認證證書設置 tls /ssl/server.pem /ssl/server-key.pem /ssl/ca.pem # 指定訪問etcd用戶名和密碼(根據實際狀況使用) credentials USERNAME PASSWORD } prometheus # 監控插件 cache 160 # 緩存時間 loop # reload 6s # 自動加載時間間隔 loadbalance # 負載均衡,開啓DNS記錄輪詢策略 forward . /etc/resolv.conf # 上面etcd未查詢到的請求轉發給設置的DNS服務器解析 log # 打印日誌 errors # 輸出錯誤 }
[Unit] Description=CoreDNS DNS server Documentation=https://coredns.io After=network.target [Service] PermissionsStartOnly=true LimitNOFILE=1048576 LimitNPROC=512 CapabilityBoundingSet=CAP_NET_BIND_SERVICE AmbientCapabilities=CAP_NET_BIND_SERVICE NoNewPrivileges=true User=coredns WorkingDirectory=~ ExecStart=/usr/bin/coredns -conf=/etc/coredns/Corefile ExecReload=/bin/kill -SIGUSR1 $MAINPID Restart=on-failure [Install] WantedBy=multi-user.target
A記錄 % etcdctl put /coredns/com/leffss/www '{"host":"1.1.1.1","ttl":10}' OK * etcd的目錄結構和域名是相反的,即上面表示域名:www.leffss.com * ttl值設置60s後,coredns每60s纔會到etcd讀取這個域名的記錄一次 查詢結果: % dig @localhost +short www.leffss.com 1.1.1.1 若是想添加多條記錄,讓coredns輪詢,方法以下: % etcdctl put /coredns/com/leffss/www/x1 '{"host":"1.1.1.2","ttl":10}' OK % etcdctl put /coredns/com/leffss/www/x2 '{"host":"1.1.1.3","ttl":10}' OK * x1和x2能夠自定義,好比a、b、c等 * 設置多個AAAA、CNAME等方法相似 * 添加/coredns/com/leffss/www/x一、x2後,請求www.leffss.com就不會再讀取/coredns/com/leffss/www,可使用etcdctl del /coredns/com/leffss/www刪除值 查詢結果: % dig @localhost +short www.leffss.com 1.1.1.21.1.1.3 **注意:**若是想讓取消設置的輪詢值,須要刪除/coredns/com/leffss/www/x1與/coredns/com/leffss/www/x2 AAAA記錄 % etcdctl put /coredns/com/leffss/www '{"host":"1002::4:2","ttl":10}' OK 查詢結果: % dig -t AAAA @localhost +short www.leffss.com 1002::4:2 CNAME記錄 % etcdctl put /coredns/com/leffss/www '{"host":"www.baidu.com","ttl":10}' OK 查詢結果: % dig -t CNAME @localhost +short www.leffss.com www.baidu.com. * 這裏cname設置成外部百度域名,按理說coredns應該也把這個cname記錄繼續解析成www.baidu.cm的IP地址,可是通過測試發現請求www.leffss.com只能解析到CNAME:www.baidu.com,沒法繼續解析,緣由未知,之後研究 SRV記錄 % etcdctl put /coredns/com/leffss/www '{"host":"www.baidu.com","port":80,"ttl":10}' OK * SRV記錄和CNAME記錄相似,只是多了port,它們的添加方法其實能夠通用 查詢結果: % dig -t SRV @localhost +short www.leffss.com 10 100 80 www.baidu.com. TXT記錄 % etcdctl put /coredns/com/leffss/www '{"text":"This is text!","ttl":10}' OK 查詢結果: % dig -t TXT @localhost +short www.leffss.com "This is text!"
public static void main(String[] args) throws Exception {
// create client
Client client = Client.builder().endpoints("http://192.168.2.155:2379").build(); KV kvClient = client.getKVClient(); ByteSequence key = ByteSequence.from(formatKey("www.leffss.com"), Charset.forName("UTF-8")); ByteSequence value = ByteSequence.from(formatValue("192.168.2.133", 53), Charset.forName("UTF-8")); // put the key-value kvClient.put(key, value).get(); // get the CompletableFuture CompletableFuture<GetResponse> getFuture = kvClient.get(key); // get the value from CompletableFuture GetResponse response = getFuture.get(); List<KeyValue> keyValues = response.getKvs(); for (KeyValue kv : keyValues) { System.out.println("key :" + kv.getKey().toString(Charset.forName("UTF-8")) + " val :" + kv.getValue().toString(Charset.forName("UTF-8"))); }
<dependency> <groupId>dnsjava</groupId> <artifactId>dnsjava</artifactId> <version>2.1.8</version> </dependency> <dependency> <groupId>io.etcd</groupId> <artifactId>jetcd-core</artifactId> <version>0.3.0</version> </dependency>
cat > ca-config.json <<EOF
{
"signing": { "default": { "expiry": "87600h" }, "profiles": { "www": { "expiry": "87600h", "usages": [ "signing", "key encipherment", "server auth", "client auth" ] } } } } EOF cat > ca-csr.json <<EOF { "CN": "etcd CA", "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "CN", "L": "hunan", "ST": "changsha" } ] } EOF cfssl gencert -initca ca-csr.json | cfssljson -bare ca - #----------------------- cat > server-csr.json <<EOF { "CN": "etcd", "hosts": [ "192.168.2.155", "127.0.0.1" ], "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "CN", "L": "hunan", "ST": "changsha" } ] } EOF cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=www server-csr.json | cfssljson -bare server // 單機模式tls cat > ca-config.json <<EOF { "signing": { "default": { "expiry": "87600h" }, "profiles": { "server": { "expiry": "87600h", "usages": [ "signing", "key encipherment", "server auth", "client auth" ] }, "client": { "expiry": "87600h", "usages": [ "signing", "key encipherment", "server auth", "client auth" ] } } } } EOF cat > ca-csr.json <<EOF { "CN": "etcd CA", "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "CN", "L": "hunan", "O": "thyc", "ST": "changsha" } ] } EOF # 使用定義好的簽名生成證書 cfssl gencert -initca ca-csr.json | cfssljson -bare ca - # 生成服務器證書 # ----------------------- cat > server-csr.json <<EOF { "CN": "etcd", "hosts": [ "192.168.2.155", "127.0.0.1" ], "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "CN", "L": "hunan", "O": "thyc", "ST": "changsha" } ] } EOF # 生成服務器證書 cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=server server-csr.json | cfssljson -bare server
注意:java
本博文中涉及到的ip請根據本身部署的服務器ip進行調整。linux
如啓用tls後,你須要用java去鏈接etcd作域名解析記錄的添加修改等,你須要引入ca.pem到你的java項目目錄中。git