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:
-
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 đó. -
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
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
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
:
kubectl apply -f cdn.yaml
Kết quả:
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