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