이 튜토리얼에서는 MySQL 데이터베이스를 사용하여 WordPress에서 단일 복제본 Google Kubernetes Engine(GKE) 배포를 설정하는 방법을 설명합니다. 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 구성요소를 사용합니다.
프로젝트 사용량을 기준으로 예상 비용을 산출하려면 가격 계산기를 사용하세요.
이 문서에 설명된 태스크를 완료했으면 만든 리소스를 삭제하여 청구가 계속되는 것을 방지할 수 있습니다. 자세한 내용은 삭제를 참조하세요.
시작하기 전에
- 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.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
In the Google Cloud console, 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.
- Cloud Shell에서 GKE 및 Cloud SQL Admin API를 사용 설정합니다.
gcloud services enable container.googleapis.com sqladmin.googleapis.com
환경 설정
Cloud Shell에서 Google Cloud CLI의 기본 리전을 설정합니다.
gcloud config set compute/region region
다음을 바꿉니다.
region
: 가장 가까운 리전을 선택합니다. 자세한 내용은 리전 및 영역을 참조하세요.
PROJECT_ID
환경 변수를 Google Cloud 프로젝트 ID(project-id)로 설정합니다.export PROJECT_ID=project-id
GitHub 저장소에서 앱 매니페스트 파일을 다운로드합니다.
git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples
wordpress-persistent-disks
파일이 있는 디렉터리로 변경합니다.cd kubernetes-engine-samples/quickstarts/wordpress-persistent-disks
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를 프로비저닝합니다.
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 인스턴스 만들기
Cloud Shell에서
mysql-wordpress-instance
이라는 인스턴스를 만듭니다.INSTANCE_NAME=mysql-wordpress-instance gcloud sql instances create $INSTANCE_NAME
인스턴스 연결 이름을 환경 변수로 추가합니다.
export INSTANCE_CONNECTION_NAME=$(gcloud sql instances describe $INSTANCE_NAME \ --format='value(connectionName)')
WordPress에 대해 데이터를 저장할 데이터베이스를 만듭니다.
gcloud sql databases create wordpress --instance $INSTANCE_NAME
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 보안 비밀과 데이터베이스 사용자 인증 정보를 저장할 다른 보안 비밀을 만듭니다.
서비스 계정 구성 및 보안 비밀 만들기
Cloud SQL 프록시를 통해 WordPress 앱에서 MySQL 인스턴스에 액세스할 수 있게 하려면 다음과 같이 서비스 계정을 만듭니다.
SA_NAME=cloudsql-proxy gcloud iam service-accounts create $SA_NAME --display-name $SA_NAME
서비스 계정 이메일 주소를 환경 변수로 추가합니다.
SA_EMAIL=$(gcloud iam service-accounts list \ --filter=displayName:$SA_NAME \ --format='value(email)')
서비스 계정에
cloudsql.client
역할을 추가합니다.gcloud projects add-iam-policy-binding $PROJECT_ID \ --role roles/cloudsql.client \ --member serviceAccount:$SA_EMAIL
서비스 계정의 키를 만듭니다.
gcloud iam service-accounts keys create $WORKING_DIR/key.json \ --iam-account $SA_EMAIL
이 명령어는
key.json
파일의 사본을 다운로드합니다.MySQL 사용자 인증 정보용 Kubernetes 보안 비밀을 만듭니다.
kubectl create secret generic cloudsql-db-credentials \ --from-literal username=wordpress \ --from-literal password=$CLOUD_SQL_PASSWORD
서비스 계정 사용자 인증 정보용 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
환경 변수에 설정됩니다.
INSTANCE_CONNECTION_NAME
환경 변수를 바꿔서 파일을 준비합니다.cat $WORKING_DIR/wordpress_cloudsql.yaml.template | envsubst > \ $WORKING_DIR/wordpress_cloudsql.yaml
wordpress_cloudsql.yaml
매니페스트 파일을 배포합니다.kubectl create -f $WORKING_DIR/wordpress_cloudsql.yaml
Persistent Disk가 컴퓨팅 노드에 연결되어 있는 동안 이 매니페스트 파일을 배포하는 데 몇 분 정도 걸립니다.
배포를 확인하여 상태가
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에서 서비스를 사용하여 앱을 노출하는 방법에 대한 자세한 내용은 안내 가이드를 참조하세요.
type:LoadBalancer
의 서비스를 만듭니다.kubectl create -f $WORKING_DIR/wordpress-service.yaml
부하 분산기를 만드는 데 몇 분 정도 걸립니다.
배포를 확인하고 서비스에 외부 IP 주소가 할당될 때까지 기다립니다.
kubectl get svc -l app=wordpress --watch
출력에 외부 IP 주소가 표시되면 다음 단계로 진행할 수 있습니다. 외부 IP는 다음 예시와 다릅니다.
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE wordpress 10.51.243.233 203.0.113.3 80:32418/TCP 1m
나중에 사용할 수 있도록
EXTERNAL_IP
주소 필드를 기록해 둡니다.
WordPress 블로그 설정
이 섹션에서는 WordPress 블로그를 설정합니다.
브라우저에서 다음 URL로 이동합니다. 여기서 external-ip-address를 WordPress 인스턴스를 노출하는 서비스의
EXTERNAL_IP
주소로 바꿉니다.http://external-ip-address
WordPress 설치 페이지에서 언어를 선택한 다음 계속을 클릭합니다.
Information needed(필요한 정보) 페이지를 작성한 다음 Install WordPress(WordPress 설치)를 클릭합니다.
Log In(로그인)을 클릭합니다.
이전에 만든 사용자 이름과 비밀번호를 입력합니다.
이제 블로그 사이트가 생겼습니다. 블로그를 방문하려면 브라우저에서 다음 URL로 이동합니다.
http://external-ip-address
삭제
이 튜토리얼에서 사용된 리소스 비용이 Google Cloud 계정에 청구되지 않도록 하려면 리소스가 포함된 프로젝트를 삭제하거나 프로젝트를 유지하고 개별 리소스를 삭제하세요.
프로젝트 삭제
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
개별 리소스 삭제
기존 프로젝트를 사용한 경우 삭제하지 않으려면 개별 리소스를 삭제합니다.
서비스를 삭제합니다.
kubectl delete service wordpress
wordpress
서비스에 프로비저닝된 부하 분산기가 삭제될 때까지 기다립니다. 백그라운드에서 부하 분산기가 비동기식으로 삭제됩니다.삭제 프로세스를 확인합니다.
watch gcloud compute forwarding-rules list
다음 출력이 표시되면 부하 분산기가 삭제된 것입니다.
Listed 0 items.
배포를 삭제합니다.
kubectl delete deployment wordpress
WordPress용 PVC를 삭제합니다.
kubectl delete pvc wordpress-volumeclaim
이 명령어는 PV 및 Persistent Disk도 자동으로 삭제합니다.
GKE 클러스터를 삭제합니다.
gcloud container clusters delete $CLUSTER_NAME
Cloud SQL 인스턴스를 삭제합니다.
gcloud sql instances delete $INSTANCE_NAME
서비스 계정에서 역할을 삭제합니다.
gcloud projects remove-iam-policy-binding $PROJECT_ID \ --role roles/cloudsql.client \ --member serviceAccount:$SA_EMAIL
서비스 계정을 삭제합니다.
gcloud iam service-accounts delete $SA_EMAIL
다음 단계
- 앱의 정적 IP 및 도메인 이름 구성
다른 Kubernetes Engine 튜토리얼 살펴보기
Google Cloud에 대한 참조 아키텍처, 다이어그램, 권장사항 살펴보기 Cloud 아키텍처 센터를 살펴보세요.