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:

  1. 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.
  2. 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.
  3. 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.
  4. 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 RKE2
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:

RoleCPURAMHostnameOS
Control Plane Node24control-nodeUbuntu 20.04 TLS hoặc Ubuntu 22.04 TLS
Worker Node24worker-nodeUbuntu 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
Cài đặt RKE2 Server
Cài đặt 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, crictlctr. 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
Kubectl get node
Kubectl get node

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/
Cài đặt dịch vụ RKE2 Agent
Cài đặt dịch vụ RKE2 Agent

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
Thu thập thông tin trên Control Node
Thu thập thông tin trên Control Node

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
Khởi động RKE2 Agent
Khởi động RKE2 Agent

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.

Triển khai ứng dụng Guest Book
Triển khai ứng dụng Guest Book
Truy cập ứng dụng trên trình duyệt
Truy cập ứng dụng trên trình duyệt

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!!!