Chào mừng tất cả các bạn đã đến với blog foxcodesite. Trong bài viết hôm nay, mình và các bạn sẽ cùng nhau cài đặt một kubernetes cluster phục vụ cho công cuộc vọc vạch khám phá vẻ đẹp của kubernetes, hay cho công việc và thậm chí là production-ready các bạn nhé. Với bảy phần khéo léo, cộng thêm ba phần tỉ mỉ và chỉ bằng một cái click chuột, các bạn có thể dễ dàng tìm thấy các bài viết, video hướng dẫn cài đặt kubernetes cluster. Tuy nhiên đa số các bài viết sẽ hướng dẫn các bạn cài đặt single control plane. Vì vậy trong bài viết này, mình sẽ chia sẻ cách mà mình đã sử dụng k3s để dựng HA cluster sẵn sàng sử dụng cho môi trường production. Nào, cùng mình bắt đầu thôi.
K3s là cái chi chi?
Trước hết, mình sẽ chia sẻ đôi chút hiểu biết của mình về k3s. Mình xin trích dẫn một số các định nghĩa về k3s để cho các bạn có hình dung đầu tiên về k3s nhé.
K3s is a lightweight Kubernetes distribution created by Rancher Labs, and it is fully certified by the Cloud Native Computing Foundation (CNCF). K3s is highly available and production-ready. It has a very small binary size and very low resource requirements.
K3s is a highly available, certified Kubernetes distribution designed for production workloads in unattended, resource-constrained, remote locations or inside IoT appliances.
Theo như các trích dẫn bên trên, thì ta có thể hiểu k3s là một distribution của k8s, do Rancher Labs khai sinh và hiện tại được bảo hộ bởi CNCF. Đây là một lightway distribution, thậm chí có thể cài đặt trên các thiết bị phần cứng IoT như Raspberry Pi. Kiến trúc single của k3s như sau:
Với kiến trúc single server như trên, chúng ta khó có thể đảm bảo cho hệ thống của chúng ta có tính sẵn sàng cao (HA). Khi server node có vấn đề như là mất điện, hỏng phần cứng do vô vàn các nguyên nhân thì … bùm … hệ thống đi rồi ông giáo ạ. Đó là điều chúng ta không hề mong muốn. Trong cái rủi có cái xui, à nhầm, cái may chứ nhỉ :))). Với kiến trúc như trên không đáp ứng được, Rancher Labs luôn luôn lắng nghe, sẵn sàng thấu hiểu. Họ đã đưa ra cho chúng ta một kiến trúc HA như sau:
Với kiến trúc này, k3s tách riêng database (etcd, mysql, sqlite, …) ra khỏi cụm k3s server đảm bảo được tính sẵn sàng cao của hệ thống.
Tiến hành cài đặt
Có vẻ mình hơi lan man một chút về k3s, bây giờ, cùng mình bắt tay vào xây dựng một cụm HA k3s nào các bạn ơi. Chuẩn bị: Trong bài viết này mình sẽ sử dụng:
1 VPS centos 7: cài đặt external database (mysql), LB cho cluster
2 VPS centos 7 đóng vai trò làm master node
2 VPS centos 7 đóng vai trò làm agent (worker node) Trên mỗi VPS chúng ta cần cài đặt thêm docker các bạn nhé Hiện các VPS này mình khởi tạo trên GCP (chả là tiện mới đăng ký dùng thử GCP được cho 400$ nên mạnh dạn lôi ra làm đạo cụ cho blog các bạn ạ. ahihi)
Mình đặt tên các VPS tương ứng với role của nó các bạn nhé. còn thằng rancher chính là thằng mình setup database, loadbalacing và rancher ui (mình sẽ có một bài viết về thằng này sau các bạn nhé). Cài đặt:
1. Cài đặt Load Balancing Trong bài viết này mình sử dụng nginx làm load balancer với file cấu hình nginx.conf như sau:
events {}
stream {
upstream k3s_servers {
server ip_server_1:6443;
server ip_server_2:6443;
}
server {
listen 6443;
proxy_pass k3s_servers;
}
}
Sử dụng docker-compose để khởi chạy LB:
nginx:
image: "nginx:mainline"
ports:
- 6443:6443
restart: on-failure
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
Cuối cùng, ta chỉ cần gõ lệnh đơn giản như sau:
docker-compose up -d
Như vậy LB service đã được khởi chạy. Kiểm tra bằng cách sử dụng docker ps
2. Cài đặt server node Để cài đặt server node, chúng ta cần chuẩn bị connection tới database, ở trong bài viết này mình sử dụng mysql với thông tin kết nối theo định dạng cài đặt của k3s như sau:
mysql://username:password@tcp(IP:port)/database
Chúng ta tiến hành ssh vào master node đầu tiên, chạy lệnh su để chuyển sang chế độ user root, sau đó chạy lệnh sau:
curl -sfL https://get.k3s.io | sh -s - server \
--datastore-endpoint="mysql://username:password@tcp(database_ip_or_hostname:port)/database" --tls-san=IP_load_balacing
Sau khi quá trình cài đặt hoàn tất, để kiểm tra ta có thể dùng lệnh:
systemctl status k3s
Kết quả như sau:
Kết quả hiển thị process của k3s server đang active. Tiếp tục, sử dụng lệnh kubectl get nodes để xem cluster k3s của chúng ta với single node đã lên chưa nhé. Teng.
Vậy là chúng ta đã có k8s cluster với single server node bạn nhé. Tiếp tục, ta tiến hành join server node còn lại vào cluster thôi. Cũng như với server đầu tiên, chúng ta cần ssh và chuyển đổi sang root user và chạy lệnh có định dạng như sau:
curl -sfL https://get.k3s.io | sh -s - server \
--token=TOKEN \
--datastore-endpoint="mysql://username:password@tcp(database_ip_or_hostname:port)/database" --tls-san=IP_load_balancer
Câu lệnh giống đến 96.69% so với việc khởi chạy node đầu tiên, tuy nhiên, ở đây cần thêm một token. Để lấy token, bạn sử dụng lệnh trên server node đầu tiên.
sudo cat /var/lib/rancher/k3s/server/token
Ở đây mình có một lưu ý nhỏ là các node trong cluster phải có hostname khác nhau nhé, nếu tồn tại ít nhất 2 node có hostname giống nhau thì chúng ta thêm một flag nữa đó là --with-node-id. Như vậy câu lệnh join node sẽ là:
curl -sfL https://get.k3s.io | sh -s - server \
--token=TOKEN \
--datastore-endpoint="mysql://username:password@tcp(database_ip_or_hostname:port)/database" --tls-san=IP_load_balancer --with-node-id=true
Sau khi chạy lệnh trên, lặp lại bước kiểm tra xem tiến trình k3s server, ta được kết quả như sau:
Teng teng, thế là cluster của chúng ta hiện tại đã có 2 control plane rồi các bạn nhé. Tiếp theo ta sẽ tiến hành join các agent (hay còn gọi là worker) node vào cluster để có một cluster hoàn chỉnh.
3. Joining agent node Sau khi ssh vào worker node, sử dụng với quyền là root user, bạn chạy lệnh sau để join worker vào cluster nhé:
curl -sfL https://get.k3s.io | K3S_TOKEN=NODE_TOKEN sh -s - agent --server https://IP_load_balacing:6443
Nếu các node worker có cùng hostname, ta truyền thêm biến môi trường K3S_NODE_NAME
Trong đó, NODE_TOKEN được lấy từ một trong 2 server node bằng lệnh sau:
sudo cat /var/lib/rancher/k3s/server/node-token
Sau khi chạy xong lệnh join node trên 2 worker node, ta được kết quả như sau:
Tinh teng, cuối cùng ta cũng có được một HA k8s cluster để vọc vạch rồi các bạn ơi.
**Note: ** Để kubectl client trên máy local hay bất cứ nơi đâu bạn muốn, thì hãy copy file config trên server node theo đường dẫn sau nhé.
cat /etc/rancher/k3s/k3s.yaml
Các bạn sửa địa chỉ của server thành IP của load balancing là được nhé. Đảm bảo rằng khi một server node dẹo, bạn vẫn có thể truy cập được đến cluster.
4. Bóc tem HA cluster mới nào Để test thử k8s cluster chúng ta vừa tạo, mình có chuẩn bị một file replica-set-demo.yml như sau nhé:
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: kubia
spec:
selector:
matchExpressions:
- key: app
operator: In
values:
- kubia
replicas: 3
template:
metadata:
labels:
app: kubia
spec:
containers:
- name: kubia
image: tunk/kubia
ports:
- containerPort: 8080
Sau đó chạy lệnh:
kubectl apply -f replica-set-demo.yml
Kết quả sau khi run sẽ được như sau:
Kiểm tra connect tới pod bằng lệnh port-forward như sau:
kubectl port-forward kubia-5c97b99d79-988kb 8080:8080
Tiến hành gọi tới pod sử dụng curl:
curl localhost:8080
Và kết quả là:
Tổng kết
Như vậy, trong bài viết này, mình đã cùng các bạn cài đặt một HA k8s cluster sử dụng distribution là k3s. Việc cài đặt còn có thể đơn giản hơn bằng việc sử dụng k3sup. Các bạn có thể tìm kiếm và thử sức với nó nhé. Ngoài ra, các bạn cũng có thể tham khảo tài liệu chính thức của Rancher Labs về k3s tại đây. Tự mình vọc vạch thêm nhiều các tham số để làm chủ k3s hơn các bạn nhé. Cảm ơn các bạn đã đồng hành cùng với mình trong bài viết này. Trong bài viết tiếp theo, mình sẽ cùng các bạn đi cài đặt Dashboard cho cluster sử dụng Rancher UI và Ingress Controller để các bạn có thể public application của mình ra bên ngoài nha.