Sơ lược về RKE2
Giới thiệu
RKE2, còn được gọi là RKE Goverment hay Rancher Kubernetes Engine 2, là một bản phân phối Kubernetes nhẹ, tùy biến cao và tập trung vào bản mật. Công cụ được phát triển bởi Rancher Labs, được thiết kế để đáp ứng các yêu cầu riêng biệt trong môi trường doanh nghiệp. Không giống như phiên bản RKE ban đầu, là bản phân phối Kubernetes đơn giản, thân thiện với người dùng, RKE2 được cải tiến cho phù hợp với các môi trường mà ở đó yêu cầu cao về tính bảo mật, sự tuân thủ và hiệu suất.
Nếu hiểu đơn giản, RKE2 chính là Kubernetes, có cùng kiến trúc, các tính năng cốt lõi, nhưng RKE2 nổi bật hơn với những tích hợp về bảo mật và cải thiện:
- Tích hợp sẵn CIS(Center for Internet Security) benchmark.
- Tuân thủ FIPS 140-2, đây là tiêu chuẩn bảo mật liên bang dành cho các module mật mã hóa.
- Có sẵn bản đóng gói binary được tối ưu hóa bao gồm container làm runtime và etc làm cơ sở dữ liệu.
Ưu điểm của RKE2
RKE2 phát huy lợi thế trong các môi trường mà ở đó hiệu năng, bảo mật, và độ tin cậy là những yếu tố được cân nhắc cẩn trọng. Dưới đây là một vài chi tiết về ưu điểm của RKE2:
- Tính bảo mật và tuân thủ: RKE2 đi kèm với những tính năng bảo mật vượt trội, bao gồm tuân thủ đầy đủ FIPS 140-2, một tiêu chuẩn mã hóa liên bang. Điều này làm cho RKE2 sẵn sàng được sử dụng ở những phân khúc tổ chức yêu cầu các tiêu chuẩn bảo mật, chẳng hạn như chính và phủ và quốc phòng.
- Nhẹ và tối ưu: Khác với bản phân phối Kubernetes truyền thống, RKE2 được tối ưu về sử dụng hiệu quả tài nguyên. Nó chạy một bộ thành phần tối thiểu và runtime mặc định là containerd, nhẹ hơn và bảo mật hơn so với Docker.
- CIS Benchmarking: RKE2 tuân thủ theo CIS Kubernetes benchmarks, đảm bảo rằng cluster mà nó tạo ra có tính bảo mật và tuân thủ với các tiêu chuẩn công nghiệp.
- Môi trường air-gapped: RKE2 được thiết kế để dễ dàng triển khai trên các môi trường air-grapped (không có kết nối vớ internet), làm cho RKE2 trở nên lý tưởng cho các môi trường biệt lập yêu cầu các kiểm soát bảo mật bổ sung.
Với RKE2, tổ chức có thể tự tin triển khai cluster Kubernetes mà đáp ứng đầy đủ các tiêu chuẩn và tuân thủ, đồng thời vẫn được đảm bảo về hiệu năng tối ưu và bảo mật tốt.
Kiến trúc RKE2
Kiến trúc của RKE2 được xây dựng bên 3 thành phần chính:
- Server (Control Plane): Control plane chịu trách nhiệm quản lý toàn bộ trạng thái của cluster. RKE2 server tương ứng với Kubernetes API server, controller manager và scheduler. Đây là nơi đưa ra các quyết định về lập lịch, điều phối trong Kubernetes.
- Agent (Worker Node): RKE2 agent node chịu trách nhiệm chạy khối lượng công việc (container, pod, và service) được lập lịch trong cluster.
- Runtime (Containerd): RKE2 sử dụng
containerd
làm container runtime mặc định. Containerd là một container runtime chuẩn công nghiệp, nhẹ cho phép tạo ra các container. Containerd được xây dựng với mục đích cải thiện Kubernetes và tập trung vào bảo mật và điều phối container.
Ngoài ra, các thành phần sau cũng thường được triển khai cùng Kubernetes:
- Networking: Bao gồm các CNI (Container Network Interface) plugins cung cấp thêm các tính năng về mạng giữa pod, service, ingress. RKE2 có thể tích hợp với các các network policie có sẵn và SDN(Software Defined Networking) framework, cung cấp tính linh hoạt trong đa dạng các môi trường triển khai.
- Storage: RKE2 hỗ trợ các tùy chọn persistent storage thông qua các plugin CIS (Container Storage Interface), cho phép tích hợp liền mạch với các giải pháp lưu trữ ngoài như AWS EBS, Google Persistent Disk, …
- Security: Bên cạnh các tính năng bảo mật Kubernetes tiêu chuẩn, RKE2 còn có lựa chọn triển khai các biện pháp bảo mật tăng cường như SELinux (Security-Enhanced Linux), TLS encryption trong giap tiếp giữa các thành phần.
Kế thừa kiến trúc của Kubernetes, RKE2 vẫn duy trì các đặc tính của vốn có của Kubernetes, khả năng mở rộng tốt, khả dụng cao và khả năng chịu lỗi tốt. Kiến trúc của RKE2 góp phần đảm bảo tất cả các kết nối, giao tiếp giữa các thành phần trong cluster là bảo mật và được mã hóa, đưa RKE2 trở thành một lựa chọn tốt cho môi trường production.
It’s time to Practice
Chuẩn bị môi trường
Trước khi bắt tay vào cài đặt, một vài bước liên quan tới môi trường cài đặt sẽ cần chuẩn bị trước. Để giải lập triển khai cho 1 cluster RKE2, chúng ta cần chuẩn bị máy ảo với các thông số đề xuất sau:
Role | CPU | RAM | Hostname | OS |
---|---|---|---|---|
Control Plane Node | 2 | 4 | control-node | Ubuntu 20.04 TLS hoặc Ubuntu 22.04 TLS |
Worker Node | 2 | 4 | worker-node | Ubuntu 20.04 TLS hoặc Ubuntu 22.04 TLS |
Nếu môi trường máy ảo của bạn có yêu cầu chặt chẽ về network inbound, bạn cần đảm bảo kết nối từ worker node tới master node
- 6443 : Kubernetes API Server
- 9345 : Kết nối giữa Server và Agent của RKE2
Cài đặt Kubernetes sử dụng RKE2
Sau khi môi trường đã sẵn sàng, chúng ta có thể cài đặt RKE2 trên cả 2 node.
1. Cài đặt RKE2 Server (Control Plan Node)
Trên terminal của control-node
, lưu ý rằng chúng ta sẽ cần quyền sudo, nhập vào lần lượt các lệnh sau:
# Tải và chạy tệp tin cài đặt rke2 với vai trò control plane node
curl -sfL https://get.rke2.io | sudo sh -
# Cho phép service khởi động tự động sau khi server được khởi động
sudo systemctl enable rke2-server.service
# Khởi chạy dịch vụ rke2-server, câu lệnh mất tương đối thời gian để hoàn tất
sudo systemctl start rke2-server.service
# Kiểm tra trạng thái của dịch vụ rke2-server
sudo systemctl status rke2-server
Trong trường hợp nếu gặp lỗi, bạn có thể theo dõi log hoạt động của dịch vụ rke2-server thông qua lệnh sudo journalctl -u rke2-server -f
.
Một vài thông tin bạn cần biết sau khi cài đặt RKE2 server:
- Dịch vụ
rke2-server
sẽ được cài đặt tự động, dịch vụ này cần được cấu hình để có thể tự động khởi động sau khi server bị restart hoặc tiến trình bị xóa. - Các công cụ cũng được cài đặt sẵn trong thư mục
/var/lib/rancher/rke2/bin
, bao gồm:kubectl
,crictl
vàctr
. Lưu ý rằng, các công cụ này không nằm trong PATH mặc định, người dùng cần chỉ định đường dẫn tuyệt đối tới chúng để sử dụng. - Tệp tin cấu hình
kubeconfig
được lưu trữ theo đường dẫn/etc/rancher/rke2/rke2.yaml
. - Một token được sử dụng cho việc đăng ký, tham gia cluster của các server và agent node khác được lưu trữ tại
/var/lib/rancher/rke2/server/node-token
.
Chúng ta sẽ kiểm tra cluster Kubernetes thông qua câu lệnh lấy về thông tin các node, ở câu lệnh dưới đây, chúng ta cần chỉ định đường dẫn tuyệt đối tới công cụ kubectl
cũng như chỉ định rõ tệp tin kubeconfig
:
sudo /var/lib/rancher/rke2/bin/kubectl --kubeconfig=/etc/rancher/rke2/rke2.yaml get nodes
Như vậy, control plane node đã được cài đặt thành công.
2. Cài đặt RKE2 Agent (Worker Node)
Sau khi RKE2 Server đã có, chúng ta sẽ thêm RKE2 Agent vào cluster. Trong terminal của worker node, thực hiện các lệnh sau để cài đặt dịch vụ RKE2 Agent:
# Tải và chạy tệp tin cài đặt rke2 với vai trò worker node
curl -sfL https://get.rke2.io | sudo INSTALL_RKE2_TYPE="agent" sh -
# Cho phép service khởi động tự động sau khi server được khởi động
sudo systemctl enable rke2-agent.service
# Tạo trước thư mục lưu trữ cấu hình cho dịch vụ rke2-agent.service
sudo mkdir -p /etc/rancher/rke2/
Chúng ta chưa vội khởi động dịch vụ, bởi RKE2 Agent hiện tại chưa có thông tin về RKE2 Server. Do đó, chúng ta cần bổ sung cấu hình cho dịch vụ rke2-agent.service
bằng cách thêm mới tệp tin /etc/rancher/rke2/config.yaml
với nội dung:
server: https://<control_node_ip>:9345
token: <rke2_server_token>
Nội dung cấu hình của chúng ta gồm thông tin địa chỉ RKE2 Server và token xác thực. Để có những thông tin này, chúng ta cần quay trở lại control node và thực hiện lệnh sau để truy xuất chúng:
# Lấy thông tin địa chỉ IPv4
ip -c -4 addr
# Lấy giá trị token
sudo cat /var/lib/rancher/rke2/server/node-token
Thông tin đã đầy đủ, chúng ta còn một bước nữa để kết nối RKE2 Agent này vào cluster, trên terminal của worker node, nhập lệnh:
# Khởi động dịch vụ rke2-agent, câu lệnh mất tương đối thời gian để hoàn tất
sudo systemctl start rke2-agent.service
# Kiểm tra trạng thái dịch vụ rke2-agent
sudo systemctl status rke2-agent.service
# Trong trường hợp lỗi hoặc muốn biết thêm hoạt động của rke2-agent, kiểm tra log của dịch vụ
sudo journalctl -u rke2-agent -f
Khi trạng thái dịch vụ RKE2 Agent là active (running)
tức là chúng ta đã thành công thêm worker node vào cluster Kubernetes. Bạn hãy quay trở lại control node và liệu bạn sẽ thấy có bao nhiêu node trong cluster thông qua câu lệnh get nodes
?
Triển khai ứng dụng trên cluster
Thiết lập kubectl & kubeconfig
Chúng ta đã sẵn sàng để kiểm nghiệm hoạt động của cluster RKE2. Tuy nhiên chúng ta sẽ chậm lại một chút để thiết lập công cụ kubectl
cũng như cấu hình kubeconfig
cho user thường.
Tại bước này, chúng ta làm 2 việc:
- Một là thêm công cụ
kubectl
vào thư mục lưu trữ/usr/local/bin
, điều này cho phép user thường có thể sử dụng công cụ. - Hai là thêm tệp tin
kubeconfig
cho user thường để chúng ta có thể kết nối với API server trong cluster RKE2.
Trên terminal của control node, thực hiện các lệnh sau:
# Thêm công cụ kubectl cho normal user
sudo cp /var/lib/rancher/rke2/bin/kubectl /usr/local/bin/kubectl
# Sao chép tệp tin kubeconfig tới home của normal user và thiết lập quyền sở hữu tệp tin
mkdir ~/.kube
sudo cp /etc/rancher/rke2/rke2.yaml ~/.kube/config
sudo chown ubuntu:ubuntu ~/.kube/config
Nếu bạn còn nghi ngờ mục đích của bước này, hãy chạy thử câu lệnh kubectl get nodes
, bạn sẽ thấy kết quả tương tự với câu lệnh sudo /var/lib/rancher/rke2/bin/kubectl --kubeconfig=/etc/rancher/rke2/rke2.yaml get nodes
. Câu lệnh đã được rút gọn đi rất nhiều !
Triển khai ứng dụng Guest Book
Bước kiểm nghiệm cuối cùng cho cluster RKE2 của chúng ta sẽ thực hiện triển khai ứng dụng Guest Book. Hãy xem qua nội dung của Kubernetes manifest dưới đây, yêu cầu của chúng ta bao gồm:
- Deployment và Service cho cluster Redis(1 master, 2 replica)
- Deployment và Service cho ứng dụng Guest Book Frontend. Service được định nghĩa với
type=NodePort
và sẽ expose ứng dụng cho người dùng truy cập.
Nội dung của tệp tin guestbook-all-in-one.yaml
apiVersion: v1
kind: Service
metadata:
name: redis-master
labels:
app: redis
tier: backend
role: master
spec:
ports:
- port: 6379
targetPort: 6379
selector:
app: redis
tier: backend
role: master
---
apiVersion: apps/v1 # for k8s versions before 1.9.0 use apps/v1beta2 and before 1.8.0 use extensions/v1beta1
kind: Deployment
metadata:
name: redis-master
spec:
selector:
matchLabels:
app: redis
role: master
tier: backend
replicas: 1
template:
metadata:
labels:
app: redis
role: master
tier: backend
spec:
containers:
- name: master
image: registry.k8s.io/redis:e2e # or just image: redis
resources:
requests:
cpu: 100m
memory: 100Mi
ports:
- containerPort: 6379
---
apiVersion: v1
kind: Service
metadata:
name: redis-replica
labels:
app: redis
tier: backend
role: replica
spec:
ports:
- port: 6379
selector:
app: redis
tier: backend
role: replica
---
apiVersion: apps/v1 # for k8s versions before 1.9.0 use apps/v1beta2 and before 1.8.0 use extensions/v1beta1
kind: Deployment
metadata:
name: redis-replica
spec:
selector:
matchLabels:
app: redis
role: replica
tier: backend
replicas: 2
template:
metadata:
labels:
app: redis
role: replica
tier: backend
spec:
containers:
- name: replica
image: gcr.io/google_samples/gb-redisslave:v1
resources:
requests:
cpu: 100m
memory: 100Mi
env:
- name: GET_HOSTS_FROM
value: dns
# If your cluster config does not include a dns service, then to
# instead access an environment variable to find the master
# service's host, comment out the 'value: dns' line above, and
# uncomment the line below:
# value: env
ports:
- containerPort: 6379
---
apiVersion: v1
kind: Service
metadata:
name: frontend
labels:
app: guestbook
tier: frontend
spec:
# comment or delete the following line if you want to use a LoadBalancer
type: NodePort
# if your cluster supports it, uncomment the following to automatically create
# an external load-balanced IP for the frontend service.
# type: LoadBalancer
ports:
- port: 80
selector:
app: guestbook
tier: frontend
---
apiVersion: apps/v1 # for k8s versions before 1.9.0 use apps/v1beta2 and before 1.8.0 use extensions/v1beta1
kind: Deployment
metadata:
name: frontend
spec:
selector:
matchLabels:
app: guestbook
tier: frontend
replicas: 3
template:
metadata:
labels:
app: guestbook
tier: frontend
spec:
containers:
- name: php-redis
image: forestgun007/google-samples-gb-frontend:v4
resources:
requests:
cpu: 100m
memory: 100Mi
env:
- name: GET_HOSTS_FROM
value: dns
# If your cluster config does not include a dns service, then to
# instead access environment variables to find service host
# info, comment out the 'value: dns' line above, and uncomment the
# line below:
# value: env
ports:
- containerPort: 80
Bạn cần tạo tệp tin guestbook-all-in-one.yaml
với nội dung ở phía trên trong control node, trước khi thực hiện các lệnh để yêu cẩu Kubernetes triển khai ứng dụng:
# Tạo các đối tượng được định nghĩa trong tệp tin manifest
kubectl apply -f guestbook-all-in-one.yaml
# Kiểm tra các tài nguyên được đã được tạo ra
kubectl get all
Chờ đợi 1 chút để Kubernetes hoàn tất việc triển khai ứng dụng Guest Book, bạn sẽ thấy kết quả tương tự như hình dưới đây. Hãy nhìn vào giá trị Node Port của Service dành cho thành phần Frontend. Chúng ta sẽ sử dụng nó để truy cập ứng dụng này trên trình duyệt ghép, hãy kết hợp địa chỉ IP của control node và giá trị Node Port http://<control_ip>:<node_port>
để hoàn tất xác nhận hoạt động của ứng dụng được triển khai.
Clean up
Nếu cần gỡ và dọn dẹp sạch sẽ cluster RKE2, bạn có thể dễ dàng với cùng 1 câu lệnh trên terminal của 2 node:
sudo /usr/bin/rke2-uninstall.sh
Tổng kết
Qua bài viết nầy, chúng ta đã khám phá RKE2 là gì, kiến trúc của nó và bắt tay từng bước từng bước cài đặt và sử dụng cluster Kubernetes thành công. Với RKE2 và những tính năng mà nó mang lại, bạn và tổ chức có thể tự tin triển khai Kubernetes một cách đơn giản.
Ở bài viết tiếp theo, chúng ta sẽ cùng nhau triển khai một cluster Kubernetes sẵn sàng cho môi trường production hơn tính khả cao với 3 node master, và n node worker bằng RKE2. See you again!!!
Bình luận