Service Mesh中的DNS代理具備緩衝DNS代理的功能。當Service Mesh收到來自應用程式的DNS查詢時,Sidecar代理將進行透明地攔截並提供解析能力。本文介紹如何在ASM中啟用和使用DNS代理功能。
前提條件
已建立ASM執行個體,且ASM執行個體為1.8.3.17及以上版本。具體操作,請參見建立ASM執行個體。
已添加叢集到ASM執行個體。具體操作,請參見添加叢集到ASM執行個體。
為default命名空間注入Sidecar。具體操作,請參見開啟Sidecar自動注入。
背景資訊
ACK叢集預設部署了一套DNS服務,為工作負載提供網域名稱解析功能,使得在Kubernetes叢集中啟動並執行應用程式可以使用DNS解析來發現叢集中的其他服務。
DNS伺服器運行在每個Kubernetes叢集中,每個Pod都會使用內部DNS伺服器進行網域名稱解析。預設情況下DNS請求不會被Sidecar代理攔截,並且每個應用程式都會在開啟與其他服務的串連之前嘗試解析DNS名稱。在ASM中啟用DNS代理功能後,收到來自應用程式的DNS查詢時,Sidecar代理將進行透明地攔截並提供解析能力,加快網域名稱解析的速度。
啟用DNS代理功能
情境一:全域啟用DNS代理功能
登入ASM控制台,在左側導覽列,選擇 。
在網格管理頁面,單擊目標執行個體名稱,然後在左側導覽列,選擇
。在全域頁簽下單擊DNS代理功能,開啟啟用DNS代理功能開關,單擊更新設定。
重啟Pod,使DNS配置在應用中生效。
在控制台左側導覽列,單擊叢集。
在叢集列表頁面,單擊目的地組群名稱或者目的地組群右側操作列下的詳情。
在叢集管理頁左側導覽列,選擇 。
在容器組頁面,單擊目標Pod右側操作列下的 。
在提示對話方塊,單擊確定。
稍等一段時間,容器重啟後配置生效。
情境二:針對特定命名空間啟用DNS代理功能
登入ASM控制台,在左側導覽列,選擇 。
在網格管理頁面,單擊目標執行個體名稱,然後在左側導覽列,選擇
。在Sidecar代理配置頁面,單擊命名空間頁簽。
選擇命名空間,單擊DNS代理功能,選中啟用DNS代理功能,開啟右側的開關,單擊更新設定。
重啟Pod,使DNS配置在應用中生效。
在控制台左側導覽列,單擊叢集。
在叢集列表頁面,單擊目的地組群名稱或者目的地組群右側操作列下的詳情。
在叢集管理頁左側導覽列,選擇 。
在容器組頁面,單擊目標Pod右側操作列下的 。
在提示對話方塊,單擊確定。
稍等一段時間,容器重啟後配置生效。
情境三:針對特定Pod啟用DNS代理功能
您需要在Pod的YAML檔案中添加註釋,才能為特定的Pod啟用DNS代理功能。
在控制台左側導覽列,單擊叢集。
在叢集列表頁面,單擊目的地組群名稱或者目的地組群右側操作列下的詳情。
在叢集管理頁左側導覽列,選擇 。
在無狀態頁面目標應用右側操作列下選擇 。
在編輯 YAML對話方塊中spec參數下添加以下注釋,然後單擊更新。
annotations: proxy.istio.io/config: | proxyMetadata: ISTIO_META_DNS_CAPTURE: "true" ISTIO_META_DNS_AUTO_ALLOCATE: "true"
重啟Pod,使DNS配置在應用中生效。
在控制台左側導覽列,單擊叢集。
在叢集列表頁面,單擊目的地組群名稱或者目的地組群右側操作列下的詳情。
在叢集管理頁左側導覽列,選擇 。
在容器組頁面,單擊目標Pod右側操作列下的 。
在提示對話方塊,單擊確定。
稍等一段時間,容器重啟後配置生效。
使用DNS代理功能
步驟一:建立叢集外服務
使用叢集外服務將aliyun.com添加到Service Mesh內部維護的服務註冊表中。
登入ASM控制台。
在左側導覽列,選擇 。
在網格管理頁面,找到待配置的執行個體,單擊執行個體的名稱或在操作列中單擊管理。
在網格詳情頁面左側導覽列,選擇 ,然後在右側頁面,單擊使用YAML建立。
在建立頁面選擇命名空間,選擇任意情境模版,將以下內容服務複製到文字框中,然後單擊建立。
apiVersion: networking.istio.io/v1beta1 kind: ServiceEntry metadata: name: test1-mydnsproxying spec: hosts: - aliyun.com location: MESH_EXTERNAL ports: - number: 443 name: https protocol: TLS resolution: DNS
步驟二:部署樣本應用
使用以下內容,建立名為sleep.yaml的檔案。
執行以下命令,部署Sleep應用。
kubectl apply -f sleep.yaml
執行以下命令,查看Sleep Pod是否成功啟動。
kubectl get pod |grep sleep
預期輸出:
NAME READY STATUS RESTARTS AGE sleep-66cd8f684f-nxw8v 2/2 Running 0 16m
步驟三:為Sleep容器啟用DNS代理功能
在控制台左側導覽列,單擊叢集。
在叢集列表頁面,單擊目的地組群名稱或者目的地組群右側操作列下的詳情。
在叢集管理頁左側導覽列,選擇 。
在無狀態頁面目標應用右側操作列下選擇 。
在編輯 YAML對話方塊中spec參數下添加以下注釋,然後單擊更新。
annotations: proxy.istio.io/config: | proxyMetadata: ISTIO_META_DNS_CAPTURE: "true" ISTIO_META_DNS_AUTO_ALLOCATE: "true"
重啟Pod,使DNS配置在Sleep應用中生效。
在控制台左側導覽列,單擊叢集。
在叢集列表頁面,單擊目的地組群名稱或者目的地組群右側操作列下的詳情。
在叢集管理頁左側導覽列,選擇 。
在容器組頁面,單擊Sleep容器右側操作列下的 。
在提示對話方塊,單擊確定。
稍等一段時間,容器重啟後配置生效。
步驟四:驗證使用DNS代理功能是否成功
查看istio-init容器的日誌。
在控制台左側導覽列,單擊叢集。
在叢集列表頁面,單擊目的地組群名稱或者目的地組群右側操作列下的詳情。
在叢集管理頁左側導覽列,選擇 。
在容器組頁面,單擊Sleep容器的名稱。
在容器詳情頁面單擊日誌頁簽,設定容器為istio-init。
可以看到以下日誌。
-A OUTPUT -p udp --dport 53 -d 192.168.0.10/32 -j REDIRECT --to-port 15053 -A ISTIO_OUTPUT -p tcp --dport 53 -d 192.168.0.10/32 -j REDIRECT --to-ports 15053
Sidecar代理會攔截來自應用程式容器的所有DNS查詢,攔截的方式與通過iptables規則攔截其他類型的流量相同。Istio添加了額外的iptables規則來將所有發送到Kubernetes DNS服務(例如CoreDNS服務)的連接埠53(TCP和UDP)上的DNS資料包重新導向到連接埠15053。
查看pilot-agent進程監聽的連接埠。
在叢集管理頁左側導覽列,選擇 。
在容器組頁面單擊Sleep容器右側操作列下的終端,單擊istio-proxy。
在istio-proxy容器中執行以下命令,查看pilot-agent進程監聽的連接埠。
netstat -anp |grep 15053
預期輸出:
tcp 0 0 127.0.0.1:15053 0.0.0.0:* LISTEN 1/pilot-agent udp 0 0 127.0.0.1:15053 0.0.0.0:* 1/pilot-agent
DNS查詢被重新導向到在Sidecar代理容器中啟動並執行pilot-agent進程中,可以看到該進程正在監聽連接埠15053。
訪問aliyun.com。
在叢集管理頁左側導覽列,選擇 。
在容器組頁面單擊Sleep容器右側操作列下的終端,單擊sleep。
在Sleep容器中執行以下命令,訪問aliyun.com。
curl -v https://aliyun.com
預期輸出:
* Trying 240.240.**.**:443... * Connected to aliyun.com (240.240.**.**) port 443 (#0)
可以看到返回的地址是240.240.**.**,該地址是Service Mesh自動分配的虛擬IP,而不是真實的公開的IP地址。Service Mesh使用iptables劫持了對kube-dns的請求,並將請求路由到了Pod中啟動並執行Sidecar Proxy。當應用程式Pod將aliyun.com解析為虛擬IP並發出請求時,虛擬IP將被替換為Sidecar Proxy中解析的實際公用IP地址。
為DNS代理啟用調試日誌
為DNS代理和pilot-agent啟用調試日誌後,pilot-agent將記錄來自應用程式容器的每個DNS查詢。
在控制台左側導覽列,單擊叢集。
在叢集列表頁面,單擊目的地組群名稱或者目的地組群右側操作列下的詳情。
在叢集管理頁左側導覽列,選擇 。
在無狀態頁面目標應用右側操作列下選擇 。
在編輯 YAML對話方塊中spec參數下添加以下注釋,然後單擊更新。
annotations: sidecar.istio.io/agentLogLevel: "dns:debug"
在叢集中執行以下命令,查看調試日誌。
kubectl logs -n default sleep-85fdfd8896-2ctq4 -c istio-proxy | grep debug
可以在日誌中看到
found=true
,說明DNS查詢在本地註冊表中找到了網域名稱,並將對網域名稱進行解析。