Sử dụng Kubernetes trên nền tảng Google Cloud Platform
White

Thuong Nguyen Van viết ngày 04/03/2019

Mở đầu

Sau vài ngày tìm hiểu về Kubernetes mình cũng muốn chia sẻ một chút kiến thức mình đã học được về Kubernetes tới cộng đồng. Trong lúc mình tìm hiểu về công nghệ này có rất nhiều lúc mắc vào vòng luẩn quẩn tốn thời gian nên mình viết bài viết này mong muốn có thể giúp những người có level như mình có thể đi nhanh hơn 1 chút khi tìm hiểu về công nghệ này. Bài viết này nói những vấn đề rất basic của Kubernetes và hướng dẫn mọi người deploy một project Kubernetes trên nền tảng Google Cloud Platform.

Tôi đã tiếp cận với Kubernetes ?

. Mình đang lên ý tưởng để code một app mobile. App này của mình sẽ hoạt động dựa vào dữ liệu của website khác nên tuần trước mình bắt đầu viết API với mục đích là crawl và lọc dữ liệu của website đó. Mục tiêu của mình là API phải nhanh nhất có thể. Website mình cần phải crawl có khá nhạy cảm dùng HTTP request sinh ra rất nhiều lỗi hơn nữa nó dùng cả capcha nữa nên mình quyết định sử dụng headless browser để crawl. Mà thằng headless browser nó chạy cực kì tốn tài nguyên và dễ sinh ra lỗi.
. Ban đầu mình quyết định sử dụng Cloud Function của google để thực hiện cawl. Cloud function giống như một docker image và code của bạn được đóng gói trong đó. Nó không chạy liên tục và khi có request đến nó bắt đầu tạo ra các instance ( giống container docker) của function đó và xử lý các request đó. Google nói tại một thời điểm instance cloud function chỉ xử lý 1 request để đảm bảo request đó sử dụng hết tài nguyên của instance function đó. Instance function có thể tái sử dụng hoặc tạo thêm mới. Như vậy khả năng scale của cloud function là không giới hạn và càng được sử dụng nhiều thì nó càng nhanh.
. Nhưng khi mình bắt đầu đụng tới Cloud Function thì lỗi tùm lum hết và rõ là local đã chạy ngon mình đoán là runtime của cloud google nó vẫn chưa ổn định để chạy headless browser . Sử dụng Cloud funtion mình chỉ có thể sử dụng runtime mà google cài đặt sẵn không thể can thiệp vào đó được.

Lúc đó câu hỏi mình đặt ra là: Liệu có thằng nào có cơ chế hoạt động giống cloud function mà cho phép mình tùy chỉnh được runtime không ? Hơn nữa lúc đó mình cũng đang dùng vps ubuntu thấy deploy bằng docker khá loằng ngoằng nên tự hỏi không biết có thằng nó chuyên dụng để mình deploy bằng docker không ?

Kubernetes là gì ?

. Hiểu đơn giản là giả sử bạn có nhiều máy chủ được cài đặt Kubernetes và các docker images chưa project của bạn. Khi bạn muốn deploy một project nào thì dùng công cụ phía client gọi là Kubectl để giao tiếp với Kubernetes server bảo nó deploy project này cho tao. Thằng Kubernetes server nó sẽ tự quản lý tài nguyên bạn có và tạo ra các container để chạy project của bạn. Câu hỏi đặt ra ở đây là có 1 máy chủ thôi thì có chạy được không thì có người cho rằng sử dụng một máy chủ thì không thể hiện được sức mạnh của Kubernetes. Bản thân mình dùng Kubernetes chỉ để vọc là chính thôi nên cũng không quan tâm lắm nhưng trước mình thấy dùng nó để deploy project sử dụng docker rất tiên.
. Kubernetes có cho phép bạn scale project của bạn bằng các nó chạy project của bạn trên nhiều container và dùng cân bằng tải.
. Nói đến đây có thể có nhiều người nghĩ sao mà nói nghe ngon vậy đúng không ? Đúng vậy Kubernetes là một hệ thống chạy trên nhiều máy chủ và còn được cân bằng tải nên để tự build được 1 hệ thống Kubernetes do bạn làm chủ thì không hề đơn giản. Trong khả năng của mình, mình mới chỉ sử dụng GKE ( Google Kubernetes Engine ) được google hỗ trợ sẵn để sử dụng Kubernetes. Bạn có thể tạo ra một hệ thống chạy Kubernetes mà không cần quan tâm đến nhiều thứ phức tạp.

Các khái niệm cơ bản trong Kubernetes

Kubernetes Cluster : Cluster nghĩa là một cụm các node . Mình nghĩ rằng node có thể máy chủ hoặc cái gì đó có RAM và CPU :D .
alt text
Kubernetes Pod : Pod sẽ chứa các container. các container trong pod sẽ có thể share lưu trữ và mạng cho nhau. giả sử mình chạy 1
project có dùng nodejs và mysql và mình dùng 2 container là nodejs và mysql thì mình để 2 thằng này trong pod thôi.
Kubernetes replicas: Khi app của bạn scale lên bạn muốn run nhiều pod cùng 1 lúc replicas là tham số thể hiện số pod giống nhau bạn muốn run.
alt text

Bắt đầu sử dụng Kubernetes trong GCP

Bạn có thể đọc hướng dẫn ở đây
https://cloud.google.com/kubernetes-engine/docs/tutorials/hello-app

Bước 1: Bạn phải cài đặt Google Cloud SDK trên máy tính của bạn.

Mình cũng chưa hiểu hết thằng này nhưng chỉ hiểu là nó dùng để remote google cloud của bạn dưới dụng command line interface

Bước 2: Bạn tạo một vào console => Kubernetes => cluster tạo một cluster

Google khuyến khích bạn sử dụng 3 node cho một cluster nhưng để test thì bạn chọn 1 cái thôi.
Google sử dụng VM instance làm node cluster và nó tính tiền Kubernetes theo số lượng VM instance mà bạn đã tạo ra nhé
alt text

Bước 3: Sau khi cluster được tạo ra bạn chọn chọn vào connect button trên cluster đó và copy đoạn mã đó vào terminal

Bước này chính là để config cho Kubectl remote đến cluster của bạn. Hãy làm theo hướng dẫn này để cài đặt Google Cloud SDK và cả Kubectl https://cloud.google.com/kubernetes-engine/docs/tutorials/hello-app
Bước 1 mình nói bạn cài Google Cloud SDK bạn phải làm bước này và login vào tài khoản của bạn tiếp mới làm tiếp đến đay được.
Client dùng một cung cụ gọi là Kubectl để giao tiếp với Kubernetes server. Bạn hình dung sau này bạn có thể có nhiều cluster không phải là cluster của google mà là ở nhiều chỗ khác. Bạn sẽ dùng Kubectl để remote đến các cluster đó. Kubectl sẽ giao tiếp với Kubernetes server bằng resfull api.
alt text

Bước 4: Push cái image của bạn lên container registry của google

Khi bạn deploy images thì cái docker image đó nằm trên thằng container registry của google thì nó sẽ pull về được. Sau đó run test trên local cái.
alt text

Bước 5: Run cái image đó trên cluster

Cứ làm theo hướng dẫn là được.
Giải thích step 6: Giả sử bạn đã run được image trên các node. Thì vấn đề là làm sao để truy cập vào API trên pod đã run. Bạn hình dung là pod của bạn có thể chạy trên nhiều máy chủ khác nhau vì vậy ta cần tạo ra 1 máy chủ có ip tĩnh để trỏ đến các thằng này nó sẽ làm nhiệm vụ cân bằng tải luôn.
alt text

Sau khi deploy được 1 project đơn giản bây giờ bạn sẽ bắt đầu tìm hiểu sau hơn về Kubernetes

Trên terminal bạn gõ Kubectl get all
Bạn sẽ thấy các phần replicaset, deployment , service , pod. Nhưng thằng này được gọi là resouce của Kubernetes. Mình cũng không hiểu nó lắm đâu. Chỉ biết được pod được quản lý bởi thằng replicaset nếu xóa thằng replicaset sẽ mất hết pod nó quản lý và thằng replicaset được quản lý bởi thằng deployment. Rõ ràng thằng service chả phụ thuộc vào thằng nào cả nó chỉ là dùng để cần bằng tải nên có thể config nó.
alt text
Để xem mô tả chi tiết của một resource ta gõ Kubectl describe + tên resource. Trong hãy cố gắng đọc vì trong này có nhiều thông tin hữu ích mô tả resource đó.
alt text
Như mình đã nói replicaset, deployment , service , pod được gọi là 1 resouce trong K8s. Nhưng bước để deploy app ở trên ta làm thực ra giống như ta bảo thằng K8s server rằng mày tạo ra cho tao 1 resource với thông số như này cho tao. Nhưng có vẻ dùng command line như trên hơi chuối nhỉ nên K8s nó có một cú pháp mô tả resource trong file YAML.
Chúng ta hãy xem resource của chung ta được mô tả thế nào nhé bằng lệnh: kubectl get --output yaml ( nó hỗ trợ cả json đấy )
alt text
Copy cái đó paste vào 1 file đặt tên là deployment.yaml. Sau khi xóa bớt mấy cái không cần thiết ta được file thế này
alt text
Oke từ lần sau cần cập nhập hay thay đổi gì ta cần sửa file này và gõ kubectl apply -f deployment.yaml là xong . Bạn cũng có thể deploy mới bằng cách này mạc định khi resource chưa có thì nó sẽ được tạo mới.

Bây giờ chúng ta phải đào xới cái file yaml xem các tham số của nó và sử dụng nó để mô tả resource

Bạn bắt đầu vào trang này và đọc api của nó. Ở đây mình muốn giải thích một tham số đầu tiên đó là apiVersion. Mình hiểu thì thằng này bảo K8s server rằng tao đang mô tả resource bằng apiVersion: apps/v1 và từ đó thằng K8s có thể hiểu được nó. Sau này nó có thể có nhiều version mới.
https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.13/

Giới hạn tài nguyên trong K8s

Khi bạn run 1 pod thì pod đó mạc định yêu cầu 100m nghĩa là 10% CPU và cả RAM nữa. K8s nó sẽ luôn tính toán để thằng kia có 10% CPU bất cứ khi nào nó cần vì trong môi trương product cái này rất quan trọng. Vì vậy các pod mới muốn run và k8s thấy ko đủ tài nguyên thì sẽ ko run được. Nếu bạn dùng K8s để vọc chơi như mình thì để phần resource vậy để chạy bao nhiêu pod tùy thích.
alt text

Nguồn
https://blog.vietnamlab.vn/2018/09/25/nhap-mon-kubernetes-gioi-thieu-rerial-kubernetes/

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

Thuong Nguyen Van

5 bài viết.
8 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
13 5
Lập trình socket trong Java Lời nói đầu : Theo đúng lộ trình thì mỗi một kì học mình sẽ làm một project ( tự tìm hiểu về một cái gì đó mình nghĩ l...
Thuong Nguyen Van viết 2 năm trước
13 5
White
3 4
Lời tựa Sau 4 tháng trời ngồi mò mẫm làm việc với firebase mình muốn viết ra bài này để chia sẻ một chút kinh nghiệm của mình. Với mong muốn giúp n...
Thuong Nguyen Van viết 11 tháng trước
3 4
White
2 0
Tại sao là linux. Tùy từng người nhưng mình thấy dùng linux thực sự rất hay. nó là môi trường để run product nên mình cũng muốn học cách sử dụng ...
Thuong Nguyen Van viết 5 tháng trước
2 0
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
5 bài viết.
8 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!