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
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ểndevspace_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 cluster
và namespace
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à :
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