Hỏi đáp

Hướng dẫn tạo Helm chart trong 10 phút

Huy Erick

Giới thiệu về Helm Helm là một trình quản lý gói ứng dụng cho Kubernetes, giúp điều phối tải xuống, cài đặt và triển khai ứng dụng. Helm chart là cách bạn xác định một...

Giới thiệu về Helm

Helm là một trình quản lý gói ứng dụng cho Kubernetes, giúp điều phối tải xuống, cài đặt và triển khai ứng dụng. Helm chart là cách bạn xác định một ứng dụng bao gồm các tài nguyên nào trong Kubernetes.

Tại sao bạn nên sử dụng Helm? Vì Helm giúp quản lý việc triển khai các ứng dụng dễ dàng hơn trong Kubernetes bằng cách sử dụng các temlplate đã được làm sẵn. Tất cả các Helm chart đều có cấu trúc giống nhau nhưng vẫn có thể linh hoạt để chạy bất kỳ ứng dụng nào trên Kubernetes. Helm cũng hỗ trợ việc quản lý phiên bản nhằm theo dõi sự thay đổi của từng phiên bản ứng dụng được triển khai.

Trong bài viết hôm nay, chúng ta sẽ nói về việc làm thế nào để tạo một Helm Chart với Minikube. Cụ thể hơn, bạn sẽ tạo một Web Server chạy Nginx. Trong ví dụ này, chúng ta thực hiện trên môi trường như sau:

  • minikube version: v1.14.0. Tải xuống và cài đặt theo hướng dẫn sau: Link
  • helm chart v3.4.0-rc.1. Tải xuống và cài đặt theo hướng dẫn sau: Link

Cách khởi tạo một Helm chart

Trước khi bắt đầu, cần xác nhận lại rằng Minikube và Helm đã được cài đặt đúng:

$ which helm ## /usr/local/bin/helm
$ minikube status ## if it shows Stopped, run `minikube start`
host: Running
kubelet: Running
apiserver: Running
kubeconfig: Configured

Bắt đầu tạo một Helm chart mới sử dụng một câu lệnh sau:

$ helm create tel4vnchart

Trong bài viết này, chúng ta sẽ tạo một chart có tên là tel4vnchart.

Cấu trúc của một chart

Sau bước trên, bạn đã tạo một chart, giờ hãy cùng nhìn xem bên trong một chart bao gồm những thứ gì. Trước tiên, 2 file bạn nhìn thấy là Chart.yamlvalues.yaml.

Mở file Chart.yaml, bạn sẽ xem cấu trúc của chart bao gồm những gì:

apiVersion: v2
name: tel4vnchart
description: A Helm chart for Kubernetes
type: application
version: 0.1.0
appVersion: 1.16.0

Phần đầu tiên gồm thông số về API version mà chart này sẽ sử dụng. Tiếp theo là tên của chart và mô tả của nó. Phần tiếp theo sẽ là loại chart (mặc định là application), tiếp theo là phiên bản chart mà ta sẽ triển khai và phiên bản ứng dụng này.

Phần quan trọng nhất của chart là thư mục template. Trong đó gồm tất cả các cài đặt mà ứng dụng của bạn sẽ triển khai trong cluster. Như bạn thấy ở bên dưới, ứng dụng này bao gồm các phần triển khai cơ bản nhất là ingress, service account và service. Ngoài ra còn có thư mục test, bao gồm các kiểm tra dùng để check kết nối vào bên trong ứng dụng.

$ ls templates/
NOTES.txt   _helpers.tpl  deployment.yaml  ingress.yaml  service.yaml  serviceaccount.yaml  tests/

Ngoài các file trong thư mục template, bạn còn có thư mục charts/. Trong đó bao gồm các chart khác mà ứng dụng của bạn cần để triển khai. Một số chart cần thêm chart khác để có thể bổ sung được, thì các chart bổ sung đó sẽ được để vào đây. Tạm thời bạn bỏ qua vấn đề này.

Giải thích và chỉnh sửa giá trị file config

Thông số về các giá trị tài nguyên, cấu hình hạ tầng mà ứng dụng sử dụng sẽ được lưu trong file values.yaml. Trước đó, bạn sẽ cùng nói qua về file values.yaml.

# Default values for tel4vnchart.
# This is a YAML-formatted file.
# Declare variables to be passed into your templates.
replicaCount: 1
image:
  repository: nginx
  pullPolicy: IfNotPresent
imagePullSecrets: []
nameOverride: ""
fullnameOverride: ""
serviceAccount:
  create: true
  annotations: {}
  name:
podSecurityContext: {}
service:
  type: ClusterIP
  port: 80
ingress:
  enabled: false
  annotations: {}
  hosts:
    - host: chart-example.local
      paths: []
  tls: []
resources: {}
nodeSelector: {}
tolerations: []
affinity: {}

Trên cùng của file, bạn có thể thấy thông số replicaCount được đặt mặc định là 1. Nó có nghĩa là sẽ chỉ có 1 pod được tạo khi ứng dụng chạy. Nếu bạn cần nhiều hơn 1 pod thì hãy điều chỉnh thông số này. Bạn sẽ để nguyên là 1 trong bài viết này.

Đoạn image trong phần này sẽ gồm 2 điểm bạn cần quan tâm: repository - nơi bạn sẽ tải xuống các image để triển khai và pullPolicy - điều kiện để bạn tải xuống images mới. Hiện tại pullPolicy được cài đặt là IfNotPresent nghĩa là tự động tải xuống image khi nó chưa có trên máy. Ở đây bạn sẽ sử dụng Always để có thể luôn tải xuống image mỗi khi triển khai hoặc Latest để tải xuống image mới nhất mỗi khi triển khai.

Hiện tại:

image:
  repository: nginx
  pullPolicy: IfNotPresent

Sau đó:

image:
  repository: nginx
  pullPolicy: Always

Các thông số trong Helm chart

Thông số namingsecrets

Tiếp theo là thông số imagePullSecrets - đây là cài đặt một khoá bí mật, mật khẩu hoặc API key để bạn có thể tải xuống image từ một Private Registy.

Tiếp theo là nameOverridefullnameOverride. 2 thông số này được hiểu là khi bạn chạy câu lệnh helm create thì đã đặt tên cho chart là tel4vnchart nhưng nếu bạn cần phải đổi tên chart sau khi bạn tạo nó thì bạn có thể thay đổi nó ở đây.

Hiện tại:

imagePullSecrets: []
nameOverride: ""
fullnameOverride: ""

Sau đó:

imagePullSecrets: []
nameOverride: "cherry-awesome-app"
fullnameOverride: "cherry-chart"

Thông số Accounts

Trường service accounts cung cấp xác thực người dùng khi chạy một pod bên trong cluster. Nếu phần này trống, nó sẽ được sinh tự động theo full name được chỉ định trong helpers.tpl. Mình kiến nghị nên có service account được cài để ứng dụng có thể được liên kết với người dùng ngay trong chart.

Hiện tại:

serviceAccount:
  create: true
  annotations: {}
  name:

Sau đó:

serviceAccount:
  create: true
  annotations: {}
  name: cherrybomb

Thông số Security

Bạn có thể cài đặt pod security để giới hạn nhóm người hoặc người dùng nhất định được can thiệp vào pod. Hiểu được các thông số trong phần này sẽ giúp tăng khả năng bảo mật cho pod nhưng trong bài viết này, mình sẽ bỏ qua:

podSecurityContext: {}

Thông số Networking

Có 2 loại cài đặt khác nhau trong phần này có thể được chỉ định trong chart. Đầu tiên là sử dụng mạng local với ClusterIP. Khi đó ứng dụng sẽ được expose trên địa chỉ IP bên trong của Cluster. Với thông số này, ứng dụng của bạn chỉ có thể truy cập ở bên trong cluster (hoặc thông qua ingress, mặc định thông số ingress được đặt là false). Cài đặt khác là NodePort. Nó sẽ expose ứng dụng trên mỗi địa chỉ của từng node trong Kubernetes Cluster.

Hiện tại:

service:
  type: ClusterIP
  port: 80
ingress:
  enabled: false

Sau đó:

service:
  type: NodePort
  port: 80
ingress:
  enabled: false

Thông số Resources

Helm cho phép bạn chỉnh sửa thông số phần cứng sẽ cung cấp để chạy ứng dụng. Bạn có thể cấu hình giá trị lớn nhất và nhỏ nhất phần cứng sẽ cung cấp. Trong bài viết này, bạn sẽ giới hạn lại như bên dưới:

Hiện tại:

resources: {}

Sau đó:

resources:
  limits:
    cpu: 100m
    memory: 128Mi
  requests:
    cpu: 100m
    memory: 128Mi

Tolerations, node selectors, affinities

Cuối cùng là 3 thông số:

  • nodeSelector: chỉ định rằng bạn sẽ triển khai ứng dụng trên các node nào trong cluster.
  • taining: chỉ định thông số để loại bỏ một node ra khỏi quá trình triển khai.
  • affinity: chỉ định thông số để thêm ưu tiên chọn một node khi triển khai.

Trong bài viết này, để đơn giản hóa việc tạo Helm chart, mình sẽ không đề cập đến việc chỉnh sửa các thông số này:

Hiện tại:

nodeSelector: {}
tolerations: []
affinity: {}

Triển khai Helm chart

Sau các bước trên, bạn đã chỉnh sửa các thông số cần thiết để tạo một Helm chart. Tiếp sẽ là bước triển khai chart này trên cluster của bạn:

$ helm install my-tel4vn-chart tel4vnchart/ -values tel4vnchart/values.yaml
Release "my-tel4vn-chart" has been upgraded. Happy Helming!

Câu lệnh này sẽ hiển thị tiếp các bước để bạn cài đặt làm thế nào kết nối được mình ứng dụng. Ví dụ như bên dưới:

$ export POD_NAME=$(kubectl get pods -l "app.kubernetes.io/name=tel4vnchart,app.kubernetes.io/instance=my-tel4vn-chart" -o jsonpath="{.items[0].metadata.name}")
$ echo "Truy cập http://127.0.0.1:8080 để sử dụng ứng dụng của bạn"
Truy cập http://127.0.0.1:8080 để sử dụng ứng dụng của bạn
$ kubectl port-forward $POD_NAME 8080:80
Forwarding from 127.0.0.1:8080 -> 80
Forwarding from [::1]:8080 -> 80

Cuối cùng thì bạn sẽ có kết quả như sau:

Nguồn bài viết: opensource.com

1