亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么使用Istio 1.6管理多集群中的微服務

發布時間:2021-08-05 20:13:02 來源:億速云 閱讀:155 作者:chen 欄目:云計算

本篇內容介紹了“怎么使用Istio 1.6管理多集群中的微服務”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

假如你正在一家典型的企業里工作,需要與多個團隊一起工作,并為客戶提供一個獨立的軟件,組成一個應用程序。你的團隊遵循微服務架構,并擁有由多個Kubernetes集群組成的廣泛基礎設施。

由于微服務分布在多個集群中,你需要設計一個解決方案來集中管理所有微服務。幸運的是,你正在使用Istio,提供這個解決方案只不過是另一個配置的變化。

像Istio這樣的服務網格技術可以幫助你安全地發現和連接分布在多個集群和環境中的微服務。今天我們來討論一下使用Istio管理托管在多個Kubernetes集群中的微服務。

架構說明

Istio使用以下組件提供跨集群服務發現:

  • Istio CoreDNS:每個Istio控制平面都有一個CoreDNS。Istio使用它來發現全局范圍上定義的服務。例如,如果一個托管在集群1上的微服務需要連接到另一個托管在集群2上的微服務,你需要為運行在集群2上的微服務在Istio CoreDNS上做一個全局條目。

  • Root CA:由于Istio需要在不同集群上運行的服務之間建立mTLS連接,因此需要使用共享的Root CA為兩個集群生成中間CA證書。這就在不同集群上運行的微服務之間建立了信任,因為中間CA共享同一個Root CA。

  • Istio Ingress網關:集群間的通信通過Ingress網關進行,服務之間沒有直接連接。因此,你要確保Ingress網關是可發現的,并且所有集群都可以連接到它。

怎么使用Istio 1.6管理多集群中的微服務

服務發現

Istio使用以下步驟來促進服務發現:

  1. 集群上都有相同的控制平面,以促進高可用性。

  2. Kube DNS與Istio CoreDNS為支點,以提供全局服務發現。

  3. 用戶通過Istio CoreDNS中的ServiceEntries定義遠程服務的路由,格式為name.namespace.global。

  4. 源sidecar使用全局CoreDNS條目將流量路由到目標Istio Ingress網關。

  5. 目標 Istio Ingress 網關將流量路由到正確的微服務 pod。

前期準備

本文假設你已經對Kubernetes以及Istio的工作原理有一個基本的了解。如果你想了解Istio 1.5和1.6的詳細內容,點擊此處即可查看相關視頻。為了能夠跟上我們接下來的演示,請確保:

  • 你有至少兩個Kubernetes集群,Kubernetes的版本為1.14、1.15或1.16

  • 你擁有在集群內安裝和配置Istio的權限

  • 你在兩個Kubernetes集群上都有集群管理權限。

  • Ingress網關可通過網絡負載均衡器或類似配置連接到其他集群。扁平網絡是不必要的。

安裝Istio

在兩個集群上,使用以下命令安裝Istio 1.6.1:

curl -L https://istio.io/downloadIstio | ISTIO_VERSION=1.6.1 sh -
cd istio-1.6.1
export PATH=$PWD/bin:$PATH

由于我們需要用共享的根證書生成的中間證書來啟動我們的Istio服務網格,所以使用中間證書創建一個secret。

在這個例子中,我們使用提供的樣本證書。但是,我不建議你在生產中使用這些證書,因為它們一般都是可輕松獲取的,而且是眾所周知的。最好是使用你的組織的Root CA來生成中間CA證書。

在兩個集群上運行以下命令來使用樣本證書。如果你使用的是你的證書,請替換適用的文件路徑。

kubectl create namespace istio-system
kubectl create secret generic cacerts -n istio-system \
    --from-file=samples/certs/ca-cert.pem \
    --from-file=samples/certs/ca-key.pem \
    --from-file=samples/certs/root-cert.pem \
    --from-file=samples/certs/cert-chain.pem
secret/cacerts created

由于我們需要安裝Istio進行多集群設置,所以在兩個集群上使用提供的Istio多集群網關manifest文件。

$ istioctl manifest apply -f install/kubernetes/operator/examples/multicluster/values-istio-multicluster-gateways.yaml
- Applying manifest for component Base...
? Finished applying manifest for component Base.
- Applying manifest for component Pilot...
? Finished applying manifest for component Pilot.
  Waiting for resources to become ready...
- Applying manifest for component AddonComponents...
- Applying manifest for component IngressGateways...
- Applying manifest for component EgressGateways...
? Finished applying manifest for component EgressGateways.
? Finished applying manifest for component IngressGateways.
? Finished applying manifest for component AddonComponents.
? Installation complete

配置KubeDNS

下一步是將DNS解析從Kube DNS聯邦到Istio CoreDNS。讓我們通過為kube-dns定義一個ConfigMap來配置一個存根域。在兩個集群上應用以下manifest:

$ kubectl apply -f - <<EOF
apiVersion: v1
kind: ConfigMap
metadata:
  name: kube-dns
  namespace: kube-system
data:
  stubDomains: |
    {"global": ["$(kubectl get svc -n istio-system istiocoredns -o jsonpath={.spec.clusterIP})"]}
EOF

configmap/kube-dns configured

設置上下文(context)

由于我們需要為不同得活動連接兩個集群,因此獲取上下文并將其存儲在環境變量中會很有意義。有了這些,我們只要在kubectl命令中加入上下文,就可以在我們選擇得集群中運行kubectl命令。

獲取上下文:

$ kubectl config get-contexts
CURRENT   NAME        CLUSTER     AUTHINFO      NAMESPACE
          cluster-1   cluster-1   cluster-1
*         cluster-2   cluster-2   cluster-2

設置環境變量以使用上下文:

$ export CTX_CLUSTER1=$(kubectl config view -o jsonpath='{.contexts[0].name}')
$ export CTX_CLUSTER2=$(kubectl config view -o jsonpath='{.contexts[1].name}')
$ echo CTX_CLUSTER1 = ${CTX_CLUSTER1}, CTX_CLUSTER2 = ${CTX_CLUSTER2}
CTX_CLUSTER1 = cluster-1, CTX_CLUSTER2 = cluster-2

部署示例微服務

我們先在集群1的foo命名空間上部署sleep微服務。

$ kubectl create --context=$CTX_CLUSTER1 namespace foo
namespace/foo created
$ kubectl label --context=$CTX_CLUSTER1 namespace foo istio-injection=enabled
namespace/foo labeled
$ kubectl apply --context=$CTX_CLUSTER1 -n foo -f samples/sleep/sleep.yaml
serviceaccount/sleep created
service/sleep created
deployment.apps/sleep created
$ export SLEEP_POD=$(kubectl get --context=$CTX_CLUSTER1 -n foo pod -l app=sleep -o jsonpath={.items..metadata.name})

現在我們在集群2的bar命名空間上部署httpbin微服務:

$ kubectl create --context=$CTX_CLUSTER2 namespace bar
namespace/bar created
$ kubectl label --context=$CTX_CLUSTER2 namespace bar istio-injection=enabled
namespace/bar labeled
$ kubectl apply --context=$CTX_CLUSTER2 -n bar -f samples/httpbin/httpbin.yaml
serviceaccount/httpbin created
service/httpbin created
deployment.apps/httpbin created

創建服務條目

現在我們需要在Istio CoreDNS上創建一個服務條目以便于我們可以從集群1中發現集群2上的服務。由于所有的通信都會通過Ingress 網關,導出集群2 Ingress網關地址。

export CLUSTER2_GW_ADDR=$(kubectl get --context=$CTX_CLUSTER2 svc --selector=app=istio-ingressgateway \
    -n istio-system -o jsonpath='{.items[0].status.loadBalancer.ingress[0].ip}')

為了讓集群1上的服務能夠發現集群2上的httpbin,我們需要在集群1上為httpbin.bar.global創建一個ServiceEntry。這樣可以保證集群1上的Istio Core DNS在集群1上的服務到達httpbin.bar.global這個端點時,可以到達集群2的Ingress網關。下面的yaml:

  • 在hosts部分定義服務域名

  • 位置是mesh_INTERNAL,因為我們需要把其他服務當作同一個服務網格的一部分

  • 將服務暴露在8000端口上

  • 我們需要給該服務提供一個獨特的IP地址。該IP地址不需要可路由,并且你可以使用240.0.0.0/16范圍內的任意地址

  • 我們在端點地址部分上定義集群2 ingress網關地址,以便于請求可以路由給它。端口15443是Ingress網關的SNI識別的Envoy代理端口,用于在目標群集服務的Pod之間路由流量。

應用yaml文件:

$ kubectl apply --context=$CTX_CLUSTER1 -n foo -f - <<EOF
apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:
  name: httpbin-bar
spec:
  hosts:
  - httpbin.bar.global
  location: MESH_INTERNAL
  ports:
  - name: http1
    number: 8000
    protocol: http
  resolution: DNS
  addresses:
  - 240.0.0.2
  endpoints:
  - address: ${CLUSTER2_GW_ADDR}
    ports:
      http1: 15443 # Do not change this port value
EOF

serviceentry.networking.istio.io/httpbin-bar created

測試服務

現在讓我們從sleep微服務中產生一些流量,看看它是否能到達集群2上運行的httpbin微服務。

$ kubectl exec --context=$CTX_CLUSTER1 $SLEEP_POD -n foo -c sleep -- curl -I httpbin.bar.global:8000/headers
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0HTTP/1.1 200 OK
  0   519    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
server: envoy
date: Sat, 16 May 2020 23:03:22 GMT
content-type: application/json
content-length: 519
access-control-allow-origin: *
access-control-allow-credentials: true
x-envoy-upstream-service-time: 37

我們得到一個成功的響應!恭喜你,我們已經成功地使用Istio在多個Kubernetes集群之間配置了服務發現。

“怎么使用Istio 1.6管理多集群中的微服務”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

含山县| 阿克苏市| 泸州市| 陆河县| 乐至县| 鄂托克旗| 措勤县| 梅河口市| 榆林市| 高清| 延吉市| 新营市| 平泉县| 德惠市| 象州县| 北流市| 上蔡县| 柳江县| 湘潭市| 株洲县| 萝北县| 肥乡县| 罗城| 资讯| 蓝田县| 辰溪县| 社会| 邵东县| 黄浦区| 汉阴县| 武夷山市| 兴城市| 西安市| 徐水县| 阳谷县| 乡宁县| 神农架林区| 镇坪县| 泸水县| 榆社县| 繁峙县|