build/libs/
.Dockerfile
trong thư mục gốc với nội dung:FROM eclipse-temurin:21-jre-jammyRUN groupadd --system spring && useradd --system --gid spring springUSER spring:springCOPY build/libs/*.jar app.jarENTRYPOINT ["java", "-jar", "/app.jar"]EXPOSE 8080
docker build -t smarthire-app:v1 .
-t
gắn tag tên image: smarthire-app
phiên bản v1
..
tham chiếu vị trí Dockerfile và ngữ cảnh build hiện tại.docker images
kubectl get nodes
docker-desktop
với trạng thái Ready
.k8s/postgres-k8s.yaml
:apiVersion: apps/v1kind: Deploymentmetadata: name: postgresspec: replicas: 1 selector: matchLabels: app: postgres template: metadata: labels: app: postgres spec: containers: - name: postgres image: pgvector/pgvector:pg17 ports: - containerPort: 5432 env: - name: POSTGRES_DB value: "smarthire" - name: POSTGRES_USER value: "YOUR_USER" - name: POSTGRES_PASSWORD value: "YOUR_PASSWORD" # ❗ Trong thực tế dùng K8s Secrets! volumeMounts: - name: postgres-data mountPath: /var/lib/postgresql/data volumes: - name: postgres-data persistentVolumeClaim: claimName: postgres-pvc---apiVersion: v1kind: PersistentVolumeClaimmetadata: name: postgres-pvcspec: accessModes: - ReadWriteOnce resources: requests: storage: 1Gi---apiVersion: v1kind: Servicemetadata: name: postgresspec: type: ClusterIP ports: - port: 5432 targetPort: 5432 selector: app: postgres
Thành phần | Mô tả |
---|---|
Deployment | Chạy container pgvector/pgvector:pg17 cho PostgreSQL. |
PVC | Yêu cầu ổ lưu trữ bền 1GiB để giữ dữ liệu khi pod khởi động lại. |
Service | Định nghĩa dịch vụ ClusterIP để kết nối nội bộ trong cluster. |
k8s/app-k8s.yaml
:apiVersion: apps/v1kind: Deploymentmetadata: name: smarthire-appspec: replicas: 1 selector: matchLabels: app: smarthire-app template: metadata: labels: app: smarthire-app spec: containers: - name: smarthire-app image: smarthire-app:v1 imagePullPolicy: IfNotPresent ports: - containerPort: 8080 env: - name: SPRING_DATASOURCE_URL value: "jdbc:postgresql://postgres:5432/smarthire" - name: SPRING_DATASOURCE_USERNAME value: "YOUR_USER" - name: SPRING_DATASOURCE_PASSWORD value: "YOUR_PASSWORD" - name: GOOGLE_APPLICATION_CREDENTIALS value: /etc/gcp-auth/key.json volumeMounts: - name: gcp-sa-key-volume mountPath: /etc/gcp-auth readOnly: true volumes: - name: gcp-sa-key-volume secret: secretName: gcp-sa-key---apiVersion: v1kind: Servicemetadata: name: smarthire-appspec: type: LoadBalancer ports: - port: 8090 targetPort: 8080 selector: app: smarthire-app
kubectl create secret generic gcp-sa-key --from-file=key.json=/path/to/your-download-service-account-key.json
/path/to/your-download-service-account-key.json
bằng đường dẫn chính xác tới file JSON.gcp-sa-key
sẽ được mount vào ứng dụng ở thư mục /etc/gcp-auth
.GOOGLE_APPLICATION_CREDENTIALS
để xác thực Google Vertex AI.kubectl apply -f k8s/postgres-k8s.yamlkubectl apply -f k8s/app-k8s.yaml
kubectl get pods
postgres
và smarthire-app
có trạng thái Running
.kubectl get services
smarthire-app
có EXTERNAL-IP
là localhost
và cổng 8090 được mở.kubectl get pods | grep smarthire-app
kubectl logs <tên-pod-smarthire-app>
-f
để xem theo thời gian thực.http://localhost:8090/api/candidates/upload