+20

Kubernetes Practice - Set up image service with Thumbor and AWS S3

Giới thiệu

Chào mọi người đến với series practice về kubernetes. Ở bài này chúng ta sẽ tìm hiểu về cách cài đặt Thumbor ở trên môi trường Kubernetes và sử dụng AWS S3 làm nơi lưu trữ hình ảnh cho Thumbor.

image.png

Thumbor

Thumbor là một service xử lý hình ảnh rất mạnh và được cộng đồng sử dụng rất nhiều. Thumbor cho phép ta xử lý thao tác trên hình ảnh rất dễ dàng, ví dụ như xử lý crop, resizing và flipping cho hình ảnh.

Ví dụ ta sẽ dùng Thumbor để lấy hình ảnh với chiều rộng là 300 và chiều dài là 200.

http://thumbor-server/K97LekICOXT9MbO3X1u8BBkrjbu5/300x200/smart/example.jpg

Sau đó nếu ta cần lấy hình ảnh với chiều rộng là 350 và chiều dài là 300 thì chỉ cần thay đổi giá trị 300x200 thành 350x300, rất tiện 😁.

Set up Thumbor

Ok, giờ ta sẽ tiến hành cài đặt thumbor trên môi trường kubernetes.

Đầu tiên ta tạo một file tên là thumbor-deployment.yaml với config như sau:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: thumbor-server
spec:
  replicas: 1
  selector:
    matchLabels:
      app: thumbor
  template:
    metadata:
      labels:
        app: thumbor
    spec:
      containers:
        - name: thumbor
          image: minimalcompact/thumbor:6.7.5
          command: ["thumbor"]
          args: ["-p", "80", "-c", "/conf/thumbor.conf"]
          ports:
            - containerPort: 80
          volumeMounts:
            - name: thumbor-conf
              mountPath: /conf
      volumes:
        - name: thumbor-conf
          configMap:
            name: thumbor

Ta sẽ dùng ConfigMap để lưu cấu hình cho thumbor server và mount nó vào trong Pod thumbor-server ở đường dẫn /conf. Sau đó ta dùng hai thuộc tính commandargs để chỉ định thumbor sẽ chạy ở port 80 và sử dụng /conf/thumbor.conf làm file cấu hình.

Tiếp theo ta tạo ConfigMap để lưu cấu hình của file thumbor.conf, tạo một file tên là thumbor.cm.yaml.

apiVersion: v1
kind: ConfigMap
metadata:
  name: thumbor
data:
  thumbor.conf: |
    UPLOAD_ENABLED = True

Trong file thumbor.conf sẽ có một thuộc tính là UPLOAD_ENABLED = True để cho phép thumbor bật tính năng upload hình. Các bạn xem toàn bộ cấu hình ở đường dẫn này https://thumbor.readthedocs.io/en/latest/configuration.html.

Tiếp theo ta tạo Service và Ingress để expose thumbor server ra bên ngoài, tạo một file tên là thumbor.svc.yaml.

apiVersion: v1
kind: Service
metadata:
  name: thumbor
spec:
  selector:
    app: thumbor
  ports:
    - port: 80

---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: thumbor
  annotations:
    kubernetes.io/ingress.class: alb
    alb.ingress.kubernetes.io/scheme: internet-facing
    alb.ingress.kubernetes.io/target-type: ip
    alb.ingress.kubernetes.io/healthcheck-path: /healthcheck
spec:
  rules:
  - host: thumbor.example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: thumbor
            port:
              number: 80

Ở bài này vì mình xài Kubernetes trên AWS nên Ingress mình dùng của aws-load-balancer-controller, các bạn xem cách cài ở đường dẫn này https://aws.amazon.com/premiumsupport/knowledge-center/eks-alb-ingress-controller-fargate. Còn đối với môi trường on premises thì các bạn nên xài Ingress của NGINX Ingress.

Còn nếu bạn muốn test trên môi trường local thì ta sẽ tạo Service kiểu NodePort.

apiVersion: v1
kind: Service
metadata:
  name: thumbor
spec:
  type: NodePort
  selector:
    app: thumbor
  ports:
    - port: 80
      nodePort: 30000

Tạo resources.

kubectl apply -f thumbor.cm.yaml
kubectl apply -f thumbor-deployment.yaml
kubectl apply -f thumbor.svc.yaml

Nếu bạn cài Ingress dưới on premises thì ta cần trỏ domain tới địa chỉ IP của Worker Node mà host Ingress Controler. Còn nếu bạn cài Ingress trên Cloud thì khi ta tạo Ingress thì Ingress Controler sẽ tạo cho ta một AWS Application Load Balancer, ta chỉ cần trỏ domain tới ALB là được.

Sau đó ta dùng câu lệnh sau để upload hình lên trên Thumbor.

curl -i -H "Content-Type: image/jpeg" -H "Slug: photo.jpg" -XPOST http://thumbor.example.com/image --data-binary "@example.jpg"

Bạn sẽ thấy kết quả trả về như sau.

HTTP/1.1 201 Created
Content-Length: 0
Content-Type: text/html; charset=UTF-8
Location: /image/05b2eda857314e559630c6f3334d818d/photo.jpg
Server: TornadoServer/4.5.3

Để truy cập hình ảnh thì ta chỉ cần dán đường dẫn sau lên trên trình duyệt.

http://thumbor.example.com/image/05b2eda857314e559630c6f3334d818d/photo.jpg

Ok, vậy là ta đã cài đặt thumbor thành công. Nhưng bây giờ nếu bạn xóa thằng Deployment đi và tạo lại thì lúc này nếu ta truy cập vào đường dẫn hình ảnh ở trên thì nó sẽ báo 404 Not Found.

Lý do là vì ta chưa cấu hình persistent storage cho thumbor server, ta có thể xài StatefulSet và cấu hình PersistentVolume, nhưng khi ta scale lên thì hình của ta sẽ được lưu ở các PV khác nhau và điều này sẽ gây ra lỗi khi ta truy cập hình ảnh => Do đó ta cần một chỗ lưu trữ chung cho toàn bộ thumbor server trong trường hợp ta cần scale.

Set up Thumbor with S3 Storage

Ở bài này ta sẽ sử dụng AWS S3 dùng làm chỗ lưu trữ chung cho toàn bộ thumbor server, để xài được S3 cho thumbor thì ta làm theo những bước sau .

Đầu tiên ta cần tạo một IAM user có quyền truy cập S3 bucket mà bạn sẽ sử dụng nó để lưu trữ hình. Các bạn xem hướng dẫn ở đây https://docs.aws.amazon.com/AmazonS3/latest/userguide/example-walkthroughs-managing-access-example1.html. Sau đó bạn tạo access key và secret key cho IAM user đó, dùng hai giá trị đó để tạo Kubernetes Secret, ví dụ như sau.

kubectl create secret generic s3-credentials --from-literal=AWS_ACCESS_KEY_ID=AKIAR4725YR2POTRRS5G --from-literal=AWS_SECRET_ACCESS_KEY=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

Sau đó ta cập nhật ConfigMap thêm vào cấu hình để thumbor có thể sử dụng S3.

apiVersion: v1
kind: ConfigMap
metadata:
  name: thumbor
data:
  thumbor.conf: |
    UPLOAD_ENABLED = True
    TC_AWS_REGION = 'us-west-2'
    TC_AWS_STORAGE_BUCKET = 'thumbor-test'
    TC_AWS_STORAGE_ROOT_PATH = 'storage'
    TC_AWS_RESULT_STORAGE_BUCKET = 'thumbor-test'
    TC_AWS_RESULT_STORAGE_ROOT_PATH = 'result_storage'
    STORAGE = 'tc_aws.storages.s3_storage'
    UPLOAD_PHOTO_STORAGE = 'tc_aws.storages.s3_storage'
    RESULT_STORAGE = 'tc_aws.result_storages.s3_storage'

Các bạn xem toàn bộ cấu hình ở đường dẫn này https://github.com/thumbor-community/aws. Ở trên ta sẽ dùng cấu hình STORAGE = 'tc_aws.storages.s3_storage'UPLOAD_PHOTO_STORAGE = 'tc_aws.storages.s3_storage' để chỉ định cho thumbor sử dụng S3 làm nơi lưu trữ hình.

Sau đó ta cập nhật lại Deployment như sau.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: thumbor-server
spec:
  replicas: 1
  selector:
    matchLabels:
      app: thumbor
  template:
    metadata:
      labels:
        app: thumbor
    spec:
      containers:
        - name: thumbor
          image: minimalcompact/thumbor:6.7.5
          command: ["thumbor"]
          args: ["-p", "80", "-c", "/conf/thumbor.conf"]
          ports:
            - containerPort: 80
          envFrom:
            - secretRef:
                name: s3-credentials
          volumeMounts:
            - name: thumbor-conf
              mountPath: /conf
      volumes:
        - name: thumbor-conf
          configMap:
            name: thumbor

Ta tạo lại Configmap và Deployment.

kubectl apply -f thumbor.cm.yaml
kubectl apply -f thumbor-deployment.yaml

Bây giờ ta upload hình ảnh lên.

curl -i -H "Content-Type: image/jpeg" -H "Slug: photo.jpg" -XPOST http://thumbor.example.com/image --data-binary "@example.jpg"

Sau đó bạn vào S3 kiểm tra thì sẽ thấy file của ta.

image.png

Oke, ta đã cấu hình thành công 😁.

English version Set up image service with Thumbor and AWS S3. Please follow me on Medium 😁.

Kết luận

Vậy là ta đã tìm hiểu xong cách cấu hình Thumbor với S3. Thumbor là một service xử lý hình ảnh rất hay mà có lẻ ta sẽ sử dụng nhiều trên môi trường production. Nếu có thắc mắc hoặc cần giải thích rõ thêm chỗ nào thì các bạn có thể hỏi dưới phần comment.

Mục tìm kiếm đồng đội

Hiện tại thì công ty bên mình, là Hoàng Phúc International, với hơn 30 năm kinh nghiệm trong lĩnh vực thời trang. Và sở hữu trang thương mại điện tử về thời trang lớn nhất Việt Nam. Team công nghệ của HPI đang tìm kiếm đồng đội cho các vị trí như:

Với mục tiêu trong vòng 5 năm tới về mảng công nghệ là:

  • Sẽ có trang web nằm trong top 10 trang web nhanh nhất VN với 20 triệu lượt truy cập mỗi tháng.
  • 5 triệu loyal customers và có hơn 10 triệu transactions mỗi năm.

Team đang xây dựng một hệ thống rất lớn với rất nhiều vấn đề cần giải quyết, và sẽ có rất nhiều bài toán thú vị cho các bạn. Nếu các bạn có hứng thú trong việc xây dựng một hệ thống lớn, linh hoạt, dễ dàng mở rộng, và performance cao với kiến trúc microservices thì hãy tham gia với tụi mình.

Nếu các bạn quan tâm hãy gửi CV ở trong trang tuyển dụng của Hoàng Phúc International hoặc qua email của mình nha hmquan08011996@gmail.com. Cảm ơn các bạn đã đọc.


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí