Chuyển tới nội dung

Triển khai ecommerce trên k8s

1. Chuẩn bị môi trường

Get code về máy tính. Edit config file thay thế tonytechlab.com bằng domain của bạn bằng notepad ++

Trong notepad ++ ta chọn File  > Open Folder as Workspace sau đó mở tới  folder dự án và bấm Control + F sau đó chọn File in file

Thay thế domain của bạn vào code

2. Đóng gói image và đưa lên docker hub

Upload source code lên máy cài docker để tiến hành build FrontEnd BackEnd sau đó đưa lên docker hub

Build image frontend

cd C:\Project\Fullstack-Ecommerce-Web\03-frontend_angular-ecommerce> 
docker build -t beobeo/ecommerce-frontend:v1 .

Build image Backend

cd C:\Project\Fullstack-Ecommerce-Web\02-backend_spring-boot-rest-api
docker build -t beobeo/ecommerce-backend:v1 .

Push image lên dockerhub

docker login -u beobeo
docker push beobeo/ecommerce-backend:v1
docker push beobeo/ecommerce-frontend:v1

3. Tạo server mariadb qua docker-compose sau đó copy thư mục 01-starter-files_db-scripts sau đó chạy các lệnh để khởi tạo db

Trong trường hợp này ta dùng file docker-compose.yml của bài lab trước, tái sư dụng mariadb server của nginx-proxy-manager.

version: '3.9'

services:
  nginx-proxy-manager:
    image: 'jc21/nginx-proxy-manager:latest'
    container_name: nginx-proxy-manager
    restart: always
    ports:
      - '80:80'         # HTTP
      - '81:81'         # Web UI
      - '443:443'       # HTTPS
    environment:
      DB_MYSQL_HOST: "10.100.1.56"
      DB_MYSQL_PORT: 3306
      DB_MYSQL_USER: "npm"
      DB_MYSQL_PASSWORD: "npm_password"
      DB_MYSQL_NAME: "npm_db_1"
    volumes:
      - /opt/data/nginx/data:/data
      - /opt/data/nginx/letsencrypt:/etc/letsencrypt
    networks:
      VLAN88:
        ipv4_address: 10.100.1.55
  npm-db-1:
    image: 'mariadb:10.5'
    container_name: npm-db-1
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: 'npm_rootpass'
      MYSQL_DATABASE: 'npm_db_1'
      MYSQL_USER: 'npm'
      MYSQL_PASSWORD: 'npm_password'
    volumes:
      - /opt/data/mysql:/var/lib/mysql
    networks:
      VLAN88:
        ipv4_address: 10.100.1.56

  rancher:
    image: rancher/rancher:v2.12.0
    container_name: rancher
    restart: always
    volumes:
      - /opt/data/rancher/data:/var/lib/rancher
    environment:
      CATTLE_BOOTSTRAP_PASSWORD: "DienDo@2025"
    networks:
      VLAN88:
        ipv4_address: 10.100.1.54
    privileged: true

  nginx-lb:
    image: nginx:stable-alpine
    container_name: nginx-lb
    restart: always
    ports:
      - "80:80"
    volumes:
      - /opt/data/nginx-lb/nginx.conf:/etc/nginx/nginx.conf:ro
      - /opt/data/nginx-lb/conf.d:/etc/nginx/conf.d:ro
    networks:
      VLAN88:
        ipv4_address: 10.100.1.57
  
networks:
  VLAN88:
    external: true

Copy tất cả các file *.sql vào thư mục data map của mariadb (trong trường hợp này là /opt/data/mariadb)

sudo cp ~/devops/01-starter-files_db-scripts /opt/data/mariadb

Truy cập vào container npm-db-1

docker exec -it npm-db-1 /bin/bash
cd /var/lib/mysql/01-starter-files_db-scripts

Tiến hành import databases

mysql -u root -p // sau đó gõ password root của mysql
source <đường dẫn đến 01-starter-files_db-scripts/01-create-user.sql> 
source <đường dẫn đến 01-starter-files_db-scripts/02-create-products.sql>
source <đường dẫn đến 01-starter-files_db-scripts/03-refresh-database-with-100-products.sql>
source <đường dẫn đến 01-starter-files_db-scripts/04-countries-and-states.sql>
source <đường dẫn đến 01-starter-files_db-scripts/05-create-order-tables.sql>
mysql -u root -p // sau đó gõ password root của mysql
source 01-create-user.sql
source 02-create-products.sql
source 03-refresh-database-with-100-products.sql
source 04-countries-and-states.sql
source 05-create-order-tables.sql

Kiểm tra kết quả

show databases;
show tables;

4. Triển khai hệ thống Deployment, ClusterIP, Ingress

– Triển khai FrontEnd, FrontEnd.yml

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: ecommerce-frontend-selector
  name: ecommerce-frontend-deployment
  namespace: beobeo-ecommerce
spec:
  progressDeadlineSeconds: 600
  replicas: 2
  revisionHistoryLimit: 11
  selector:
    matchLabels:
      app: ecommerce-frontend-selector
  strategy:
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%
    type: RollingUpdate
  template:
    metadata:
      labels:
        app: ecommerce-frontend-selector
      namespace: beobeo-ecommerce
    spec:
      containers:
        - image: beobeo/ecommerce-frontend:v1
          imagePullPolicy: Always
          name: ecommerce-frontend
          ports:
            - containerPort: 80
              name: tcp
              protocol: TCP

---
apiVersion: v1
kind: Service
metadata:
  name: ecommerce-frontend-clusterip
  namespace: beobeo-ecommerce
spec:
  internalTrafficPolicy: Cluster
  ipFamilies:
    - IPv4
  ipFamilyPolicy: SingleStack
  ports:
    - name: tcp
      port: 80
      protocol: TCP
      targetPort: 80
  selector:
    app: ecommerce-frontend-selector
  sessionAffinity: None
  type: ClusterIP
 
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ecommerce-frontend-ingress
  namespace: beobeo-ecommerce
spec:
  ingressClassName: nginx
  rules:
    - host: ecommerce.diendo.lc
      http:
        paths:
          - backend:
              service:
                name: ecommerce-frontend-clusterip
                port:
                  number: 80
            path: /
            pathType: Prefix

– Triển khai Backend, file Backend.yml

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: ecommerce-backend-selector
  name: ecommerce-backend-deployment
  namespace: beobeo-ecommerce
spec:
  progressDeadlineSeconds: 600
  replicas: 2
  revisionHistoryLimit: 11
  selector:
    matchLabels:
      app: ecommerce-backend-selector
  strategy:
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%
    type: RollingUpdate
  template:
    metadata:
      labels:
        app: ecommerce-backend-selector
      namespace: beobeo-ecommerce
    spec:
      containers:
        - image: beobeo/ecommerce-backend:v1
          imagePullPolicy: Always
          name: ecommerce-backend
          ports:
            - containerPort: 8080
              name: tcp
              protocol: TCP

---
apiVersion: v1
kind: Service
metadata:
  name: ecommerce-backend-clusterip
  namespace: beobeo-ecommerce
spec:
  internalTrafficPolicy: Cluster
  ipFamilies:
    - IPv4
  ipFamilyPolicy: SingleStack
  ports:
    - name: tcp
      port: 8080
      protocol: TCP
      targetPort: 8080
  selector:
    app: ecommerce-backend-selector
  sessionAffinity: None
  type: ClusterIP
 
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ecommerce-backend-ingress
  namespace: beobeo-ecommerce
spec:
  ingressClassName: nginx
  rules:
    - host: api-ecommerce.diendo.lc
      http:
        paths:
          - backend:
              service:
                name: ecommerce-backend-clusterip
                port:
                  number: 8080
            path: /
            pathType: Prefix

– Triển khai Backend/FrontEnd trên giao diện bấm Import

Chọn Namespace sau đó đưa file yml cần thiết lên

Nếu file yml hợp lệ thì hệ thống sẽ triển khai thành công

Trỏ file host

10.100.1.57 api-ecommerce.diendo.lc

10.100.157 ecommerce.diendo.lc

Kết quả truy cập vào trang api-ecommerce.diendo.lc

Liên hệ