Mã hóa trang tổng quan thời gian thực cho Kubernetes
Trong Kubernetes, bạn có thể sử dụng Shared Informer - một mẫu mã hiệu quả để theo dõi những thay đổi trong tài nguyên Kubernetes. Trong bài viết này, Bizfly Cloud sẽ cùng bạn sẽ tìm hiểu cách nó hoạt động và cách bạn có thể xây dựng một bảng điều khiển thời gian thực cho Kubernetes.
Xây dựng trang tổng quan thời gian thực cho Pod
Hãy tưởng tượng bạn muốn xây dựng một bảng điều khiển thời gian thực để theo dõi vị trí của các Pod trong các Nút của bạn.
Ví dụ:
Khi một Pod mới được thêm vào, một khối màu xanh lá cây sẽ được tạo trong một Node. Và một Pod hiện có bị xóa, một khối màu xanh lá cây sẽ bị xóa khỏi Node.
Tuy nhiên, trước khi có thể sử dụng API, bạn cần:
- Lưu trữ một trang web tĩnh nơi bạn có thể phân phát HTML, CSS và Javascript.
- Truy cập API Kubernetes
Bạn cần tạo một thư mục cục bộ với một index.html tệp:
mkdir k8bit
cd k8bit
echo "<!DOCTYPE html><title>⎈</title><h1>Hello world!" > index.html
Trong cùng một thư mục, hãy bắt đầu một proxy kubectl cũng cung cấp nội dung tĩnh với:
kubectl proxy --www=.
Starting to serve on 127.0.0.1:8001
Bạn đã học cách kubectl proxy tạo một đường hầm từ máy cục bộ của bạn đến máy chủ API bằng thông tin đăng nhập của bạn.
Nếu bạn sử dụng cờ, --www=<folder> bạn cũng có thể phân phát nội dung tĩnh từ một thư mục cụ thể.
Nội dung tĩnh được cung cấp /static theo mặc định, nhưng bạn cũng có thể tùy chỉnh nội dung đó bằng cờ --www-prefix='/<my-url>/'.
Lưu ý rằng việc cung cấp API và các nội dung tĩnh trong cùng một miền giúp bạn không phải xử lý các quyền CORS .
Hãy xem liệu bạn cũng có thể kết nối với Kubernetes API.
Tạo một tệp Javascript có tên app.js với nội dung sau:
app.js
fetch(`/api/v1/pods`)
.then((response) => response.json())
.then((podList) => {
const pods = podList.items
const podNames = pods.map(it => it.metadata.name)
console.log('PODS:', podNames)
})
Bạn có thể đưa tập lệnh vào HTML với:
echo '<script src= >> index.html
Bạn có thể sử dụng watch chuỗi truy vấn và nhận cập nhật kịp thời về các Nhóm được thêm hoặc xóa.
Mã trong Javascript có thể thực hiện như sau:
dashboard.js
fetch(`/api/v1/pods?watch=1`).then((response) => {
/* read line and parse it to json */
})
Mặc dù lệnh gọi ban đầu tới API cũng được thực hiện tương tự, nhưng việc xử lý phản hồi phức tạp hơn. Bởi vì phản hồi không bao giờ kết thúc và vẫn mở, bạn phải phân tích cú pháp các trọng tải đến khi chúng đến.
Ngoài ra, bạn cũng cần phân tích cú pháp các phản hồi JSON mỗi khi có một dòng mới.
Theo dõi các thay đổi
API đồng hồ chỉ theo dõi các bản cập nhật và nó có bộ nhớ 5 phút. Vì vậy, bạn có thể nhận các bản cập nhật cho Nhóm đã được tạo hoặc xóa cách đây tối đa 5 phút.
Bạn có thể kiểm tra trường trong cụm hiện có của mình bằng cách:
kubectl get pod <my-pod> -o=jsonpath='{.metadata.resourceVersion}'
464927
Phiên bản tài nguyên tăng dần và nó được bao gồm trong các sự kiện từ API đồng hồ.
Khi bạn liệt kê tất cả các Nhóm của mình, điều tương tự cũng resourceVersion được bao gồm trong phản hồi:
curl localhost:8001/api/v1/pods | jq ".metadata.resourceVersion"
12031
resourceVersion số có thể được coi như một số tăng lên mỗi khi bạn nhập lệnh hoặc một tài nguyên được tạo.
Không chỉ thế, cùng một số có thể được sử dụng để truy xuất trạng thái của cụm tại một thời điểm nhất định. Và bạn có thể liệt kê tất cả các Nhóm từ resourceVersion số 12031 với:
curl localhost:8001/api/v1/pods?resourceVersion=12031
# ... PodList response
Khi thực hiện xong các lệnh bạn có thể:
- Yêu cầu đầu tiên truy xuất tất cả các Nhóm. Phản hồi là danh sách các Nhóm có a resourceVersion. Bạn nên lưu số đó.
- Bắt đầu API Watch từ cụ thể đó resourceVersion.
Lúc này mã sẽ được thay đổi thành:
dashboard.js
fetch('/api/v1/pods')
.then((response) => response.json())
.then((response) => {
const pods = podList.items
const podNames = pods.map(it => it.metadata.name)
console.log('PODS:', podNames)
return response.metadata.resourceVersion
})
.then((resourceVersion) => {
fetch(`/api/v1/pods?watch=1&resourceVersion=${resourceVersion}`).then((response) => {
/* read line and parse it to json */
const event = JSON.parse(line)
const pod = event.object
console.log('PROCESSING EVENT: ', event.type, pod.metadata.name)
})
})
Mã lúc này đã được hoạt động và không có Pod trùng lặp.
Bộ nhớ cache cục bộ
Vì mỗi Pod hiển thị một .spec.nodeName trường có tên của Pod, bạn có thể sử dụng trường đó để tạo một pod - node cặp.
Hầu hết mọi Pod đều lộ ra .spec.nodeName.
Khi một Pod được tạo:
- Nó được lưu trữ trong cơ sở dữ liệu.
- Sự kiện "ADDED" được gửi đi.
- Pod được thêm vào hàng đợi của bộ lập lịch.
- Bộ lập lịch liên kết Pod với một Node.
- Pod được cập nhật trong cơ sở dữ liệu.
- Sự kiện "ĐÃ SỬA ĐỔI" được gửi đi.
Vì vậy, bạn có thể giữ danh sách tất cả các Nhóm, nhưng chỉ lọc danh sách cho các Nhóm a .spec.nodeName.
Kết luận
Tất cả các mã được viết tính cho đến nay đều chống lại kubectl proxy. Nhưng cùng một mã có thể được đóng gói lại và triển khai bên trong cụm của bạn.
Ví dụ như bạn có thể theo dõi Pods, Triển khai, Dịch vụ, DaemonSets, v.v. từ trong một cụm. Những điều này sẽ xảy ra khi bạn triển khai một nhà điều hành hoặc một bộ điều khiển trong Kubernetes.
Và trên đây là cách mã hóa trang tổng quan thời gian thực cho Kubernetes. Hãy theo dõi tiếp những bài viết của Bizfly Cloud để biết thêm nhiều kiến thức thú vị được cập nhật trong thời gian tới.
Bizfly Cloud là 1 trong top 4 doanh nghiệp đáp ứng đầy đủ toàn bộ tiêu chí, chỉ tiêu kỹ thuật, an toàn thông tin của nền tảng điện toán đám mây của Bộ TT&TT. Bizfly Cloud - Được vận hành bởi công ty Cổ phần VCCorp, đã xây dựng và ứng dụng thành công nền tảng điện toán đám mây bao gồm hơn 15 dịch vụ/giải pháp đáp ứng hầu như toàn bộ các nhu cầu về hạ tầng trong một doanh nghiệp tại Việt Nam.
Bizfly Cloud - Đơn vị HÀNG ĐẦU cung cấp giải pháp hạ tầng IT/Cloud phục vụ Chuyển đổi số cho doanh nghiệp SME tại Việt Nam.