0
0
Lập trình
Admin Team
Admin Teamtechmely

Hướng dẫn chi tiết xây dựng CDN server hiệu quả trên Kubernetes

Đăng vào 3 tuần trước

• 5 phút đọc

Hướng dẫn chi tiết xây dựng CDN server hiệu quả trên Kubernetes

Việc phân phối nội dung cho website một cách hiệu quả là yếu tố quan trọng quyết định đến tốc độ tải trang và trải nghiệm người dùng. Trong bài viết này, chúng tôi sẽ hướng dẫn bạn từng bước để triển khai một CDN server đơn giản trên nền tảng Kubernetes, nhằm tối ưu hóa việc phân phối hình ảnh và nội dung trên website của bạn.

Tại sao cần sử dụng CDN?

Khoảng cách địa lý giữa người dùng và máy chủ lưu trữ website có thể ảnh hưởng đáng kể đến thời gian tải nội dung. Việc rút ngắn khoảng cách này sẽ giúp cải thiện tốc độ truy cập, giảm mức tiêu thụ băng thông và nâng cao trải nghiệm người dùng. Hệ thống CDN (Content Delivery Network) ra đời để giải quyết bài toán này, với mạng lưới máy chủ phân tán giúp tối ưu hóa tốc độ truy cập đối với người dùng trên toàn thế giới.

Nguyên lý hoạt động của CDN

CDN hoạt động dựa trên cơ chế lưu trữ bản sao tạm thời của các tệp tin trên máy chủ proxy gần người dùng nhất. Điều này không chỉ giúp tăng tốc độ tải trang mà còn giảm tải cho máy chủ gốc.

Bước 1: Chuẩn bị môi trường

Để triển khai CDN server, trước tiên bạn cần chuẩn bị các yêu cầu sau:

  1. Tạo một thư mục để lưu trữ hình ảnh, ví dụ: /home/root2/cdn-images và tải một số hình ảnh vào đó.

  2. Tạo Kubernetes secret với chứng chỉ TLS cho ingress, bằng cách sử dụng lệnh:

    kubectl create secret tls tls-certificate --namespace default --key certificate-key.key --cert certificate.crt

Bước 2: Cấu hình DNS

Tạo một bản ghi DNS A trỏ đến máy chủ của bạn, ví dụ: cdn.example.com.

Bước 3: Cài đặt Ingress

Bạn cần cài đặt ingress, có thể tham khảo hướng dẫn chi tiết trên trang tài liệu của Kubernetes.

Bước 4: Cấu hình bộ nhớ đệm

Để tối ưu hóa hiệu suất, bạn nên bổ sung bộ nhớ đệm cho ingress. Tạo một tệp manifest có tên configmap.yaml với nội dung như sau và áp dụng:

yaml Copy
apiVersion: v1
kind: ConfigMap
metadata:
  name: ingress-nginx-controller
  namespace: default
  labels:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
data:
  proxy-connect-timeout: "10"
  proxy-read-timeout: "120"
  proxy-send-timeout: "120"
  http-snippet: "proxy_cache_path /tmp/nginx_cache levels=1:2 keys_zone=static-cache:10m max_size=4g inactive=120m use_temp_path=off;"

Dùng lệnh sau để áp dụng:
kubectl apply -f configmap.yaml

Bước 5: Triển khai CDN server

Sao chép và dán tệp manifest dưới đây vào một tệp có tên cdn.yaml. Lưu ý thay thế YOUR public ip bằng địa chỉ IP của bạn.

yaml Copy
apiVersion: v1
kind: ConfigMap
metadata:
  name: cdn-config
data:
  default.conf: |
    server {
      listen 80;
      server_name _;
      root /usr/share/nginx/html;
      location / {
        proxy_read_timeout 150;
      }
    }
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: cdn
spec:
  selector:
    matchLabels:
      app: cdn
  replicas: 1
  template:
    metadata:
      labels:
        app: cdn
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        ports:
        - containerPort: 80
        volumeMounts:
        - name: cdn-config
          mountPath: /etc/nginx/conf.d/default.conf
          subPath: default.conf
        - name: cdn-images
          mountPath: "/usr/share/nginx/html/"
      volumes:
        - name: cdn-config
          configMap:
            name: cdn-config
        - name: cdn-images
          persistentVolumeClaim:
            claimName: cdn-images
---
apiVersion: v1
kind: Service
metadata:
  name: cdn
spec:
  selector:
    app: cdn
  ports:
    - port: 80
      targetPort: 80
  externalIPs:
  - YOUR public ip
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-cdn
  annotations:
    kubernetes.io/ingress.class: "nginx"
    nginx.ingress.kubernetes.io/rewrite-target: /
    nginx.ingress.kubernetes.io/proxy-body-size: 8m
    nginx.ingress.kubernetes.io/proxy-buffering: "on"
    nginx.ingress.kubernetes.io/configuration-snippet: |
      proxy_cache static-cache;
      proxy_cache_valid any 120m;
      add_header X-Cache-Status $upstream_cache_status;
spec:
  tls:
    - hosts:
      - cdn.example.com
      secretName: tls-certificate
  rules:
  - host: cdn.example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: cdn
            port:
              number: 80
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: cdn-images
spec:
  storageClassName: manual
  capacity:
    storage: 4Gi
  accessModes:
  - ReadWriteOnce
  hostPath:
    path: /home/root2/cdn-images/
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: cdn-images
spec:
  storageClassName: manual
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 4Gi

Sau khi hoàn tất, áp dụng tệp cdn.yaml:

Copy
kubectl apply -f cdn.yaml

Kết quả:

Copy
configmap/cdn-config created
deployment.apps/cdn created
service/cdn created
ingress.networking.k8s.io/ingress-cdn created
persistentvolume/cdn-images created
persistentvolumeclaim/cdn-images created

Sau một thời gian ngắn, quá trình triển khai sẽ hoàn tất thành công.

Kiểm tra khả năng truy cập và bộ nhớ đệm

Tệp manifest cdn.yaml bao gồm ConfigMap, Deployment, Service, PersistentVolume và PersistentVolumeClaim. Trong đó, ConfigMap chứa tệp cấu hình đơn giản cho nginx. Phần Deployment cấu hình VolumeMounts và Volumes, bổ sung ConfigMap và PersistentVolumeClaim. Service được sử dụng để đảm bảo dịch vụ có thể truy cập được từ bên ngoài, trong khi Ingress cung cấp dịch vụ ra công cộng. Chúng ta cũng đã thêm các annotations nhằm tối ưu hóa bộ nhớ đệm cho proxy.

Đó là toàn bộ hướng dẫn để xây dựng một CDN server đơn giản trên Kubernetes. Hy vọng bài viết giúp ích cho bạn trong việc tối ưu hóa trải nghiệm người dùng trên website của mình.
source: viblo

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào