1.1、背景
創(chuàng)新互聯(lián)公司專業(yè)為企業(yè)提供克什克騰網(wǎng)站建設(shè)、克什克騰做網(wǎng)站、克什克騰網(wǎng)站設(shè)計、克什克騰網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計與制作、克什克騰企業(yè)網(wǎng)站模板建站服務(wù),10多年克什克騰做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價值的思路和整體網(wǎng)絡(luò)服務(wù)。
寫這篇文章的目的是為了說明以下問題:如何使用TCP協(xié)議相同的端口訪問網(wǎng)格外多個服務(wù)? 這是最近直播的時候有一個同學(xué)提出的,當(dāng)時我沒有完全明白,“訪問多集群” 的意思。后來仔細(xì)思考了一下,問題應(yīng)該就是Istio服務(wù)網(wǎng)格內(nèi)如何通過相同的協(xié)議,端口訪問不同的服務(wù)。
1.2、使用場景
肯定會有人回答,既然相同的端口不能使用,何不換一個端口呢,這樣做也是一種解決方法。我在想有一些場景一定沒法或者不方便繞過去。
1) 假如同一個網(wǎng)格內(nèi)部署了生產(chǎn),測試,開發(fā)三套環(huán)境,都需要通過3306端口訪問對應(yīng)環(huán)境的MySQL數(shù)據(jù)庫。
2) 假如同一個網(wǎng)格內(nèi)部署了生產(chǎn),測試,開發(fā)三套環(huán)境,都需要通過6379端口訪問對應(yīng)環(huán)境的redis。
在微服務(wù)盛行的今天,往往需要團(tuán)隊(duì)之間協(xié)作,沒辦法保證所有的微服務(wù)都運(yùn)行在同一服務(wù)網(wǎng)格內(nèi)。尤其是中間件服務(wù),作為公司公共服務(wù),一定是業(yè)務(wù)共享的。既然我們不可避免的需要使用相同的端口,訪問外部服務(wù),接下來告訴大家兩種方案解決以上問題。
1.3、解決方案
通過相同的端口443訪問 https://github.com 和 https://www.huaweicloud.com,從網(wǎng)格內(nèi)訪問外部服務(wù),需要分別創(chuàng)建對應(yīng)的ServiceEntentry:
1) www.huaweicloud.com
cat < apiVersion: networking.istio.io/v1alpha3 kind: ServiceEntry metadata: name: hwcloud spec: hosts: www.huaweicloud.com ports: number: 443 name: tcp protocol: TCP resolution: DNS location: MESH_EXTERNAL EOF 2) github.com cat < apiVersion: networking.istio.io/v1alpha3 kind: ServiceEntry metadata: name: github spec: hosts: github.com ports: number: 443 name: tcp protocol: TCP resolution: DNS location: MESH_EXTERNAL EOF 兩條規(guī)則建好之后,等待pilot將新的配置下發(fā)到所有的proxy,我們通過sleep pod驗(yàn)證連通性 $ kubectl exec sleep-754684654f-trpt2 -- curl -sL -o /dev/null https://www.huaweicloud.com –v … < HTTP/1.1 200 OK < Server: NWSs < Date: Fri, 21 Dec 2018 02:23:11 GMT < Content-Type: text/html;charset=utf-8 < Content-Length: 703122 < Connection: keep-alive < Cache-Control: public, max-age=600 < Expires: Fri, 21 Dec 2018 02:33:10 GMT < Last-Modified: Thu, 20 Dec 2018 10:30:00 GMT < X-NWS-LOG-UUID: 0d13017f-8767-4399-a509-6c11b2a9f3d0 < Access-Control-Allow-Origin: * < dl-from: qcloud < X-Cache-Lookup: Hit From Disktank3 < X-Via: LIANTONG-HENAN_171(200:hit) < { [15930 bytes data] kubectl exec sleep-754684654f-trpt2 -- curl -sL -o /dev/null https://github.com –v -k … < HTTP/1.1 404 Not Found < Server: NWSs < Date: Fri, 21 Dec 2018 02:29:26 GMT < Content-Type: text/html < Content-Length: 52 < Connection: keep-alive < X-NWS-LOG-UUID: b283fee3-89e0-48bc-8d6e-0c3a68ecc4bf < X-Via: LIANTONG-HENAN_25(404:hit) < { [52 bytes data] 由此可見可以在網(wǎng)格內(nèi)部訪問https://www.huaweicloud.com,但是不可以訪問https://github.com. 這里有一個原因是istio會將ServiceEntry規(guī)則按照創(chuàng)建時間排序,創(chuàng)建時間較早的優(yōu)先級高,所以先創(chuàng)建的 hwcloud ServiceEntry生效。 可以查看sleep pod上的配置來確認(rèn):listener配置只有到華為云的cluster"outbound|443||www.huaweicloud.com" $ istioctl pc listener sleep-754684654f-trpt2 --address=0.0.0.0 --port=443 -ojson [ ] 為了同時訪問兩者,這里我提供兩種方法: 1.3.1創(chuàng)建ServiceEntry時指定Address 查詢www.huaweicloud.com域名綁定的ip地址,選擇一個或者多個更新hwcloud ServiceEntry 同樣的方法更新 github 驗(yàn)證https://www.huaweicloud.com和https://github.com均可以從網(wǎng)格內(nèi)訪問,因?yàn)橹付藄pec.addresses 后,pilot生成listener使就會使用指定的ip地址代替‘0.0.0.0’的全匹配方式。 雖然著這種方式一定程度上可以解決同一端口訪問外部服務(wù)的需求。但是由于需要提前設(shè)置ip地址,所以在ip經(jīng)常變動的場景下缺少靈活性。下面提供一種更靈活的方法。 1.3.2 指定ServiceEntry的作用域 Istio社區(qū)最近實(shí)現(xiàn)了網(wǎng)絡(luò)的配置作用域特性:https://github.com/istio/istio/pull/10287, 允許用戶設(shè)置相應(yīng)規(guī)則的作用域范圍。 目前 ServiceEntry,VirtualService,Gateway, DestinationRule等都可以通過spec.configScope設(shè)置作用范圍。ConfigScope 可以設(shè)置為"PUBLIC","PRIVATE"類型。 "PUBLIC" 表示規(guī)則對網(wǎng)格內(nèi)所有的工作負(fù)載可見,這也是默認(rèn)值。 "PRIVATE" 表示規(guī)則僅對同一namespace下面的工作負(fù)載可見。 因此可以利用ConfigScope將github以及hwcloud都設(shè)置成PRIVATE,分別創(chuàng)建在兩個不同的namespace下面。這樣也可以做到ns1內(nèi)的工作負(fù)載訪問https://github.com, ns2內(nèi)的工作負(fù)載訪問https://www.huaweicloud.com . cat < apiVersion: networking.istio.io/v1alpha3 kind: ServiceEntry metadata: name: github namespace: ns1 spec: hosts: github.com ports: number: 443 name: tcp protocol: TCP resolution: DNS location: MESH_EXTERNAL configScope: PRIVATE EOF cat < apiVersion: networking.istio.io/v1alpha3 kind: ServiceEntry metadata: name: hwcloud namespace: ns2 spec: hosts: www.huaweicloud.com ports: number: 443 name: tcp protocol: TCP resolution{
"name": "0.0.0.0_443",
"address": {
"socketAddress": {
"address": "0.0.0.0",
"portValue": 443
}
},
"filterChains": [
{
"filters": [
{
"name": "mixer",
…
},
{
"name": "envoy.tcp_proxy",
"config": {
"access_log": [
{
…
}
],
"cluster": "outbound|443||www.huaweicloud.com",
"stat_prefix": "outbound|443||www.huaweicloud.com"
}
}
]
}
],
…
}
標(biāo)題名稱:Istio如何使用相同的端口訪問網(wǎng)格外服務(wù)
文章位置:http://weahome.cn/article/ipogdo.html