Chuyển đến nội dung chính

Ghi chú cách deploy 1 app đơn giản lên Kubernetes

Dưới đây là ghi chú để deploy 1 app đơn giản lên reactjsAKSCluster

Bạn cần nắm

  • Cách tạo 1 image container
  • Kubernetes là gì
  • Pod, Service, ingress

Lý thuyết

Kubernetes là gì

Kubernetes là một nền tảng nguồn mở, khả chuyển, có thể mở rộng để quản lý các ứng dụng được đóng gói và các service, giúp thuận lợi trong việc cấu hình và tự động hoá việc triển khai ứng dụng. Kubernetes là một hệ sinh thái lớn và phát triển nhanh chóng. Các dịch vụ, sự hỗ trợ và công cụ có sẵn rộng rãi.

Tên gọi Kubernetes có nguồn gốc từ tiếng Hy Lạp, có ý nghĩa là người lái tàu hoặc hoa tiêu. Google mở mã nguồn Kubernetes từ năm 2014. Kubernetes xây dựng dựa trên một thập kỷ rưỡi kinh nghiệm mà Google có được với việc vận hành một khối lượng lớn workload trong thực tế, kết hợp với các ý tưởng và thực tiễn tốt nhất từ cộng đồng

Kubernetes Services

AKS là một dịch vụ quản lý Kubernetes trên đám mây của Microsoft, cho phép bạn triển khai và quản lý các ứng dụng container trên một cluster Kubernetes được quản lý bởi Azure. 

Pod là gì?

Một Pod là một khái niệm trừu tượng của Kubernetes, đại diện cho một nhóm gồm một hoặc nhiều ứng dụng containers (ví dụ như Docker hoặc rkt) và một số tài nguyên được chia sẻ cho các containers đó. Những tài nguyên đó bao gồm:

  • Lưu trữ được chia sẻ, dưới dạng Volumes
  • Kết nối mạng, như một cluster IP duy nhất
  • Thông tin về cách chạy từng container, chẳng hạn như phiên bản container image hoặc các ports cụ thể để sử dụng

Mỗi pod sẽ sở hữu một internal IP riêng và có thể giao tiếp với nhau. 

Địa chỉ IP này sẽ được thay đổi khi các pod được khởi tạo lại (re-creation). 

Service

Service được xác định dựa trên label, đại diện cho một entry point để truy cập vào ứng dụng. Mỗi service có địa chỉ IP và port không đổi. Client có thể kết nối đến các IP và port của service, sau đó sẽ được điều hướng đến các pod để xử lý. Quan trọng hơn hết là life cycle của service và pod không liên quan quan (kết nối) với nhau nên khi một pod bị crash (hoặc chết) thì service và IP của nó vẫn tồn tại. Chúng ta có thể định nghĩa external service hoặc internal service tùy vào mục đích sử dụng. Khi browser request đến ứng dụng, lúc này ta sẽ sử dụng IP để kết nối (external service) nhưng url với những sản phẩm production sẽ có domain name lúc này ta có tiếp một khái niệm là ingress.

Ingress

Ingress là thành phần dùng để điều hướng các yêu cầu trafic giao thức HTTP và HTTPS từ bên ngoài vào các dịch vụ bên trong Cluster. Nó chỉ phục vụ các cỏng, yêu cầu HTTP và HTTPS còn lại các cổng khác, giao thức khác được truy cập từ bên ngoài thì ta dùng các kiểu service khác. Lúc này request sẽ đi đến ingreass và chuyển tiếp đến các service.

Namespace

namespace trong k8s là cơ chế để bạn có thể tách biệt các nhóm tài nguyên (như Pod, Deployment hay Service…) trong cùng một cluster.

Tên của các tài nguyên này là duy nhất trong namespace đó, nhưng có thể được sử dụng ở một namespace khác. Các namespace khác nhau được phân biệt bởi tên namespace. Namespace có cấu trúc phẳng, tức là bạn không thể tạo namespace bên trong namespace được.

Các tài nguyên (resource) trên k8s chia làm 2 loại: Tài nguyên mức namespace: Tức là thuộc quản lý của 1 namespace nào đó. Ví dụ Pods, Deployments, Services….

Tài nguyên mức cluster: Không thuộc một namespace cụ thể nào mà thuộc quản lý của cluster như Nodes, StorageClass, Persistent Volumes….

Setup Project Web Application

Tạo một project web app .net bằng Visual Studio hoặc Visual Studio Code. Bạn có thể chọn một template sẵn có hoặc tạo một web app từ đầu

# syntax=docker/dockerfile:1
FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build-env
WORKDIR /app

#Copy csproj and restore as distinct layers
COPY *.csproj ./
RUN dotnet restore

#Copy everything else and build
COPY . ./
RUN dotnet publish -c Release -o out

#Build runtime image
FROM mcr.microsoft.com/dotnet/aspnet:6.0
WORKDIR /app
COPY --from=build-env /app/out .
ENTRYPOINT ["dotnet", "hello-kube.dll"]
Tham khảo: Tạo dockerfile cho project ASP.NET

Các bước deploy

Setup Environment

Azure CLI: https://learn.microsoft.com/en-us/cli/azure/install-azure-cli

Setup AKS CLI
az aks install-cli
Sẽ gồm 4 file, chạy lần lượt
# Create a configmap from the file configmap.yaml
kubectl create -f configmap.yaml

# Create a deployment from the file deployment.yaml
kubectl create -f deployment.yaml

# Create a service from the file services.yaml
kubectl create -f services.yaml

# Create an ingress from the file ingress.yaml
kubectl create -f ingress.yaml
Login
az login
Browser sẽ tự động mở, user nhập thông tin user + password. Sau đó thì close browser

Deploy

Giả sử bạn có 4 file deployment.yaml, service.yaml, ingress.yaml, bạn thêm vào namespace, ví dụ:
metadata:
  labels:
    app: hello-kube
  name: hello-kube
  namespace: anbinhtrong

Quản lý namespace

Sử dụng kubectl command, bạn gõ lệnh: kubectl create namespace [namespace-name]
Hoặc tạo manifest file với Yaml rồi sử dụng kubectl apply để thực thi file này, ví dụ với file test-namespace.yaml như sau:
apiVersion: v1
kind: Namespace
metadata:
  name: test-namespace
Sau đó bạn có thể chạy lệnh:
kubectl apply -f test-namespace.yaml
để tạo namespace test-namespace.

Liệt kê tài nguyên trong namespace

Sử dụng lệnh kubectl với tham số -n hoặc --namespace1. Ví dụ:
# để liệt kê các pods trong namespace test-namespace
kubectl get pods -n test-namespace
# để liệt kê tất cả các loại tài nguyên trong namespace test-namespace
kubectl get all -n test-namespace
# để liệt kê các deployments và services trong namespace test-namespace
kubectl get deployments,services -n test-namespace

Chuyển đổi giữa các namespace

Bằng cách sử dụng lệnh kubectl config set-context với tham số --namespace. Ví dụ:
#để chuyển đổi sang namespace test-namespace
kubectl config set-context --current --namespace=test-namespace 
#để chuyển đổi về namespace mặc định
kubectl config set-context --current --namespace=default

Nhận xét

Bài đăng phổ biến từ blog này

[ASP.NET MVC] Authentication và Authorize

Một trong những vấn đề bảo mật cơ bản nhất là đảm bảo những người dùng hợp lệ truy cập vào hệ thống. ASP.NET đưa ra 2 khái niệm: Authentication và Authorize Authentication xác nhận bạn là ai. Ví dụ: Bạn có thể đăng nhập vào hệ thống bằng username và password hoặc bằng ssh. Authorization xác nhận những gì bạn có thể làm. Ví dụ: Bạn được phép truy cập vào website, đăng thông tin lên diễn đàn nhưng bạn không được phép truy cập vào trang mod và admin.

ASP.NET MVC: Cơ bản về Validation

Validation (chứng thực) là một tính năng quan trọng trong ASP.NET MVC và được phát triển trong một thời gian dài. Validation vắng mặt trong phiên bản đầu tiên của asp.net mvc và thật khó để tích hợp 1 framework validation của một bên thứ 3 vì không có khả năng mở rộng. ASP.NET MVC2 đã hỗ trợ framework validation do Microsoft phát triển, tên là Data Annotations. Và trong phiên bản 3, framework validation đã hỗ trợ tốt hơn việc xác thực phía máy khách, và đây là một xu hướng của việc phát triển ứng dụng web ngày nay.

Tổng hợp một số kiến thức lập trình về Amibroker

Giới thiệu về Amibroker Amibroker theo developer Tomasz Janeczko được xây dựng dựa trên ngôn ngữ C. Vì vậy bộ code Amibroker Formula Language sử dụng có syntax khá tương đồng với C, ví dụ như câu lệnh #include để import hay cách gói các object, hàm trong các block {} và kết thúc câu lệnh bằng dấu “;”. AFL trong Amibroker là ngôn ngữ xử lý mảng (an array processing language). Nó hoạt động dựa trên các mảng (các dòng/vector) số liệu, khá giống với cách hoạt động của spreadsheet trên excel.