238 lines
7.0 KiB
Bash
Executable File
238 lines
7.0 KiB
Bash
Executable File
#!/bin/bash
|
|
# create-imagepullsecret.sh - ACR Image Pull Secret 생성 스크립트
|
|
|
|
set -e
|
|
|
|
# 변수 설정
|
|
ACR_NAME="${1:-acrdigitalgarage03}"
|
|
RESOURCE_GROUP="${2:-rg-digitalgarage-03}"
|
|
SECRET_NAME="${3:-acr-secret}"
|
|
|
|
echo "====================================================="
|
|
echo " ACR Image Pull Secret 생성 (Restaurant API)"
|
|
echo "====================================================="
|
|
|
|
# 사용법 표시 함수
|
|
show_usage() {
|
|
echo "사용법:"
|
|
echo " $0 [ACR_NAME] [RESOURCE_GROUP] [SECRET_NAME]"
|
|
echo ""
|
|
echo "파라미터:"
|
|
echo " ACR_NAME : Azure Container Registry 이름 (필수)"
|
|
echo " RESOURCE_GROUP: Azure 리소스 그룹 (필수)"
|
|
echo " SECRET_NAME : Secret 이름 (기본값: acr-secret)"
|
|
echo ""
|
|
echo "예시:"
|
|
echo " $0 acrdigitalgarage01 rg-digitalgarage-03"
|
|
echo " $0 acrdigitalgarage01 rg-digitalgarage-03 acr-prod-secret"
|
|
echo ""
|
|
}
|
|
|
|
# 파라미터 검증
|
|
if [ "$1" == "--help" ] || [ "$1" == "-h" ]; then
|
|
show_usage
|
|
exit 0
|
|
fi
|
|
|
|
if [ -z "${ACR_NAME}" ] || [ -z "${RESOURCE_GROUP}" ]; then
|
|
echo "❌ ACR_NAME과 RESOURCE_GROUP는 필수 파라미터입니다."
|
|
echo ""
|
|
show_usage
|
|
exit 1
|
|
fi
|
|
|
|
# 필수 도구 확인
|
|
echo "🔧 필수 도구 확인 중..."
|
|
|
|
if ! command -v az &> /dev/null; then
|
|
echo "❌ Azure CLI (az)가 설치되지 않았습니다."
|
|
echo "설치 방법: https://docs.microsoft.com/en-us/cli/azure/install-azure-cli"
|
|
exit 1
|
|
fi
|
|
|
|
if ! command -v kubectl &> /dev/null; then
|
|
echo "❌ kubectl이 설치되지 않았습니다."
|
|
echo "설치 방법: https://kubernetes.io/docs/tasks/tools/"
|
|
exit 1
|
|
fi
|
|
|
|
if ! command -v jq &> /dev/null; then
|
|
echo "❌ jq가 설치되지 않았습니다."
|
|
echo "설치 방법: sudo apt-get install jq"
|
|
exit 1
|
|
fi
|
|
|
|
echo "✅ 필수 도구 확인 완료"
|
|
|
|
# Azure 로그인 확인
|
|
echo ""
|
|
echo "🔐 Azure 로그인 상태 확인 중..."
|
|
|
|
if ! az account show &> /dev/null; then
|
|
echo "❌ Azure에 로그인되지 않았습니다."
|
|
echo "로그인 명령: az login"
|
|
exit 1
|
|
fi
|
|
|
|
CURRENT_SUBSCRIPTION=$(az account show --query name -o tsv)
|
|
echo "✅ Azure 로그인 확인됨"
|
|
echo " 현재 구독: ${CURRENT_SUBSCRIPTION}"
|
|
|
|
# Kubernetes 클러스터 연결 확인
|
|
echo ""
|
|
echo "☸️ Kubernetes 클러스터 연결 확인 중..."
|
|
|
|
if ! kubectl cluster-info &> /dev/null; then
|
|
echo "❌ Kubernetes 클러스터에 연결되지 않았습니다."
|
|
echo "클러스터 연결 방법:"
|
|
echo " az aks get-credentials --resource-group ${RESOURCE_GROUP} --name <AKS_CLUSTER_NAME>"
|
|
exit 1
|
|
fi
|
|
|
|
CURRENT_CONTEXT=$(kubectl config current-context)
|
|
echo "✅ Kubernetes 클러스터 연결 확인됨"
|
|
echo " 현재 컨텍스트: ${CURRENT_CONTEXT}"
|
|
|
|
# ACR 정보 설정
|
|
REGISTRY_URL="${ACR_NAME}.azurecr.io"
|
|
|
|
echo ""
|
|
echo "📋 설정 정보:"
|
|
echo " ACR 이름: ${ACR_NAME}"
|
|
echo " 레지스트리 URL: ${REGISTRY_URL}"
|
|
echo " 리소스 그룹: ${RESOURCE_GROUP}"
|
|
echo " Secret 이름: ${SECRET_NAME}"
|
|
|
|
# ACR 존재 확인
|
|
echo ""
|
|
echo "🏪 ACR 존재 확인 중..."
|
|
|
|
if ! az acr show --name "${ACR_NAME}" --resource-group "${RESOURCE_GROUP}" &> /dev/null; then
|
|
echo "❌ ACR을 찾을 수 없습니다."
|
|
echo "확인 사항:"
|
|
echo " - ACR 이름: ${ACR_NAME}"
|
|
echo " - 리소스 그룹: ${RESOURCE_GROUP}"
|
|
echo " - ACR이 해당 리소스 그룹에 존재하는지 확인"
|
|
exit 1
|
|
fi
|
|
|
|
echo "✅ ACR 존재 확인됨: ${ACR_NAME}"
|
|
|
|
# ACR credential 조회
|
|
echo ""
|
|
echo "🔑 ACR credential 조회 중..."
|
|
|
|
credential_json=$(az acr credential show --name "${ACR_NAME}" --resource-group "${RESOURCE_GROUP}" 2>/dev/null)
|
|
|
|
if [ $? -ne 0 ]; then
|
|
echo "❌ ACR credential 조회 실패"
|
|
echo "확인 사항:"
|
|
echo " - ACR 이름: ${ACR_NAME}"
|
|
echo " - 리소스 그룹: ${RESOURCE_GROUP}"
|
|
echo " - ACR에 대한 권한이 있는지 확인"
|
|
exit 1
|
|
fi
|
|
|
|
# JSON에서 username과 password 추출
|
|
username=$(echo "${credential_json}" | jq -r '.username')
|
|
password=$(echo "${credential_json}" | jq -r '.passwords[0].value')
|
|
|
|
if [ -z "${username}" ] || [ -z "${password}" ] || [ "${username}" == "null" ] || [ "${password}" == "null" ]; then
|
|
echo "❌ ACR credential 파싱 실패"
|
|
echo "credential JSON:"
|
|
echo "${credential_json}"
|
|
exit 1
|
|
fi
|
|
|
|
echo "✅ ACR credential 조회 성공"
|
|
echo " 사용자명: ${username}"
|
|
echo " 비밀번호: ${password:0:10}..."
|
|
|
|
# 기존 Secret 확인 및 삭제
|
|
echo ""
|
|
echo "🔍 기존 Secret 확인 중..."
|
|
|
|
if kubectl get secret "${SECRET_NAME}" &> /dev/null; then
|
|
echo "🗑️ 기존 Secret 삭제 중..."
|
|
kubectl delete secret "${SECRET_NAME}"
|
|
echo "✅ 기존 Secret 삭제 완료"
|
|
else
|
|
echo "✅ 기존 Secret 없음"
|
|
fi
|
|
|
|
# Image Pull Secret 생성
|
|
echo ""
|
|
echo "🔐 Image Pull Secret 생성 중..."
|
|
|
|
kubectl create secret docker-registry "${SECRET_NAME}" \
|
|
--docker-server="${REGISTRY_URL}" \
|
|
--docker-username="${username}" \
|
|
--docker-password="${password}"
|
|
|
|
if [ $? -eq 0 ]; then
|
|
echo "✅ Image Pull Secret 생성 성공!"
|
|
else
|
|
echo "❌ Image Pull Secret 생성 실패"
|
|
exit 1
|
|
fi
|
|
|
|
# Secret 정보 확인
|
|
echo ""
|
|
echo "📊 생성된 Secret 정보:"
|
|
kubectl describe secret "${SECRET_NAME}"
|
|
|
|
echo ""
|
|
echo "🧪 Secret 테스트 중..."
|
|
|
|
# Secret이 올바르게 생성되었는지 확인
|
|
SECRET_TYPE=$(kubectl get secret "${SECRET_NAME}" -o jsonpath='{.type}')
|
|
if [ "${SECRET_TYPE}" = "kubernetes.io/dockerconfigjson" ]; then
|
|
echo "✅ Secret 타입 확인됨: ${SECRET_TYPE}"
|
|
else
|
|
echo "❌ Secret 타입 불일치: ${SECRET_TYPE}"
|
|
fi
|
|
|
|
# Registry URL 확인
|
|
SECRET_REGISTRY=$(kubectl get secret "${SECRET_NAME}" -o jsonpath='{.data.\.dockerconfigjson}' | base64 -d | jq -r ".auths | keys[0]")
|
|
if [ "${SECRET_REGISTRY}" = "${REGISTRY_URL}" ]; then
|
|
echo "✅ Registry URL 확인됨: ${SECRET_REGISTRY}"
|
|
else
|
|
echo "❌ Registry URL 불일치: ${SECRET_REGISTRY}"
|
|
fi
|
|
|
|
echo ""
|
|
echo "🎉 ACR Image Pull Secret 생성 완료!"
|
|
echo ""
|
|
echo "📋 사용 방법:"
|
|
echo ""
|
|
echo "1. Deployment에서 imagePullSecrets 사용:"
|
|
echo " spec:"
|
|
echo " template:"
|
|
echo " spec:"
|
|
echo " imagePullSecrets:"
|
|
echo " - name: ${SECRET_NAME}"
|
|
echo ""
|
|
echo "2. ServiceAccount에 Secret 연결:"
|
|
echo " kubectl patch serviceaccount default -p '{\"imagePullSecrets\": [{\"name\": \"${SECRET_NAME}\"}]}'"
|
|
echo ""
|
|
echo "3. Secret 확인:"
|
|
echo " kubectl get secret ${SECRET_NAME}"
|
|
echo " kubectl describe secret ${SECRET_NAME}"
|
|
echo ""
|
|
echo "4. Secret 삭제 (필요시):"
|
|
echo " kubectl delete secret ${SECRET_NAME}"
|
|
echo ""
|
|
echo "🔧 다음 단계:"
|
|
echo "1. Deployment 매니페스트에 imagePullSecrets 추가"
|
|
echo "2. kubectl apply -f deployment/manifests/deployment.yaml"
|
|
echo "3. Pod 상태 확인: kubectl get pods"
|
|
echo ""
|
|
echo "💡 문제 해결:"
|
|
echo "- ErrImagePull 오류 시: Secret 이름과 레지스트리 URL 확인"
|
|
echo "- 권한 오류 시: ACR에 대한 적절한 권한 확인"
|
|
echo "- 네트워크 오류 시: 클러스터에서 ACR로의 네트워크 연결 확인"
|
|
|
|
echo ""
|
|
echo "✅ Image Pull Secret 설정이 완료되었습니다!"
|
|
|