Đây là bài viết cuối cùng về Kubernetes trên local. Bài sau (nếu có) thì sẽ là hướng dẫn cấu hình Kubernetes trên cloud.
Trong bài này, chúng ta sẽ cùng tìm hiểu về Kubernetes Serice và áp dụng chúng vào bài toán AI.
1. Kubernetes Service là gì?
Ở bài trước, chúng ta đã biết rằng mặc dù Development rất hiệu quả trong việc giải quyết tác vụ Online Inference, nhưng nó có một nhược điểm là REST API chỉ có tác dụng trong phạm vi Cluster, không thể kết nối ra ngoài. Service chính là giải pháp để giải quyết cho vấn đề đó.
Service cung cấp một Stable Virtual IP (VIP)
với mục đích forward dữ liệu đến tới các Pods. Một tiến trình kube-poluxy
chịu trách nhiệm ánh xạ giữa VIP và các Pods (vì địa chỉ của các Pods luôn thay đổi).
2. Làm việc với Kubernetes Service
Chúng ta sẽ sử dụng lại cấu hình của Deployment trong bài trước để tạo REST API cho tác vụ Online Inference trong bài toán AI. Sau đó, sử dụng Service để mở các REST API đó ra bên ngoài.
2.1 Tạo Kubernetes Deployment
Chạy các lệnh sau để tạo và kiểm tra trạng thái của Deployment, Pods:
$ kubectl create -f development-online-inference.yaml
deployment.apps/online-inference-development created
$ kubectl get deployments
NAME READY UP-TO-DATE AVAILABLE AGE
hello-world 5/5 5 5 37m
online-inference-development 2/2 2 2 2m11s
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
online-inference-development-5d46c5c7dc-hrkrn 1/1 Running 0 12m
online-inference-development-5d46c5c7dc-r4qfz 1/1 Running 0 12m
2.2 Tạo Kubernetes Service
Sử dụng lệnh sau để tạo Service:
$ kubectl expose deployment online-inference-development --type NodePort --name online-inference-service
service/online-inference-service exposed
Một số thông tin:
Kiểm tra Service vừa tạo:
$
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 72m
online-inference-service NodePort 10.100.53.16 <none> 5000:31412/TCP 3m26s
Chú ý đến 2 thông tin: EXTERNAL-IP và PORT(S). Đây là 2 thông tin để cho các yêu cầu đến truy cập vào trong các Pods.
<none>
của EXTERNAL-IP được ngầm hiểu là IP của Worker Node, vì chúng ta đã chọn TYPE của Service là NodePort.5000:31412/TCP
của PORT(S) có nghĩa là yêu cầu từ bên ngoài Cluster gửi đến Port 31412 của Worker Node sẽ được chuyển tiếp đến Port 5000 của các Pods. TCP là giao thức trao đổi dữ liệu.Xem đầy đủ thông tin của Service:
$ kubectl describe services online-inference-service
Name: online-inference-service
Namespace: default
Labels: <none>
Annotations: <none>
Selector: app=model-api
Type: NodePort
IP Families: <none>
IP: 10.100.53.16
IPs: 10.100.53.16
Port: <unset> 5000/TCP
TargetPort: 5000/TCP
NodePort: <unset> 31412/TCP
Endpoints: 192.168.24.227:5000,192.168.24.228:5000
Session Affinity: None
External Traffic Policy: Cluster
Events: <none>
Ta có thể nhìn thấy 2 IP:PORT của 2 Pods là: 192.168.24.227:5000 và 192.168.24.228:5000
2.3 Thực hiện Online Inference
Đã cấu hình xong Service, chúng ta thử gửi một yêu cầu dự đoán từ bên ngoài Cluster xem sao:
$ curl -i -H "Content-Type: application/json" -X POST -d '{"CRIM": 15.02, "ZN": 0.0, "INDUS": 18.1, "CHAS": 0.0, "NOX": 0.614, "RM": 5.3, "AGE": 97.3, "DIS": 2.1, "RAD": 24.0, "TAX": 666.0, "PTRATIO": 20.2, "B": 349.48, "LSTAT": 24.9}' 10.1.30.130:31412/predict
HTTP/1.0 200 OK
Content-Type: application/json
Content-Length: 41
Server: Werkzeug/1.0.1 Python/3.8.6
Date: Tue, 02 Feb 2021 11:06:49 GMT
{
"prediction": 12.273424794987877
}
Có kết quả trả về, tức là chúng ta đã thành công, :)).
3. Kết luận
Đây là bài viết cuối cùng trong năm Canh Tý của mình. Xong bài này mình sẽ về quê đón tết cùng gia đình.
Bài viết đầu tiên trong năm Nhâm Sửu mình sẽ hướng dẫn các bạn cách nhận biết hiện tượng Data Driff, một vấn đề mà theo mình rất quan trong việc giải quyết các bài toán AI thực tế. Mời các bạn đón đọc!
Kính chúc mọi người năm mới AN KHANG THỊNH VƯỢNG!!!
8. Tham khảo