Quản lý lưu lượng Istio với Ingress Gateway - nohu52.club

| Jan 24, 2025 min read

Ngày 01 tháng 01 năm 2021 - Máy tính

Ingress Gateway của Istio là dịch vụ biên giới cho phép lưu lượng truy cập từ bên ngoài vào lưới dịch vụ Istio. Nó có khả năng mở rộng cao hơn so với Kubernetes Ingress. Hơn nữa, khi sử dụng Istio Ingress Gateway, Istio cũng có khả năng kiểm soát chính sách và quan sát đối với lưu lượng vào.

Bài viết này sẽ sử dụng ví dụ httpbin có sẵn trong sam86.vip 2023 thư mục cài đặt Istio để trình bày cách cấu hình Gateway nhằm thực hiện truy cập từ bên ngoài. Vấn đề cài đặt Istio và các bước chuẩn bị môi trường xin tham khảo tài liệu “Cài đặt và sử dụng Istio”.

1. Triển khai ví dụ httpbin

Chuyển đến thư mục cài đặt Istio và áp dụng tệp triển khai httpbin mặc định, triển khai nó vào không gian tên istio-demo.

$ cd /usr/local/istio-1.8.1
$ kubectl apply -n istio-demo -f samples/httpbin/httpbin.yaml

2. Cấu hình Gateway cho httpbin

Tạo Gateway cho httpbin.

$ kubectl apply -n istio-demo -f - <<EOF
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
 name: httpbin-gateway
spec:
 selector:
  istio: ingressgateway # sử dụng thực thi Gateway mặc định của Istio
 servers:
 - port:
   number: 80
   name: http
   protocol: HTTP
  hosts:
  - "httpbin.example.com"
EOF

Cấu hình Virtual Service cho httpbin.

$ kubectl apply -n istio-demo -f - <<EOF
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
 name: httpbin
spec:
 hosts:
 - "httpbin.example.com"
 gateways:
 - httpbin-gateway
 http:
 - match:
  - uri:
    prefix: /status
  route:
  - destination:
    port:
     number: 8000
    host: httpbin
EOF

Những lệnh trên cấu hình Gateway và VirtualService để phơi bày httpbin cho truy cập từ bên ngoài cụm. Đồng thời chỉ định rằng Host truy cập httpbin phải là httpbin.example.com và chỉ có thể truy cập tài nguyên REST bắt đầu bằng tiền tố /status. Có thể thấy rằng Istio Gateway khác với Kubernetes Ingress ở chỗ không cần cấu hình tuyến đường trong tệp triển khai Gateway mà di chuyển cấu hình tuyến đường sang VirtualService.

Tiếp theo, chúng ta sẽ kiểm tra cấu hình thông qua việc tìm kiếm INGRESS_HOST và INGRESS_PORT được sử dụng cho truy cập từ bên ngoài.

3. Truy cập bên ngoài vào httpbin

Tra cứu INGRESS_HOST và INGRESS_PORT dùng cho truy cập từ bên ngoài.

$ kubectl get svc istio-ingressgateway -n istio-system
NAME          TYPE      CLUSTER-IP    EXTERNAL-IP  PORT(S)
istio-ingressgateway  LoadBalancer  10.102.158.234  localhost   ...80:30841/TCP...

Trong bài viết này, chúng tôi đang sử dụng Kubernetes tích hợp sẵn trong Docker Desktop, vì vậy INGRESS_HOST là localhost và INGRESS_PORT là 80. Bạn cũng có thể sử dụng các lệnh sau đây để tra cứu INGRESS_HOST và INGRESS_PORT, đạt được cùng kết quả.

$ kubectl get svc istio-ingressgateway -n istio-system -o jsonpath='{.status.loadBalancer.ingress[0].hostname}'
$ kubectl get svc istio-ingressgateway -n istio-system -o jsonpath='{.spec.ports[?(@.name=="http2")].port}'

Sau đây, chúng ta sẽ thử truy cập giao diện status của httpbin thông qua lệnh curl và trình duyệt web.

Truy cập bằng lệnh curl Khi sử dụng lệnh curl dưới đây để truy cập giao diện status của httpbin, nhận thấy lỗi 404.

$ curl -s -I 
HTTP/1.1 404 Not Found
date: Fri, 01 Jan 2021 08:27:57 GMT
server: istio-envoy
transfer-encoding: chunked

Lý do là trong bước 2 của Gateway, chúng ta đã chỉ định rằng Host truy cập phải là httpbin.example.com. Sau khi thêm Header và truy cập lại, nhận thấy mã trạng thái là nohu52.club 200, truy cập thành công.

$ curl -s -I -H "Host: httpbin.example.com" 
HTTP/1.1 200 OK
server: istio-envoy
date: Fri, 01 Jan 2021 08:28:02 GMT
content-type: text/html; charset=utf-8
access-control-allow-origin: *
access-control-allow-credentials: true
content-length: 0
x-envoy-upstream-service-time: 20

Truy cập bằng trình duyệt Web Khi mở trực tiếp httpbin.example.com trong trình duyệt, nhận thấy lỗi 404. Vì chúng ta chỉ đang làm thử nghiệm và chưa cấu hình giải quyết tên miền thật sự, nên hãy thử thay đổi Gateway và VirtualService từ httpbin.example.com thành ký tự đại diện * để cho phép truy cập.

$ kubectl apply -n istio-demo -f - <<EOF
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
 name: httpbin-gateway
spec:
 selector:
  istio: ingressgateway # sử dụng thực thi Gateway mặc định của Istio
 servers:
 - port:
   number: 80
   name: http
   protocol: HTTP
  hosts:
  - "*"
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
 name: httpbin
spec:
 hosts:
 - "*"
 gateways:
 - httpbin-gateway
 http:
 - match:
  - uri:
    prefix: /status
  route:
  - destination:
    port:
     number: 8000
    host: httpbin
EOF

Như vậy, khi truy cập lại, nhận thấy mã trạng thái là 200.

4. Dọn dẹp môi trường

Sau khi hoàn thành thử nghiệm, sử dụng các lệnh sau đây để xóa cấu hình Gateway và VirtualService của httpbin.

$ kubectl delete gateway httpbin-gateway -n istio-demo
$ kubectl delete virtualservice httpbin -n istio-demo

Gỡ cài đặt httpbin.

$ cd /usr/local/istio-1.8.1
$ kubectl delete -n istio-demo -f samples/httpbin/httpbin.yaml

Tóm tắt bài viết, trước tiên chúng tôi đã giới thiệu cách sử dụng Istio Gateway để cho phép lưu lượng truy cập từ bên ngoài vào lưới dịch vụ, sau đó cấu hình Gateway cho ví dụ httpbin và thực hiện trình diễn truy cập từ bên ngoài.

[1] Istio Ingress Gateways
[2] Istio Traffic Management

#MạngDịchVụ #Istio