Tổng kết cuối năm 2019

Hôm nay là ngày cuối năm 2019 rồi, cũng như bao người khác tôi ngồi nhìn lại xem năm qua đã làm được gì, chưa làm được gì. Để xem năm sau phải cải thiện cái gì.

OK

  • AI Engineer / DevOps – Trải nghiệm nhiều cái hay về thiết kế vận hành AI/ML system trong vài dự án AI/ML. Cũng như trải nghiệm nhiều khó khăn ví dụ như performance của model quá tệ, code model quá tù, model không hỗ trợ thread safe, triển khai hệ thống trên môi trường blackbox + không kết nối internet, không có dữ liệu để train & test AI model, …
  • Developer – Có thể làm việc với một số kỹ thuật mới như Python, Golang, Kubernetes,… Có cơ hội quy trình thiết kế, triển khai hệ thống ML lên môi trường Production sử dụng Docker/Kubernetes. Cũng như áp dụng Vertical Pod AutoScaler (VPA), Horizontal Pod AutoScaler (HPA), Cluster AutoScaler(CA).
  • Big Daddy – Hoàn thành tương đối tốt vai trò ông bố một em bé 3 tuổi: đưa đón, tắm rửa ăn uống, có thể cân team khi vợ đi công tác vài ngày TT)
  • Blogger: tiếp tục cập nhật blog wordpress đã rêu mốc
  • Reader:
    • Triển khai đọc sách với mục tiêu hơi mỳ ăn liền = Mỗi ngày đọc 10 trang sách => 35 cuốn các thể loại. Nhưng nhiều hôm phải đọc bù cho hôm trước 🙁
    • Technical blog: Hoàn thành ổn định mục tiêu 10 articles /1 ngày
  • Tương đối khỏe mạnh

Chưa OK

  • Dự án AI/ML Platform bị dừng sau hơn 1 năm phát triển vì định hướng chưa tốt. Cá nhân cũng chưa có đóng góp gì nhiều về mặt định hướng sản phẩm.
  • Cả nể & chưa tích cực phản biện hết mình trong team.
  • Chưa có chế độ vận động duy trì sức khỏe, thể dục thể thao.
  • Chưa viết blog & chia sẻ nhiều

Túm lại, năm nay cả công việc và gia đình đều được trải nghiệm với vai trò rất mới nhiều niềm vui, khó khăn nhưng có thể tạm cho là đã hoàn thành tương đối nhiệm vụ.

Năm sau, phải cố gắng hơn nữa. :beer:

Kubernetes – Set max pod (replica) limit per node

We have to allocate exactly N pod of service A per node. When new pod of A (N+1) is coming, pod cannot schedule due to lack of capacity and new nodes are added by Cluster Autoscaler

We can find a similar user case from this issue of Kubernetes Github repo add a new predicate: max replicas limit per node · Issue #71930

From Kubernetes 1.6, it seems we can use Pod Topology Spread Constraints to resolve.

You can use topology spread constraints to control how Pods are spread across your cluster among failure-domains such as regions, zones, nodes, and other user-defined topology domains. This can help to achieve high availability as well as efficient resource utilization.

Unfortunately, i am working on a old version of Kubernetes cluster (v1.12). It requires a workaround for this problem.

I found a workaround using Kubernetes QoS class Guaranteed setting to implement it.

When Kubernetes creates a Pod it assigns one of these QoS classes to the Pod:

  • Guaranteed
  • Burstable
  • BestEffort

Kubernetes QoS class

For a Pod to be given a QoS class of Guaranteed: Pods where both limit and (optionally) request are set for all resources (CPU and memory) and their values are the same. These pods are high priority, therefore they are terminated only if they are over the limit and there are no lower priority pods to terminate.

Example, 1 node t3.xlarge have 4 CPUs, 16 GBs. We want to spread 3 pods per node the resources/limits, requests are the same value 1 CPU (1 CPU for Kubernetes system pod, log pod such as Fluentd, …)

Pod manifest

containers:
  name: pong
    resources:
      limits:
        cpu: 1
        memory: 1Gi
      requests:
        cpu: 1
        memory: 1Gi

This workaround works like a charm for my case.

[til] Add a webhook to Box.com folder

How to add a new webhook to Box.com folder using Box cli

I’m using box cli version for Mac OS.

Install Box cli

Document https://developer.box.com/en/guides/tooling/sdks/cli/

Add Box cli environment

$ box configure:environments:add ~/workspace/credentials/box_config.json --name test
Successfully added CLI environment "test"
$ box configure:environments:get test

Add webhook

Please get folder ID from your web browser URL https://app.box.com/folder/97520xxxxxx

$ FOLDER=97520xxxxxx && box webhooks:create folder $FOLDER --triggers=FILE.UPLOADED --address=https://YOUR-WEBHOOK_ENDPOINT
ID: '2583xxxxxx'
Type: webhook
Target:
    ID: '97520xxxxxx'
    Type: folder

Teardown

Remove webhook, remove Box environment

box webhooks:delete 2583xxxxxx
box configure:environments:delete test

Reference: https://developer.box.com/en/guides/webhooks/