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 ở đây tôi thay đổi thành diendo.name.vn
Phần database, trong file my.cnf chỉnh sửa bind-address = 0.0.0.0
Trong source backend, sửa file C:\Project\Fullstack-Ecommerce-Web-GKE\02-backend_spring-boot-rest-api\src\main\resources\application.properties
jdbc:mysql://db-backend.diendo.name.vn:3306/full-stack-ecommerce

Sau khi sửa các thông tin, ta nén lại và up lên server cài rancher (Đây cũng là server cài sẵn docker để build các images cần thiết cho web app)



Sau khi upload code lên server, tạo thư mục project, copy file nẽn của code vào thư mục project và tiến hành giải nén

2. Đóng gói image và đưa lên docker hub
Đóng gói các images:
beobeo/ecommerce-gke-db:v1
beobeo/ecommerce-gke-frontend:v1
beobeo/ecommerce-gke-backend:v1
2.1 Đóng gói image MariaDB
cd ~$HOME/projects/01-starter-files_db-scripts/
sudo docker build -t beobeo/ecommerce-gke-db:v1 .

2.2 Build image Backend
cd ~$HOME/projects/02-backend_spring-boot-rest-api
sudo docker build -t beobeo/ecommerce-gke-backend:v1 .

2.3 Build image FrontEnd
cd ~$HOME/projects/03-frontend_angular-ecommerce
sudo docker build -t beobeo/ecommerce-gke-backend:v1 .

2.4 Push image lên dockerhub
docker login -u beobeo
sudo docker push beobeo/ecommerce-gke-db:v1
sudo docker push beobeo/ecommerce-gke-frontend:v1
sudo docker push beobeo/ecommerce-gke-backend:v1


3. Setup ecommerce
3.1 Setup database server
– Tạo docker container ecommerce-db bằng cách trên docker host trên GKE chạy lệnh bên dưới. Trong case của Tony mình tận dụng server rancher làm ecommerce-db luôn:
sudo docker run -d --name mariadb \
-v /data/mysql:/var/lib/mysql \
-p 3306:3306 beobeo/ecommerce-gke-db:v1
Mở port 3306 trên host cài mariadb GKE

Truy cập vào container mariadb
docker exec -it mariadb /bin/bash

Kiểm tra kết quả

3.2 Triển khai Full stack trên GKE
Gộp các file Deploymnet.yml, ClusterIP.yml, Ingress.yml và một file Deployment.yml (có nội dung như sau)
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-gke-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.name.vn
http:
paths:
- backend:
service:
name: ecommerce-frontend-clusterip
port:
number: 80
path: /
pathType: Prefix
---
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-gke-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.name.vn
http:
paths:
- backend:
service:
name: ecommerce-backend-clusterip
port:
number: 8080
path: /
pathType: Prefix
4. Triển khai hệ thống bằng rancher
Tạo project và namespace

Chọn project và namespace sau đó Import file Deployment.yml đã tạo ở trên



– Trên cụm GKE ta tiến hành lấy IP Public của loadbalangcer bằng lệnh:
kubectl get ingress -A

Lấy được IP của Loadbalancer trỏ domain về đúng IP

Kết quả:
