Helm là một trình quản lý gói mạnh mẽ dành cho Kubernetes, giúp các nhà phát triển và đội ngũ vận hành tự động hóa việc triển khai, cấu hình và quản lý ứng dụng trên các cụm Kubernetes một cách dễ dàng và hiệu quả. Trong Helm, mỗi gói ứng dụng được gọi là chart, chứa các tập tin mẫu (template) định nghĩa tài nguyên, cho phép triển khai mà không cần chỉnh sửa thủ công từng thành phần. Nhờ cơ chế templating, người dùng có thể linh hoạt quản lý chart bằng cách truyền vào các biến cấu hình thay vì chỉnh sửa trực tiếp mã nguồn. Helm cũng theo dõi phiên bản triển khai, giúp nâng cấp hoặc rollback ứng dụng khi cần. Khi một chart được triển khai kèm theo cấu hình tùy chỉnh, phiên bản đó được gọi là release.
DataOnline sẽ hướng dẫn bạn học cách cài đặt Helm 3, quản lý chart và release, thực hiện các thao tác cài đặt, nâng cấp, rollback, cũng như tạo và đóng gói chart tùy chỉnh. Ngoài ra, bạn sẽ biết cách thiết lập Helm repository để lưu trữ và chia sẻ chart, giúp đơn giản hóa quá trình triển khai ứng dụng. Nếu bạn đang tìm kiếm giải pháp tự động hóa triển khai trên Kubernetes, Helm chính là công cụ không thể thiếu!
Yêu cầu
● Một cụm Kubernetes có bật RBAC (quản lý truy cập dựa trên vai trò). Để biết thêm thông tin về release, bạn có thể xem trang các release của Helm.
● Công cụ dòng lệnh kubectl đã được cài đặt trên máy cục bộ của bạn, và đã được cấu hình để kết nối với cụm của bạn. Bạn có thể đọc thêm về cách cài đặt kubectl trong tài liệu chính thức. Bạn có thể kiểm tra kết nối với lệnh sau:
kubectl cluster-info
● Nếu không có lỗi xuất hiện, bạn đã kết nối thành công với cụm. Nếu bạn truy cập nhiều cụm với kubectl, hãy đảm bảo rằng bạn đã chọn đúng context của cụm bằng cách chạy:
kubectl config get-contexts
Output sẽ liệt kê các cấu hình có sẵn:
Output CURRENT NAME CLUSTER AUTHINFO NAMESPACE * do-fra1-helm3-example do-fra1-helm3-example do-fra1-helm3-example-admin
Ở đây, dấu hoa thị (*) cho biết bạn đang kết nối với cụm do-fra1-helm3-example. Để chuyển sang cụm khác, hãy chạy:
kubectl config use-context context-name
Khi bạn đã kết nối đúng với cụm, hãy tiếp tục đến Bước 1 để bắt đầu cài đặt Helm.
Bước 1 – Cài đặt Helm 3
Trong phần này, bạn sẽ cài đặt Helm 3 bằng cách sử dụng script shell được cung cấp chính thức.
Đầu tiên, hãy chuyển đến thư mục /tmp, nơi bạn sẽ lưu trữ script cài đặt bằng cách chạy:
cd /tmp
Sử dụng lệnh sau để tải script:
curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3
Bạn có thể mở file get_helm.sh trong trình soạn thảo văn bản để đảm bảo nó an toàn.
Đặt quyền thực thi cho file bằng lệnh:
chmod u+x get_helm.sh
Cuối cùng, chạy script để cài đặt Helm 3:
./get_helm.sh
Bạn sẽ nhận được output tương tự như sau:
Output Downloading https://get.helm.sh/helm-v3.5.2-linux-amd64.tar.gz Verifying checksum... Done. Preparing to install helm into /usr/local/bin helm installed into /usr/local/bin/helm
Bạn đã cài đặt thành công Helm 3 trên máy của mình. Tiếp theo, bạn sẽ tìm hiểu về các kho chứa chart và cách sử dụng chúng.
Bước 2 – Thiết lập kho chứa Chart
Các chart của Helm được lưu trữ trong các kho chứa chart mà bất cứ ai cũng có thể host. Theo mặc định, Helm 3 không được cấu hình sẵn với bất kỳ kho chứa nào. Các phiên bản trước của Helm bao gồm một kho chứa chart được quản lý tập trung; tuy nhiên, thiết kế của Helm 3 đã tiến hóa để các nhà phát triển chart tự quản lý kho chứa của họ, cho phép tự do hơn và phát hành nhanh hơn.
Điều này có nghĩa là với mỗi chart bạn muốn sử dụng, bạn cần phải thêm kho chứa host chart đó vào cài đặt Helm của mình.
Để giúp bạn tìm được kho chứa phù hợp, bạn có thể sử dụng ArtifactHub.io, một website mã nguồn mở do CNCF quản lý, chuyên liệt kê các chart của Helm và các kho chứa của chúng. Nó cũng theo dõi các chart phổ biến và hữu ích mà các dự án của CNCF khác sử dụng, do đó khác với kho chứa ổn định mà các phiên bản trước của Helm đã sử dụng. Với các dự án phổ biến như ingress-nginx hoặc các công cụ giám sát, đây là nguồn tài nguyên tuyệt vời.
Bạn có thể tìm kiếm một chart mà bạn muốn cài đặt thông qua trang chủ. Việc tìm kiếm “nginx” sẽ hiển thị tất cả các chart liên quan đến nginx.
Bạn sẽ cài đặt phiên bản cộng đồng do nhóm Kubernetes quản lý. Hãy tìm kiếm “ingress-nginx” để tìm nó trong kết quả. Chọn nó để truy cập trang chi tiết của chart.
Mỗi chart sẽ có phần mô tả chi tiết về chức năng của nó, kèm theo các lệnh để thêm kho chứa của chart vào cài đặt Helm của bạn và cài đặt chart đó. Nếu không có, bạn vẫn có thể lấy các lệnh cần thiết bằng cách nhấn nút INSTALL ở bên phải trang.
Bạn có thể nhấn nút màu xanh bên cạnh lệnh để sao chép nó. Hãy sao chép lệnh đầu tiên và chạy nó:
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
Lệnh trên sẽ thêm kho chứa cho Helm bằng cách chỉ định tên của repo và địa chỉ của nó.
Output sẽ là:
Output "ingress-nginx" has been added to your repositories
Khi bạn thêm một kho chứa mới, bạn cần thông báo cho Helm về nội dung của nó bằng cách chạy:
helm repo update
Bạn sẽ nhận được output sau, cho biết việc cập nhật đã thành công:
Output Hang tight while we grab the latest from your chart repositories... ...Successfully got an update from the "ingress-nginx" chart repository Update Complete. ⎈Happy Helming!⎈
Trong bước này, bạn đã tìm hiểu về ArtifactHub và các lợi ích mà nó mang lại. Bạn cũng đã thêm một kho chứa mới vào cài đặt Helm của mình. Ở bước tiếp theo, bạn sẽ cài đặt một chart của Helm.
Bước 3 – Cài đặt một Chart của Helm
Trong phần trước, bạn đã thêm kho chứa cho chart ingress-nginx. Giờ đây, bạn sẽ cài đặt chart này vào cụm của bạn.
Mỗi chart có các biến cấu hình mà bạn có thể thiết lập để thay đổi hành vi của nó. Các biến này được lưu trữ trong file values.yaml của chart. Trừ khi bạn đã tải chart về máy, bạn sẽ phải chạy lệnh sau để xem nội dung của nó:
helm show values chart_name
Để hiển thị các biến có sẵn cho ingress-nginx, thay chart_name bằng:
helm show values ingress-nginx/ingress-nginx
Output sẽ dài với nội dung của file values.yaml của chart ingress-nginx.
Để cài đặt một chart, bạn có thể sử dụng lệnh:
helm install release_name repository/chart_name
Một release là một phiên bản đã được triển khai của chart, và ở đây bạn đặt tên nó là ingress-nginx.
Lệnh trên sẽ cài đặt chart vào cụm của bạn với các giá trị mặc định của các biến. Nếu bạn muốn thay đổi một số giá trị, bạn có thể truyền giá trị mới thông qua tham số –set:
helm install ingress-nginx/ingress-nginx --set variable_name=variable_value
Bạn có thể lặp lại tham số –set cho bao nhiêu biến tùy ý. Vì ở đây chúng ta không thực hiện tùy chỉnh, hãy cài đặt chart theo mặc định bằng cách chạy:
helm install ingress-nginx ingress-nginx/ingress-nginx
Output sẽ tương tự như sau:
Output NAME: ingress-nginx LAST DEPLOYED: Wed Feb 24 10:12:37 2021 NAMESPACE: default STATUS: deployed REVISION: 1 TEST SUITE: None NOTES: The ingress-nginx controller has been installed. It may take a few minutes for the LoadBalancer IP to be available. You can watch the status by running 'kubectl --namespace default get services -o wide -w ingress-nginx-controller'
Lưu ý rằng tên NAME tương ứng với tên của release mà bạn đã chỉ định. Helm cũng liệt kê thông tin chung như trạng thái của release và namespace mà nó được triển khai. Phần NOTES có thể khác nhau giữa các chart, thường chứa hướng dẫn khởi động nhanh hoặc cảnh báo về một số vấn đề phổ biến khi sử dụng các tài nguyên của chart. Ở đây, nó thông báo rằng một Load Balancer đang được tạo và có thể mất một lúc để hoàn tất.
Để kiểm tra các chart đã được triển khai, hãy sử dụng lệnh:
helm list
Output sẽ hiển thị rằng ingress-nginx là chart duy nhất hiện đang được triển khai:
Output NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION ingress-nginx default 1 2021-02-24 10:12:37.281049711 +0000 UTC deployed ingress-nginx-3.23.0 0.44.0
Bạn có thể tìm các dịch vụ của chart trên cụm của bạn bằng cách chạy:
kubectl get services
Output sẽ giống như sau:
Output NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE ingress-nginx-controller LoadBalancer 10.245.211.81 46.101.68.67 80:30704/TCP,443:30700/TCP 7m19s ingress-nginx-controller-admission ClusterIP 10.245.50.17 <none> 443/TCP 7m19s kubernetes ClusterIP 10.245.0.1 <none> 443/TCP 83m
Giờ đây, khi bạn đã triển khai một release vào cụm, bước tiếp theo là thay đổi cấu hình của nó trong khi vẫn đang chạy.
Bước 4 – Nâng cấp một Release
Khi một release đã được triển khai, bạn không cần phải hủy bỏ hoàn toàn và triển khai lại khi cần thay đổi cấu hình. Bạn có thể sử dụng lệnh helm upgrade để nâng cấp release với phiên bản chart mới, hoặc để thiết lập các cài đặt mới.
Chart ingress-nginx cho phép thiết lập biến controller.replicaCount để kiểm soát số lượng pod của controller được triển khai. Theo mặc định, biến này được đặt là 1, điều bạn có thể xác minh bằng cách liệt kê các pod có sẵn:
kubectl get pods
Bạn sẽ thấy chỉ có một pod:
Output NAME READY STATUS RESTARTS AGE ingress-nginx-controller-7fc74cf778-kjtst 1/1 Running 0 12m
Nếu bạn muốn triển khai nhiều hơn để đảm bảo độ dự phòng (ví dụ, ba pod), bạn có thể nâng cấp release và đặt biến này thành 3 bằng cách chạy:
helm upgrade ingress-nginx ingress-nginx/ingress-nginx --set controller.replicaCount=3 --reuse-values
Ở đây, bạn cũng truyền tham số –reuse-values, chỉ thị cho Helm sử dụng cấu hình hiện có của release để áp dụng các thay đổi mới.
Trong output, Helm sẽ tăng revision lên để biểu thị rằng release đã được nâng cấp:
Output NAME: ingress-nginx LAST DEPLOYED: Wed Feb 24 12:07:54 2021 NAMESPACE: default STATUS: deployed REVISION: 2 TEST SUITE: None NOTES: ...
Bạn có thể kiểm tra lại các pod đã được liệt kê bằng cách chạy:
kubectl get pods
Và bạn sẽ thấy có ba pod thay vì một:
Output NAME READY STATUS RESTARTS AGE ingress-nginx-controller-7fc74cf778-4hk9g 1/1 Running 0 18s ingress-nginx-controller-7fc74cf778-kjtst 1/1 Running 0 22m ingress-nginx-controller-7fc74cf778-wz595 1/1 Running 0 18s
Tiếp theo, bạn sẽ quay lại các thay đổi và xóa release khi không còn cần thiết.
Bước 5 – Quay lại và xóa một Release
Khi bạn nâng cấp một release, số revision sẽ được tăng lên. Nội bộ, Helm lưu trữ tất cả các revision của một release, cho phép bạn quay lại phiên bản trước đó nếu cần.
Để khôi phục số lượng pod về chỉ còn 1, bạn có thể chạy lại lệnh helm upgrade và thiết lập số lượng pod thủ công vì đây là một thay đổi nhỏ. Tuy nhiên, với các chart phức tạp có nhiều biến, việc quay lại thủ công không khả thi và cần được tự động hóa.
Để quay lại một release, hãy sử dụng lệnh helm rollback:
helm rollback release_name release_revision
Bạn có thể sử dụng lệnh này để quay lại các thay đổi của ingress-nginx bằng cách quay về revision 1:
helm rollback ingress-nginx 1
Bạn sẽ nhận được output cho biết hành động đã thành công:
Output Rollback was a success! Happy Helming!
Bạn có thể kiểm tra revision hiện tại bằng cách liệt kê các release:
helm list
Bạn sẽ thấy rằng revision hiện tại là 3, chứ không phải 1:
Output NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION ingress-nginx default 3 2021-02-24 12:43:21.523664768 +0000 UTC deployed ingress-nginx-3.23.0 0.44.0
Helm coi mọi thay đổi, kể cả rollback, là một revision mới của release. Bạn có thể kiểm tra rằng revision 3 tương đương với revision ban đầu bằng cách kiểm tra số lượng pod đang được triển khai:
kubectl get pods
Và bạn sẽ thấy chỉ còn một pod:
Output NAME READY STATUS RESTARTS AGE ingress-nginx-controller-7fc74cf778-kjtst 1/1 Running 0 41m
Để xóa một release và tất cả các revision của nó, bạn có thể sử dụng lệnh helm delete:
helm delete release_name
Vì bạn không còn cần nó nữa, hãy xóa ingress-nginx bằng cách chạy:
helm delete ingress-nginx
Output sẽ là:
Output release "ingress-nginx" uninstalled
Bạn có thể liệt kê các release để kiểm tra rằng không còn release nào:
helm list
Output của bảng sẽ không còn dòng nào:
Output NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
Bây giờ, khi release đã được xóa, bạn có thể sử dụng lại tên đó cho các lần triển khai trong tương lai.
Bước 6 – Tạo Chart tùy chỉnh
Trong bước tùy chọn này, bạn sẽ học cách tạo một chart tùy chỉnh, xác định vị trí đặt các định nghĩa tài nguyên, và cách đóng gói nó để phân phối.
Bạn sẽ tạo một chart mới có tên example-chart. Chạy lệnh sau để tạo nó:
helm create example-chart
Lệnh trên sẽ tạo ra một thư mục mới có tên example-chart với cấu trúc và các file như sau:
example-chart/ charts/ templates/ ├─ tests/ │ ├─ test-connection.yaml ├─ deployment.yaml ├─ hpa.yaml ├─ ingress.yaml ├─ NOTES.txt ├─ service.yaml ├─ serviceaccount.yaml ├─ _helpers.tpl Chart.yaml values.yaml
Các định nghĩa tài nguyên mà chart của bạn sẽ triển khai lên cụm đích được đặt trong thư mục templates. Các định nghĩa mặc định mà Helm tạo ra để làm điểm khởi đầu sẽ triển khai một controller ingress Nginx. Mặc dù các file có phần mở rộng là YAML, nhưng chúng sử dụng cú pháp templating của Go để giữ cho chúng có thể tùy chỉnh thông qua các biến được khai báo mà bạn có thể truyền vào. Bạn có thể kiểm tra bằng cách xem nội dung file service.yaml bằng lệnh:
cat example-chart/templates/service.yaml
Bạn sẽ thấy rằng file này chứa các chỉ thị templating để tạo ra các giá trị được bao quanh bởi cặp dấu ngoặc kép kép:
OutputapiVersion: v1 kind: Service metadata: name: {{ include "mychart.fullname" . }} labels: {{- include "mychart.labels" . | nindent 4 }} spec: type: {{ .Values.service.type }} ports: - port: {{ .Values.service.port }} targetPort: http protocol: TCP name: http selector: {{- include "mychart.selectorLabels" . | nindent 4 }}
Các biến được tham chiếu ở đây được khai báo trong file values.yaml. Phần NOTES mà Helm hiển thị sau khi triển khai được lưu trong file NOTES.txt, và nó cũng sử dụng templating. Metadata của chart, chẳng hạn như tên, phiên bản, và phiên bản phần mềm được triển khai, được chỉ định trong file Chart.yaml:
apiVersion: v2 name: mychart description: A Helm chart for Kubernetes ... type: application ... version: 0.1.0 ... appVersion: "1.16.0"
Để kiểm tra những gì Helm sẽ triển khai, bạn có thể chạy lệnh helm install với các tham số –dry-run và –debug chỉ định tới thư mục chart:
helm install example-chart --dry-run --debug ./example-chart
Output sẽ dài và chứa tất cả các định nghĩa tài nguyên cuối cùng sẽ được áp dụng lên cụm của bạn. Trong quá trình phát triển chart, bạn có thể sử dụng lệnh helm upgrade để đẩy các phiên bản mới lên Kubernetes.
Khi bạn sẵn sàng chia sẻ chart hoàn thiện của mình, bạn có thể đóng gói nó để phân phối bằng cách chạy:
helm package ./example-chart
Output sẽ là:
Output Successfully packaged chart and saved it to: .../example-chart-0.1.0.tgz
Chart đã được đóng gói có thể được cài đặt giống như các chart từ kho chứa đã thêm:
helm install example-chart example-chart-0.1.0.tgz
Trong bước này, bạn đã tạo và triển khai một chart tùy chỉnh, đóng gói nó, và tìm hiểu về cấu trúc của chart.
Kết luận
Bây giờ, bạn đã biết cách sử dụng Helm để cài đặt và nâng cấp phần mềm được triển khai trên cụm Kubernetes của mình. Bạn đã thêm các kho chứa chart và tìm hiểu lý do tại sao chúng quan trọng, cũng như cách ArtifactHub có thể giúp bạn tìm được các chart. Bạn cũng đã tạo một chart tùy chỉnh và tìm hiểu về các revision của release và cách quay lại nếu cần.