M l ops Kubernetes Docker

Tìm hiểu về Kubernetes và áp dụng vào bài toán AI - Phần 5: Kubernetes Service

Tìm hiểu về Kubernetes và áp dụng vào bài toán AI - Phần 5: Kubernetes Service

Đâ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:

  • type: Loại Service. Ở đây sử dụng NodePort để mở REST API thông qua Port của các Worker Node. Chi tiết về các loại Type, tham khảo tại đây.
  • name: Tên của Service đuọc tạo ra.

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.

  • Giá trị <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.
  • Giá trị 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