首頁 > 軟體

基於域名的方式存取Istio服務網格中的多個應用程式的方法詳解

2022-07-15 14:04:27

1.為什麼要使用域名存取部署在Istio中的程式

我們在Istio中部署的程式一定不止有一個,前面我們已經在Istio中部署了Httpbin、Bookinfo、Nginx這三個應用程式,但是我們使用節點IP加NodePort埠的方式永遠只是請求到了一個應用程式,就好比我們已經實現了Nginx的基於埠的存取模式,不過每個應用程式都是用的是80埠,才導致只存取到了一個應用程式,在實際生產中,Istio中一定會部署很多個應用程式,我們需要實現基於域名來存取不同的應用程式。

應用部署在Istio之後,將程式對外發布,會建立Gateway以及VirtualService資源,我們只需要在這兩個資源中宣告程式使用的域名,就可以接受來自LB的請求轉發,LB的請求中會攜帶主機頭,從而轉發到對應的應用程式。

當然也可以不額外佔用伺服器去搭建LB產品,我們可以在K8S叢集中搭建一個Nginx服務,由K8S中的Nginx服務接收80埠流量請求轉發至IngressGateway,為什麼不使用Ingress呢,Ingress需要為每一個網站建立資源編排檔案,如果域名很多的情況下,設定比較繁瑣。

如下圖所示:使用者請求bookinfo的專案,在瀏覽器中輸入bookinfo.jiangxl.com域名,由DNS解析到LB負載均衡器,LB負載均衡器會將請求轉發到IngressGateway中,IngressGateway根據請求頭中的域名,將請求轉發到對應的Gateway中,然後在將請求轉發到應用程式的Service資源,最後由應用程式的Pod資源提供應用程式的服務。

2.通過域名的方式存取Istio網格中的應用程式

2.1.設定Gateway和VirtualService資源

設定每個應用程式的Gateway以及VirtualService資源,為應用程式繫結使用的域名,繫結後只有這個域名的流量請求才會被轉發到這個Gateway以及VirtualService資源上。

2.1.1.修改httpbin程式的Gateway和VirtualService資源

1)設定Gateway以及VirtualService資源繫結域名

[root@k8s-master istio-1.8.2]# vim samples/httpbin/httpbin-gateway.yaml 
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: httpbin-gateway
spec:
  selector:
    istio: ingressgateway
  servers:
  - port:
      number: 80
      name: http
      protocol: HTTP
    hosts:
    - "httpbin.jiangxl.com"				#在hosts中繫結程式的域名
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: httpbin
spec:
  hosts:
  - "httpbin.jiangxl.com"				#同樣在hosts中管理程式的域名
  gateways:
  - httpbin-gateway
  http:
  - route:
    - destination:
        host: httpbin
        port:
          number: 8000

2)更新httpbin程式的GW和VS資源

[root@k8s-master istio-1.8.2]# kubectl apply -f samples/httpbin/httpbin-gateway.yaml
gateway.networking.istio.io/httpbin-gateway created
virtualservice.networking.istio.io/httpbin created

2.1.2.修改bookinfo程式的Gateway和VirtualService資源

1)設定Gateway以及VirtualService資源繫結域名

[root@k8s-master istio-1.8.2]# vim samples/bookinfo/networking/bookinfo-gateway.yaml 
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: bookinfo-gateway
spec:
  selector:
    istio: ingressgateway # use istio default controller
  servers:
  - port:
      number: 80
      name: http
      protocol: HTTP
    hosts:
    - "bookinfo.jiangxl.com"
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: bookinfo
spec:
  hosts:
  - "bookinfo.jiangxl.com"
  gateways:
  - bookinfo-gateway
  http:
  - match:
    - uri:
        exact: /productpage
    - uri:
        prefix: /static
    - uri:
        exact: /login
    - uri:
        exact: /logout
    - uri:
        prefix: /api/v1/products
    route:
    - destination:
        host: productpage
        port:
          number: 9080

2)更新bookinfo程式的GW和VS資源

[root@k8s-master istio-1.8.2]# kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml -n bookinfo
gateway.networking.istio.io/bookinfo-gateway configured
virtualservice.networking.istio.io/bookinfo configured

2.1.3.修改nginx程式的Gateway和VirtualService資源

1)設定Gateway以及VirtualService資源繫結域名

[root@k8s-master istio-1.8.2]# vim samples/myproject/nginx-gateway.yaml 
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: nginx-gateway
  namespace: istio-project
spec:
  selector:
    istio: ingressgateway
  servers:
  - port:
      number: 80
      name: http
      protocol: HTTP
    hosts:
    - "nginx.jiangxl.com"
[root@k8s-master istio-1.8.2]# vim samples/myproject/nginx-virtualservice.yaml 
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: nginx-vs
  namespace: istio-project
spec:
  hosts:
  - "nginx.jiangxl.com"
  gateways:
  - nginx-gateway
  http:
  - route:
    - destination:
        host: nginx-svc
        subset: v1
      weight: 100
    mirror:
      host: nginx-svc
      subset: v2
    mirror_percent: 100

2)建立nginx程式的GW和VS資源

[root@k8s-master istio-1.8.2]# kubectl apply -f samples/myproject/nginx-gateway.yaml 
gateway.networking.istio.io/nginx-gateway configured
[root@k8s-master istio-1.8.2]# kubectl apply -f samples/myproject/nginx-virtualservice.yaml 
virtualservice.networking.istio.io/nginx-vs configured

2.2.設定LB代理Istio的IngressGateway

LB負載均衡我們採用Nginx來實現,由Nginx去反向代理IngressGateway的NodePort埠來實現基於域名去存取Istio中的程式。

1.安裝Nginx
[root@lb~]# yum -y install nginx
2.設定Nginx反向代理Istio的IngressGateway
[root@lb~]# vim /etc/nginx/conf.d/istio-ingressgateway.conf
server {
        listen 80;
        server_name _;

        location / {
                proxy_http_version 1.1;			#開啟http的1.1版本協定,istio是1.1版本,nginx預設1.0版本
                proxy_set_header Host $host;			#代理轉發時攜帶請求的主機頭
                proxy_pass http://192.168.20.10:31105;		#代理到istio的IngressGateway
        }
}
3.啟動Nginx
[root@lb~]# systemctl restart nginx

3.基於域名來存取Istio中的各個程式

測試之前先將域名解析寫入本地hosts檔案。

192.168.20.13 httpbin.jiangxl.com bookinfo.jiangxl.com nginx.jiangxl.com

1)httpbin程式的存取

2)bookinfo程式的存取

3)nginx程式的存取

到此這篇關於基於域名的方式存取Istio服務網格中的多個應用程式的文章就介紹到這了,更多相關Istio服務網格內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com