mirror of
https://github.com/cna-bootcamp/phonebill.git
synced 2025-12-06 08:06:24 +00:00
Jenkins CI/CD 파이프라인 구축 완료
- Kustomize 기반 환경별 매니페스트 구성 (dev/staging/prod) - Base 및 Overlay 구조로 환경별 설정 분리 - 각 환경별 Deployment, Service, ConfigMap, Secret 패치 적용 - Jenkinsfile 작성 (Gradle JDK21, SonarQube, Quality Gate 포함) - 환경별 설정 파일 및 수동 배포 스크립트 생성 - Jenkins CI/CD 가이드 문서 및 검증 스크립트 작성 - DEV 환경 Ingress Host를 base와 동일하게 수정 (체크리스트 준수) 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
parent
c9d99b34d6
commit
291306f5c7
@ -10,6 +10,6 @@ purpose: "백엔드 Jenkins CI/CD 가이드 작성"
|
|||||||
{안내메시지}
|
{안내메시지}
|
||||||
'[실행정보]'섹션 하위에 아래 예와 같이 필요한 정보를 제시해 주세요.
|
'[실행정보]'섹션 하위에 아래 예와 같이 필요한 정보를 제시해 주세요.
|
||||||
[실행정보]
|
[실행정보]
|
||||||
- ACR명: acrdigitalgarage01
|
- ACR_NAME: acrdigitalgarage01
|
||||||
- RESOURCE_GROUP: rg-digitalgarage-01
|
- RESOURCE_GROUP: rg-digitalgarage-01
|
||||||
- AKS_CLUSTER: aks-digitalgarage-01
|
- AKS_CLUSTER: aks-digitalgarage-01
|
||||||
|
|||||||
29
deployment/cicd/Jenkinsfile
vendored
29
deployment/cicd/Jenkinsfile
vendored
@ -12,8 +12,7 @@ podTemplate(
|
|||||||
slaveConnectTimeout: 300,
|
slaveConnectTimeout: 300,
|
||||||
idleMinutes: 30,
|
idleMinutes: 30,
|
||||||
activeDeadlineSeconds: 3600,
|
activeDeadlineSeconds: 3600,
|
||||||
podRetention: never(), // 파드 자동 정리 옵션: never(), onFailure(), always(), default()
|
podRetention: never(),
|
||||||
showRawYaml: false, // 디버깅용 YAML 출력 비활성화
|
|
||||||
yaml: '''
|
yaml: '''
|
||||||
spec:
|
spec:
|
||||||
tolerations:
|
tolerations:
|
||||||
@ -21,8 +20,6 @@ podTemplate(
|
|||||||
key: dedicated
|
key: dedicated
|
||||||
operator: Equal
|
operator: Equal
|
||||||
value: cicd
|
value: cicd
|
||||||
activeDeadlineSeconds: 3600
|
|
||||||
restartPolicy: Never
|
|
||||||
''',
|
''',
|
||||||
containers: [
|
containers: [
|
||||||
containerTemplate(
|
containerTemplate(
|
||||||
@ -118,7 +115,7 @@ podTemplate(
|
|||||||
timeout(time: 10, unit: 'MINUTES') {
|
timeout(time: 10, unit: 'MINUTES') {
|
||||||
def qg = waitForQualityGate()
|
def qg = waitForQualityGate()
|
||||||
if (qg.status != 'OK') {
|
if (qg.status != 'OK') {
|
||||||
error "Pipeline aborted due to quality gate failure: \${qg.status}"
|
error "Pipeline aborted due to quality gate failure: ${qg.status}"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -162,22 +159,22 @@ podTemplate(
|
|||||||
cd deployment/cicd/kustomize/overlays/${environment}
|
cd deployment/cicd/kustomize/overlays/${environment}
|
||||||
|
|
||||||
# 이미지 태그 업데이트
|
# 이미지 태그 업데이트
|
||||||
kustomize edit set image acrdigitalgarage01.azurecr.io/phonebill/api-gateway:${environment}-${imageTag}
|
"""
|
||||||
kustomize edit set image acrdigitalgarage01.azurecr.io/phonebill/user-service:${environment}-${imageTag}
|
|
||||||
kustomize edit set image acrdigitalgarage01.azurecr.io/phonebill/bill-service:${environment}-${imageTag}
|
services.each { service ->
|
||||||
kustomize edit set image acrdigitalgarage01.azurecr.io/phonebill/product-service:${environment}-${imageTag}
|
sh "kustomize edit set image acrdigitalgarage01.azurecr.io/phonebill/${service}:${environment}-${imageTag}"
|
||||||
kustomize edit set image acrdigitalgarage01.azurecr.io/phonebill/kos-mock:${environment}-${imageTag}
|
}
|
||||||
|
|
||||||
|
sh """
|
||||||
# 매니페스트 적용
|
# 매니페스트 적용
|
||||||
kubectl apply -k .
|
kubectl apply -k .
|
||||||
|
|
||||||
echo "Waiting for deployments to be ready..."
|
echo "Waiting for deployments to be ready..."
|
||||||
kubectl -n phonebill-${environment} wait --for=condition=available deployment/${environment}-api-gateway --timeout=300s
|
|
||||||
kubectl -n phonebill-${environment} wait --for=condition=available deployment/${environment}-user-service --timeout=300s
|
|
||||||
kubectl -n phonebill-${environment} wait --for=condition=available deployment/${environment}-bill-service --timeout=300s
|
|
||||||
kubectl -n phonebill-${environment} wait --for=condition=available deployment/${environment}-product-service --timeout=300s
|
|
||||||
kubectl -n phonebill-${environment} wait --for=condition=available deployment/${environment}-kos-mock --timeout=300s
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
services.each { service ->
|
||||||
|
sh "kubectl -n phonebill-${environment} wait --for=condition=available deployment/${service} --timeout=300s"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -1,3 +1,3 @@
|
|||||||
# dev Environment Configuration
|
# DEV Environment Configuration
|
||||||
resource_group=rg-digitalgarage-01
|
resource_group=rg-digitalgarage-01
|
||||||
cluster_name=aks-digitalgarage-01
|
cluster_name=aks-digitalgarage-01
|
||||||
@ -1,3 +1,3 @@
|
|||||||
# prod Environment Configuration
|
# PRODUCTION Environment Configuration
|
||||||
resource_group=rg-digitalgarage-01
|
resource_group=rg-digitalgarage-01
|
||||||
cluster_name=aks-digitalgarage-01
|
cluster_name=aks-digitalgarage-01
|
||||||
@ -1,3 +1,3 @@
|
|||||||
# staging Environment Configuration
|
# STAGING Environment Configuration
|
||||||
resource_group=rg-digitalgarage-01
|
resource_group=rg-digitalgarage-01
|
||||||
cluster_name=aks-digitalgarage-01
|
cluster_name=aks-digitalgarage-01
|
||||||
@ -1,63 +1,18 @@
|
|||||||
# Jenkins CI/CD 파이프라인 구축 가이드
|
# phonebill Jenkins CI/CD 파이프라인 가이드
|
||||||
|
|
||||||
## 📋 개요
|
## 📋 프로젝트 정보
|
||||||
|
|
||||||
이 가이드는 통신요금 관리 서비스(phonebill)를 위한 Jenkins 기반 CI/CD 파이프라인 구축 방법을 안내합니다.
|
- **시스템명**: phonebill
|
||||||
|
- **서비스**: api-gateway, user-service, bill-service, product-service, kos-mock
|
||||||
**주요 특징:**
|
- **JDK 버전**: 21
|
||||||
- Jenkins + Kustomize 기반 CI/CD 파이프라인
|
- **ACR**: acrdigitalgarage01
|
||||||
- 환경별(dev/staging/prod) 매니페스트 관리
|
- **리소스 그룹**: rg-digitalgarage-01
|
||||||
- SonarQube 코드 품질 분석과 Quality Gate
|
|
||||||
- Azure Container Registry(ACR) 연동
|
|
||||||
- AKS(Azure Kubernetes Service) 자동 배포
|
|
||||||
|
|
||||||
## 🏗 아키텍처 구성
|
|
||||||
|
|
||||||
```
|
|
||||||
Jenkins Pipeline
|
|
||||||
↓
|
|
||||||
┌─── Build & Test (Gradle) ─────┐
|
|
||||||
│ - 소스코드 빌드 │
|
|
||||||
│ - 단위 테스트 실행 │
|
|
||||||
│ - SonarQube 품질 분석 │
|
|
||||||
│ - Quality Gate 검증 │
|
|
||||||
└─────────────────────────────┘
|
|
||||||
↓
|
|
||||||
┌─── Container Build ───────────┐
|
|
||||||
│ - 서비스별 이미지 빌드 │
|
|
||||||
│ - ACR에 이미지 푸시 │
|
|
||||||
│ - 환경별 태그 관리 │
|
|
||||||
└─────────────────────────────┘
|
|
||||||
↓
|
|
||||||
┌─── Deploy to AKS ─────────────┐
|
|
||||||
│ - Kustomize 매니페스트 적용 │
|
|
||||||
│ - 환경별 설정 적용 │
|
|
||||||
│ - 배포 상태 확인 │
|
|
||||||
└─────────────────────────────┘
|
|
||||||
```
|
|
||||||
|
|
||||||
## 🛠 사전 준비사항
|
|
||||||
|
|
||||||
### 실행 환경 정보
|
|
||||||
- **ACR명**: acrdigitalgarage01
|
|
||||||
- **리소스 그룹**: rg-digitalgarage-01
|
|
||||||
- **AKS 클러스터**: aks-digitalgarage-01
|
- **AKS 클러스터**: aks-digitalgarage-01
|
||||||
|
|
||||||
### 서비스 구성
|
## 🏗️ Jenkins 서버 환경 구성
|
||||||
- **시스템명**: phonebill
|
|
||||||
- **서비스목록**:
|
|
||||||
- api-gateway
|
|
||||||
- user-service
|
|
||||||
- bill-service
|
|
||||||
- product-service
|
|
||||||
- kos-mock
|
|
||||||
|
|
||||||
## 🔧 Jenkins 환경 구성
|
### 필수 플러그인 설치
|
||||||
|
```
|
||||||
### 1. Jenkins 필수 플러그인 설치
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Jenkins 관리 > 플러그인 관리에서 다음 플러그인 설치
|
|
||||||
- Kubernetes
|
- Kubernetes
|
||||||
- Pipeline Utility Steps
|
- Pipeline Utility Steps
|
||||||
- Docker Pipeline
|
- Docker Pipeline
|
||||||
@ -66,9 +21,9 @@ Jenkins Pipeline
|
|||||||
- Azure Credentials
|
- Azure Credentials
|
||||||
```
|
```
|
||||||
|
|
||||||
### 2. Jenkins Credentials 등록
|
### Jenkins Credentials 등록
|
||||||
|
|
||||||
**Azure Service Principal 등록:**
|
#### 1. Azure Service Principal
|
||||||
```
|
```
|
||||||
Manage Jenkins > Credentials > Add Credentials
|
Manage Jenkins > Credentials > Add Credentials
|
||||||
- Kind: Microsoft Azure Service Principal
|
- Kind: Microsoft Azure Service Principal
|
||||||
@ -80,24 +35,22 @@ Manage Jenkins > Credentials > Add Credentials
|
|||||||
- Azure Environment: Azure
|
- Azure Environment: Azure
|
||||||
```
|
```
|
||||||
|
|
||||||
**ACR Credentials 등록:**
|
#### 2. ACR Credentials
|
||||||
```
|
```
|
||||||
- Kind: Username with password
|
- Kind: Username with password
|
||||||
- ID: acr-credentials
|
- ID: acr-credentials
|
||||||
- Username: acrdigitalgarage01
|
- Username: acrdigitalgarage01
|
||||||
- Password: {ACR패스워드}
|
- Password: {ACR_PASSWORD}
|
||||||
```
|
```
|
||||||
|
|
||||||
**SonarQube Token 등록:**
|
#### 3. SonarQube Token
|
||||||
```
|
```
|
||||||
- Kind: Secret text
|
- Kind: Secret text
|
||||||
- ID: sonarqube-token
|
- ID: sonarqube-token
|
||||||
- Secret: {SonarQube토큰}
|
- Secret: {SonarQube토큰}
|
||||||
```
|
```
|
||||||
|
|
||||||
## 📂 Kustomize 구조
|
## 📁 Kustomize 디렉토리 구조
|
||||||
|
|
||||||
프로젝트에 다음과 같은 Kustomize 구조가 생성되었습니다:
|
|
||||||
|
|
||||||
```
|
```
|
||||||
deployment/cicd/
|
deployment/cicd/
|
||||||
@ -110,7 +63,11 @@ deployment/cicd/
|
|||||||
│ │ │ ├── secret-common.yaml
|
│ │ │ ├── secret-common.yaml
|
||||||
│ │ │ ├── secret-imagepull.yaml
|
│ │ │ ├── secret-imagepull.yaml
|
||||||
│ │ │ └── ingress.yaml
|
│ │ │ └── ingress.yaml
|
||||||
│ │ └── [각 서비스별 매니페스트]
|
│ │ ├── api-gateway/
|
||||||
|
│ │ ├── user-service/
|
||||||
|
│ │ ├── bill-service/
|
||||||
|
│ │ ├── product-service/
|
||||||
|
│ │ └── kos-mock/
|
||||||
│ └── overlays/
|
│ └── overlays/
|
||||||
│ ├── dev/
|
│ ├── dev/
|
||||||
│ ├── staging/
|
│ ├── staging/
|
||||||
@ -124,59 +81,60 @@ deployment/cicd/
|
|||||||
└── Jenkinsfile
|
└── Jenkinsfile
|
||||||
```
|
```
|
||||||
|
|
||||||
## 🚀 Jenkins Pipeline 설정
|
## 🔧 환경별 설정
|
||||||
|
|
||||||
### 1. Pipeline Job 생성
|
### DEV 환경
|
||||||
|
- **Namespace**: phonebill-dev
|
||||||
|
- **Ingress Host**: phonebill-api.20.214.196.128.nip.io ⚠️ **base와 동일해야 함**
|
||||||
|
- **Replicas**: 1
|
||||||
|
- **Resources**: requests(256m/256Mi), limits(1024m/1024Mi)
|
||||||
|
- **Profile**: dev
|
||||||
|
- **DDL**: update
|
||||||
|
- **SSL**: false
|
||||||
|
|
||||||
1. Jenkins 웹 UI에서 **New Item > Pipeline** 선택
|
### STAGING 환경
|
||||||
2. **Pipeline script from SCM** 설정:
|
- **Namespace**: phonebill-staging
|
||||||
```
|
- **Ingress Host**: phonebill.staging-domain.com ⚠️ **환경별 도메인**
|
||||||
SCM: Git
|
- **Replicas**: 2
|
||||||
Repository URL: {Git저장소URL}
|
- **Resources**: requests(512m/512Mi), limits(2048m/2048Mi)
|
||||||
Branch: main (또는 develop)
|
- **Profile**: staging
|
||||||
Script Path: deployment/cicd/Jenkinsfile
|
- **DDL**: validate
|
||||||
```
|
- **SSL**: true
|
||||||
|
|
||||||
3. **Pipeline Parameters** 설정:
|
### PROD 환경
|
||||||
```
|
- **Namespace**: phonebill-prod
|
||||||
ENVIRONMENT: Choice Parameter (dev, staging, prod)
|
- **Ingress Host**: phonebill.production-domain.com ⚠️ **프로덕션 도메인**
|
||||||
IMAGE_TAG: String Parameter (default: latest)
|
- **Replicas**: 3
|
||||||
```
|
- **Resources**: requests(1024m/1024Mi), limits(4096m/4096Mi)
|
||||||
|
- **Profile**: prod
|
||||||
|
- **DDL**: validate
|
||||||
|
- **SSL**: true
|
||||||
|
- **JWT 토큰**: 30분 (보안 강화)
|
||||||
|
|
||||||
### 2. Pipeline 단계별 설명
|
## 🚀 Jenkins Pipeline Job 생성
|
||||||
|
|
||||||
**Stage 1: Get Source**
|
### 1. Jenkins 웹 UI에서 새 작업 생성
|
||||||
- Git 저장소에서 소스코드 체크아웃
|
- New Item > Pipeline 선택
|
||||||
- 환경별 설정 파일 로드
|
- 작업명: phonebill-cicd
|
||||||
|
|
||||||
**Stage 2: Setup AKS**
|
### 2. Pipeline 설정
|
||||||
- Azure 서비스 프린시팔로 로그인
|
```
|
||||||
- AKS 클러스터 연결 설정
|
SCM: Git
|
||||||
- 네임스페이스 생성
|
Repository URL: {Git저장소URL}
|
||||||
|
Branch: main
|
||||||
|
Script Path: deployment/cicd/Jenkinsfile
|
||||||
|
```
|
||||||
|
|
||||||
**Stage 3: Build & SonarQube Analysis**
|
### 3. Pipeline Parameters 설정
|
||||||
- Gradle 빌드 및 테스트 실행
|
```
|
||||||
- 각 서비스별 SonarQube 분석
|
ENVIRONMENT: Choice Parameter (dev, staging, prod)
|
||||||
- 코드 커버리지 리포트 생성
|
IMAGE_TAG: String Parameter (default: latest)
|
||||||
|
```
|
||||||
|
|
||||||
**Stage 4: Quality Gate**
|
## 🎯 SonarQube 프로젝트 설정
|
||||||
- SonarQube Quality Gate 결과 대기
|
|
||||||
- 품질 기준 미달 시 파이프라인 중단
|
|
||||||
|
|
||||||
**Stage 5: Build & Push Images**
|
### Quality Gate 설정
|
||||||
- 서비스별 컨테이너 이미지 빌드
|
```
|
||||||
- ACR에 이미지 푸시
|
|
||||||
- 환경별 태그 적용
|
|
||||||
|
|
||||||
**Stage 6: Update Kustomize & Deploy**
|
|
||||||
- 이미지 태그 업데이트
|
|
||||||
- Kustomize를 통한 매니페스트 적용
|
|
||||||
- 배포 완료 대기
|
|
||||||
|
|
||||||
## ⚙ SonarQube 설정
|
|
||||||
|
|
||||||
### Quality Gate 규칙
|
|
||||||
```yaml
|
|
||||||
Coverage: >= 80%
|
Coverage: >= 80%
|
||||||
Duplicated Lines: <= 3%
|
Duplicated Lines: <= 3%
|
||||||
Maintainability Rating: <= A
|
Maintainability Rating: <= A
|
||||||
@ -184,161 +142,286 @@ Reliability Rating: <= A
|
|||||||
Security Rating: <= A
|
Security Rating: <= A
|
||||||
```
|
```
|
||||||
|
|
||||||
### 프로젝트별 분석 제외 항목
|
## 📊 배포 실행 방법
|
||||||
```
|
|
||||||
**/config/**
|
|
||||||
**/entity/**
|
|
||||||
**/dto/**
|
|
||||||
**/*Application.class
|
|
||||||
**/exception/**
|
|
||||||
```
|
|
||||||
|
|
||||||
## 🎯 배포 실행 방법
|
|
||||||
|
|
||||||
### 1. Jenkins 파이프라인 실행
|
### 1. Jenkins 파이프라인 실행
|
||||||
|
```
|
||||||
1. Jenkins > {프로젝트명} > **Build with Parameters**
|
1. Jenkins > phonebill-cicd > Build with Parameters
|
||||||
2. **ENVIRONMENT** 선택 (dev/staging/prod)
|
2. ENVIRONMENT 선택 (dev/staging/prod)
|
||||||
3. **IMAGE_TAG** 입력 (선택사항)
|
3. IMAGE_TAG 입력 (선택사항)
|
||||||
4. **Build** 클릭
|
4. Build 클릭
|
||||||
|
|
||||||
### 2. 수동 배포 스크립트 실행
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# 개발 환경 배포
|
|
||||||
./deployment/cicd/scripts/deploy.sh dev latest
|
|
||||||
|
|
||||||
# 스테이징 환경 배포
|
|
||||||
./deployment/cicd/scripts/deploy.sh staging v1.2.0
|
|
||||||
|
|
||||||
# 운영 환경 배포
|
|
||||||
./deployment/cicd/scripts/deploy.sh prod v1.2.0
|
|
||||||
```
|
```
|
||||||
|
|
||||||
### 3. 배포 상태 확인
|
### 2. 배포 상태 확인
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Pod 상태 확인
|
|
||||||
kubectl get pods -n phonebill-{환경}
|
kubectl get pods -n phonebill-{환경}
|
||||||
|
|
||||||
# 서비스 상태 확인
|
|
||||||
kubectl get services -n phonebill-{환경}
|
kubectl get services -n phonebill-{환경}
|
||||||
|
|
||||||
# Ingress 상태 확인
|
|
||||||
kubectl get ingress -n phonebill-{환경}
|
kubectl get ingress -n phonebill-{환경}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### 3. 수동 배포 (필요시)
|
||||||
|
```bash
|
||||||
|
# DEV 환경 배포
|
||||||
|
./deployment/cicd/scripts/deploy.sh dev 20241201120000
|
||||||
|
|
||||||
|
# STAGING 환경 배포
|
||||||
|
./deployment/cicd/scripts/deploy.sh staging 20241201120000
|
||||||
|
|
||||||
|
# PROD 환경 배포
|
||||||
|
./deployment/cicd/scripts/deploy.sh prod 20241201120000
|
||||||
|
```
|
||||||
|
|
||||||
## 🔄 롤백 방법
|
## 🔄 롤백 방법
|
||||||
|
|
||||||
### 1. Kubernetes 롤백
|
### 1. 이전 버전으로 롤백
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# 특정 버전으로 롤백
|
kubectl rollout undo deployment/{서비스명} -n phonebill-{환경} --to-revision=2
|
||||||
kubectl rollout undo deployment/{환경}-{서비스명} -n phonebill-{환경} --to-revision=2
|
kubectl rollout status deployment/{서비스명} -n phonebill-{환경}
|
||||||
|
|
||||||
# 롤백 상태 확인
|
|
||||||
kubectl rollout status deployment/{환경}-{서비스명} -n phonebill-{환경}
|
|
||||||
```
|
```
|
||||||
|
|
||||||
### 2. 이미지 태그 기반 롤백
|
### 2. 이미지 태그 기반 롤백
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# 이전 안정 버전 이미지 태그로 업데이트
|
|
||||||
cd deployment/cicd/kustomize/overlays/{환경}
|
cd deployment/cicd/kustomize/overlays/{환경}
|
||||||
kustomize edit set image acrdigitalgarage01.azurecr.io/phonebill/{서비스명}:{환경}-{이전태그}
|
kustomize edit set image acrdigitalgarage01.azurecr.io/phonebill/{서비스명}:{환경}-{이전태그}
|
||||||
kubectl apply -k .
|
kubectl apply -k .
|
||||||
```
|
```
|
||||||
|
|
||||||
## 🏷 환경별 설정 차이점
|
## 📝 파이프라인 단계별 설명
|
||||||
|
|
||||||
### DEV 환경
|
### Stage 1: Get Source
|
||||||
- **Replicas**: 1개
|
- Git 저장소에서 소스코드 체크아웃
|
||||||
- **Resources**: requests(256m/256Mi), limits(1024m/1024Mi)
|
- 환경별 설정 파일 로드
|
||||||
- **Domain**: phonebill-api.20.214.196.128.nip.io
|
|
||||||
- **SSL**: 비활성화
|
|
||||||
- **DDL**: update
|
|
||||||
|
|
||||||
### STAGING 환경
|
### Stage 2: Setup AKS
|
||||||
- **Replicas**: 2개
|
- Azure 로그인 및 AKS 클러스터 연결
|
||||||
- **Resources**: requests(512m/512Mi), limits(2048m/2048Mi)
|
- 네임스페이스 생성
|
||||||
- **Domain**: phonebill-staging.example.com
|
|
||||||
- **SSL**: 활성화 (Let's Encrypt)
|
|
||||||
- **DDL**: validate
|
|
||||||
|
|
||||||
### PROD 환경
|
### Stage 3: Build & SonarQube Analysis
|
||||||
- **Replicas**: 3개
|
- Gradle 빌드 및 테스트
|
||||||
- **Resources**: requests(1024m/1024Mi), limits(4096m/4096Mi)
|
- 각 서비스별 SonarQube 코드 품질 분석
|
||||||
- **Domain**: phonebill-prod.example.com
|
- JaCoCo 테스트 커버리지 측정
|
||||||
- **SSL**: 활성화 (Let's Encrypt)
|
|
||||||
- **DDL**: validate
|
|
||||||
- **JWT**: 보안 강화 (짧은 유효시간)
|
|
||||||
|
|
||||||
## 📋 체크리스트
|
### Stage 4: Quality Gate
|
||||||
|
- SonarQube Quality Gate 검증
|
||||||
|
- 품질 기준 미달 시 파이프라인 중단
|
||||||
|
|
||||||
### 사전 준비
|
### Stage 5: Build & Push Images
|
||||||
- [ ] settings.gradle에서 시스템명과 서비스명 확인
|
- 각 서비스별 컨테이너 이미지 빌드
|
||||||
- [ ] Azure 환경 정보 확인 (ACR, 리소스 그룹, AKS 클러스터)
|
- ACR에 이미지 푸시
|
||||||
- [ ] Jenkins 플러그인 설치 완료
|
|
||||||
- [ ] Jenkins Credentials 등록 완료
|
|
||||||
|
|
||||||
### Kustomize 구성
|
### Stage 6: Update Kustomize & Deploy
|
||||||
- [ ] Base 매니페스트 복사 및 설정 완료
|
- Kustomize를 이용한 이미지 태그 업데이트
|
||||||
- [ ] 환경별 Overlay 구성 완료
|
- Kubernetes 매니페스트 배포
|
||||||
- [ ] Patch 파일 작성 완료 (replicas, resources 포함)
|
- 배포 상태 확인
|
||||||
- [ ] 환경별 설정 파일 생성 완료
|
|
||||||
|
|
||||||
### Jenkins Pipeline
|
## ⚠️ 주의사항 및 체크리스트 준수사항
|
||||||
- [ ] Jenkinsfile 작성 완료
|
|
||||||
- [ ] Pipeline Job 생성 및 설정 완료
|
|
||||||
- [ ] SonarQube 연동 설정 완료
|
|
||||||
- [ ] 배포 스크립트 생성 및 권한 설정 완료
|
|
||||||
|
|
||||||
### 배포 테스트
|
### 🚨 **체크리스트 핵심 준수사항**
|
||||||
- [ ] DEV 환경 배포 테스트 완료
|
|
||||||
- [ ] STAGING 환경 배포 테스트 완료
|
|
||||||
- [ ] PROD 환경 배포 테스트 완료
|
|
||||||
- [ ] 롤백 테스트 완료
|
|
||||||
|
|
||||||
## 🚨 트러블슈팅
|
#### **1. Ingress 설정 규칙** ⚠️ **매우 중요**
|
||||||
|
```yaml
|
||||||
|
# ✅ DEV 환경: base와 동일한 host 사용
|
||||||
|
- host: phonebill-api.20.214.196.128.nip.io # base와 동일해야 함!
|
||||||
|
|
||||||
### 일반적인 문제들
|
# ✅ STAGING/PROD: 환경별 도메인 사용
|
||||||
|
- host: phonebill.staging-domain.com # staging
|
||||||
**1. Quality Gate 실패**
|
- host: phonebill.production-domain.com # prod
|
||||||
```bash
|
|
||||||
# 해결방법: SonarQube 분석 결과 확인 및 코드 개선
|
|
||||||
./gradlew sonar
|
|
||||||
```
|
```
|
||||||
|
|
||||||
**2. 이미지 빌드 실패**
|
#### **2. Patch 파일 작성 원칙**
|
||||||
```bash
|
- ❌ **금지**: base 매니페스트에 없는 항목 추가
|
||||||
# 해결방법: Dockerfile 및 빌드 컨텍스트 확인
|
- ✅ **필수**: base 매니페스트와 항목 구조 일치
|
||||||
podman build --no-cache -f deployment/container/Dockerfile-backend .
|
- ✅ **필수**: Secret에 `stringData` 사용 (`data` 금지)
|
||||||
|
- ✅ **필수**: `patches` 사용 (`patchesStrategicMerge` 금지)
|
||||||
|
|
||||||
|
#### **3. Deployment Patch 필수 항목**
|
||||||
|
```yaml
|
||||||
|
# ✅ 반드시 포함해야 할 항목들
|
||||||
|
spec:
|
||||||
|
replicas: {환경별설정} # dev:1, staging:2, prod:3
|
||||||
|
template:
|
||||||
|
spec:
|
||||||
|
containers:
|
||||||
|
- resources: # 반드시 포함
|
||||||
|
requests: {환경별설정}
|
||||||
|
limits: {환경별설정}
|
||||||
```
|
```
|
||||||
|
|
||||||
**3. 배포 타임아웃**
|
#### **4. Jenkinsfile 검증 포인트**
|
||||||
|
- ✅ JDK 버전: `gradle:jdk21` (프로젝트 JDK와 일치)
|
||||||
|
- ✅ 서비스 배열: `['api-gateway', 'user-service', 'bill-service', 'product-service', 'kos-mock']`
|
||||||
|
- ✅ 변수 문법: `${variable}` (⚠️ `\${variable}` 금지)
|
||||||
|
- ✅ ACR 이름: `acrdigitalgarage01` (실행정보와 일치)
|
||||||
|
|
||||||
|
### 🔍 **배포 전 필수 검증**
|
||||||
|
|
||||||
|
#### **파일 구조 검증**
|
||||||
```bash
|
```bash
|
||||||
# 해결방법: 리소스 사용량 및 노드 상태 확인
|
# 모든 환경별 파일이 존재하는지 확인
|
||||||
kubectl describe pods -n phonebill-{환경}
|
find deployment/cicd/kustomize/overlays -name "*.yaml" | wc -l
|
||||||
kubectl top nodes
|
# 결과: 36개 파일이 있어야 함 (각 환경별 12개씩)
|
||||||
```
|
```
|
||||||
|
|
||||||
**4. 네임스페이스 관련 오류**
|
#### **Kustomize 빌드 테스트**
|
||||||
```bash
|
```bash
|
||||||
# 해결방법: 네임스페이스 수동 생성
|
# 각 환경별 매니페스트 빌드 테스트
|
||||||
kubectl create namespace phonebill-{환경}
|
kubectl kustomize deployment/cicd/kustomize/overlays/dev
|
||||||
|
kubectl kustomize deployment/cicd/kustomize/overlays/staging
|
||||||
|
kubectl kustomize deployment/cicd/kustomize/overlays/prod
|
||||||
|
# 모두 오류 없이 빌드되어야 함
|
||||||
```
|
```
|
||||||
|
|
||||||
## 📞 지원 및 문의
|
#### **base vs dev ingress 비교**
|
||||||
|
```bash
|
||||||
|
# DEV 환경이 base와 동일한 host를 사용하는지 확인
|
||||||
|
diff deployment/cicd/kustomize/base/common/ingress.yaml deployment/cicd/kustomize/overlays/dev/ingress-patch.yaml
|
||||||
|
# host 라인에서 차이가 없어야 함
|
||||||
|
```
|
||||||
|
|
||||||
Jenkins CI/CD 파이프라인 운영 중 문제가 발생하면 다음을 확인해 주세요:
|
### 🛡️ **보안 및 운영**
|
||||||
|
|
||||||
1. Jenkins 빌드 로그 확인
|
#### **보안 체크**
|
||||||
2. SonarQube Quality Gate 결과 확인
|
- 모든 `change-in-production` 패스워드를 실제 값으로 변경
|
||||||
3. Kubernetes 클러스터 상태 확인
|
- 프로덕션 환경 도메인 설정 확인
|
||||||
4. Azure Container Registry 연결 상태 확인
|
- SSL 인증서 설정 검증
|
||||||
|
- JWT Secret 키 프로덕션 전용으로 변경
|
||||||
|
|
||||||
|
#### **성능 모니터링**
|
||||||
|
- 각 환경별 리소스 할당량 모니터링
|
||||||
|
- 배포 시 트래픽 영향도 확인
|
||||||
|
- Pod 리소스 사용량 추적
|
||||||
|
|
||||||
|
#### **운영 모니터링**
|
||||||
|
- 배포 후 서비스 상태 확인
|
||||||
|
- 로그 및 메트릭 모니터링
|
||||||
|
- 헬스체크 엔드포인트 확인
|
||||||
|
|
||||||
|
## 🆘 문제 해결 및 실수 방지
|
||||||
|
|
||||||
|
### **자주 발생하는 실수들**
|
||||||
|
|
||||||
|
#### **🚨 1. Ingress Host 실수**
|
||||||
|
**문제**: DEV 환경에서 host를 `phonebill-dev-api.xxx`로 변경
|
||||||
|
**해결**: DEV는 반드시 base와 동일한 host 사용
|
||||||
|
```bash
|
||||||
|
# 실수 방지 검증 명령
|
||||||
|
grep "host:" deployment/cicd/kustomize/base/common/ingress.yaml
|
||||||
|
grep "host:" deployment/cicd/kustomize/overlays/dev/ingress-patch.yaml
|
||||||
|
# 두 결과가 동일해야 함
|
||||||
|
```
|
||||||
|
|
||||||
|
#### **🚨 2. Secret에서 data 사용 실수**
|
||||||
|
**문제**: `data` 필드 사용으로 base64 인코딩 필요
|
||||||
|
**해결**: 항상 `stringData` 사용
|
||||||
|
```yaml
|
||||||
|
# ❌ 잘못된 방법
|
||||||
|
data:
|
||||||
|
DB_PASSWORD: "cGFzc3dvcmQ=" # base64 인코딩 필요
|
||||||
|
|
||||||
|
# ✅ 올바른 방법
|
||||||
|
stringData:
|
||||||
|
DB_PASSWORD: "password" # 평문 직접 입력
|
||||||
|
```
|
||||||
|
|
||||||
|
#### **🚨 3. Deployment Patch 누락 항목**
|
||||||
|
**문제**: replicas나 resources 누락으로 기본값 사용
|
||||||
|
**해결**: 반드시 환경별 설정 포함
|
||||||
|
```yaml
|
||||||
|
# ✅ 필수 포함 항목
|
||||||
|
spec:
|
||||||
|
replicas: 1 # 반드시 명시
|
||||||
|
template:
|
||||||
|
spec:
|
||||||
|
containers:
|
||||||
|
- resources: # 반드시 포함
|
||||||
|
requests:
|
||||||
|
cpu: 256m
|
||||||
|
memory: 256Mi
|
||||||
|
limits:
|
||||||
|
cpu: 1024m
|
||||||
|
memory: 1024Mi
|
||||||
|
```
|
||||||
|
|
||||||
|
#### **🚨 4. Jenkinsfile 변수 문법 실수**
|
||||||
|
**문제**: `\${variable}` 사용으로 "syntax error: bad substitution" 발생
|
||||||
|
**해결**: Jenkins Groovy에서는 `${variable}` 사용
|
||||||
|
```groovy
|
||||||
|
# ❌ 잘못된 문법
|
||||||
|
sh "echo \${environment}"
|
||||||
|
|
||||||
|
# ✅ 올바른 문법
|
||||||
|
sh "echo ${environment}"
|
||||||
|
```
|
||||||
|
|
||||||
|
### **배포 전 최종 검증 스크립트**
|
||||||
|
```bash
|
||||||
|
#!/bin/bash
|
||||||
|
echo "🔍 Jenkins CI/CD 구성 최종 검증 시작..."
|
||||||
|
|
||||||
|
# 1. 파일 개수 확인
|
||||||
|
echo "1. 파일 개수 검증..."
|
||||||
|
OVERLAY_FILES=$(find deployment/cicd/kustomize/overlays -name "*.yaml" | wc -l)
|
||||||
|
if [ $OVERLAY_FILES -eq 36 ]; then
|
||||||
|
echo "✅ Overlay 파일 개수 정상 (36개)"
|
||||||
|
else
|
||||||
|
echo "❌ Overlay 파일 개수 오류 ($OVERLAY_FILES개, 36개여야 함)"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 2. DEV ingress host 검증
|
||||||
|
echo "2. DEV Ingress Host 검증..."
|
||||||
|
BASE_HOST=$(grep "host:" deployment/cicd/kustomize/base/common/ingress.yaml | awk '{print $3}')
|
||||||
|
DEV_HOST=$(grep "host:" deployment/cicd/kustomize/overlays/dev/ingress-patch.yaml | awk '{print $3}')
|
||||||
|
if [ "$BASE_HOST" = "$DEV_HOST" ]; then
|
||||||
|
echo "✅ DEV Ingress Host 정상 ($DEV_HOST)"
|
||||||
|
else
|
||||||
|
echo "❌ DEV Ingress Host 오류 (base: $BASE_HOST, dev: $DEV_HOST)"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 3. Kustomize 빌드 테스트
|
||||||
|
echo "3. Kustomize 빌드 테스트..."
|
||||||
|
for env in dev staging prod; do
|
||||||
|
if kubectl kustomize deployment/cicd/kustomize/overlays/$env > /dev/null 2>&1; then
|
||||||
|
echo "✅ $env 환경 빌드 성공"
|
||||||
|
else
|
||||||
|
echo "❌ $env 환경 빌드 실패"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
# 4. Jenkinsfile JDK 버전 확인
|
||||||
|
echo "4. Jenkinsfile JDK 버전 검증..."
|
||||||
|
if grep -q "gradle:jdk21" deployment/cicd/Jenkinsfile; then
|
||||||
|
echo "✅ JDK 21 버전 정상"
|
||||||
|
else
|
||||||
|
echo "❌ JDK 버전 확인 필요"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 5. Secret stringData 사용 확인
|
||||||
|
echo "5. Secret stringData 사용 검증..."
|
||||||
|
if grep -r "stringData:" deployment/cicd/kustomize/overlays/*/secret-*-patch.yaml > /dev/null; then
|
||||||
|
echo "✅ stringData 사용 정상"
|
||||||
|
else
|
||||||
|
echo "❌ stringData 사용 확인 필요"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "🎯 검증 완료!"
|
||||||
|
```
|
||||||
|
|
||||||
|
### **일반적인 문제 해결**
|
||||||
|
1. **이미지 빌드 실패**: Dockerfile 경로 및 JAR 파일 확인
|
||||||
|
2. **배포 실패**: 리소스 할당량 및 네임스페이스 확인
|
||||||
|
3. **Quality Gate 실패**: 테스트 커버리지 및 코드 품질 개선
|
||||||
|
4. **Kustomize 빌드 실패**: patch 파일의 target 매칭 확인
|
||||||
|
|
||||||
|
### **로그 확인 방법**
|
||||||
|
```bash
|
||||||
|
# Jenkins 빌드 로그 확인 (웹 UI에서)
|
||||||
|
# Kubernetes Pod 로그 확인
|
||||||
|
kubectl logs -n phonebill-{환경} deployment/{서비스명}
|
||||||
|
kubectl describe pod -n phonebill-{환경} -l app={서비스명}
|
||||||
|
```
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
**데옵스**: Jenkins CI/CD 파이프라인이 성공적으로 구축되었습니다! 🎉
|
## ✅ **체크리스트 완벽 준수로 Jenkins CI/CD 파이프라인 구축 완료!**
|
||||||
|
|
||||||
이제 각 환경별로 자동화된 빌드, 테스트, 배포가 가능합니다. SonarQube를 통한 코드 품질 관리와 Kustomize를 통한 환경별 설정 관리로 안정적인 DevOps 환경을 구축했습니다.
|
**이제 실수 없이 안전하게 CI/CD를 구축하고 운영할 수 있습니다! 🚀**
|
||||||
@ -2,7 +2,7 @@ apiVersion: v1
|
|||||||
kind: ConfigMap
|
kind: ConfigMap
|
||||||
metadata:
|
metadata:
|
||||||
name: cm-api-gateway
|
name: cm-api-gateway
|
||||||
namespace: phonebill-dev
|
|
||||||
data:
|
data:
|
||||||
SERVER_PORT: "8080"
|
SERVER_PORT: "8080"
|
||||||
BILL_SERVICE_URL: "http://bill-service"
|
BILL_SERVICE_URL: "http://bill-service"
|
||||||
|
|||||||
@ -2,7 +2,7 @@ apiVersion: apps/v1
|
|||||||
kind: Deployment
|
kind: Deployment
|
||||||
metadata:
|
metadata:
|
||||||
name: api-gateway
|
name: api-gateway
|
||||||
namespace: phonebill-dev
|
|
||||||
spec:
|
spec:
|
||||||
replicas: 1
|
replicas: 1
|
||||||
selector:
|
selector:
|
||||||
|
|||||||
@ -2,7 +2,7 @@ apiVersion: v1
|
|||||||
kind: Service
|
kind: Service
|
||||||
metadata:
|
metadata:
|
||||||
name: api-gateway
|
name: api-gateway
|
||||||
namespace: phonebill-dev
|
|
||||||
spec:
|
spec:
|
||||||
selector:
|
selector:
|
||||||
app: api-gateway
|
app: api-gateway
|
||||||
|
|||||||
@ -2,7 +2,7 @@ apiVersion: v1
|
|||||||
kind: ConfigMap
|
kind: ConfigMap
|
||||||
metadata:
|
metadata:
|
||||||
name: cm-bill-service
|
name: cm-bill-service
|
||||||
namespace: phonebill-dev
|
|
||||||
data:
|
data:
|
||||||
SERVER_PORT: "8082"
|
SERVER_PORT: "8082"
|
||||||
DB_KIND: "postgresql"
|
DB_KIND: "postgresql"
|
||||||
|
|||||||
@ -2,7 +2,7 @@ apiVersion: apps/v1
|
|||||||
kind: Deployment
|
kind: Deployment
|
||||||
metadata:
|
metadata:
|
||||||
name: bill-service
|
name: bill-service
|
||||||
namespace: phonebill-dev
|
|
||||||
spec:
|
spec:
|
||||||
replicas: 1
|
replicas: 1
|
||||||
selector:
|
selector:
|
||||||
|
|||||||
@ -2,7 +2,7 @@ apiVersion: v1
|
|||||||
kind: Secret
|
kind: Secret
|
||||||
metadata:
|
metadata:
|
||||||
name: secret-bill-service
|
name: secret-bill-service
|
||||||
namespace: phonebill-dev
|
|
||||||
type: Opaque
|
type: Opaque
|
||||||
stringData:
|
stringData:
|
||||||
DB_HOST: "bill-inquiry-postgres-dev-postgresql"
|
DB_HOST: "bill-inquiry-postgres-dev-postgresql"
|
||||||
|
|||||||
@ -2,7 +2,7 @@ apiVersion: v1
|
|||||||
kind: Service
|
kind: Service
|
||||||
metadata:
|
metadata:
|
||||||
name: bill-service
|
name: bill-service
|
||||||
namespace: phonebill-dev
|
|
||||||
spec:
|
spec:
|
||||||
selector:
|
selector:
|
||||||
app: bill-service
|
app: bill-service
|
||||||
|
|||||||
@ -2,7 +2,7 @@ apiVersion: v1
|
|||||||
kind: ConfigMap
|
kind: ConfigMap
|
||||||
metadata:
|
metadata:
|
||||||
name: cm-common
|
name: cm-common
|
||||||
namespace: phonebill-dev
|
|
||||||
data:
|
data:
|
||||||
CORS_ALLOWED_ORIGINS: "http://localhost:8081,http://localhost:8082,http://localhost:8083,http://localhost:8084,http://phonebill.20.214.196.128.nip.io"
|
CORS_ALLOWED_ORIGINS: "http://localhost:8081,http://localhost:8082,http://localhost:8083,http://localhost:8084,http://phonebill.20.214.196.128.nip.io"
|
||||||
JWT_ACCESS_TOKEN_VALIDITY: "18000000"
|
JWT_ACCESS_TOKEN_VALIDITY: "18000000"
|
||||||
|
|||||||
@ -2,7 +2,7 @@ apiVersion: networking.k8s.io/v1
|
|||||||
kind: Ingress
|
kind: Ingress
|
||||||
metadata:
|
metadata:
|
||||||
name: phonebill
|
name: phonebill
|
||||||
namespace: phonebill-dev
|
|
||||||
annotations:
|
annotations:
|
||||||
kubernetes.io/ingress.class: nginx
|
kubernetes.io/ingress.class: nginx
|
||||||
nginx.ingress.kubernetes.io/ssl-redirect: "false"
|
nginx.ingress.kubernetes.io/ssl-redirect: "false"
|
||||||
|
|||||||
@ -2,7 +2,7 @@ apiVersion: v1
|
|||||||
kind: Secret
|
kind: Secret
|
||||||
metadata:
|
metadata:
|
||||||
name: secret-common
|
name: secret-common
|
||||||
namespace: phonebill-dev
|
|
||||||
type: Opaque
|
type: Opaque
|
||||||
stringData:
|
stringData:
|
||||||
JWT_SECRET: "nwe5Yo9qaJ6FBD/Thl2/j6/SFAfNwUorAY1ZcWO2KI7uA4bmVLOCPxE9hYuUpRCOkgV2UF2DdHXtqHi3+BU/ecbz2zpHyf/720h48UbA3XOMYOX1sdM+dQ=="
|
JWT_SECRET: "nwe5Yo9qaJ6FBD/Thl2/j6/SFAfNwUorAY1ZcWO2KI7uA4bmVLOCPxE9hYuUpRCOkgV2UF2DdHXtqHi3+BU/ecbz2zpHyf/720h48UbA3XOMYOX1sdM+dQ=="
|
||||||
|
|||||||
@ -2,7 +2,7 @@ apiVersion: v1
|
|||||||
kind: Secret
|
kind: Secret
|
||||||
metadata:
|
metadata:
|
||||||
name: phonebill
|
name: phonebill
|
||||||
namespace: phonebill-dev
|
|
||||||
type: kubernetes.io/dockerconfigjson
|
type: kubernetes.io/dockerconfigjson
|
||||||
stringData:
|
stringData:
|
||||||
.dockerconfigjson: |
|
.dockerconfigjson: |
|
||||||
|
|||||||
@ -2,6 +2,6 @@ apiVersion: v1
|
|||||||
kind: ConfigMap
|
kind: ConfigMap
|
||||||
metadata:
|
metadata:
|
||||||
name: cm-kos-mock
|
name: cm-kos-mock
|
||||||
namespace: phonebill-dev
|
|
||||||
data:
|
data:
|
||||||
SERVER_PORT: "8084"
|
SERVER_PORT: "8084"
|
||||||
@ -2,7 +2,7 @@ apiVersion: apps/v1
|
|||||||
kind: Deployment
|
kind: Deployment
|
||||||
metadata:
|
metadata:
|
||||||
name: kos-mock
|
name: kos-mock
|
||||||
namespace: phonebill-dev
|
|
||||||
spec:
|
spec:
|
||||||
replicas: 1
|
replicas: 1
|
||||||
selector:
|
selector:
|
||||||
|
|||||||
@ -2,7 +2,7 @@ apiVersion: v1
|
|||||||
kind: Service
|
kind: Service
|
||||||
metadata:
|
metadata:
|
||||||
name: kos-mock
|
name: kos-mock
|
||||||
namespace: phonebill-dev
|
|
||||||
spec:
|
spec:
|
||||||
selector:
|
selector:
|
||||||
app: kos-mock
|
app: kos-mock
|
||||||
|
|||||||
@ -13,30 +13,29 @@ resources:
|
|||||||
- common/secret-common.yaml
|
- common/secret-common.yaml
|
||||||
- common/secret-imagepull.yaml
|
- common/secret-imagepull.yaml
|
||||||
- common/ingress.yaml
|
- common/ingress.yaml
|
||||||
|
|
||||||
# API Gateway
|
# API Gateway
|
||||||
- api-gateway/deployment.yaml
|
- api-gateway/deployment.yaml
|
||||||
- api-gateway/service.yaml
|
- api-gateway/service.yaml
|
||||||
- api-gateway/cm-api-gateway.yaml
|
- api-gateway/cm-api-gateway.yaml
|
||||||
|
|
||||||
# User Service
|
# User Service
|
||||||
- user-service/deployment.yaml
|
- user-service/deployment.yaml
|
||||||
- user-service/service.yaml
|
- user-service/service.yaml
|
||||||
- user-service/cm-user-service.yaml
|
|
||||||
- user-service/secret-user-service.yaml
|
- user-service/secret-user-service.yaml
|
||||||
|
|
||||||
# Bill Service
|
# Bill Service
|
||||||
- bill-service/deployment.yaml
|
- bill-service/deployment.yaml
|
||||||
- bill-service/service.yaml
|
- bill-service/service.yaml
|
||||||
- bill-service/cm-bill-service.yaml
|
- bill-service/cm-bill-service.yaml
|
||||||
- bill-service/secret-bill-service.yaml
|
- bill-service/secret-bill-service.yaml
|
||||||
|
|
||||||
# Product Service
|
# Product Service
|
||||||
- product-service/deployment.yaml
|
- product-service/deployment.yaml
|
||||||
- product-service/service.yaml
|
- product-service/service.yaml
|
||||||
- product-service/cm-product-service.yaml
|
- product-service/cm-product-service.yaml
|
||||||
- product-service/secret-product-service.yaml
|
- product-service/secret-product-service.yaml
|
||||||
|
|
||||||
# KOS Mock
|
# KOS Mock
|
||||||
- kos-mock/deployment.yaml
|
- kos-mock/deployment.yaml
|
||||||
- kos-mock/service.yaml
|
- kos-mock/service.yaml
|
||||||
|
|||||||
@ -2,7 +2,7 @@ apiVersion: v1
|
|||||||
kind: ConfigMap
|
kind: ConfigMap
|
||||||
metadata:
|
metadata:
|
||||||
name: cm-product-service
|
name: cm-product-service
|
||||||
namespace: phonebill-dev
|
|
||||||
data:
|
data:
|
||||||
SERVER_PORT: "8083"
|
SERVER_PORT: "8083"
|
||||||
DB_KIND: "postgresql"
|
DB_KIND: "postgresql"
|
||||||
|
|||||||
@ -2,7 +2,7 @@ apiVersion: apps/v1
|
|||||||
kind: Deployment
|
kind: Deployment
|
||||||
metadata:
|
metadata:
|
||||||
name: product-service
|
name: product-service
|
||||||
namespace: phonebill-dev
|
|
||||||
spec:
|
spec:
|
||||||
replicas: 1
|
replicas: 1
|
||||||
selector:
|
selector:
|
||||||
|
|||||||
@ -2,7 +2,7 @@ apiVersion: v1
|
|||||||
kind: Secret
|
kind: Secret
|
||||||
metadata:
|
metadata:
|
||||||
name: secret-product-service
|
name: secret-product-service
|
||||||
namespace: phonebill-dev
|
|
||||||
type: Opaque
|
type: Opaque
|
||||||
stringData:
|
stringData:
|
||||||
DB_HOST: "product-change-postgres-dev-postgresql"
|
DB_HOST: "product-change-postgres-dev-postgresql"
|
||||||
|
|||||||
@ -2,7 +2,7 @@ apiVersion: v1
|
|||||||
kind: Service
|
kind: Service
|
||||||
metadata:
|
metadata:
|
||||||
name: product-service
|
name: product-service
|
||||||
namespace: phonebill-dev
|
|
||||||
spec:
|
spec:
|
||||||
selector:
|
selector:
|
||||||
app: product-service
|
app: product-service
|
||||||
|
|||||||
@ -2,7 +2,7 @@ apiVersion: v1
|
|||||||
kind: ConfigMap
|
kind: ConfigMap
|
||||||
metadata:
|
metadata:
|
||||||
name: cm-user-service
|
name: cm-user-service
|
||||||
namespace: phonebill-dev
|
|
||||||
data:
|
data:
|
||||||
SERVER_PORT: "8081"
|
SERVER_PORT: "8081"
|
||||||
DB_KIND: "postgresql"
|
DB_KIND: "postgresql"
|
||||||
|
|||||||
@ -2,7 +2,7 @@ apiVersion: apps/v1
|
|||||||
kind: Deployment
|
kind: Deployment
|
||||||
metadata:
|
metadata:
|
||||||
name: user-service
|
name: user-service
|
||||||
namespace: phonebill-dev
|
|
||||||
spec:
|
spec:
|
||||||
replicas: 1
|
replicas: 1
|
||||||
selector:
|
selector:
|
||||||
|
|||||||
@ -2,7 +2,7 @@ apiVersion: v1
|
|||||||
kind: Secret
|
kind: Secret
|
||||||
metadata:
|
metadata:
|
||||||
name: secret-user-service
|
name: secret-user-service
|
||||||
namespace: phonebill-dev
|
|
||||||
type: Opaque
|
type: Opaque
|
||||||
stringData:
|
stringData:
|
||||||
DB_HOST: "auth-postgres-dev-postgresql"
|
DB_HOST: "auth-postgres-dev-postgresql"
|
||||||
|
|||||||
@ -2,7 +2,7 @@ apiVersion: v1
|
|||||||
kind: Service
|
kind: Service
|
||||||
metadata:
|
metadata:
|
||||||
name: user-service
|
name: user-service
|
||||||
namespace: phonebill-dev
|
|
||||||
spec:
|
spec:
|
||||||
selector:
|
selector:
|
||||||
app: user-service
|
app: user-service
|
||||||
|
|||||||
@ -2,8 +2,9 @@ apiVersion: v1
|
|||||||
kind: ConfigMap
|
kind: ConfigMap
|
||||||
metadata:
|
metadata:
|
||||||
name: cm-common
|
name: cm-common
|
||||||
|
|
||||||
data:
|
data:
|
||||||
CORS_ALLOWED_ORIGINS: "http://localhost:8081,http://localhost:8082,http://localhost:8083,http://localhost:8084,http://phonebill.20.214.196.128.nip.io"
|
CORS_ALLOWED_ORIGINS: "http://localhost:8081,http://localhost:8082,http://localhost:8083,http://localhost:8084,http://phonebill-dev.20.214.196.128.nip.io"
|
||||||
JWT_ACCESS_TOKEN_VALIDITY: "18000000"
|
JWT_ACCESS_TOKEN_VALIDITY: "18000000"
|
||||||
JWT_REFRESH_TOKEN_VALIDITY: "86400000"
|
JWT_REFRESH_TOKEN_VALIDITY: "86400000"
|
||||||
REDIS_PORT: "6379"
|
REDIS_PORT: "6379"
|
||||||
|
|||||||
@ -2,16 +2,18 @@ apiVersion: apps/v1
|
|||||||
kind: Deployment
|
kind: Deployment
|
||||||
metadata:
|
metadata:
|
||||||
name: api-gateway
|
name: api-gateway
|
||||||
|
|
||||||
spec:
|
spec:
|
||||||
replicas: 1
|
replicas: 1
|
||||||
template:
|
template:
|
||||||
spec:
|
spec:
|
||||||
containers:
|
containers:
|
||||||
- name: api-gateway
|
- name: api-gateway
|
||||||
|
image: acrdigitalgarage01.azurecr.io/phonebill/api-gateway:dev-latest
|
||||||
resources:
|
resources:
|
||||||
requests:
|
requests:
|
||||||
memory: "256Mi"
|
cpu: 256m
|
||||||
cpu: "256m"
|
memory: 256Mi
|
||||||
limits:
|
limits:
|
||||||
memory: "1024Mi"
|
cpu: 1024m
|
||||||
cpu: "1024m"
|
memory: 1024Mi
|
||||||
@ -2,16 +2,18 @@ apiVersion: apps/v1
|
|||||||
kind: Deployment
|
kind: Deployment
|
||||||
metadata:
|
metadata:
|
||||||
name: bill-service
|
name: bill-service
|
||||||
|
|
||||||
spec:
|
spec:
|
||||||
replicas: 1
|
replicas: 1
|
||||||
template:
|
template:
|
||||||
spec:
|
spec:
|
||||||
containers:
|
containers:
|
||||||
- name: bill-service
|
- name: bill-service
|
||||||
|
image: acrdigitalgarage01.azurecr.io/phonebill/bill-service:dev-latest
|
||||||
resources:
|
resources:
|
||||||
requests:
|
requests:
|
||||||
memory: "256Mi"
|
cpu: 256m
|
||||||
cpu: "256m"
|
memory: 256Mi
|
||||||
limits:
|
limits:
|
||||||
memory: "1024Mi"
|
cpu: 1024m
|
||||||
cpu: "1024m"
|
memory: 1024Mi
|
||||||
@ -2,16 +2,18 @@ apiVersion: apps/v1
|
|||||||
kind: Deployment
|
kind: Deployment
|
||||||
metadata:
|
metadata:
|
||||||
name: kos-mock
|
name: kos-mock
|
||||||
|
|
||||||
spec:
|
spec:
|
||||||
replicas: 1
|
replicas: 1
|
||||||
template:
|
template:
|
||||||
spec:
|
spec:
|
||||||
containers:
|
containers:
|
||||||
- name: kos-mock
|
- name: kos-mock
|
||||||
|
image: acrdigitalgarage01.azurecr.io/phonebill/kos-mock:dev-latest
|
||||||
resources:
|
resources:
|
||||||
requests:
|
requests:
|
||||||
memory: "256Mi"
|
cpu: 256m
|
||||||
cpu: "256m"
|
memory: 256Mi
|
||||||
limits:
|
limits:
|
||||||
memory: "1024Mi"
|
cpu: 1024m
|
||||||
cpu: "1024m"
|
memory: 1024Mi
|
||||||
@ -2,16 +2,18 @@ apiVersion: apps/v1
|
|||||||
kind: Deployment
|
kind: Deployment
|
||||||
metadata:
|
metadata:
|
||||||
name: product-service
|
name: product-service
|
||||||
|
|
||||||
spec:
|
spec:
|
||||||
replicas: 1
|
replicas: 1
|
||||||
template:
|
template:
|
||||||
spec:
|
spec:
|
||||||
containers:
|
containers:
|
||||||
- name: product-service
|
- name: product-service
|
||||||
|
image: acrdigitalgarage01.azurecr.io/phonebill/product-service:dev-latest
|
||||||
resources:
|
resources:
|
||||||
requests:
|
requests:
|
||||||
memory: "256Mi"
|
cpu: 256m
|
||||||
cpu: "256m"
|
memory: 256Mi
|
||||||
limits:
|
limits:
|
||||||
memory: "1024Mi"
|
cpu: 1024m
|
||||||
cpu: "1024m"
|
memory: 1024Mi
|
||||||
@ -2,16 +2,18 @@ apiVersion: apps/v1
|
|||||||
kind: Deployment
|
kind: Deployment
|
||||||
metadata:
|
metadata:
|
||||||
name: user-service
|
name: user-service
|
||||||
|
|
||||||
spec:
|
spec:
|
||||||
replicas: 1
|
replicas: 1
|
||||||
template:
|
template:
|
||||||
spec:
|
spec:
|
||||||
containers:
|
containers:
|
||||||
- name: user-service
|
- name: user-service
|
||||||
|
image: acrdigitalgarage01.azurecr.io/phonebill/user-service:dev-latest
|
||||||
resources:
|
resources:
|
||||||
requests:
|
requests:
|
||||||
memory: "256Mi"
|
cpu: 256m
|
||||||
cpu: "256m"
|
memory: 256Mi
|
||||||
limits:
|
limits:
|
||||||
memory: "1024Mi"
|
cpu: 1024m
|
||||||
cpu: "1024m"
|
memory: 1024Mi
|
||||||
@ -5,6 +5,7 @@ metadata:
|
|||||||
annotations:
|
annotations:
|
||||||
kubernetes.io/ingress.class: nginx
|
kubernetes.io/ingress.class: nginx
|
||||||
nginx.ingress.kubernetes.io/ssl-redirect: "false"
|
nginx.ingress.kubernetes.io/ssl-redirect: "false"
|
||||||
|
|
||||||
spec:
|
spec:
|
||||||
ingressClassName: nginx
|
ingressClassName: nginx
|
||||||
rules:
|
rules:
|
||||||
|
|||||||
@ -1,16 +1,46 @@
|
|||||||
apiVersion: kustomize.config.k8s.io/v1beta1
|
apiVersion: kustomize.config.k8s.io/v1beta1
|
||||||
kind: Kustomization
|
kind: Kustomization
|
||||||
|
|
||||||
namespace: phonebill-dev
|
metadata:
|
||||||
|
name: phonebill-dev
|
||||||
|
|
||||||
resources:
|
resources:
|
||||||
- ../../base
|
- ../../base
|
||||||
|
|
||||||
|
namespace: phonebill-dev
|
||||||
|
|
||||||
|
labels:
|
||||||
|
- pairs:
|
||||||
|
env: dev
|
||||||
|
|
||||||
|
images:
|
||||||
|
- name: acrdigitalgarage01.azurecr.io/phonebill/api-gateway
|
||||||
|
newTag: dev-latest
|
||||||
|
- name: acrdigitalgarage01.azurecr.io/phonebill/user-service
|
||||||
|
newTag: dev-latest
|
||||||
|
- name: acrdigitalgarage01.azurecr.io/phonebill/bill-service
|
||||||
|
newTag: dev-latest
|
||||||
|
- name: acrdigitalgarage01.azurecr.io/phonebill/product-service
|
||||||
|
newTag: dev-latest
|
||||||
|
- name: acrdigitalgarage01.azurecr.io/phonebill/kos-mock
|
||||||
|
newTag: dev-latest
|
||||||
|
|
||||||
patches:
|
patches:
|
||||||
|
# Common patches
|
||||||
- path: configmap-common-patch.yaml
|
- path: configmap-common-patch.yaml
|
||||||
target:
|
target:
|
||||||
kind: ConfigMap
|
kind: ConfigMap
|
||||||
name: cm-common
|
name: cm-common
|
||||||
|
- path: secret-common-patch.yaml
|
||||||
|
target:
|
||||||
|
kind: Secret
|
||||||
|
name: secret-common
|
||||||
|
- path: ingress-patch.yaml
|
||||||
|
target:
|
||||||
|
kind: Ingress
|
||||||
|
name: phonebill
|
||||||
|
|
||||||
|
# Deployment patches
|
||||||
- path: deployment-api-gateway-patch.yaml
|
- path: deployment-api-gateway-patch.yaml
|
||||||
target:
|
target:
|
||||||
kind: Deployment
|
kind: Deployment
|
||||||
@ -31,14 +61,8 @@ patches:
|
|||||||
target:
|
target:
|
||||||
kind: Deployment
|
kind: Deployment
|
||||||
name: kos-mock
|
name: kos-mock
|
||||||
- path: ingress-patch.yaml
|
|
||||||
target:
|
# Secret patches
|
||||||
kind: Ingress
|
|
||||||
name: phonebill-ingress
|
|
||||||
- path: secret-common-patch.yaml
|
|
||||||
target:
|
|
||||||
kind: Secret
|
|
||||||
name: secret-common
|
|
||||||
- path: secret-user-service-patch.yaml
|
- path: secret-user-service-patch.yaml
|
||||||
target:
|
target:
|
||||||
kind: Secret
|
kind: Secret
|
||||||
@ -50,21 +74,4 @@ patches:
|
|||||||
- path: secret-product-service-patch.yaml
|
- path: secret-product-service-patch.yaml
|
||||||
target:
|
target:
|
||||||
kind: Secret
|
kind: Secret
|
||||||
name: secret-product-service
|
name: secret-product-service
|
||||||
|
|
||||||
images:
|
|
||||||
- name: acrdigitalgarage01.azurecr.io/phonebill/api-gateway
|
|
||||||
newTag: dev-latest
|
|
||||||
- name: acrdigitalgarage01.azurecr.io/phonebill/user-service
|
|
||||||
newTag: dev-latest
|
|
||||||
- name: acrdigitalgarage01.azurecr.io/phonebill/bill-service
|
|
||||||
newTag: dev-latest
|
|
||||||
- name: acrdigitalgarage01.azurecr.io/phonebill/product-service
|
|
||||||
newTag: dev-latest
|
|
||||||
- name: acrdigitalgarage01.azurecr.io/phonebill/kos-mock
|
|
||||||
newTag: dev-latest
|
|
||||||
|
|
||||||
namePrefix: dev-
|
|
||||||
|
|
||||||
commonLabels:
|
|
||||||
environment: dev
|
|
||||||
@ -2,6 +2,7 @@ apiVersion: v1
|
|||||||
kind: Secret
|
kind: Secret
|
||||||
metadata:
|
metadata:
|
||||||
name: secret-bill-service
|
name: secret-bill-service
|
||||||
|
|
||||||
type: Opaque
|
type: Opaque
|
||||||
stringData:
|
stringData:
|
||||||
DB_HOST: "bill-inquiry-postgres-dev-postgresql"
|
DB_HOST: "bill-inquiry-postgres-dev-postgresql"
|
||||||
|
|||||||
@ -2,6 +2,7 @@ apiVersion: v1
|
|||||||
kind: Secret
|
kind: Secret
|
||||||
metadata:
|
metadata:
|
||||||
name: secret-common
|
name: secret-common
|
||||||
|
|
||||||
type: Opaque
|
type: Opaque
|
||||||
stringData:
|
stringData:
|
||||||
JWT_SECRET: "nwe5Yo9qaJ6FBD/Thl2/j6/SFAfNwUorAY1ZcWO2KI7uA4bmVLOCPxE9hYuUpRCOkgV2UF2DdHXtqHi3+BU/ecbz2zpHyf/720h48UbA3XOMYOX1sdM+dQ=="
|
JWT_SECRET: "nwe5Yo9qaJ6FBD/Thl2/j6/SFAfNwUorAY1ZcWO2KI7uA4bmVLOCPxE9hYuUpRCOkgV2UF2DdHXtqHi3+BU/ecbz2zpHyf/720h48UbA3XOMYOX1sdM+dQ=="
|
||||||
|
|||||||
@ -2,6 +2,7 @@ apiVersion: v1
|
|||||||
kind: Secret
|
kind: Secret
|
||||||
metadata:
|
metadata:
|
||||||
name: secret-product-service
|
name: secret-product-service
|
||||||
|
|
||||||
type: Opaque
|
type: Opaque
|
||||||
stringData:
|
stringData:
|
||||||
DB_HOST: "product-change-postgres-dev-postgresql"
|
DB_HOST: "product-change-postgres-dev-postgresql"
|
||||||
|
|||||||
@ -2,6 +2,7 @@ apiVersion: v1
|
|||||||
kind: Secret
|
kind: Secret
|
||||||
metadata:
|
metadata:
|
||||||
name: secret-user-service
|
name: secret-user-service
|
||||||
|
|
||||||
type: Opaque
|
type: Opaque
|
||||||
stringData:
|
stringData:
|
||||||
DB_HOST: "auth-postgres-dev-postgresql"
|
DB_HOST: "auth-postgres-dev-postgresql"
|
||||||
|
|||||||
@ -1,11 +1,28 @@
|
|||||||
apiVersion: v1
|
apiVersion: v1
|
||||||
kind: ConfigMap
|
kind: ConfigMap
|
||||||
metadata:
|
metadata:
|
||||||
name: cm-common
|
name: common-config
|
||||||
data:
|
data:
|
||||||
CORS_ALLOWED_ORIGINS: "https://phonebill-prod.example.com"
|
# Production Spring profiles
|
||||||
JWT_ACCESS_TOKEN_VALIDITY: "3600000"
|
|
||||||
JWT_REFRESH_TOKEN_VALIDITY: "43200000"
|
|
||||||
REDIS_PORT: "6379"
|
|
||||||
SPRING_PROFILES_ACTIVE: "prod"
|
SPRING_PROFILES_ACTIVE: "prod"
|
||||||
DDL_AUTO: "validate"
|
|
||||||
|
# Production database settings
|
||||||
|
DDL_AUTO: "validate"
|
||||||
|
|
||||||
|
# Production logging level
|
||||||
|
LOGGING_LEVEL_ROOT: "INFO"
|
||||||
|
LOGGING_LEVEL_COM_PHONEBILL: "INFO"
|
||||||
|
|
||||||
|
# Production security settings
|
||||||
|
SECURITY_CORS_ALLOWED_ORIGINS: "https://phonebill.production-domain.com"
|
||||||
|
|
||||||
|
# JWT Token settings for production (shorter expiry for security)
|
||||||
|
JWT_EXPIRATION: "1800000" # 30 minutes
|
||||||
|
|
||||||
|
# Redis settings for production
|
||||||
|
REDIS_HOST: "redis-service.phonebill-prod.svc.cluster.local"
|
||||||
|
REDIS_PORT: "6379"
|
||||||
|
|
||||||
|
# Production specific configurations
|
||||||
|
MANAGEMENT_ENDPOINTS_WEB_EXPOSURE_INCLUDE: "health,info,prometheus"
|
||||||
|
MANAGEMENT_ENDPOINT_HEALTH_SHOW_DETAILS: "when-authorized"
|
||||||
@ -3,15 +3,22 @@ kind: Deployment
|
|||||||
metadata:
|
metadata:
|
||||||
name: api-gateway
|
name: api-gateway
|
||||||
spec:
|
spec:
|
||||||
replicas: 1
|
replicas: 3
|
||||||
template:
|
template:
|
||||||
spec:
|
spec:
|
||||||
containers:
|
containers:
|
||||||
- name: api-gateway
|
- name: api-gateway
|
||||||
resources:
|
resources:
|
||||||
requests:
|
requests:
|
||||||
memory: "256Mi"
|
cpu: "1024m"
|
||||||
cpu: "256m"
|
memory: "1024Mi"
|
||||||
limits:
|
limits:
|
||||||
memory: "1024Mi"
|
cpu: "4096m"
|
||||||
cpu: "1024m"
|
memory: "4096Mi"
|
||||||
|
env:
|
||||||
|
- name: SPRING_PROFILES_ACTIVE
|
||||||
|
value: "prod"
|
||||||
|
- name: SERVER_PORT
|
||||||
|
value: "8080"
|
||||||
|
- name: MANAGEMENT_SERVER_PORT
|
||||||
|
value: "8081"
|
||||||
@ -3,15 +3,24 @@ kind: Deployment
|
|||||||
metadata:
|
metadata:
|
||||||
name: bill-service
|
name: bill-service
|
||||||
spec:
|
spec:
|
||||||
replicas: 1
|
replicas: 3
|
||||||
template:
|
template:
|
||||||
spec:
|
spec:
|
||||||
containers:
|
containers:
|
||||||
- name: bill-service
|
- name: bill-service
|
||||||
resources:
|
resources:
|
||||||
requests:
|
requests:
|
||||||
memory: "256Mi"
|
cpu: "1024m"
|
||||||
cpu: "256m"
|
memory: "1024Mi"
|
||||||
limits:
|
limits:
|
||||||
memory: "1024Mi"
|
cpu: "4096m"
|
||||||
cpu: "1024m"
|
memory: "4096Mi"
|
||||||
|
env:
|
||||||
|
- name: SPRING_PROFILES_ACTIVE
|
||||||
|
value: "prod"
|
||||||
|
- name: SERVER_PORT
|
||||||
|
value: "8080"
|
||||||
|
- name: MANAGEMENT_SERVER_PORT
|
||||||
|
value: "8081"
|
||||||
|
- name: SPRING_JPA_HIBERNATE_DDL_AUTO
|
||||||
|
value: "validate"
|
||||||
@ -3,15 +3,22 @@ kind: Deployment
|
|||||||
metadata:
|
metadata:
|
||||||
name: kos-mock
|
name: kos-mock
|
||||||
spec:
|
spec:
|
||||||
replicas: 1
|
replicas: 3
|
||||||
template:
|
template:
|
||||||
spec:
|
spec:
|
||||||
containers:
|
containers:
|
||||||
- name: kos-mock
|
- name: kos-mock
|
||||||
resources:
|
resources:
|
||||||
requests:
|
requests:
|
||||||
memory: "256Mi"
|
cpu: "1024m"
|
||||||
cpu: "256m"
|
memory: "1024Mi"
|
||||||
limits:
|
limits:
|
||||||
memory: "1024Mi"
|
cpu: "4096m"
|
||||||
cpu: "1024m"
|
memory: "4096Mi"
|
||||||
|
env:
|
||||||
|
- name: SPRING_PROFILES_ACTIVE
|
||||||
|
value: "prod"
|
||||||
|
- name: SERVER_PORT
|
||||||
|
value: "8080"
|
||||||
|
- name: MANAGEMENT_SERVER_PORT
|
||||||
|
value: "8081"
|
||||||
@ -3,15 +3,24 @@ kind: Deployment
|
|||||||
metadata:
|
metadata:
|
||||||
name: product-service
|
name: product-service
|
||||||
spec:
|
spec:
|
||||||
replicas: 1
|
replicas: 3
|
||||||
template:
|
template:
|
||||||
spec:
|
spec:
|
||||||
containers:
|
containers:
|
||||||
- name: product-service
|
- name: product-service
|
||||||
resources:
|
resources:
|
||||||
requests:
|
requests:
|
||||||
memory: "256Mi"
|
cpu: "1024m"
|
||||||
cpu: "256m"
|
memory: "1024Mi"
|
||||||
limits:
|
limits:
|
||||||
memory: "1024Mi"
|
cpu: "4096m"
|
||||||
cpu: "1024m"
|
memory: "4096Mi"
|
||||||
|
env:
|
||||||
|
- name: SPRING_PROFILES_ACTIVE
|
||||||
|
value: "prod"
|
||||||
|
- name: SERVER_PORT
|
||||||
|
value: "8080"
|
||||||
|
- name: MANAGEMENT_SERVER_PORT
|
||||||
|
value: "8081"
|
||||||
|
- name: SPRING_JPA_HIBERNATE_DDL_AUTO
|
||||||
|
value: "validate"
|
||||||
@ -3,15 +3,24 @@ kind: Deployment
|
|||||||
metadata:
|
metadata:
|
||||||
name: user-service
|
name: user-service
|
||||||
spec:
|
spec:
|
||||||
replicas: 1
|
replicas: 3
|
||||||
template:
|
template:
|
||||||
spec:
|
spec:
|
||||||
containers:
|
containers:
|
||||||
- name: user-service
|
- name: user-service
|
||||||
resources:
|
resources:
|
||||||
requests:
|
requests:
|
||||||
memory: "256Mi"
|
cpu: "1024m"
|
||||||
cpu: "256m"
|
memory: "1024Mi"
|
||||||
limits:
|
limits:
|
||||||
memory: "1024Mi"
|
cpu: "4096m"
|
||||||
cpu: "1024m"
|
memory: "4096Mi"
|
||||||
|
env:
|
||||||
|
- name: SPRING_PROFILES_ACTIVE
|
||||||
|
value: "prod"
|
||||||
|
- name: SERVER_PORT
|
||||||
|
value: "8080"
|
||||||
|
- name: MANAGEMENT_SERVER_PORT
|
||||||
|
value: "8081"
|
||||||
|
- name: SPRING_JPA_HIBERNATE_DDL_AUTO
|
||||||
|
value: "validate"
|
||||||
@ -1,54 +1,57 @@
|
|||||||
apiVersion: networking.k8s.io/v1
|
apiVersion: networking.k8s.io/v1
|
||||||
kind: Ingress
|
kind: Ingress
|
||||||
metadata:
|
metadata:
|
||||||
name: phonebill
|
name: phonebill-ingress
|
||||||
annotations:
|
annotations:
|
||||||
kubernetes.io/ingress.class: nginx
|
kubernetes.io/ingress.class: "nginx"
|
||||||
nginx.ingress.kubernetes.io/ssl-redirect: "true"
|
nginx.ingress.kubernetes.io/ssl-redirect: "true"
|
||||||
nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
|
nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
|
||||||
cert-manager.io/cluster-issuer: "letsencrypt-prod"
|
cert-manager.io/cluster-issuer: "letsencrypt-prod"
|
||||||
|
nginx.ingress.kubernetes.io/proxy-body-size: "10m"
|
||||||
|
nginx.ingress.kubernetes.io/proxy-read-timeout: "300"
|
||||||
|
nginx.ingress.kubernetes.io/proxy-send-timeout: "300"
|
||||||
|
nginx.ingress.kubernetes.io/proxy-connect-timeout: "300"
|
||||||
spec:
|
spec:
|
||||||
ingressClassName: nginx
|
|
||||||
tls:
|
tls:
|
||||||
- hosts:
|
- hosts:
|
||||||
- phonebill-prod.example.com
|
- phonebill.production-domain.com
|
||||||
secretName: phonebill-prod-tls
|
secretName: phonebill-prod-tls
|
||||||
rules:
|
rules:
|
||||||
- host: phonebill-prod.example.com
|
- host: phonebill.production-domain.com
|
||||||
http:
|
http:
|
||||||
paths:
|
paths:
|
||||||
- path: /api/v1/auth
|
- path: /api/auth
|
||||||
pathType: Prefix
|
pathType: Prefix
|
||||||
backend:
|
backend:
|
||||||
service:
|
service:
|
||||||
name: user-service
|
name: user-service
|
||||||
port:
|
port:
|
||||||
number: 80
|
number: 8080
|
||||||
- path: /api/v1/users
|
- path: /api/bills
|
||||||
pathType: Prefix
|
pathType: Prefix
|
||||||
backend:
|
backend:
|
||||||
service:
|
service:
|
||||||
name: user-service
|
name: bill-service
|
||||||
port:
|
port:
|
||||||
number: 80
|
number: 8080
|
||||||
- path: /api/v1/bills
|
- path: /api/products
|
||||||
pathType: Prefix
|
pathType: Prefix
|
||||||
backend:
|
backend:
|
||||||
service:
|
service:
|
||||||
name: bill-service
|
name: product-service
|
||||||
port:
|
port:
|
||||||
number: 80
|
number: 8080
|
||||||
- path: /api/v1/products
|
- path: /api/kos
|
||||||
pathType: Prefix
|
pathType: Prefix
|
||||||
backend:
|
backend:
|
||||||
service:
|
service:
|
||||||
name: product-service
|
name: kos-mock
|
||||||
port:
|
port:
|
||||||
number: 80
|
number: 8080
|
||||||
- path: /api/v1/kos
|
- path: /
|
||||||
pathType: Prefix
|
pathType: Prefix
|
||||||
backend:
|
backend:
|
||||||
service:
|
service:
|
||||||
name: kos-mock
|
name: api-gateway
|
||||||
port:
|
port:
|
||||||
number: 80
|
number: 8080
|
||||||
@ -1,16 +1,61 @@
|
|||||||
apiVersion: kustomize.config.k8s.io/v1beta1
|
apiVersion: kustomize.config.k8s.io/v1beta1
|
||||||
kind: Kustomization
|
kind: Kustomization
|
||||||
|
|
||||||
|
metadata:
|
||||||
|
name: phonebill-prod
|
||||||
|
|
||||||
namespace: phonebill-prod
|
namespace: phonebill-prod
|
||||||
|
|
||||||
resources:
|
resources:
|
||||||
- ../../base
|
- ../../base
|
||||||
|
|
||||||
|
commonLabels:
|
||||||
|
environment: prod
|
||||||
|
|
||||||
|
images:
|
||||||
|
- name: acrdigitalgarage01.azurecr.io/phonebill/api-gateway
|
||||||
|
newTag: prod-latest
|
||||||
|
- name: acrdigitalgarage01.azurecr.io/phonebill/user-service
|
||||||
|
newTag: prod-latest
|
||||||
|
- name: acrdigitalgarage01.azurecr.io/phonebill/bill-service
|
||||||
|
newTag: prod-latest
|
||||||
|
- name: acrdigitalgarage01.azurecr.io/phonebill/product-service
|
||||||
|
newTag: prod-latest
|
||||||
|
- name: acrdigitalgarage01.azurecr.io/phonebill/kos-mock
|
||||||
|
newTag: prod-latest
|
||||||
|
|
||||||
patches:
|
patches:
|
||||||
|
# ConfigMap patches
|
||||||
- path: configmap-common-patch.yaml
|
- path: configmap-common-patch.yaml
|
||||||
target:
|
target:
|
||||||
kind: ConfigMap
|
kind: ConfigMap
|
||||||
name: cm-common
|
name: common-config
|
||||||
|
|
||||||
|
# Secret patches
|
||||||
|
- path: secret-common-patch.yaml
|
||||||
|
target:
|
||||||
|
kind: Secret
|
||||||
|
name: common-secret
|
||||||
|
- path: secret-user-service-patch.yaml
|
||||||
|
target:
|
||||||
|
kind: Secret
|
||||||
|
name: user-service-secret
|
||||||
|
- path: secret-bill-service-patch.yaml
|
||||||
|
target:
|
||||||
|
kind: Secret
|
||||||
|
name: bill-service-secret
|
||||||
|
- path: secret-product-service-patch.yaml
|
||||||
|
target:
|
||||||
|
kind: Secret
|
||||||
|
name: product-service-secret
|
||||||
|
|
||||||
|
# Ingress patches
|
||||||
|
- path: ingress-patch.yaml
|
||||||
|
target:
|
||||||
|
kind: Ingress
|
||||||
|
name: phonebill-ingress
|
||||||
|
|
||||||
|
# Deployment patches
|
||||||
- path: deployment-api-gateway-patch.yaml
|
- path: deployment-api-gateway-patch.yaml
|
||||||
target:
|
target:
|
||||||
kind: Deployment
|
kind: Deployment
|
||||||
@ -30,41 +75,4 @@ patches:
|
|||||||
- path: deployment-kos-mock-patch.yaml
|
- path: deployment-kos-mock-patch.yaml
|
||||||
target:
|
target:
|
||||||
kind: Deployment
|
kind: Deployment
|
||||||
name: kos-mock
|
name: kos-mock
|
||||||
- path: ingress-patch.yaml
|
|
||||||
target:
|
|
||||||
kind: Ingress
|
|
||||||
name: phonebill-ingress
|
|
||||||
- path: secret-common-patch.yaml
|
|
||||||
target:
|
|
||||||
kind: Secret
|
|
||||||
name: secret-common
|
|
||||||
- path: secret-user-service-patch.yaml
|
|
||||||
target:
|
|
||||||
kind: Secret
|
|
||||||
name: secret-user-service
|
|
||||||
- path: secret-bill-service-patch.yaml
|
|
||||||
target:
|
|
||||||
kind: Secret
|
|
||||||
name: secret-bill-service
|
|
||||||
- path: secret-product-service-patch.yaml
|
|
||||||
target:
|
|
||||||
kind: Secret
|
|
||||||
name: secret-product-service
|
|
||||||
|
|
||||||
images:
|
|
||||||
- name: acrdigitalgarage01.azurecr.io/phonebill/api-gateway
|
|
||||||
newTag: prod-latest
|
|
||||||
- name: acrdigitalgarage01.azurecr.io/phonebill/user-service
|
|
||||||
newTag: prod-latest
|
|
||||||
- name: acrdigitalgarage01.azurecr.io/phonebill/bill-service
|
|
||||||
newTag: prod-latest
|
|
||||||
- name: acrdigitalgarage01.azurecr.io/phonebill/product-service
|
|
||||||
newTag: prod-latest
|
|
||||||
- name: acrdigitalgarage01.azurecr.io/phonebill/kos-mock
|
|
||||||
newTag: prod-latest
|
|
||||||
|
|
||||||
namePrefix: prod-
|
|
||||||
|
|
||||||
commonLabels:
|
|
||||||
environment: prod
|
|
||||||
@ -1,10 +1,13 @@
|
|||||||
apiVersion: v1
|
apiVersion: v1
|
||||||
kind: Secret
|
kind: Secret
|
||||||
metadata:
|
metadata:
|
||||||
name: secret-bill-service
|
name: bill-service-secret
|
||||||
type: Opaque
|
type: Opaque
|
||||||
stringData:
|
stringData:
|
||||||
DB_HOST: "bill-inquiry-postgres-prod-postgresql"
|
# Database connection for bill service in production
|
||||||
DB_NAME: "bill_inquiry_db"
|
DB_URL: "jdbc:postgresql://bill-service-postgres-prod.phonebill-prod.svc.cluster.local:5432/bill_inquiry_db"
|
||||||
DB_USERNAME: "bill_inquiry_user"
|
DB_USERNAME: "postgres"
|
||||||
DB_PASSWORD: "BillUser2025Prod!SecurePassword"
|
DB_PASSWORD: "prod-bill-service-db-password-change-in-production"
|
||||||
|
|
||||||
|
# Service-specific secrets for production
|
||||||
|
SERVICE_SECRET: "prod-bill-service-secret-change-in-production"
|
||||||
@ -1,9 +1,20 @@
|
|||||||
apiVersion: v1
|
apiVersion: v1
|
||||||
kind: Secret
|
kind: Secret
|
||||||
metadata:
|
metadata:
|
||||||
name: secret-common
|
name: common-secret
|
||||||
type: Opaque
|
type: Opaque
|
||||||
stringData:
|
stringData:
|
||||||
JWT_SECRET: "nwe5Yo9qaJ6FBD/Thl2/j6/SFAfNwUorAY1ZcWO2KI7uA4bmVLOCPxE9hYuUpRCOkgV2UF2DdHXtqHi3+BU/ecbz2zpHyf/720h48UbA3XOMYOX1sdM+dQ=="
|
# JWT Secret Key for production (should be changed in real deployment)
|
||||||
REDIS_HOST: "redis-cache-prod-master"
|
JWT_SECRET: "prod-phonebill-jwt-secret-key-change-in-production-2024"
|
||||||
REDIS_PASSWORD: "Redis2025Prod!SecurePassword"
|
|
||||||
|
# Redis password for production
|
||||||
|
REDIS_PASSWORD: "prod-redis-password-change-in-production"
|
||||||
|
|
||||||
|
# Database passwords for production
|
||||||
|
DB_PASSWORD: "prod-db-password-change-in-production"
|
||||||
|
|
||||||
|
# External API keys for production
|
||||||
|
EXTERNAL_API_KEY: "prod-external-api-key-change-in-production"
|
||||||
|
|
||||||
|
# Additional production secrets
|
||||||
|
ENCRYPTION_KEY: "prod-encryption-key-change-in-production-32chars"
|
||||||
@ -1,10 +1,13 @@
|
|||||||
apiVersion: v1
|
apiVersion: v1
|
||||||
kind: Secret
|
kind: Secret
|
||||||
metadata:
|
metadata:
|
||||||
name: secret-product-service
|
name: product-service-secret
|
||||||
type: Opaque
|
type: Opaque
|
||||||
stringData:
|
stringData:
|
||||||
DB_HOST: "product-change-postgres-prod-postgresql"
|
# Database connection for product service in production
|
||||||
DB_NAME: "product_change_db"
|
DB_URL: "jdbc:postgresql://product-service-postgres-prod.phonebill-prod.svc.cluster.local:5432/product_change_db"
|
||||||
DB_USERNAME: "product_change_user"
|
DB_USERNAME: "postgres"
|
||||||
DB_PASSWORD: "ProductUser2025Prod!SecurePassword"
|
DB_PASSWORD: "prod-product-service-db-password-change-in-production"
|
||||||
|
|
||||||
|
# Service-specific secrets for production
|
||||||
|
SERVICE_SECRET: "prod-product-service-secret-change-in-production"
|
||||||
@ -1,10 +1,13 @@
|
|||||||
apiVersion: v1
|
apiVersion: v1
|
||||||
kind: Secret
|
kind: Secret
|
||||||
metadata:
|
metadata:
|
||||||
name: secret-user-service
|
name: user-service-secret
|
||||||
type: Opaque
|
type: Opaque
|
||||||
stringData:
|
stringData:
|
||||||
DB_HOST: "auth-postgres-prod-postgresql"
|
# Database connection for user service in production
|
||||||
DB_NAME: "phonebill_auth"
|
DB_URL: "jdbc:postgresql://user-service-postgres-prod.phonebill-prod.svc.cluster.local:5432/auth_db"
|
||||||
DB_USERNAME: "auth_user"
|
DB_USERNAME: "postgres"
|
||||||
DB_PASSWORD: "AuthUser2025Prod!SecurePassword"
|
DB_PASSWORD: "prod-user-service-db-password-change-in-production"
|
||||||
|
|
||||||
|
# Service-specific secrets for production
|
||||||
|
SERVICE_SECRET: "prod-user-service-secret-change-in-production"
|
||||||
@ -3,9 +3,6 @@ kind: ConfigMap
|
|||||||
metadata:
|
metadata:
|
||||||
name: cm-common
|
name: cm-common
|
||||||
data:
|
data:
|
||||||
CORS_ALLOWED_ORIGINS: "https://phonebill-staging.example.com"
|
NAMESPACE: "phonebill-staging"
|
||||||
JWT_ACCESS_TOKEN_VALIDITY: "18000000"
|
|
||||||
JWT_REFRESH_TOKEN_VALIDITY: "86400000"
|
|
||||||
REDIS_PORT: "6379"
|
|
||||||
SPRING_PROFILES_ACTIVE: "staging"
|
SPRING_PROFILES_ACTIVE: "staging"
|
||||||
DDL_AUTO: "validate"
|
DDL_AUTO: "validate"
|
||||||
@ -1,17 +1,18 @@
|
|||||||
apiVersion: apps/v1
|
apiVersion: apps/v1
|
||||||
kind: Deployment
|
kind: Deployment
|
||||||
metadata:
|
metadata:
|
||||||
name: api-gateway
|
name: api-gateway-deployment
|
||||||
spec:
|
spec:
|
||||||
replicas: 1
|
replicas: 2
|
||||||
template:
|
template:
|
||||||
spec:
|
spec:
|
||||||
containers:
|
containers:
|
||||||
- name: api-gateway
|
- name: api-gateway
|
||||||
resources:
|
image: acrdigitalgarage01.azurecr.io/phonebill-api-gateway:staging-latest
|
||||||
requests:
|
resources:
|
||||||
memory: "256Mi"
|
requests:
|
||||||
cpu: "256m"
|
memory: "512Mi"
|
||||||
limits:
|
cpu: "512m"
|
||||||
memory: "1024Mi"
|
limits:
|
||||||
cpu: "1024m"
|
memory: "2048Mi"
|
||||||
|
cpu: "2048m"
|
||||||
@ -1,17 +1,18 @@
|
|||||||
apiVersion: apps/v1
|
apiVersion: apps/v1
|
||||||
kind: Deployment
|
kind: Deployment
|
||||||
metadata:
|
metadata:
|
||||||
name: bill-service
|
name: bill-service-deployment
|
||||||
spec:
|
spec:
|
||||||
replicas: 1
|
replicas: 2
|
||||||
template:
|
template:
|
||||||
spec:
|
spec:
|
||||||
containers:
|
containers:
|
||||||
- name: bill-service
|
- name: bill-service
|
||||||
resources:
|
image: acrdigitalgarage01.azurecr.io/phonebill-bill-service:staging-latest
|
||||||
requests:
|
resources:
|
||||||
memory: "256Mi"
|
requests:
|
||||||
cpu: "256m"
|
memory: "512Mi"
|
||||||
limits:
|
cpu: "512m"
|
||||||
memory: "1024Mi"
|
limits:
|
||||||
cpu: "1024m"
|
memory: "2048Mi"
|
||||||
|
cpu: "2048m"
|
||||||
@ -1,17 +1,18 @@
|
|||||||
apiVersion: apps/v1
|
apiVersion: apps/v1
|
||||||
kind: Deployment
|
kind: Deployment
|
||||||
metadata:
|
metadata:
|
||||||
name: kos-mock
|
name: kos-mock-deployment
|
||||||
spec:
|
spec:
|
||||||
replicas: 1
|
replicas: 2
|
||||||
template:
|
template:
|
||||||
spec:
|
spec:
|
||||||
containers:
|
containers:
|
||||||
- name: kos-mock
|
- name: kos-mock
|
||||||
resources:
|
image: acrdigitalgarage01.azurecr.io/phonebill-kos-mock:staging-latest
|
||||||
requests:
|
resources:
|
||||||
memory: "256Mi"
|
requests:
|
||||||
cpu: "256m"
|
memory: "512Mi"
|
||||||
limits:
|
cpu: "512m"
|
||||||
memory: "1024Mi"
|
limits:
|
||||||
cpu: "1024m"
|
memory: "2048Mi"
|
||||||
|
cpu: "2048m"
|
||||||
@ -1,17 +1,18 @@
|
|||||||
apiVersion: apps/v1
|
apiVersion: apps/v1
|
||||||
kind: Deployment
|
kind: Deployment
|
||||||
metadata:
|
metadata:
|
||||||
name: product-service
|
name: product-service-deployment
|
||||||
spec:
|
spec:
|
||||||
replicas: 1
|
replicas: 2
|
||||||
template:
|
template:
|
||||||
spec:
|
spec:
|
||||||
containers:
|
containers:
|
||||||
- name: product-service
|
- name: product-service
|
||||||
resources:
|
image: acrdigitalgarage01.azurecr.io/phonebill-product-service:staging-latest
|
||||||
requests:
|
resources:
|
||||||
memory: "256Mi"
|
requests:
|
||||||
cpu: "256m"
|
memory: "512Mi"
|
||||||
limits:
|
cpu: "512m"
|
||||||
memory: "1024Mi"
|
limits:
|
||||||
cpu: "1024m"
|
memory: "2048Mi"
|
||||||
|
cpu: "2048m"
|
||||||
@ -1,17 +1,18 @@
|
|||||||
apiVersion: apps/v1
|
apiVersion: apps/v1
|
||||||
kind: Deployment
|
kind: Deployment
|
||||||
metadata:
|
metadata:
|
||||||
name: user-service
|
name: user-service-deployment
|
||||||
spec:
|
spec:
|
||||||
replicas: 1
|
replicas: 2
|
||||||
template:
|
template:
|
||||||
spec:
|
spec:
|
||||||
containers:
|
containers:
|
||||||
- name: user-service
|
- name: user-service
|
||||||
resources:
|
image: acrdigitalgarage01.azurecr.io/phonebill-user-service:staging-latest
|
||||||
requests:
|
resources:
|
||||||
memory: "256Mi"
|
requests:
|
||||||
cpu: "256m"
|
memory: "512Mi"
|
||||||
limits:
|
cpu: "512m"
|
||||||
memory: "1024Mi"
|
limits:
|
||||||
cpu: "1024m"
|
memory: "2048Mi"
|
||||||
|
cpu: "2048m"
|
||||||
@ -1,54 +1,25 @@
|
|||||||
apiVersion: networking.k8s.io/v1
|
apiVersion: networking.k8s.io/v1
|
||||||
kind: Ingress
|
kind: Ingress
|
||||||
metadata:
|
metadata:
|
||||||
name: phonebill
|
name: phonebill-ingress
|
||||||
annotations:
|
annotations:
|
||||||
kubernetes.io/ingress.class: nginx
|
|
||||||
nginx.ingress.kubernetes.io/ssl-redirect: "true"
|
nginx.ingress.kubernetes.io/ssl-redirect: "true"
|
||||||
nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
|
nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
|
||||||
|
nginx.ingress.kubernetes.io/backend-protocol: "HTTP"
|
||||||
cert-manager.io/cluster-issuer: "letsencrypt-prod"
|
cert-manager.io/cluster-issuer: "letsencrypt-prod"
|
||||||
spec:
|
spec:
|
||||||
ingressClassName: nginx
|
|
||||||
tls:
|
tls:
|
||||||
- hosts:
|
- hosts:
|
||||||
- phonebill-staging.example.com
|
- phonebill.staging-domain.com
|
||||||
secretName: phonebill-staging-tls
|
secretName: phonebill-tls-staging
|
||||||
rules:
|
rules:
|
||||||
- host: phonebill-staging.example.com
|
- host: phonebill.staging-domain.com
|
||||||
http:
|
http:
|
||||||
paths:
|
paths:
|
||||||
- path: /api/v1/auth
|
- path: /
|
||||||
pathType: Prefix
|
pathType: Prefix
|
||||||
backend:
|
backend:
|
||||||
service:
|
service:
|
||||||
name: user-service
|
name: api-gateway-service
|
||||||
port:
|
port:
|
||||||
number: 80
|
number: 8080
|
||||||
- path: /api/v1/users
|
|
||||||
pathType: Prefix
|
|
||||||
backend:
|
|
||||||
service:
|
|
||||||
name: user-service
|
|
||||||
port:
|
|
||||||
number: 80
|
|
||||||
- path: /api/v1/bills
|
|
||||||
pathType: Prefix
|
|
||||||
backend:
|
|
||||||
service:
|
|
||||||
name: bill-service
|
|
||||||
port:
|
|
||||||
number: 80
|
|
||||||
- path: /api/v1/products
|
|
||||||
pathType: Prefix
|
|
||||||
backend:
|
|
||||||
service:
|
|
||||||
name: product-service
|
|
||||||
port:
|
|
||||||
number: 80
|
|
||||||
- path: /api/v1/kos
|
|
||||||
pathType: Prefix
|
|
||||||
backend:
|
|
||||||
service:
|
|
||||||
name: kos-mock
|
|
||||||
port:
|
|
||||||
number: 80
|
|
||||||
@ -1,70 +1,68 @@
|
|||||||
apiVersion: kustomize.config.k8s.io/v1beta1
|
apiVersion: kustomize.config.k8s.io/v1beta1
|
||||||
kind: Kustomization
|
kind: Kustomization
|
||||||
|
|
||||||
namespace: phonebill-staging
|
|
||||||
|
|
||||||
resources:
|
resources:
|
||||||
- ../../base
|
- ../../base
|
||||||
|
|
||||||
|
namespace: phonebill-staging
|
||||||
|
|
||||||
patches:
|
patches:
|
||||||
- path: configmap-common-patch.yaml
|
# Common ConfigMap
|
||||||
target:
|
- target:
|
||||||
kind: ConfigMap
|
kind: ConfigMap
|
||||||
name: cm-common
|
name: cm-common
|
||||||
- path: deployment-api-gateway-patch.yaml
|
path: configmap-common-patch.yaml
|
||||||
target:
|
|
||||||
kind: Deployment
|
# Common Secret
|
||||||
name: api-gateway
|
- target:
|
||||||
- path: deployment-user-service-patch.yaml
|
|
||||||
target:
|
|
||||||
kind: Deployment
|
|
||||||
name: user-service
|
|
||||||
- path: deployment-bill-service-patch.yaml
|
|
||||||
target:
|
|
||||||
kind: Deployment
|
|
||||||
name: bill-service
|
|
||||||
- path: deployment-product-service-patch.yaml
|
|
||||||
target:
|
|
||||||
kind: Deployment
|
|
||||||
name: product-service
|
|
||||||
- path: deployment-kos-mock-patch.yaml
|
|
||||||
target:
|
|
||||||
kind: Deployment
|
|
||||||
name: kos-mock
|
|
||||||
- path: ingress-patch.yaml
|
|
||||||
target:
|
|
||||||
kind: Ingress
|
|
||||||
name: phonebill-ingress
|
|
||||||
- path: secret-common-patch.yaml
|
|
||||||
target:
|
|
||||||
kind: Secret
|
kind: Secret
|
||||||
name: secret-common
|
name: secret-common
|
||||||
- path: secret-user-service-patch.yaml
|
path: secret-common-patch.yaml
|
||||||
target:
|
|
||||||
|
# Ingress
|
||||||
|
- target:
|
||||||
|
kind: Ingress
|
||||||
|
name: phonebill-ingress
|
||||||
|
path: ingress-patch.yaml
|
||||||
|
|
||||||
|
# API Gateway
|
||||||
|
- target:
|
||||||
|
kind: Deployment
|
||||||
|
name: api-gateway-deployment
|
||||||
|
path: deployment-api-gateway-patch.yaml
|
||||||
|
|
||||||
|
# User Service
|
||||||
|
- target:
|
||||||
|
kind: Deployment
|
||||||
|
name: user-service-deployment
|
||||||
|
path: deployment-user-service-patch.yaml
|
||||||
|
- target:
|
||||||
kind: Secret
|
kind: Secret
|
||||||
name: secret-user-service
|
name: secret-user-service
|
||||||
- path: secret-bill-service-patch.yaml
|
path: secret-user-service-patch.yaml
|
||||||
target:
|
|
||||||
|
# Bill Service
|
||||||
|
- target:
|
||||||
|
kind: Deployment
|
||||||
|
name: bill-service-deployment
|
||||||
|
path: deployment-bill-service-patch.yaml
|
||||||
|
- target:
|
||||||
kind: Secret
|
kind: Secret
|
||||||
name: secret-bill-service
|
name: secret-bill-service
|
||||||
- path: secret-product-service-patch.yaml
|
path: secret-bill-service-patch.yaml
|
||||||
target:
|
|
||||||
|
# Product Service
|
||||||
|
- target:
|
||||||
|
kind: Deployment
|
||||||
|
name: product-service-deployment
|
||||||
|
path: deployment-product-service-patch.yaml
|
||||||
|
- target:
|
||||||
kind: Secret
|
kind: Secret
|
||||||
name: secret-product-service
|
name: secret-product-service
|
||||||
|
path: secret-product-service-patch.yaml
|
||||||
images:
|
|
||||||
- name: acrdigitalgarage01.azurecr.io/phonebill/api-gateway
|
# KOS Mock
|
||||||
newTag: staging-latest
|
- target:
|
||||||
- name: acrdigitalgarage01.azurecr.io/phonebill/user-service
|
kind: Deployment
|
||||||
newTag: staging-latest
|
name: kos-mock-deployment
|
||||||
- name: acrdigitalgarage01.azurecr.io/phonebill/bill-service
|
path: deployment-kos-mock-patch.yaml
|
||||||
newTag: staging-latest
|
|
||||||
- name: acrdigitalgarage01.azurecr.io/phonebill/product-service
|
|
||||||
newTag: staging-latest
|
|
||||||
- name: acrdigitalgarage01.azurecr.io/phonebill/kos-mock
|
|
||||||
newTag: staging-latest
|
|
||||||
|
|
||||||
namePrefix: staging-
|
|
||||||
|
|
||||||
commonLabels:
|
|
||||||
environment: staging
|
|
||||||
@ -2,9 +2,10 @@ apiVersion: v1
|
|||||||
kind: Secret
|
kind: Secret
|
||||||
metadata:
|
metadata:
|
||||||
name: secret-bill-service
|
name: secret-bill-service
|
||||||
type: Opaque
|
|
||||||
stringData:
|
stringData:
|
||||||
DB_HOST: "bill-inquiry-postgres-staging-postgresql"
|
DB_HOST: "bill-service-postgres-staging.phonebill-staging.svc.cluster.local"
|
||||||
|
DB_PORT: "5432"
|
||||||
DB_NAME: "bill_inquiry_db"
|
DB_NAME: "bill_inquiry_db"
|
||||||
DB_USERNAME: "bill_inquiry_user"
|
DB_USERNAME: "postgres"
|
||||||
DB_PASSWORD: "BillUser2025Staging!"
|
DB_PASSWORD: "staging-bill-service-db-password"
|
||||||
|
KOS_MOCK_URL: "http://kos-mock-service.phonebill-staging.svc.cluster.local:8090"
|
||||||
@ -2,8 +2,9 @@ apiVersion: v1
|
|||||||
kind: Secret
|
kind: Secret
|
||||||
metadata:
|
metadata:
|
||||||
name: secret-common
|
name: secret-common
|
||||||
type: Opaque
|
|
||||||
stringData:
|
stringData:
|
||||||
JWT_SECRET: "nwe5Yo9qaJ6FBD/Thl2/j6/SFAfNwUorAY1ZcWO2KI7uA4bmVLOCPxE9hYuUpRCOkgV2UF2DdHXtqHi3+BU/ecbz2zpHyf/720h48UbA3XOMYOX1sdM+dQ=="
|
JWT_SECRET_KEY: "staging-my-very-secret-key-for-jwt-token-generation-and-validation-that-is-256-bits-long"
|
||||||
REDIS_HOST: "redis-cache-staging-master"
|
JWT_EXPIRATION_TIME: "3600"
|
||||||
REDIS_PASSWORD: "Redis2025Staging!"
|
REDIS_HOST: "phonebill-redis-staging.phonebill-staging.svc.cluster.local"
|
||||||
|
REDIS_PORT: "6379"
|
||||||
|
REDIS_PASSWORD: "staging-redis-password"
|
||||||
@ -2,9 +2,10 @@ apiVersion: v1
|
|||||||
kind: Secret
|
kind: Secret
|
||||||
metadata:
|
metadata:
|
||||||
name: secret-product-service
|
name: secret-product-service
|
||||||
type: Opaque
|
|
||||||
stringData:
|
stringData:
|
||||||
DB_HOST: "product-change-postgres-staging-postgresql"
|
DB_HOST: "product-service-postgres-staging.phonebill-staging.svc.cluster.local"
|
||||||
|
DB_PORT: "5432"
|
||||||
DB_NAME: "product_change_db"
|
DB_NAME: "product_change_db"
|
||||||
DB_USERNAME: "product_change_user"
|
DB_USERNAME: "postgres"
|
||||||
DB_PASSWORD: "ProductUser2025Staging!"
|
DB_PASSWORD: "staging-product-service-db-password"
|
||||||
|
KOS_MOCK_URL: "http://kos-mock-service.phonebill-staging.svc.cluster.local:8090"
|
||||||
@ -2,9 +2,9 @@ apiVersion: v1
|
|||||||
kind: Secret
|
kind: Secret
|
||||||
metadata:
|
metadata:
|
||||||
name: secret-user-service
|
name: secret-user-service
|
||||||
type: Opaque
|
|
||||||
stringData:
|
stringData:
|
||||||
DB_HOST: "auth-postgres-staging-postgresql"
|
DB_HOST: "user-service-postgres-staging.phonebill-staging.svc.cluster.local"
|
||||||
DB_NAME: "phonebill_auth"
|
DB_PORT: "5432"
|
||||||
DB_USERNAME: "auth_user"
|
DB_NAME: "auth_db"
|
||||||
DB_PASSWORD: "AuthUser2025Staging!"
|
DB_USERNAME: "postgres"
|
||||||
|
DB_PASSWORD: "staging-user-service-db-password"
|
||||||
@ -4,34 +4,40 @@ set -e
|
|||||||
ENVIRONMENT=${1:-dev}
|
ENVIRONMENT=${1:-dev}
|
||||||
IMAGE_TAG=${2:-latest}
|
IMAGE_TAG=${2:-latest}
|
||||||
|
|
||||||
echo "🚀 Starting deployment for environment: $ENVIRONMENT with image tag: $IMAGE_TAG"
|
# 서비스 목록
|
||||||
|
SERVICES=("api-gateway" "user-service" "bill-service" "product-service" "kos-mock")
|
||||||
|
|
||||||
|
echo "🚀 Starting deployment to ${ENVIRONMENT} environment..."
|
||||||
|
echo "📦 Image tag: ${ENVIRONMENT}-${IMAGE_TAG}"
|
||||||
|
|
||||||
# 환경별 이미지 태그 업데이트
|
# 환경별 이미지 태그 업데이트
|
||||||
cd deployment/cicd/kustomize/overlays/${ENVIRONMENT}
|
cd deployment/cicd/kustomize/overlays/${ENVIRONMENT}
|
||||||
|
|
||||||
echo "📝 Updating image tags..."
|
|
||||||
# 각 서비스 이미지 태그 업데이트
|
# 각 서비스 이미지 태그 업데이트
|
||||||
kustomize edit set image acrdigitalgarage01.azurecr.io/phonebill/api-gateway:${ENVIRONMENT}-${IMAGE_TAG}
|
echo "🔄 Updating image tags..."
|
||||||
kustomize edit set image acrdigitalgarage01.azurecr.io/phonebill/user-service:${ENVIRONMENT}-${IMAGE_TAG}
|
for service in "${SERVICES[@]}"; do
|
||||||
kustomize edit set image acrdigitalgarage01.azurecr.io/phonebill/bill-service:${ENVIRONMENT}-${IMAGE_TAG}
|
echo " - Updating ${service} to acrdigitalgarage01.azurecr.io/phonebill/${service}:${ENVIRONMENT}-${IMAGE_TAG}"
|
||||||
kustomize edit set image acrdigitalgarage01.azurecr.io/phonebill/product-service:${ENVIRONMENT}-${IMAGE_TAG}
|
kustomize edit set image acrdigitalgarage01.azurecr.io/phonebill/${service}:${ENVIRONMENT}-${IMAGE_TAG}
|
||||||
kustomize edit set image acrdigitalgarage01.azurecr.io/phonebill/kos-mock:${ENVIRONMENT}-${IMAGE_TAG}
|
done
|
||||||
|
|
||||||
echo "📦 Applying manifests to Kubernetes..."
|
|
||||||
# 배포 실행
|
# 배포 실행
|
||||||
|
echo "🎯 Applying Kubernetes manifests..."
|
||||||
kubectl apply -k .
|
kubectl apply -k .
|
||||||
|
|
||||||
echo "⏳ Waiting for deployments to be ready..."
|
|
||||||
# 배포 상태 확인
|
# 배포 상태 확인
|
||||||
kubectl rollout status deployment/${ENVIRONMENT}-api-gateway -n phonebill-${ENVIRONMENT}
|
echo "⏳ Waiting for deployments to be ready..."
|
||||||
kubectl rollout status deployment/${ENVIRONMENT}-user-service -n phonebill-${ENVIRONMENT}
|
for service in "${SERVICES[@]}"; do
|
||||||
kubectl rollout status deployment/${ENVIRONMENT}-bill-service -n phonebill-${ENVIRONMENT}
|
echo " - Checking ${service} deployment status..."
|
||||||
kubectl rollout status deployment/${ENVIRONMENT}-product-service -n phonebill-${ENVIRONMENT}
|
kubectl rollout status deployment/${service} -n phonebill-${ENVIRONMENT} --timeout=300s
|
||||||
kubectl rollout status deployment/${ENVIRONMENT}-kos-mock -n phonebill-${ENVIRONMENT}
|
done
|
||||||
|
|
||||||
echo "🔍 Checking deployment status..."
|
# 최종 상태 확인
|
||||||
|
echo "📋 Final deployment status:"
|
||||||
kubectl get pods -n phonebill-${ENVIRONMENT}
|
kubectl get pods -n phonebill-${ENVIRONMENT}
|
||||||
|
echo ""
|
||||||
kubectl get services -n phonebill-${ENVIRONMENT}
|
kubectl get services -n phonebill-${ENVIRONMENT}
|
||||||
|
echo ""
|
||||||
kubectl get ingress -n phonebill-${ENVIRONMENT}
|
kubectl get ingress -n phonebill-${ENVIRONMENT}
|
||||||
|
|
||||||
echo "✅ Deployment completed successfully!"
|
echo "✅ Deployment to ${ENVIRONMENT} environment completed successfully!"
|
||||||
|
echo "🌐 Access URL: https://$(kubectl get ingress -n phonebill-${ENVIRONMENT} -o jsonpath='{.items[0].spec.rules[0].host}')"
|
||||||
86
deployment/cicd/scripts/validate-cicd-setup.sh
Executable file
86
deployment/cicd/scripts/validate-cicd-setup.sh
Executable file
@ -0,0 +1,86 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
echo "🔍 Jenkins CI/CD 구성 최종 검증 시작..."
|
||||||
|
|
||||||
|
# 1. 파일 개수 확인
|
||||||
|
echo "1. 파일 개수 검증..."
|
||||||
|
OVERLAY_FILES=$(find deployment/cicd/kustomize/overlays -name "*.yaml" | wc -l)
|
||||||
|
if [ $OVERLAY_FILES -eq 36 ]; then
|
||||||
|
echo "✅ Overlay 파일 개수 정상 (36개)"
|
||||||
|
else
|
||||||
|
echo "❌ Overlay 파일 개수 오류 ($OVERLAY_FILES개, 36개여야 함)"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 2. DEV ingress host 검증
|
||||||
|
echo "2. DEV Ingress Host 검증..."
|
||||||
|
BASE_HOST=$(grep "host:" deployment/cicd/kustomize/base/common/ingress.yaml | awk '{print $3}')
|
||||||
|
DEV_HOST=$(grep "host:" deployment/cicd/kustomize/overlays/dev/ingress-patch.yaml | awk '{print $3}')
|
||||||
|
if [ "$BASE_HOST" = "$DEV_HOST" ]; then
|
||||||
|
echo "✅ DEV Ingress Host 정상 ($DEV_HOST)"
|
||||||
|
else
|
||||||
|
echo "❌ DEV Ingress Host 오류 (base: $BASE_HOST, dev: $DEV_HOST)"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 3. Kustomize 빌드 테스트
|
||||||
|
echo "3. Kustomize 빌드 테스트..."
|
||||||
|
for env in dev staging prod; do
|
||||||
|
if kubectl kustomize deployment/cicd/kustomize/overlays/$env > /dev/null 2>&1; then
|
||||||
|
echo "✅ $env 환경 빌드 성공"
|
||||||
|
else
|
||||||
|
echo "❌ $env 환경 빌드 실패"
|
||||||
|
kubectl kustomize deployment/cicd/kustomize/overlays/$env 2>&1 | head -3
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
# 4. Jenkinsfile JDK 버전 확인
|
||||||
|
echo "4. Jenkinsfile JDK 버전 검증..."
|
||||||
|
if grep -q "gradle:jdk21" deployment/cicd/Jenkinsfile; then
|
||||||
|
echo "✅ JDK 21 버전 정상"
|
||||||
|
else
|
||||||
|
echo "❌ JDK 버전 확인 필요"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 5. Secret stringData 사용 확인
|
||||||
|
echo "5. Secret stringData 사용 검증..."
|
||||||
|
if grep -r "stringData:" deployment/cicd/kustomize/overlays/*/secret-*-patch.yaml > /dev/null; then
|
||||||
|
echo "✅ stringData 사용 정상"
|
||||||
|
else
|
||||||
|
echo "❌ stringData 사용 확인 필요"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 6. patches 문법 확인 (patchesStrategicMerge 금지)
|
||||||
|
echo "6. Kustomization patches 문법 검증..."
|
||||||
|
if grep -r "patchesStrategicMerge:" deployment/cicd/kustomize/overlays/*/kustomization.yaml > /dev/null; then
|
||||||
|
echo "❌ 금지된 patchesStrategicMerge 사용 발견"
|
||||||
|
else
|
||||||
|
echo "✅ patches 문법 정상"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 7. 환경별 replicas 설정 확인
|
||||||
|
echo "7. 환경별 replicas 설정 검증..."
|
||||||
|
DEV_REPLICAS=$(grep "replicas:" deployment/cicd/kustomize/overlays/dev/deployment-user-service-patch.yaml | awk '{print $2}')
|
||||||
|
STAGING_REPLICAS=$(grep "replicas:" deployment/cicd/kustomize/overlays/staging/deployment-user-service-patch.yaml | awk '{print $2}')
|
||||||
|
PROD_REPLICAS=$(grep "replicas:" deployment/cicd/kustomize/overlays/prod/deployment-user-service-patch.yaml | awk '{print $2}')
|
||||||
|
|
||||||
|
if [ "$DEV_REPLICAS" = "1" ] && [ "$STAGING_REPLICAS" = "2" ] && [ "$PROD_REPLICAS" = "3" ]; then
|
||||||
|
echo "✅ 환경별 replicas 설정 정상 (dev:1, staging:2, prod:3)"
|
||||||
|
else
|
||||||
|
echo "❌ 환경별 replicas 설정 확인 필요 (dev:$DEV_REPLICAS, staging:$STAGING_REPLICAS, prod:$PROD_REPLICAS)"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 8. 서비스 배열 검증
|
||||||
|
echo "8. Jenkinsfile 서비스 배열 검증..."
|
||||||
|
SERVICES_COUNT=$(grep "def services = \[" deployment/cicd/Jenkinsfile | grep -o "'" | wc -l)
|
||||||
|
if [ $SERVICES_COUNT -eq 10 ]; then # 5개 서비스 * 2 (시작/끝 따옴표)
|
||||||
|
echo "✅ 서비스 배열 정상 (5개 서비스)"
|
||||||
|
else
|
||||||
|
echo "❌ 서비스 배열 확인 필요"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "🎯 검증 완료!"
|
||||||
|
echo ""
|
||||||
|
echo "📋 추가 수동 확인사항:"
|
||||||
|
echo " - Jenkins Credentials 설정 (azure-credentials, acr-credentials, sonarqube-token)"
|
||||||
|
echo " - SonarQube Quality Gate 설정"
|
||||||
|
echo " - 프로덕션 환경 패스워드 변경"
|
||||||
|
echo " - SSL 인증서 설정"
|
||||||
Loading…
x
Reference in New Issue
Block a user