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 đồngKubernetes 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 CLIaz 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
Đăng nhận xét