+9

Helm là gì ? Nó có liên quan gì đến series này ?

Helm là một trình quản lý gói và công cụ quản lý ứng dụng cho Kubernetes, gói nhiều tài nguyên Kubernetes vào một đơn vị triển khai logic duy nhất được gọi là Chart

Với mục đích deploy air-viewer sử dụng helm, bài viết lần này chỉ giới thiệu về helm và deploy Nginx với Helm

Lợi ích từ Helm

  • Deployment đơn giản hơn mang tính chất lặp lại với chỉ vài câu lệnh ngắn
  • Quản lý sự phụ thuộc của ứng dụng với các version cụ thể
  • Thực hiện nhiều deployment với các môi trường khác nhau như: test, staging, production ...
  • Thực thi các jobs liên quan đến chạy ứng dụng trước khi deployment
  • Dễ dàng update rollback và test deployment khi có vấn đề xảy ra hay muốn cập nhật phiên bản mới (zero downtime server)

Cài đặt Helm CLI

curl -sSL https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 | bash

check version

helm version --short

Tải các kho lưu trữ Chart

helm repo add stable https://kubernetes-charts.storage.googleapis.com/
helm search repo stable

kết quả như hình:

như các bạn thấy rất nhiều repo stable để cài đặt.

Deploy Nginx với Helm

Cập nhật các repo

Để đảm bảo đã có đủ các repo stable có sẵn chúng ta sẽ chạy lệnh sau

helm repo update

Tìm kiếm repo Nginx

helm search repo nginx

ở trên chúng ta có thể sử dụng nginx-ingress được config tích hợp sẵn với kubernetes. Đến đoạn này mình chỉ giới thiệu qua vì mình ko dùng nginx-ingress của helm stable. Cài đặt nginx-ingress thông tin chi tiết thêm : https://github.com/helm/charts/tree/master/stable/nginx-ingress

helm install demo stable/nginx-ingress

còn chúng ta muốn xóa nginx-ingress với helm

helm uninstall demo

Tự tạo chart nginx cho riêng mình và deploy chúng

create chart

chúng ta sẽ có 1 cấu trúc thư mục như sau

/example-project
    /Chart.yaml # mô tả của chart
    /values.yaml # các giá trị mặc định, chúng ta có thể thay đổi trong khi cài đặt hay nâng cấp project của chúng ta
    /charts/ # subcharts
    /templates/ # template file

Bằng việc chạy lệnh

helm create example-project

tùy chỉnh lại theo ý mình

trước khi tùy chỉnh chúng ta sẽ xem xét qua các nội dung của file ở phần templates chúng ta có các file như:

  • deployment.yaml deployment với kubernetes
  • _helpers.tpl mẫu có sẵn có thể tái sử dụng trong chart
  • ingress.yaml liệt kê triển khai các quyền để ứng dụng của bạn truy cập được kubernetes
  • serviceaccount.yaml tạo tài khoản cho service mình dùng phần này có ví dụ cài đặt ingress-nginx ở 2 bài trước đó
  • service.yaml triển khai các deployment với các service
  • tests/ thư mục chứa các testing về chart

chúng ta sẽ tự tạo chart từ đầu và chúng ta sẽ xóa các mục sau:

rm -rf example-project/templates/
rm -rf example-project/Chart.yaml
rm -rf example-project/values.yaml

Tiếp theo chúng ta sẽ mô tả chart theo ý mình thích

cat <<EoF > example-project/Chart.yaml
apiVersion: v2
name: example-project
description: A Helm chart for Kubernetes Microservices application
version: 0.1.0
appVersion: 1.0
EoF

Sau đó, chúng ta sẽ tạo các deploymentservice đơn giản bên trong templates

#tạo subfolders
mkdir -p example-project/templates/deployment
mkdir -p example-project/templates/service

Có 1 chút khác biệt so với deployment thông thường là có config {{ .Values.replicas }} hay {{ .Values.hello.image }}:{{ .Values.version }} được maping đến values.yaml sẽ khai báo sau

apiVersion: apps/v1
kind: Deployment
metadata:
  name: coffee
spec:
  replicas: {{ .Values.replicas }}
  selector:
    matchLabels:
      app: coffee
  template:
    metadata:
      labels:
        app: coffee
    spec:
      containers:
      - name: coffee
        image: {{ .Values.hello.image }}:{{ .Values.version }}
        ports:
        - containerPort: 80
apiVersion: v1
kind: Service
metadata:
  name: coffee-svc
spec:
  ports:
  - port: 80
    targetPort: 80
    protocol: TCP
    name: http
  selector:
    app: coffee

Tạo values.yaml

cat <<EoF > example-project/values.yaml
# Default values for example-project.
# This is a YAML-formatted file.
# Declare variables to be passed into your templates.

# Release-wide Values
replicas: 3
version: 'plain-text'

# Service Specific Values
hello:
  image: nginxdemos/hello
EoF

Deploy example-project Chart

Trước khi deployment chúng ta sẽ test Chart để xác nhận các config của chúng ta là chính xác

helm install --debug --dry-run example-project example-project

Chúng ta sẽ deploy

helm install example-project example-project

Chúng ta kiểm tra các status của svc,deployment, pod

kubectl get svc,po,deploy

Chúng ta sẽ test thử nội dung cuả nginx này

kubectl describe svc coffee-svc

#chúng ta có 3 cái pods khác nhau, truy cập thử 1 cái
curl 10.244.1.16:80

Lợi ích của việc sử dụng helm qua ví dụ minh họa

Giả sử chúng ta update example-project của chúng ta với image không tồn tại vì 1 lý do nào đó thành nginxdemos/hello-non-existing và cập nhật phiên bản mới của project của chúng ta

helm upgrade example-project example-project

Kubernetes sẽ tạo pod khác với image mới đó nhưng có lỗi là ImagePullBackOff. Vậy chúng ta phải Rollback lại phiên bản

helm history example-project

Rollback:

helm rollback example-project 1

lỗi không còn nữa

Xóa example-project

Việc uninstall cũng nhanh không kém cạnh. Chúng ta không cần phải chạy 1 số câu lệnh lần lượt để delete svc, deployment, ingress, secret để xóa, mọi thứ chỉ 1 câu lệnh

helm uninstall example-project

Kết luận

Bài viết mang tính chất tìm hiểu cơ bản về helm, ngoài ra còn nhiều chức năng khác làm việc khá hiệu quả với kubernetes, giúp devOps đỡ vất vả hơn khoản deploy sản phẩm của mình. Tiếp theo mình sẽ deploy air-viewer ở bài trước sử dụng helm.


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí