NFS 스토리지를 사용하여 Google Kubernetes Engine에 IBM Db2 Warehouse 배포

이 가이드에서는 NFS(Network File System) 볼륨을 스토리지 레이어로 사용하여 Google Kubernetes Engine(GKE)에서 IBM Db2 Warehouse 클러스터를 만드는 방법을 보여줍니다. Filestore를 공유 스토리지 솔루션의 NFS 백엔드로 사용합니다. 하지만 다른 클라우드 배포 가능한 NFS 솔루션을 선택할 수도 있습니다.

이 가이드는 시스템 관리자, 개발자, 엔지니어 또는 데이터베이스 관리자가 Google Cloud에 IBM Db2 Warehouse 클러스터를 배포하려는 경우에 유용합니다.

Google Cloud에서의 IBM Db2 Warehouse 및 배포 옵션에 대한 개요는 시리즈 개요를 참조하세요.

이 가이드에서 사용하는 소프트웨어는 다음과 같습니다.

  • Ubuntu-서버 16.04
  • IBM Db2 Warehouse Enterprise Edition
  • IBM Db2 Warehouse Client

목표

  • Docker Store에서 IBM Db2 Warehouse Docker 이미지에 액세스합니다.
  • Filestore 인스턴스를 만듭니다.
  • GKE 클러스터를 실행합니다.
  • 클러스터가 작동하는지 확인합니다.
  • GKE 클러스터에서 Docker Store 인증을 초기화합니다.
  • 클러스터에 NFS-클라이언트 프로비저닝 도구를 배포하고 실행합니다.
  • 클러스터에 IBM Db2 Warehouse 컨테이너를 배포하고 실행합니다.
  • IBM Db2 Warehouse에 샘플 데이터를 업로드합니다.
  • IBM Db2 관리 콘솔에 연결합니다.

비용

이 가이드에서는 비용이 청구될 수 있는 다음과 같은 Google Cloud 구성요소를 사용합니다.

가격 계산기를 사용하면 예상 사용량을 기준으로 예상 비용을 산출할 수 있습니다.

시작하기 전에

  1. Google Cloud 계정에 로그인합니다. Google Cloud를 처음 사용하는 경우 계정을 만들고 Google 제품의 실제 성능을 평가해 보세요. 신규 고객에게는 워크로드를 실행, 테스트, 배포하는 데 사용할 수 있는 $300의 무료 크레딧이 제공됩니다.
  2. Google Cloud Console의 프로젝트 선택기 페이지에서 Google Cloud 프로젝트를 선택하거나 만듭니다.

    프로젝트 선택기로 이동

  3. Cloud 프로젝트에 결제가 사용 설정되어 있는지 확인합니다. 프로젝트에 결제가 사용 설정되어 있는지 확인하는 방법을 알아보세요.

  4. GKE and Filestore API를 사용 설정합니다.

    API 사용 설정

  5. Docker ID가 없으면 Docker Store에서 Docker ID를 만듭니다.

이 가이드에서는 IBM Db2 Warehouse Enterprise Edition을 사용합니다. 이 소프트웨어에 대한 라이선스가 없다면 무료 체험판을 이 가이드에 사용해도 됩니다.

이 가이드를 마치면 만든 리소스를 삭제하여 비용이 계속 청구되지 않게 할 수 있습니다. 자세한 내용은 삭제를 참조하세요.

아키텍처

이 가이드에서는 서로 다른 세 가지 Google Cloud 영역에 GKE를 사용하여 Kubernetes 클러스터를 배포합니다. 클러스터에서 IBM Db2 Warehouse의 인스턴스 세 개를 배포합니다.

  • db2wh-1이라는 인스턴스를 처음에 헤드 노드로 지정합니다.
  • db2wh-2db2wh-3이라는 인스턴스를 처음에 데이터 노드로 지정합니다.

헤드 노드가 장애 조치되면 개별 인스턴스 역할(헤드 또는 데이터 노드)이 바뀔 수 있습니다.

또한 클러스터 노드의 공유 스토리지 역할을 하는 db2wh-data-nfs라는 Filestore 인스턴스를 배포합니다.

아래 다이어그램은 해당 아키텍처를 보여줍니다.

아키텍처

IBM Db2 Warehouse Edition Docker 이미지에 액세스

이 가이드에서는 Docker Store 계정을 사용하여 Docker Store에서 IBM Db2 Warehouse Edition 무료 평가판을 다운로드할 수 있습니다. 이를 위해 개별 이미지 두 개(서버와 클라이언트)를 다운로드합니다.

  1. 브라우저에서 IBM Db2 Warehouse EE Docker 이미지로 이동합니다.

  2. Docker 사용자 이름과 비밀번호를 사용하여 로그인합니다.

  3. 체크아웃으로 이동을 클릭합니다.

  4. 세부정보를 입력합니다.

  5. 약관에 동의하면 오른쪽에 있는 동의함 ...동의 ... 체크박스를 선택합니다.

  6. 콘텐츠 가져오기를 클릭합니다.

    그러면 설정 페이지로 이동합니다. 가이드의 뒷부분에서 해당 단계를 수행할 것이므로, 안내를 따를 필요가 없습니다.

  7. IBM Db2 Warehouse Client 이미지에 대해 위 과정을 반복합니다.

환경 준비

이 가이드에서는 us-central1을 기본 리전으로 us-central1-b를 기본 영역으로 사용합니다. gcloud 명령줄 도구에서 Compute Engine 영역 옵션을 입력하는 시간을 절약하기 위해 리전과 영역을 기본값으로 설정합니다.

이 가이드의 단계는 대부분 Cloud Shell에서 수행됩니다. 또한 Cloud Shell을 열 때 이 가이드와 관련된 GitHub 저장소를 자동으로 복제할 수 있습니다.

  1. Cloud Shell을 엽니다.

    Cloud Shell 열기

  2. 기본 리전 및 영역을 설정합니다.

    gcloud config set compute/region us-central1
    gcloud config set compute/zone us-central1-b
    

Filestore 인스턴스 만들기

다음 단계는 Filestore 데이터베이스 인스턴스를 만드는 것입니다.

  • Cloud Shell에서 Filestore 인스턴스를 만듭니다.

    gcloud beta filestore instances create db2wh-data-nfs \
        --location=us-central1-c \
        --tier=STANDARD \
        --file-share=name="db2whdata",capacity=1TB \
        --network=name="default",reserved-ip-range="10.0.0.0/29"
    

    그러면 1TB 용량의 db2wh-data-nfs라는 표준 등급 Filestore 인스턴스와 db2whdata라는 마운트 지점이 생성됩니다.

GKE 클러스터를 관리하기 위한 서비스 계정 프로비저닝

이 가이드에서는 GKE 클러스터에서 Compute Engine 인스턴스를 관리할 서비스 계정을 만듭니다. GKE 클러스터 노드는 기본 서비스 계정 대신 이 서비스 계정을 사용합니다. 애플리케이션을 실행하는 데 필요한 역할과 액세스 권한으로 서비스 계정을 제한하는 것이 가장 좋습니다.

서비스 계정에 필요한 유일한 역할은 Compute 관리자 역할(roles/compute.admin)입니다. 이 역할은 모든 Compute Engine 리소스를 관리할 수 있는 전체 권한을 제공합니다 GKE 클러스터 노드를 관리하려면 서비스 계정에 이 역할이 필요합니다.

  1. Cloud Shell에서 서비스 계정 이름을 저장할 환경 변수를 만듭니다.

    export GKE_SERVICE_ACCOUNT_NAME=db2dw-gke-service-account
    
  2. 서비스 계정을 만듭니다.

    gcloud iam service-accounts create $GKE_SERVICE_ACCOUNT_NAME \
        --display-name=$GKE_SERVICE_ACCOUNT_NAME
    
  3. 서비스 계정 이메일 계정 이름을 저장할 환경 변수를 만듭니다.

    export GKE_SERVICE_ACCOUNT_EMAIL=$(gcloud iam service-accounts list \
        --format='value(email)' \
        --filter=displayName:"$GKE_SERVICE_ACCOUNT_NAME")
    
  4. compute.admin 역할을 서비스 계정에 결합합니다.

    gcloud projects add-iam-policy-binding \
        $(gcloud config get-value project 2> /dev/null) \
        --member serviceAccount:$GKE_SERVICE_ACCOUNT_EMAIL \
        --role roles/compute.admin
    

GKE 클러스터 준비

이 섹션에서는 GKE 클러스터를 실행하고, 권한을 부여하고, 클러스터 구성을 완료합니다.

GKE 클러스터 실행

이제 GKE 클러스터를 만들고 실행할 수 있습니다.

  • Cloud Shell에서 각 영역에 단일 노드가 있는 리전별 GKE 클러스터를 만듭니다.

    gcloud container clusters create ibm-db2dw-demo \
        --enable-ip-alias \
        --image-type=ubuntu \
        --machine-type=n1-standard-16 \
        --metadata disable-legacy-endpoints=true \
        --node-labels=app=db2wh \
        --node-locations us-central1-a,us-central1-b,us-central1-c \
        --no-enable-basic-auth \
        --no-issue-client-certificate \
        --num-nodes=1 \
        --region us-central1 \
        --service-account=$GKE_SERVICE_ACCOUNT_EMAIL
    

    그러면 ibm-db2dw-demo라는 클러스터가 생성됩니다.

노드 풀(기본 노드 풀) 하나만으로 이 클러스터를 만들기 때문에 이 클러스터의 모든 노드에서 IBM Db2 Warehouse 워크로드를 실행할 수 있습니다. (라벨이 지정된 노드만 IBM Db2 Warehouse Pod를 호스팅할 수 있습니다.) 더 많은 분리를 원하는 경우(예를 들어 IBM Db2 Warehouse 전용 노드를 원하는 경우), 새로운 노드 풀 또는 전용 클러스터를 만들 수 있습니다.

Docker Store 인증 관리

이 가이드에서는 Docker Store 사용자 인증 정보를 저장할 보안 비밀을 만들어 GKE 클러스터가 Docker Store에서 IBM Db2 Warehouse Docker 이미지를 다운로드할 수 있도록 합니다. 자세한 내용은 Kubernetes 문서의 관련 섹션을 참조하세요. 이 접근 방식은 비공개 Docker 레지스트리 인스턴스에도 유효합니다.

  1. Cloud Shell에서 Docker Store(사용할 Docker 레지스트리 인스턴스)에 로그인합니다.

    docker login
    
  2. Docker Store 사용자 인증 정보로 Kubernetes 보안 비밀을 만듭니다.

    kubectl create secret generic dockerstore \
        --type=kubernetes.io/dockerconfigjson \
        --from-file=.dockerconfigjson="$HOME"/.docker/config.json
    

사용자에게 클러스터 관리자 권한 부여

GKE 문서의 설명대로 사용자에게 GKE에서 새 역할을 만들 수 있는 권한을 부여해야 합니다.

  • Cloud Shell에서 사용자에게 새 역할을 만들 수 있는 권한을 부여합니다.

    kubectl create clusterrolebinding cluster-admin-binding \
        --clusterrole cluster-admin \
        --user $(gcloud config list \
        --format 'value(core.account)')
    

NFS-클라이언트 프로비저닝 도구 배포

이 가이드에서는 클러스터에 NFS-클라이언트 프로비저닝 도구를 배포합니다. 이 프로비저닝 도구는 Filestore 인스턴스에서 PersistentVolumeClaims를 뒷받침할 PersistentVolumes를 초기화합니다.

  1. Cloud Shell에서 NFS 리소스를 관리할 서비스 계정을 만듭니다.

    kubectl apply -f solutions-db2wh/nfs/rbac.yaml
    
  2. NFS-클라이언트 프로비저닝 도구를 배포합니다.

    kubectl apply -f solutions-db2wh/nfs/deployment.yaml
    
  3. NFS 볼륨으로 PersistentVolumeClaims를 뒷받침할 StorageClass를 만듭니다.

    kubectl apply -f solutions-db2wh/nfs/class.yaml
    
  4. NFS-클라이언트 프로비저닝 도구 pod가 Running으로 보고될 때까지 기다립니다.

    kubectl get pods --watch
    

    실행 중이면 출력에 Running이 표시됩니다.

    nfs-client-provisioner   1/1       Running   0         10s
    

노드 파일 만들기

이제 각 인스턴스를 부트스트랩하기 위해 IBM Db2 Warehouse가 필요로 하는 구성 파일을 만들 수 있습니다.

  1. Cloud Shell에서 nodes 파일을 만듭니다.

    kubectl get nodes -o=jsonpath="{range \
    .items[?(@.metadata.labels.app=='db2wh')]}\
    {.metadata.name}{':'}{.status.addresses[?(@.type=='InternalIP')]\
    .address}{\"\n\"}{end}" | sed '1s/^/head_node=/' | \
    sed -e '2,$ s/^/data_node=/' > nodes
    
  2. nodes 파일이 포함된 ConfigMap을 만듭니다.

    kubectl create configmap db2wh-nodes --from-file=nodes
    

IBM Db2 Warehouse 포드 배포

이제 IBM Db2 Warehouse를 실행하는 데 필요한 모든 GKE Pod를 만듭니다.

  1. Cloud Shell에서 PersistentVolumeClaim을 만듭니다. PersistentVolumeClaim 객체를 사용하면 클러스터가 PersistentVolume으로 NFS 저장소를 동시에 여러 pod에 마운트할 수 있습니다.

    kubectl apply -f solutions-db2wh/persistent-volume-claim.yaml
    
  2. NFS 볼륨에 있는 nodes 파일을 복사하는 작업을 실행합니다.

    kubectl apply -f solutions-db2wh/nodes-file-deploy-job.yaml
    
  3. nodes 파일 배포 작업이 실행되었는지 확인합니다.

    kubectl get jobs --watch
    

    nodes-configSuccessful로 보고되면 작업이 실행된 것입니다.

    NAME           DESIRED   SUCCESSFUL   AGE
    nodes-config   1         1            19s
    
  4. IBM Db2 Warehouse 관리 콘솔에 액세스할 수 있도록 LoadBalancer 서비스를 배포합니다.

    kubectl apply -f solutions-db2wh/service.yaml
    
  5. db2wh-ext라는 부하 분산기 서비스에 외부 IP 주소가 할당될 때까지 기다립니다.

    kubectl get services --watch
    

    출력에 CLUSTER-IPEXTERNAL-IP에 대한 IP 주소가 있어야 합니다.

    NAME       TYPE         CLUSTER-IP   EXTERNAL-IP  PORT(S)                         AGE
    db2wh-ext  LoadBalancer yy.yy.yy.yy  xx.xx.xx.xx  8443:30973/TCP,50000:30613/TCP  7s
    
  6. StatefulSet를 배포하여 IBM Db2 Warehouse pod를 시작합니다.

    kubectl apply -f solutions-db2wh/statefulset.yaml
    
  7. IBM Db2 Warehouse pod(db2wh-0, db2wh-1, db2wh-2)가 실행 중인지 확인합니다.

    kubectl get pods --watch
    

    이 작업은 몇 분 정도 소요될 수 있습니다.

    모든 pod의 상태가 Running이면 pod가 실행 중인 것입니다.

    db2wh-1   0/1       Running   0         3m
    db2wh-2   0/1       Running   0         3m
    db2wh-0   0/1       Running   0         3m
    
  8. IBM Db2 Warehouse 헤드 노드를 실행 중인 노드의 IP 주소를 저장할 환경 변수를 만듭니다.

    HEAD_NODE_IP=$(grep "head_node" nodes | awk -F ':' '{print $2}')
    
  9. 헤드 노드 포드 이름을 저장할 환경 변수를 만듭니다.

    HEAD_NODE_POD_NAME=$(kubectl get pods \
    --field-selector=status.phase=Running -o=jsonpath="{range \
    .items[?(@.metadata.labels.app=='db2wh')]} \
    {.metadata.name}{':'}{.status.\
    hostIP}{'\n'}{end}" | grep $HEAD_NODE_IP | awk -F ':' '{print $1}')
    
  10. 포드 중 하나의 로그를 점검하여 부트스트랩 프로세스가 문제 없이 실행되고 있는지 확인합니다.

    kubectl exec -it $HEAD_NODE_POD_NAME -- status --check-startup
    

    이 작업에는 40~60 분이 소요될 수 있으며, 그 동안 일부 오류가 감지될 수 있습니다. 이 가이드에서는 이러한 오류를 무시해도 됩니다.

    출력에서 상태가 running successfully로 표시되면 프로세스가 올바르게 실행되고 있는 것입니다.

    HA Management up and running successfully!
    Successfully started IBM Db2 Warehouse service stack!
    
  11. 관리 콘솔 비밀번호를 설정합니다.

    DB2_ADMIN_PASSWORD=$(openssl rand -hex 8)
    kubectl exec -it $HEAD_NODE_POD_NAME -- setpass ${DB2_ADMIN_PASSWORD}
    

배포 테스트

포드 구성을 완료했으므로 이제 배포를 테스트할 수 있습니다.

IBM Db2 Warehouse Client 컨테이너 배포

IBM Db2 Warehouse에 데이터를 업로드하려면 이제 Client 컨테이너를 배포하고 Kubernetes ConfigMap을 사용하여 샘플 데이터를 Client 컨테이너에 매핑합니다.

  1. Cloud Shell에서 샘플 데이터가 포함된 ConfigMap을 만듭니다.

    kubectl create configmap sample-data \
        --from-file=solutions-db2wh/sample-data/nyc-wifi-locs.csv \
        --from-file=solutions-db2wh/sample-data/sample-table.sql
    
  2. IBM Db2 Warehouse Client 컨테이너를 시작할 배포를 만듭니다.

    kubectl apply -f solutions-db2wh/client.yaml
    
  3. IBM Db2 Warehouse Client 포드가 실행 중인지 확인합니다.

    kubectl get pods --watch
    

    이 작업은 몇 분 정도 소요될 수 있습니다.

    상태가 Running으로 표시되면 pod가 실행되고 있는 것입니다.

    db2wh-client-xxxxx-xxxx   1/1       Running   0         3m
    

샘플 데이터 업로드

배포를 테스트하는 데 도움이 되도록 샘플 데이터를 IBM Db2 Warehouse 서버에 업로드합니다.

  1. Cloud Shell에서 이전에 만든 비밀번호를 표시합니다.

    echo $DB2_ADMIN_PASSWORD
    
  2. IBM Db2 Warehouse Client 컨테이너 이름을 저장할 환경 변수를 만듭니다.

    CLIENT_CONTAINER_NAME=$(kubectl get pods -l app=db2wh-client -o=jsonpath='{.items[0].metadata.name}')
    
  3. 클라이언트 컨테이너에서 셸 창을 엽니다.

    kubectl exec -it $CLIENT_CONTAINER_NAME -- cli
    
  4. 비밀번호를 저장할 환경 변수를 만듭니다. 여기서, [PASSWORD]는 이전 단계에서 가져온 비밀번호입니다.

    DB_PASSWORD=[PASSWORD]
    
  5. 데이터베이스 별칭을 저장할 환경 변수를 만듭니다.

    DB_ALIAS=BLUDB
    

    BLUDB는 IBM Db2 Warehouse의 기본 데이터베이스 이름입니다.

  6. 데이터베이스 호스트 이름을 저장할 환경 변수를 만듭니다.

    DB_HOST=db2wh-ext.default.svc.cluster.local
    
  7. 데이터베이스 카탈로그를 설정합니다.

    db_catalog --add $DB_HOST --alias $DB_ALIAS
    
  8. IBM Db2 Warehouse 서버에서 샘플 데이터를 보관할 테이블을 만듭니다.

    dbsql -f /sample-table.sql -d $DB_ALIAS -h $DB_HOST -u bluadmin -W $DB_PASSWORD
    
  9. IBM Db2 Warehouse 서버에 데이터를 업로드합니다.

    dbload -verbose -host $DB_HOST -u bluadmin \
    -pw $DB_PASSWORD -db $DB_ALIAS -schema BLUADMIN \
    -t NYC_FREE_PUBLIC_WIFI -df /nyc-wifi-locs.csv -delim ',' \
    -quotedValue DOUBLE -timeStyle 12HOUR -skipRows 1
    
  10. IBM Db2 Warehouse Client 셸을 닫습니다.

    exit
    

관리 콘솔을 사용하여 데이터 유효성 검사

이제 IBM Db2 Warehouse 관리 콘솔에 연결하여 업로드한 데이터를 확인합니다.

  1. Cloud Shell에서 서비스의 외부 IP 주소를 확인합니다.

    kubectl get svc db2wh-ext
    
  2. 브라우저를 열고 다음 URL로 이동합니다. 여기서 [EXTERNAL_IP]는 이전 단계의 IP 주소입니다.

    https://[EXTERNAL_IP]:8443
    

    보안 경고는 무시해도 됩니다.

  3. 다음 사용자 인증 정보로 로그인합니다.

    • 사용자 이름: bluadmin
    • 비밀번호: (이전 절차에서 만든 비밀번호)
  4. IBM Db2 Warehouse EULA에 동의하면 동의를 클릭합니다.

  5. 왼쪽에서 메뉴를 연 후 관리자 > 테이블을 선택합니다.

    테이블 폴더를 보여주는 IBM Db2 Warehouse 관리 UI

  6. 빠르게 둘러보기 팝업을 닫습니다.

  7. NYC_FREE_PUBLIC_WIFI를 클릭합니다.

    사용 가능한 Wi-Fi 핫스팟 목록

  8. 데이터 배포 탭을 클릭하고 테이블이 채워져 있는지 확인합니다.

    테이블 목록의 데이터 배포 탭

    행이 총 2,871개 표시되며, 이는 전체 데이터세트입니다.

  9. SQL 생성을 클릭합니다.

  10. SELECT 문을 선택합니다.

  11. 확인을 클릭합니다.

    SQL 생성 탭이 열리고 자동으로 생성된 SELECT 문으로 미리 채워집니다.

  12. LIMIT 절을 자동으로 생성된 SELECT 문에 추가하여 결과를 처음 5개 레코드로 제한합니다.

    SELECT "THE_GEOM", "OBJECTID", "BORO", "TYPE", "PROVIDER", "NAME", "LOCATION",
           "LAT", "LON", "X", "Y", "LOCATION_T", "REMARKS", "CITY", "SSID",
           "SOURCEID", "ACTIVATED", "BOROCODE", "BORONAME", "NTACODE", "NTANAME",
           "COUNDIST", "POSTCODE", "BOROCD", "CT2010", "BOROCT2010", "BIN", "BBL", "DOITT_ID"
      FROM "BLUADMIN"."NYC_FREE_PUBLIC_WIFI"
      LIMIT 5;
    
  13. 실행을 클릭한 후 모두 실행을 선택합니다.

    결과 세트 탭에 레코드 목록이 표시됩니다. 이는 샘플 데이터가 성공적으로 업로드되었음을 나타냅니다.

    업로드된 데이터에서 레코드 5개를 보여주는 SQL 문 실행 결과

정리

이 튜토리얼에서 사용된 리소스 비용이 Google Cloud 계정에 청구되지 않도록 하려면 리소스가 포함된 프로젝트를 삭제하거나 프로젝트를 유지하고 개별 리소스를 삭제하세요.

프로젝트 삭제

  1. Cloud Console에서 리소스 관리 페이지로 이동합니다.

    리소스 관리로 이동

  2. 프로젝트 목록에서 삭제할 프로젝트를 선택하고 삭제를 클릭합니다.
  3. 대화상자에서 프로젝트 ID를 입력한 후 종료를 클릭하여 프로젝트를 삭제합니다.

다음 단계