Persistent Disk 및 Cloud SQL로 GKE에서 WordPress 배포


이 튜토리얼에서는 MySQL 데이터베이스를 사용하여 Google Kubernetes Engine(GKE)에서 단일 복제본 WordPress 배포를 설정하는 방법을 설명합니다. MySQL을 설치하는 대신 MySQL의 관리형 버전을 제공하는 Cloud SQL을 사용합니다. WordPress는 PersistentVolumes(PV)PersistentVolumeClaims(PVC)를 사용하여 데이터를 저장합니다.

PV는 PVC에서 작성된 요청을 수행하기 위해 관리자가 프로비저닝하거나 Kubernetes에 의해 동적으로 프로비저닝되는 클러스터의 스토리지 볼륨을 나타냅니다. PVC는 특정 스토리지 클래스의 스토리지에 대한 사용자의 요청으로 PV에서 수행할 수 있습니다. PV 및 PVC는 포드 수명 주기와 별개이며 포드의 다시 시작, 재예약, 삭제를 통해 데이터를 보존합니다. WordPress는 Google Persistent Disk를 PV 지원용 스토리지로 사용합니다.

배경

WordPress는 관계형 데이터베이스를 사용하여 블로그 문서와 관련 객체 및 메타데이터를 저장하고 로컬 파일 시스템을 사용하여 블로그 게시물의 사진과 같은 저작물을 저장하는 블로그 도구입니다. 이 튜토리얼에서는 Docker Hub의 공식 WordPress Docker 이미지를 사용합니다.

일반적으로 컨테이너의 루트 파일 시스템은 영구 데이터를 저장하는 데 적합하지 않습니다. GKE에서 실행하는 컨테이너는 일반적으로 일회용 항목이며, 클러스터 관리자는 노드 오류 또는 기타 원인으로 인해 사용할 수 없게 된 모든 컨테이너를 삭제, 축출 또는 다시 예약해야 합니다. 노드가 실패하면 컨테이너의 루트 파일 시스템에 저장된 모든 데이터가 손실됩니다.

Persistent Disk에서 지원되는 PV를 사용하면 WordPress 플랫폼 데이터를 컨테이너 외부에 저장할 수 있습니다. 이렇게 하면 컨테이너가 삭제되더라도 데이터가 유지됩니다. 기본 스토리지 클래스를 사용하면 포드가 다른 노드로 다시 예약되는 경우 Persistent Disk(및 데이터)가 포드와 함께 이동하지 않습니다. 데이터 이동을 처리하는 방법에는 여러 가지가 있지만 이 튜토리얼에서는 다루지 않습니다. 자세한 내용은 Persistent Disk를 사용한 영구 볼륨을 참조하세요.

WordPress에서는 데이터를 저장하기 위해 PV가 필요합니다. 이 튜토리얼에서는 기본 스토리지 클래스를 사용하여 Persistent Disk를 동적으로 만들고 배포용 PVC를 만듭니다.

목표

  • GKE 클러스터 만들기
  • Persistent Disk에서 지원되는 PV 및 PVC 만들기
  • MySQL용 Cloud SQL 인스턴스 만들기
  • WordPress 배포
  • WordPress 블로그 설정

비용

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

프로젝트 사용량을 기준으로 예상 비용을 산출하려면 가격 계산기를 사용하세요. Google Cloud를 처음 사용하는 사용자는 무료 체험판을 사용할 수 있습니다.

이 문서에 설명된 태스크를 완료했으면 만든 리소스를 삭제하여 청구가 계속되는 것을 방지할 수 있습니다. 자세한 내용은 삭제를 참조하세요.

시작하기 전에

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  5. Make sure that billing is enabled for your Google Cloud project.

  6. In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

  7. Cloud Shell에서 GKE 및 Cloud SQL Admin API를 사용 설정합니다.
    gcloud services enable container.googleapis.com sqladmin.googleapis.com
    

환경 설정

  1. Cloud Shell에서 Google Cloud CLI의 기본 리전을 설정합니다.

    gcloud config set compute/region region
    

    다음을 바꿉니다.

    • region: 가장 가까운 리전을 선택합니다. 자세한 내용은 리전 및 영역을 참조하세요.
  2. PROJECT_ID 환경 변수를 Google Cloud 프로젝트 ID(project-id)로 설정합니다.

    export PROJECT_ID=project-id
    

  3. GitHub 저장소에서 앱 매니페스트 파일을 다운로드합니다.

    git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples
    
  4. wordpress-persistent-disks 파일이 있는 디렉터리로 변경합니다.

    cd kubernetes-engine-samples/quickstarts/wordpress-persistent-disks
    
  5. WORKING_DIR 환경 변수를 설정합니다.

    WORKING_DIR=$(pwd)
    

    이 튜토리얼에서는 YAML 형식의 매니페스트 파일을 사용하여 Kubernetes 객체를 만듭니다.

GKE 클러스터 만들기

WordPress 앱 컨테이너를 호스팅하기 위한 GKE 클러스터를 만듭니다.

  • Cloud Shell에서 persistent-disk-tutorial라는 GKE 클러스터를 만듭니다.

    CLUSTER_NAME=persistent-disk-tutorial
    gcloud container clusters create-auto $CLUSTER_NAME
    

    클러스터를 만든 후 새 클러스터에 연결합니다.

    gcloud container clusters get-credentials $CLUSTER_NAME --region REGION
    

Persistent Disk에서 지원되는 PV 및 PVC 만들기

WordPress에 필요한 스토리지로 PVC를 만듭니다. GKE에는 Persistent Disk에서 지원되는 PV를 동적으로 프로비저닝할 수 있는 기본 StorageClass 리소스가 설치되어 있습니다. wordpress-volumeclaim.yaml 파일을 사용하여 배포에 필요한 PVC를 만듭니다.

이 매니페스트 파일은 200GB의 스토리지를 요청하는 PVC를 설명합니다. 파일에서 StorageClass 리소스가 정의되지 않았으므로 이 PVC는 기본 StorageClass 리소스를 사용하여 Persistent Disk에서 지원되는 PV를 프로비저닝합니다.

  1. Cloud Shell에서 매니페스트 파일을 배포합니다.

    kubectl apply -f $WORKING_DIR/wordpress-volumeclaim.yaml
    

    Persistent Disk에서 지원되는 PV를 프로비저닝하고 PVC에 결합하는 데 최대 10초가 걸릴 수 있습니다. 다음 명령어를 사용하여 상태를 확인할 수 있습니다.

    kubectl get persistentvolumeclaim
    

    출력에 다음과 비슷하게 Pending 상태의 PersistentVolumeClaim이 표시됩니다.

    NAME                    STATUS    VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE
    wordpress-volumeclaim   Pending                                      standard-rwo   5s
    

    이 PersistentVolumeClaim은 이 가이드의 뒷부분에서 사용할 때까지 Pending 상태로 유지됩니다.

MySQL용 Cloud SQL 인스턴스 만들기

  1. Cloud Shell에서 mysql-wordpress-instance이라는 인스턴스를 만듭니다.

    INSTANCE_NAME=mysql-wordpress-instance
    gcloud sql instances create $INSTANCE_NAME
    
  2. 인스턴스 연결 이름을 환경 변수로 추가합니다.

    export INSTANCE_CONNECTION_NAME=$(gcloud sql instances describe $INSTANCE_NAME \
        --format='value(connectionName)')
    
  3. WordPress에 대해 데이터를 저장할 데이터베이스를 만듭니다.

    gcloud sql databases create wordpress --instance $INSTANCE_NAME
    
  4. WordPress에서 인스턴스를 인증할 wordpress라는 데이터베이스 사용자와 비밀번호를 만듭니다.

    CLOUD_SQL_PASSWORD=$(openssl rand -base64 18)
    gcloud sql users create wordpress --host=% --instance $INSTANCE_NAME \
        --password $CLOUD_SQL_PASSWORD
    

    Cloud Shell 세션을 닫으면 비밀번호가 손실됩니다. 비밀번호는 이 튜토리얼의 후반부에 필요하므로 비밀번호를 기록해 둡니다.

새 WordPress 블로그의 데이터베이스 설정이 완료되었습니다.

WordPress 배포

WordPress를 배포하려면 먼저 서비스 계정을 만들어야 합니다. 서비스 계정 사용자 인증 정보를 저장할 Kubernetes 보안 비밀과 데이터베이스 사용자 인증 정보를 저장할 다른 보안 비밀을 만듭니다.

서비스 계정 구성 및 보안 비밀 만들기

  1. Cloud SQL 프록시를 통해 WordPress 앱에서 MySQL 인스턴스에 액세스할 수 있게 하려면 다음과 같이 서비스 계정을 만듭니다.

    SA_NAME=cloudsql-proxy
    gcloud iam service-accounts create $SA_NAME --display-name $SA_NAME
    
  2. 서비스 계정 이메일 주소를 환경 변수로 추가합니다.

    SA_EMAIL=$(gcloud iam service-accounts list \
        --filter=displayName:$SA_NAME \
        --format='value(email)')
    
  3. 서비스 계정에 cloudsql.client 역할을 추가합니다.

    gcloud projects add-iam-policy-binding $PROJECT_ID \
        --role roles/cloudsql.client \
        --member serviceAccount:$SA_EMAIL
    
  4. 서비스 계정의 키를 만듭니다.

    gcloud iam service-accounts keys create $WORKING_DIR/key.json \
        --iam-account $SA_EMAIL
    

    이 명령어는 key.json 파일의 사본을 다운로드합니다.

  5. MySQL 사용자 인증 정보용 Kubernetes 보안 비밀을 만듭니다.

    kubectl create secret generic cloudsql-db-credentials \
        --from-literal username=wordpress \
        --from-literal password=$CLOUD_SQL_PASSWORD
    
  6. 서비스 계정 사용자 인증 정보용 Kubernetes 보안 비밀을 만듭니다.

    kubectl create secret generic cloudsql-instance-credentials \
        --from-file $WORKING_DIR/key.json
    

WordPress 배포

다음 단계는 GKE 클러스터에 WordPress 컨테이너를 배포하는 것입니다.

wordpress_cloudsql.yaml 매니페스트 파일은 WordPress 인스턴스가 있는 컨테이너를 실행하는 단일 포드를 만드는 배포를 설명합니다. 이 컨테이너는 생성된 cloudsql-db-credentials 보안 비밀이 포함된 WORDPRESS_DB_PASSWORD 환경 변수를 읽습니다.

또한 이 매니페스트 파일은 사이드카 컨테이너에서 실행되는 Cloud SQL 프록시를 통해 MySQL과 통신하도록 WordPress 컨테이너를 구성합니다. 호스트 주소 값은 WORDPRESS_DB_HOST 환경 변수에 설정됩니다.

  1. INSTANCE_CONNECTION_NAME 환경 변수를 바꿔서 파일을 준비합니다.

    cat $WORKING_DIR/wordpress_cloudsql.yaml.template | envsubst > \
        $WORKING_DIR/wordpress_cloudsql.yaml
    
  2. wordpress_cloudsql.yaml 매니페스트 파일을 배포합니다.

    kubectl create -f $WORKING_DIR/wordpress_cloudsql.yaml
    

    Persistent Disk가 컴퓨팅 노드에 연결되어 있는 동안 이 매니페스트 파일을 배포하는 데 몇 분 정도 걸립니다.

  3. 배포를 확인하여 상태가 running으로 변경되는지 확인합니다.

    kubectl get pod -l app=wordpress --watch
    

    출력에 Running 상태가 표시되면 다음 단계로 이동할 수 있습니다.

    NAME                     READY     STATUS    RESTARTS   AGE
    wordpress-387015-02xxb   2/2       Running   0          2m47s
    

WordPress 서비스 노출

이전 단계에서 WordPress 컨테이너를 배포했지만 외부 IP 주소가 없으므로 현재 클러스터 외부에서 액세스할 수 없습니다. 연결된 외부 부하 분산기로 Kubernetes 서비스를 만들고 구성하여 WordPress 앱을 인터넷 트래픽에 노출시킬 수 있습니다. GKE에서 서비스를 사용하여 앱을 노출하는 방법에 대한 자세한 내용은 안내 가이드를 참조하세요.

  1. type:LoadBalancer서비스를 만듭니다.

    kubectl create -f $WORKING_DIR/wordpress-service.yaml
    

    부하 분산기를 만드는 데 몇 분 정도 걸립니다.

  2. 배포를 확인하고 서비스에 외부 IP 주소가 할당될 때까지 기다립니다.

    kubectl get svc -l app=wordpress --watch
    
  3. 출력에 외부 IP 주소가 표시되면 다음 단계로 진행할 수 있습니다. 외부 IP는 다음 예시와 다릅니다.

    NAME        CLUSTER-IP      EXTERNAL-IP    PORT(S)        AGE
    wordpress   10.51.243.233   203.0.113.3    80:32418/TCP   1m
    
  4. 나중에 사용할 수 있도록 EXTERNAL_IP 주소 필드를 기록해 둡니다.

WordPress 블로그 설정

이 섹션에서는 WordPress 블로그를 설정합니다.

  1. 브라우저에서 다음 URL로 이동합니다. 여기서 external-ip-address를 WordPress 인스턴스를 노출하는 서비스의 EXTERNAL_IP 주소로 바꿉니다.

    http://external-ip-address
    
  2. WordPress 설치 페이지에서 언어를 선택한 다음 계속을 클릭합니다.

  3. Information needed(필요한 정보) 페이지를 작성한 다음 Install WordPress(WordPress 설치)를 클릭합니다.

  4. Log In(로그인)을 클릭합니다.

  5. 이전에 만든 사용자 이름과 비밀번호를 입력합니다.

  6. 이제 블로그 사이트가 생겼습니다. 블로그를 방문하려면 브라우저에서 다음 URL로 이동합니다.

    http://external-ip-address
    

삭제

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

프로젝트 삭제

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

개별 리소스 삭제

기존 프로젝트를 사용한 경우 삭제하지 않으려면 개별 리소스를 삭제합니다.

  1. 서비스를 삭제합니다.

    kubectl delete service wordpress
    

    wordpress 서비스에 프로비저닝된 부하 분산기가 삭제될 때까지 기다립니다. 백그라운드에서 부하 분산기가 비동기식으로 삭제됩니다.

    삭제 프로세스를 확인합니다.

    watch gcloud compute forwarding-rules list
    

    다음 출력이 표시되면 부하 분산기가 삭제된 것입니다.

    Listed 0 items.
    
  2. 배포를 삭제합니다.

    kubectl delete deployment wordpress
    
  3. WordPress용 PVC를 삭제합니다.

    kubectl delete pvc wordpress-volumeclaim
    

    이 명령어는 PV 및 Persistent Disk도 자동으로 삭제합니다.

  4. GKE 클러스터를 삭제합니다.

    gcloud container clusters delete $CLUSTER_NAME
    
  5. Cloud SQL 인스턴스를 삭제합니다.

    gcloud sql instances delete $INSTANCE_NAME
    
  6. 서비스 계정에서 역할을 삭제합니다.

    gcloud projects remove-iam-policy-binding $PROJECT_ID \
        --role roles/cloudsql.client \
        --member serviceAccount:$SA_EMAIL
    
  7. 서비스 계정을 삭제합니다.

    gcloud iam service-accounts delete $SA_EMAIL
    

다음 단계