0
0
Lập trình
Harry Tran
Harry Tran106580903228332612117

Hướng Dẫn Thiết Lập Canary Release Trên Kubernetes Sử Dụng Nginx Ingress Kết Hợp Với Github Actions

Đăng vào 1 tháng trước

• 7 phút đọc

Xin Chào Các Bạn!

Chúc các bạn có một cuối tuần thật vui vẻ và thư giãn! Hôm nay, chúng ta lại cùng nhau khám phá một chủ đề thú vị trong chuỗi bài viết về Kubernetes - cách thiết lập Canary Release sử dụng Nginx Ingress và tích hợp với CI/CD thông qua Github Actions.

Canary Release Là Gì?

Canary Release là phương pháp triển khai tính năng mới cho một nhóm người dùng chọn lọc trước khi phát hành cho toàn bộ người dùng. Thay vì phát hành tính năng mới cho 100% người dùng ngay lập tức, bạn có thể bắt đầu với 10%, thu thập phản hồi và theo dõi lỗi. Nếu mọi thứ diễn ra suôn sẻ, bạn có thể dần dần tăng tỉ lệ lên 20%, 50% và cuối cùng là 100%.

Kỹ thuật này giúp giảm thiểu rủi ro cho người dùng đang sử dụng sản phẩm, đặc biệt là khi các tính năng mới có thể tiềm ẩn lỗi. Nếu có vấn đề xảy ra trong quá trình Canary Release, bạn có thể dễ dàng dừng lại và lùi về phiên bản ổn định trước đó.

Một cách để hiểu về Canary Release là hình dung hình thức mà các thợ mỏ trước đây sử dụng chim hoàng yến để phát hiện khí độc trong hầm mỏ. Họ sẽ mang theo một chú chim, và nếu chim có dấu hiệu không khỏe, điều đó cảnh báo cho họ về điều gì đó không ổn trong môi trường.

Tiến Trình Thiết Lập

Bước 1: Lấy Session Để Truy Cập Kubernetes

Để thực hành, đầu tiên bạn cần lấy phiên truy cập vào Kubernetes Cluster. Bạn có thể truy cập đường dẫn này để nhận session. Hãy nhớ đánh dấu chọn Require Domain để sử dụng cùng với Ingress nhé.

Bước 2: Tạo Canary Release Với Nginx Ingress

Chúng ta sẽ sử dụng Nginx Ingress vì đây là giải pháp tiện lợi cho việc thiết lập Canary Release. Đầu tiên, tạo một thư mục mới với tên k8s-canary-release và thêm file kubernetes-config vào đó.

Tạo file deployment.yml

Mở một file mới có tên deployment.yml và thêm nội dung như sau:

yaml Copy
apiVersion: v1
kind: Service
metadata:
  name: myapp-svc
  labels:
    app: myapp
spec:
  type: ClusterIP
  ports:
    - port: 80
      name: http
      targetPort: http
  selector:
    app: myapp

---

apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp
  labels:
    app: myapp
spec:
  replicas: 1
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
        - name: myapp
          image: maitrungduc1410/sample-node:latest
          ports:
            - containerPort: 3000
              name: http
          resources:
            requests:
              memory: "64Mi"
              cpu: "100m"
            limits:
              memory: "128Mi"
              cpu: "200m"

Áp Dụng Configuration

Sau khi thêm file, áp dụng cấu hình bằng lệnh:

Copy
kubectl apply -f deployment.yml --kubeconfig=./kubernetes-config

Tạo File Ingress

Tiếp theo, tạo file ingress.yml với nội dung sau:

yaml Copy
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: myapp
spec:
  ingressClassName: "nginx"
  rules:
    - host: 6b4407.learnk8s.jamesisme.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: myapp-svc
                port:
                  name: http

Áp dụng ingress.yml:

Copy
kubectl apply -f ingress.yml --kubeconfig=./kubernetes-config

Bước 3: Tạo Canary Release

Sau khi cấu hình Ingress, chúng ta sẽ thiết lập Canary Release. Đây là bước quan trọng nhé. Nginx cho phép cấu hình thông qua annotation, giúp đơn giản hóa quy trình. Bạn sẽ cần tạo file deployment-canary.yml với nội dung như sau:

yaml Copy
apiVersion: v1
kind: Service
metadata:
  name: myapp-svc-canary
  labels:
    app: myapp-canary
spec:
  type: ClusterIP
  ports:
    - port: 80
      name: http
      targetPort: http
  selector:
    app: myapp-canary

---

apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp-canary
  labels:
    app: myapp-canary
spec:
  replicas: 1
  selector:
    matchLabels:
      app: myapp-canary
  template:
    metadata:
      labels:
        app: myapp-canary
    spec:
      containers:
        - name: myapp
          image: maitrungduc1410/sample-node:v1
          ports:
            - containerPort: 3000
              name: http
          resources:
            requests:
              memory: "64Mi"
              cpu: "100m"
            limits:
              memory: "128Mi"
              cpu: "200m"

Sau đó, áp dụng lại cấu hình:

Copy
kubectl apply -f deployment-canary.yml --kubeconfig=./kubernetes-config

Thiết Lập Ingress Canary

Tiếp theo, bạn cần tạo một file ingress-canary.yml với nội dung:

yaml Copy
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: myapp-canary
  annotations:
    nginx.ingress.kubernetes.io/canary: "true"
    nginx.ingress.kubernetes.io/canary-weight: "30"
spec:
  ingressClassName: "nginx"
  rules:
    - host: 6b4407.learnk8s.jamesisme.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: myapp-svc-canary
                port:
                  name: http

Áp dụng cấu hình cho ingress-canary:

Copy
kubectl apply -f ingress-canary.yml --kubeconfig=./kubernetes-config

Tích Hợp Với Github Actions

Để tự động hóa quy trình Canary Release, chúng ta sẽ tích hợp với Github Actions. Tạo một repo mới tên là viblo-k8s-canary-release và thêm file deploy.yml vào thư mục .github/workflows/ với nội dung như sau:

yaml Copy
name: "Kubernetes Canary Release"
on:
  workflow_dispatch:

jobs:
  canary-deployment:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v4
  # thêm các bước cần thiết ở đây

Nội dung cụ thể sẽ bao gồm các bước để triển khai bản stable, bản canary và xử lý rollback nếu có lỗi xảy ra.

Kết Luận

Qua bài viết này, hy vọng rằng bạn đã nắm được cách thiết lập Canary Release trên Kubernetes cùng với Nginx Ingress, và làm thế nào để tích hợp quy trình này vào CI/CD thông qua Github Actions một cách tự động và hiệu quả.

Chúc bạn có dược sự thành công trong các dự án 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