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