Chào anh em ! Sau loạt bài khái niệm và kiến trúc part I và part II thì tôi được đi tiêm vaccine phòng covid, và sau một tuần kiêng chất kích thích thì nay tôi mới được dùng lại để có cảm hướng gửi tới anh em phần tiếp theo.
Hôm nay, tôi sẽ giới thiệu cho anh em về công cụ minikube và một số câu lệnh kubectl giúp chạy ứng dụng đơn giản trên local.
Minikube là một công cụ giúp developer thực hành và triển khai các ứng dụng trên local. Minikube dùng virtual machine để tạo ra một single node k8s cluster. Thông thường một k8s cluster sẽ gồm master node và worker node nhưng với minikube thì các process của master và worker sẽ chạy chung trên một node dưới dạng các container. Ngoài minikube chúng ta có thể sử dụng một số công cụ khác để thực hành trên local như kind và k3s.
Việc cài đặt minikube khá đơn giản, anh em truy cập đường dẫn dưới đây để tiến hành cài đặt minikube:
https://minikube.sigs.k8s.io/docs/start
Sau khi cài đặt minikube xong, chạy minikube start
để tạo và khởi động k8s cluster. Chạy minikube status
để kiểm tra
trang thái hoạt động.
1
2
minikube start
minikube status
Như trong phần lý thuyết đã đề cập ở trước, API server cung cấp RESTful API cho client tương tác với k8s cluster, và để gọi đến API server đó thì ta sẽ sử dụng các câu lệnh kubectl. Dưới hình sau đây là một số câu lệnh chính:
Trước khi triển khai ứng dụng tới k8s, tôi đã chuẩn bị trước một image chứa ứng dụng hello-world và đưa nó lên DockerHub. Để kiểm tra hoạt động của ứng dụng trong image ta có thể sử dụng docker để chạy container trên local.
1
docker run --rm -it -p 3000:3000 saiury92/hello-world:latest
Ứng dụng sẽ chạy trên port 3000 và hiển thị trên browser dòng chữ “Hello World, I am Saiury92” kèm theo private ip của container đang chạy ứng dụng. Nhiệm vụ của chúng ta bây giờ là triển khai ứng dụng trên 2 pod khác nhau và sử dụng k8s service với nhiệm vụ cân bằng tải.
Sử dụng câu lệnh kubectl create deployment
để tạo deployment với tên là hello-world
1
2
3
4
kubectl create deployment hello-world \
--replicas=2 \
--image=saiury92/hello-world:latest \
--port=3000
Với option –replicas=2 là số lượng pod được tạo, –image=saiury92/hello-world:latest xác định image để tạo container, –port=3000 là port của container được expose.
Sử dụng câu lệnh kubectl expose deployment hello-world
để tạo service cho hello-world deployment.
1
2
3
4
kubectl expose deployment hello-world \
--type=LoadBalancer \
--port=8080 \
--target-port=3000
Với option –type=LoadBalancer là loại service được tạo, đến đây các bạn sẽ thắc mắc sao không phải loại khác như ClusterIP hay NodePort, lý do đơn giản là vì với loại LoadBalancer thì chúng ta sẽ dễ dàng expose một external-ip ra bên ngoài thông qua minikube tunnel
. Option –port=8080 là port để truy cập service từ bên ngoài, –target-port=3000 là port của container mà service gửi traffic tới.
Trang thái EXTERNAL-IP đang là pending, để truy cập được vào ứng dụng ta mở thêm tab mới ở terminal chạy minikube tunnel
để expose external-ip.
Sau khi hoàn tất việc expose external-ip, ta có thể truy cập ứng dụng thông qua địa chỉ sau:
http://REPLACE_WITH_EXTERNAL_IP:8080
Khi chúng ta refresh nhiều lần trên browser, thì traffic sẽ được cân bằng tải trên hai container khác nhau với ip là 172.17.0.7 và 172.17.0.8
Đến đây hẳn anh em đã nhận thấy sự bất cập của việc sử dụng câu lệnh, khi chúng ta muốn thay đổi nhiều cấu hình khác nhau thì câu lênh sẽ phức tạp hơn. Do đó, chúng ta có thể gom tất cả các cấu hình vào trong yaml file để dễ quản lý và chia sẻ.
Trước khi vào phần thực hành tiếp theo tôi sẽ clean up các resource đã tạo phần trước.
1
2
kubectl delete service hello-world
kubectl delete deployment hello-world
Tạo file hello-world.yaml có nội dụng như dưới đây
1
vi ~/hello-world.yaml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: hello-world
labels:
app: hello-app
spec:
replicas: 2
selector:
matchLabels:
app: hello-app # has to match .spec.template.metadata.labels
template:
metadata:
labels:
app: hello-app # has to match .spec.selector.matchLabels
spec:
containers:
- name: hello-world
image: saiury92/hello-world:latest
ports:
- name: http
containerPort: 3000
protocol: TCP
---
# Service
apiVersion: v1
kind: Service
metadata:
name: hello-world
spec:
type: LoadBalancer
selector:
app: hello-app
ports:
- port: 8080
targetPort: 3000
Chúng ta có thể tách source của deployment và service ra làm 2 yaml file khác nhau, nhưng để đơn giản tôi cho chung vào một file để triển khai cho nhanh.
Sử dụng câu lệnh kubectl apply
để tạo đồng thời deployment và service.
1
kubectl apply -f ~/hello-world.yaml
Việc truy cập ứng dụng bằng cách thông qua minikube tunnel
giống như phần trên.
Sử dụng câu lệnh kubectl delete
để xoá các resource.
1
kubectl apply -f ~/hello-world.yaml
Tôi đang định gửi tới anh em thêm phần scale up số lượng pod nhưng bài viết hơi dài, để anh em thực hành như vậy là quá đủ trong một ngày rùi, nên tôi sẽ dừng bài viết ở đây đi ngủ để tối ưu hệ miễn dịch sau khi tiêm vaccine. Ak quên, phần sau tôi sẽ giới thiệu về helm có gì anh em cài đặt trước đi nhé. Còn bây giờ chào thân ái và hẹn gặp lại !
Comments