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

Giới thiệu về Helm #

Helm là một trình quản lý gói ứng dụng cho Kubernetes, đ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 lại sử dụng Helm ư? bởi 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 việc 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 này, mình 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, mình 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, bạn 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, mình sẽ tạo một chart có tên là tel4vnchart:

$ helm create tel4vnchart
Creating tel4vnchart
$ ls tel4vnchart/
Chart.yaml   charts/      templates/   values.yaml

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.yaml và values.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

# A chart can be either an 'application' or a 'library' chart.
#
# Application charts are a collection of templates that can be packaged into versioned archives
# to be deployed.
#
# Library charts provide useful utilities or functions for the chart developer. They're included as
# a dependency of application charts to inject those utilities and functions into the rendering
# pipeline. Library charts do not define any templates and therefore cannot be deployed.
type: application

# This is the chart version. This version number should be incremented each time you make changes
# to the chart and its templates, including the app version.
version: 0.1.0

# This is the version number of the application being deployed. This version number should be
# incremented each time you make changes to the application.
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. (bắt buôc). 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:
 # Specifies whether a service account should be created
create: true
# Annotations to add to the service account
annotations: {}
# The name of the service account to use.
# If not set and create is true, a name is generated using the fullname template
name:

podSecurityContext: {}
# fsGroup: 2000

securityContext: {}
# capabilities:
#   drop:
#   - ALL
# readOnlyRootFilesystem: true
# runAsNonRoot: true
# runAsUser: 1000

service:
type: ClusterIP
port: 80

ingress:
enabled: false
annotations: {}
# kubernetes.io/ingress.class: nginx
# kubernetes.io/tls-acme: "true"
hosts:
- host: chart-example.local
paths: []
tls: []
#  - secretName: chart-example-tls
#    hosts:
#      - chart-example.local

resources: {}
# We usually recommend not to specify default resources and to leave this as a conscious
# choice for the user. This also increases chances charts run on environments with little
# resources, such as Minikube. If you do want to specify resources, uncomment the following
# lines, adjust them as necessary, and remove the curly braces after 'resources:'.
# limits:
#   cpu: 100m
#   memory: 128Mi
# requests:
#   cpu: 100m
#   memory: 128Mi

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 chỉnh sửa 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ố naming và secrets #

Tiếp theo bạn đến với 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à nameOverride  và fullnameOverride. 2 thông số này được hiểu là khi bạn chạy câu lệnh heml 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:
 # Specifies whether a service account should be created
create: true
# Annotations to add to the service account
annotations: {}
# The name of the service account to use.
# If not set and create is true, a name is generated using the fullname template
Name:

Sau đó:

serviceAccount:
 # Specifies whether a service account should be created
create: true
# Annotations to add to the service account
annotations: {}
# The name of the service account to use.
# If not set and create is true, a name is generated using the fullname template
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: {}
# fsGroup: 2000

securityContext: {}
# capabilities:
#   drop:
#   - ALL
# readOnlyRootFilesystem: true
# runAsNonRoot: true
# runAsUser: 1000

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 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: {}
# We usually recommend not to specify default resources and to leave this as a conscious
# choice for the user. This also increases chances charts run on environments with little
# resources, such as Minikube. If you do want to specify resources, uncomment the following
# lines, adjust them as necessary, and remove the curly braces after 'resources:'.
# limits:
#   cpu: 100m
#   memory: 128Mi
# requests:
#   cpu: 100m
#   memory: 128Mi

Sau đó:

resources:
 # We usually recommend not to specify default resources and to leave this as a conscious
# choice for the user. This also increases chances charts run on environments with little
# resources, such as Minikube. If you do want to specify resources, uncomment the following
# lines, adjust them as necessary, and remove the curly braces after '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 hoá 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:

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 "Visit http://127.0.0.1:8080 to use your application"
Visit http://127.0.0.1:8080 to use your application
$ 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:

Nginx welcome screen

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

Mình là Tùng, hiện đang là DevOps tại Công Ty CP EcoIT. Với kinh nghiệm và thủ thuật đúc rút được từ trong công việc, mình muốn chia sẻ cho bạn đọc cùng biết và cùng nhau học thêm nhiều điều mới trong lĩnh vực DevOps.

Powered by BetterDocs

Để lại bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *