+3

DevSpace - Công cụ tối ưu chu trình phát triển Kubernetes

Mở Đầu

XIn chào tất cả mọi người cũng khá lâu rồi mình mới lại viết bài 😄, Hôm nay mình sẽ giới thiệu đến mọi người 1 công cụ đó là Devspace một công cụ phát triển mã nguồn được thiết kế để tối ưu hóa quy trình phát triển cho các ứng dụng chạy trên Kubernetes giúp kết nối môi trường dev của bạn với môi trường Kubernetes, cho phép việc phát triển và kiểm thử ứng dụng trở nên mượt mà và nhanh chóng hơn. Vậy nó có gì nổi bật so với quy trình phát triển Kubernetes truyền thống.

  • Tăng tốc chu trình phát triển: DevSpace cho phép đồng bộ code trực tiếp từ máy local vào container đang chạy trong Kubernetes mà không cần phải rebuild và redeploy toàn bộ ứng dụng. Điều này có thể giảm thời gian từ vài phút xuống còn vài giây cho mỗi thay đổi.
  • Phát triển trong môi trường thực tế: DevSpace cho phép bạn phát triển ứng dụng trực tiếp trong một môi trường Kubernetes thực, giúp phát hiện sớm các vấn đề liên quan đến infrastructure và tránh sự khác biệt giữa môi trường phát triển và production.
  • Quản lý đa môi trường dễ dàng: Với DevSpace, bạn có thể dễ dàng chuyển đổi giữa các namespace và context Kubernetes khác nhau, giúp quản lý nhiều môi trường (dev, staging, testing) trở nên đơn giản hơn.
  • Trải nghiệm gỡ lỗi tốt hơn: DevSpace cung cấp các tính năng như log streaming, port forwarding, và shell trực tiếp vào container, giúp quá trình debug trở nên thuận tiện hơn.
  • Giảm thiểu cấu hình: DevSpace tự động hóa nhiều bước cấu hình phức tạp trong quy trình phát triển Kubernetes, giúp giảm thiểu boilerplate code và tập trung vào phát triển tính năng.

Ngoài Devspace ra thì còn có 1 số công cụ tương tự nhưi Skaffold, Garden. Trong phạm vi bài viết này mình chỉ giới thiệu về Devspace các tính năng chính của DevSpace, cách cài đặt và cấu hình, cũng như một ví dụ thực tế, Bắt đầu luôn nhé 😄

Cài đặt và thiết lập

Trước khi cài đặt devspace, thì chúng ta cần cài đặt thêm 1 số công cụ khác nữa

  • Một cluster Kubernetes đang hoạt động (có thể là Minikube, Docker Desktop với Kubernetes, Kind, hoặc một cluster từ xa) ở đây mình dùng Minikube
  • Kubectl để kết nối với cluster của bạn
  • Docker hoặc một container runtime tương tự

Cài đặt DevSpace:

Trên Linux

# AMD64
curl -L -o devspace "https://github.com/loft-sh/devspace/releases/latest/download/devspace-linux-amd64" && sudo install -c -m 0755 devspace /usr/local/bin

# ARM64
curl -L -o devspace "https://github.com/loft-sh/devspace/releases/latest/download/devspace-linux-arm64" && sudo install -c -m 0755 devspace /usr/local/bin

Ngoài ra còn các cách cài đặt khác, với hệ điều hành khác bạn có thể tham khảo tại đây. Sau khi cài đặt xong các bạn có thể kiểm tra xem đã cài đặt thành công hay chưa bằng command

devspace --version

image.png

Tiếp theo là cấu hình với tệp devspace.yaml. tệp này định nghĩa cách DevSpace tương tác với ứng dụng của bạn và cách triển khai nó lên Kubernetes. Để bắt đầu với dự án mới chúng ta cần di chuyển đến thư mục gốc của dự án và chạy lệnh devspace init, sau đó bạn sẽ cần chọn ngôn ngữ của project, cách deploy project này như thế nào... sau khi thành công nó sẽ tạo ra file devspace.yaml về cơ bản file devspace.yaml sẽ có dạng

version: v2beta1
name: devspacedemo

# Định nghĩa các images cần build
images:
  app:
    image: myregistry.com/myuser/myapp
    dockerfile: ./Dockerfile
    context: ./

# Cách triển khai ứng dụng
deployments:
  app:
    helm:
      chart:
        name: ./charts/my-chart
      values:
        image: ${IMAGE_PLACEHOLDER}

# Cấu hình đồng bộ hóa file
dev:
  app:
    imageSelector: myregistry.com/myuser/myapp
    terminal:
      enabled: true
    sync:
      - path: ./src:/app/src
      - path: ./config:/app/config
    ports:
      - port: 8080:8080

Các thành phần chính:

  • images: Định nghĩa cách build và push container images.
  • deployments: Cấu hình cách triển khai ứng dụng (sử dụng kubectl, helm, hoặc kustomize).
  • dev: Cấu hình cho môi trường phát triển, bao gồm đồng bộ hóa file, port forwarding, và các tùy chọn terminal.

Bạn có thể tùy chỉnh tệp devspace.yaml để phù hợp với nhu cầu cụ thể của dự án:

  • Đồng bộ hóa thư mục: Định nghĩa đường dẫn cần đồng bộ giữa máy local và container.
dev:
  app:
    sync:
      - path: ./src:/app/src
        excludePaths:
          - node_modules/
  • Chuyển tiếp cổng: Cấu hình port forwarding để truy cập dịch vụ.
dev:
  app:
    ports:
      - port: 8080:3000 # [local]:[remote]
  • Biến môi trường: Thiết lập biến môi trường cho container.
dev:
  app:
    env:
      - name: DEBUG
        value: "true"

Một số lệnh cơ bản

  • devspace dev: Lệnh này sẽ thực hiện tất cả các bước cần thiết để triển khai ứng dụng và thiết lập môi trường phát triển, bao gồm: build image, push image, deploy ứng dụng, đồng bộ hóa file, và thiết lập port forwarding.
  • devspace deploy: Chỉ triển khai ứng dụng mà không bắt đầu chế độ phát triển.
  • devspace purge: Xóa triển khai khỏi cluster.
  • devspace logs -f: Xem logs của các container.

Trong phần tiếp theo, chúng ta sẽ đi vào một ví dụ thực tế để thấy DevSpace hoạt động nhé.

Ví dụ thực tế với DevSpace

Để hiểu rõ hơn về cách DevSpace hoạt động và những lợi ích nó mang lại, hãy cùng đi qua một ví dụ thực tế. Trong phần này, chúng ta sẽ thiết lập một ứng dụng web đơn giản, xem quy trình phát triển từ đầu đến cuối, và tìm hiểu cách xử lý một số tình huống thường gặp.

Thiết lập một ứng dụng đơn giản với DevSpace

Chúng ta sẽ tạo một ứng dụng Node.js đơn giản và triển khai nó lên Kubernetes bằng DevSpace. Tôi sẽ tạo 1 ứng dụng Express đơn giản

# Tạo thư mục dự án
mkdir devspace-demo
cd devspace-demo
# Khởi tạo dự án với yarn
yarn init -y

# Cài đặt Express và các dependencies cần thiết
yarn add express

# Tạo file index.js
touch index.js

nội dung file index.js

const express = require('express');
const app = express();
const port = process.env.PORT || 3000;

app.get('/', (req, res) => {
  res.send('Hello from DevSpace! App is running.');
});

app.listen(port, () => {
  console.log(`App listening at http://localhost:${port}`);
});

Tạo Dockerfile với nội dung

FROM node:14-alpine

WORKDIR /app

COPY package*.json ./
RUN npm install

COPY . .

EXPOSE 3000

CMD ["node", "index.js"]

Tiếp theo là khởi tạo Devspace

devspace init

     %########%      
     %###########%       ____                 _____                      
         %#########%    |  _ \   ___ __   __ / ___/  ____    ____   ____ ___ 
         %#########%    | | | | / _ \\ \ / / \___ \ |  _ \  / _  | / __// _ \
     %#############%    | |_| |(  __/ \ V /  ____) )| |_) )( (_| |( (__(  __/
     %#############%    |____/  \___|  \_/   \____/ |  __/  \__,_| \___\\___|
 %###############%                                  |_|
 %###########%


info Detecting programming language...

? Select the programming language of this project javascript

Mình đang demo bằng express nên sẽ chọn là javascrip, tiếp theo nó sẽ hỏi mình deploy dự án này thế nào, ở đây mình chọn helm

How do you want to deploy this project?
Do you already have a Helm chart for this project? 
Do you want to develop this project with DevSpace or just deploy it?  

tiếp theo nó hỏi mình đã có helm chart cho dự dán này chưa mình chọn no và muốn devspace phát triển hay chỉ devploy vậy ở đây mình chọn cả 2

How should DevSpace build the container image for this project?
If you were to push any images, which container registry would you want to push to?

vì đã có file Dockerfile nên mình chọn Use this existing Dockerfile: ./Dockerfile và mình chỉ buil ở local nên mình chọn Skip Registry. Như vậy là đã xong

done Project successfully initialized
info Configuration saved in devspace.yaml - you can make adjustments as needed
         
You can now run:
1. devspace use namespace - to pick which Kubernetes namespace to work in
2. devspace dev - to start developing your project in Kubernetes

Run `devspace -h` or `devspace [command] -h` to see a list of available commands and flags

Sau khi chạy xong nó sẽ thêm 3 file mới

  • devspace.yaml: File này là tệp cấu hình chính của DevSpace. Nó định nghĩa cách DevSpace sẽ thiết lập và triển khai môi trường phát triển
  • devspace_start.sh: Đây là một script shell tự động được tạo ra để giúp bạn bắt đầu với môi trường DevSpace. Script này sẽ khởi tạo và bắt đầu container
  • .gitignore: ignore thư mục ./devspace

Tiếp theo là chọn clusternamespace

bui.huy.hoang@sun-asterisk.com@B122391-LT1 ~/D/devspace-demo> devspace use context

? Which context do you want to use?  [Use arrows to move, type to filter]
  local
> minikube

ở đây mình chọn minikube và tạo 1 namespace mới

bui.huy.hoang@sun-asterisk.com@B122391-LT1 ~/D/devspace-demo> kubectl create ns demo-devspace
namespace/demo-devspace created

rồi đó bây giờ là chạy lên thôi

devspace dev

Installing Yarn Dependencies
yarn install v1.22.19
[1/4] Resolving packages...
[2/4] Fetching packages...
[3/4] Linking dependencies...
[4/4] Building fresh packages...

warning Your current version of Yarn is out of date. The latest version is "1.22.22", while you're on "1.22.19".
info To upgrade, run the following command:
$ curl --compressed -o- -L https://yarnpkg.com/install.sh | bash
Done in 1.34s.

     %########%      
     %###########%       ____                 _____                      
         %#########%    |  _ \   ___ __   __ / ___/  ____    ____   ____ ___ 
         %#########%    | | | | / _ \\ \ / / \___ \ |  _ \  / _  | / __// _ \
     %#############%    | |_| |(  __/ \ V /  ____) )| |_) )( (_| |( (__(  __/
     %#############%    |____/  \___|  \_/   \____/ |  __/  \__,_| \___\\___|
 %###############%                                  |_|
 %###########%


Welcome to your development container!

This is how you can work with it:
- Files will be synchronized between your local machine and this container
- Some ports will be forwarded, so you can access this container via localhost
- Run `npm start` to start the application

devspace ./app # 

Vậy là devspace đã thực hiện build image từ Dockerfile, deploy project lên minikube, đồng bộ hóa file hai chiều từ máy local đến container và forward pod từ service trong cluster về máy local. bây giờ mình gõ yarn start và truy cập vào địa chỉ http://localhost:3000 và kết quả là :

image.png

như vậy là chúng ta đã deploy thành công

bui.huy.hoang@sun-asterisk.com@B122391-LT1 ~/D/devspace-demo> kubectl get pods
NAME                            READY   STATUS    RESTARTS   AGE
app-devspace-55f7467669-tzb2p   1/1     Running   0          11m

Tôi thêm API router mới

// Tạo file routes.js
const express = require('express');
const router = express.Router();

router.get('/', (req, res) => {
  res.send('API is working');
});

router.get('/status', (req, res) => {
  res.json({
    status: 'online',
    uptime: process.uptime(),
    timestamp: new Date().toISOString()
  });
});

module.exports = router;

Sau đó, cập nhật file index.js:

const express = require('express');
const apiRoutes = require('./routes');
const app = express();
const port = process.env.PORT || 3000;

app.get('/', (req, res) => {
  res.send('Hello from DevSpace! I just updated this code in real-time!');
});

app.use('/api', apiRoutes);

app.listen(port, () => {
  console.log(`App listening at http://localhost:${port}`);
});

Những thay đổi này sẽ được đồng bộ tự động và ứng dụng sẽ được cập nhật mà không cần khởi động lại.

Kết Luận

Như vậy là mình đã giới thiệu đến mọi người DevSpace một công cụ mạnh mẽ giúp tối ưu hóa quy trình phát triển ứng dụng trong môi trường container và Kubernetes. Nếu bạn đang tìm kiếm một giải pháp để phát triển và triển khai ứng dụng trong môi trường container thì hãy thử tìm hiểu Devspace xem sao nhé 😄, Cuối cùng xin cảm ơn các bạn đã đọc bài viết nếu có góp ý gì cho bài viết thì hãy comment xuống bên dưới nhé 😄


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í