Giaosucan's blog - Chia sẻ kiến thức theo cách bá đạo

Ticker

20/recent/ticker-posts

Project Zeus - GCP infra - part 3

 


Tiếp tục bài 2, bài này phân tích nhược điểm của GKE Jenkins hiện tại

Issue của hệ thống hiện tại

Container Docker


GKE Cluster của hệ thống cũ bao gồm nhiều node pools, các node-pools này đều được team SRE tạo manual theo ticket request các team khác. Ví dụ tạo node-pools A với cấu hình X, Y, Z để phục vụ cho mục đích nào đó. Các node-pools này được launched base on docker container runtime. Loại docker container run time này đã deprecated on K8s

Một vấn đề đối với docker container là không giới hạn memory cho container theo mặc định. Host’s Kernel Scheduler sẽ quyết định việc provide capacity cho Docker Memory. Điều này có nghĩa là, docker container có thể tiêu thụ hết toàn bộ memory của Host. Dẫn tới xảy ra hiện tượng các nodes bị lỗi run out of memory khi pod schedule vào node và consume memory

kubectl describe node gke
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Warning OOMKilling 22m kernel-monitor Memory cgroup out of memory: Killed process 2937 (node) total-vm:13953692kB, anon-rss:1966676kB, file-rss:36516kB, shmem-rss:0kB, UID:10001 pgtables:15756kB oom_score_adj:981
Warning SystemOOM 22m kubelet System OOM encountered, victim process: node, pid: 2937

Khi các node bị lỗi OOM, các pod không thể nào launch được container và bị stuck ở state ContainerCreating và sinh ra error

Warning  Failed   17m   kubelet                                Error: context deadline exceeded

 Autoscaling Profile

GKE Autoscaling profile có 2 loại là balanced và optimized. Profile đang được sử dụng là optimized.

Trước hết cần hiểu ý nghĩa của 2 loại scaling này

Mục đích của optimized profile là làm sao scale down càng nhanh càng tốt, để tiết kiệm chi phí, remove node nhanh. Trong profile này, GKE sẽ schedule pod vào các node còn nhiều cpu resources hơn là scaling up ra node mới, cũng là để giảm chi phí.

Tuy nhiên cách này cũng là con dao hai lưỡi, vì việc giảm available resources quá nhanh sẽ gây ra thiếu resources khi workload lớn. Lỗi node OOM cũng 1 phần từ đây mà ra

Ngược loại balanced giống như một dạng chia đều pod cho từng node, để share workload, như vậy sẽ không có node nào phải gánh workload hơn node nào

Giải pháp được đặt ra như sau

Jenkins master và agent của GKE Jenkins hiện tại vẫn đang sử dụng nền tảng docker container, dùng socket /docker.sock dùng để communicate giữa docker daemon và container.

Tạo 3 node pool cho GKE cluster

pool-master và pool-agent dùng để schedule jenkins master và jenkins-agent , vẫn dùng docker container

pool-apps dùng containerd để scheduled các app khác, do containerd dùng ít resource hơn và optimized hơn. Node pools này dùng node size cao hơn để tránh issue về memory

Chuyển autoscaling profile về balanced

Để schedule pod vào đúng node cần thiết dùng tains và tolerant , cài này trên mạng Google đầy vì là kiến thức basic

Đại loại là

Taints được dùng để cấm pod được deploy tới worker node mà có taints.

Tolerations được dùng để gán vào pod, và những pod nào mà được gán tolerations thỏa mãn với điều kiện taints thì sẽ được deploy lên những worker node mà có gán taints.

Kết luận

Cách trên là giải quyết tạm thời cho GKE Jenkins cũ do còn sử dụng docker container. Sang hệ thống mới pool docker sẽ bị loại bỏ dùng hoàn toàn docker containerd. Vậy câu hỏi đặt ra các jenkins master/agent dùng docker container cũ (/docker.sock) thì làm thế nào.


Đăng nhận xét

0 Nhận xét