این آموزش بر روی راهاندازی یک پیادهسازی WordPress با یک کپی در GKE (Google Kubernetes Engine) با استفاده از یک پایگاه داده MySQL متمرکز است. به جای نصب MySQL، کاربران میتوانند از Cloud SQL استفاده کنند که نسخه مدیریتشده MySQL را ارائه میدهد. WordPress از PersistentVolumeClaims (PVC) و PersistentVolumes (PV) برای ذخیرهسازی دادهها استفاده میکند.
یک PersistentVolume (PV) نمایانگر یک حجم ذخیرهسازی در خوشه است که توسط یک مدیر تأمین میشود یا بهصورت پویا توسط Kubernetes تأمین میشود تا درخواستهای مطرحشده در PersistentVolumeClaims (PVC) را برآورده کند. یک PersistentVolumeClaim (PVC) درخواست ذخیرهسازی از یک کلاس ذخیرهسازی خاص توسط کاربر است که میتواند توسط یک PersistentVolume (PV) برآورده شود. هر دو PVC و PV مستقل از چرخه حیات Pod هستند و دادهها را از طریق برنامهریزی مجدد، راهاندازی مجدد و حتی حذف Pods حفظ میکنند. در Google Kubernetes Engine (GKE)، WordPress از دیسکهای پایدار به عنوان ذخیرهسازی برای پشتیبانی از PersistentVolumes (PV) استفاده میکند.
WordPress یک موتور وبلاگنویسی است که از یک پایگاه داده رابطهای برای ذخیره مقالات وبلاگ و متادیتا و اشیای مرتبط با آنها و از سیستم فایل محلی برای ذخیره داراییها، مانند تصاویر و ویدیوها در یک پست وبلاگ استفاده میکند. در این آموزش، ما از تصویر رسمی Docker WordPress از Docker Hub برای پیادهسازی WordPress استفاده خواهیم کرد.
سیستم فایل ریشه یک کانتینر بهطور کلی برای ذخیره دادههای پایدار مناسب نیست. کانتینرهایی که ما در GKE (Google Kubernetes Engine) اجرا میکنیم، معمولاً موجودیتهای قابل دور انداختن هستند. مدیر خوشه میتواند هر کانتینری را که به دلیل خرابی نود یا دلایل دیگر در دسترس نیست، حذف، حذف یا دوباره برنامهریزی کند. کاربر همچنین تمام دادههای ذخیرهشده در سیستم فایل ریشه یک کانتینر را در صورت خرابی نود از دست خواهد داد.
WordPress به PersistentVolumes (PV) برای ذخیرهسازی دادهها نیاز دارد. استفاده از PVهای پشتیبانیشده توسط دیسک پایدار به کاربر این امکان را میدهد که دادههای پلتفرم خود را خارج از کانتینرها نگه دارد. حتی اگر کانتینرها حذف شوند، دادههای آنها به این ترتیب حفظ خواهد شد. دیسک پایدار کاربر (و در نتیجه دادههای آنها) با Pod آنها جابجا نمیشود اگر Pod به یک نود دیگر با کلاس ذخیرهسازی پیشفرض دوباره برنامهریزی شود. این آموزش از کلاس ذخیرهسازی پیشفرض برای ایجاد یک دیسک پایدار و ایجاد یک PersistentVolumeClaims (PVC) برای پیادهسازی استفاده خواهد کرد.
قبل از شروع
– اگر کاربر جدیدی در Google Cloud است، یک حساب کاربری ایجاد کند.
– در کنسول Google Cloud، به صفحه انتخاب پروژه بروید و یک پروژه Google Cloud انتخاب یا ایجاد کنید.
– اطمینان حاصل کنید که صورتحساب برای پروژه Google Cloud فعال شده باشد.
– در کنسول Google Cloud، Cloud Shell را فعال کنید.
– APIهای Google Kubernetes Engine (GKE) و Cloud SQL Admin را در Cloud Shell فعال کنید:
gcloud services enable container.googleapis.com sqladmin.googleapis.com
راهاندازی محیط
۱. در Cloud Shell، با اجرای دستور زیر، منطقه پیشفرض برای ابزار خط فرمان gcloud را تنظیم کنید:
gcloud config set compute/zone zone
۲. سپس، بخش زیر را با منطقه نزدیک به کاربر جایگزین کنید:
zone:
۳. سپس، متغیر محیطی PROJECT_ID را به شناسه پروژه Google Cloud تنظیم کنید. در دستور زیر، project-id را با شناسه واقعی پروژه Cloud جایگزین کنید:
export PROJECT_ID=project-id
۴. فایلهای مانفیست برنامه را از مخزن GitHub دانلود کنید:
git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples
۵. به دایرکتوری حاوی فایل wordpress-persistent-disks بروید، مانند:
cd kubernetes-engine-samples/wordpress-persistent-disks
۶. در نهایت، متغیر محیطی WORKING_DIR را تنظیم کنید:
WORKING_DIR=$(pwd)
برای این آموزش، ما اشیاء Kubernetes را با استفاده از فایلهای مانفیست در فرمت YAML ایجاد خواهیم کرد.
ایجاد یک خوشه Google Kubernetes Engine (GKE)
برای ایجاد یک خوشه GKE برای میزبانی کانتینر برنامه WordPress کاربر، مراحل زیر را دنبال کنید:
خوشهای (persistent-disk-tutorial) ایجاد کنید که دارای سه نود در Cloud Shell باشد:
CLUSTER_NAME=persistent-disk-tutorial
gcloud container clusters create $CLUSTER_NAME \
--num-nodes=3 --enable-autoupgrade --no-enable-basic-auth \
--no-issue-client-certificate --enable-ip-alias --metadata \
disable-legacy-endpoints=true
ایجاد یک PVC و یک PV پشتیبانیشده توسط دیسک پایدار
یک PersistentVolumeClaims (PVC) به عنوان فضای ذخیرهسازی مورد نیاز برای WordPress ایجاد کنید. Google Kubernetes Engine (GKE) دارای یک منبع StorageClass پیشفرض است که به کاربر اجازه میدهد تا بهصورت پویا PersistentVolume پشتیبانیشده توسط دیسک پایدار را تأمین کند. کاربران میتوانند از فایل wordpress-volumeclaim.yaml برای ایجاد PVCهای مورد نیاز برای پیادهسازی استفاده کنند. این فایل مانفیست یک PersistentVolumeClaims (PVC) را توصیف میکند که درخواست ۲۰۰ گیگابایت فضای ذخیرهسازی را دارد. منبع StorageClass در این فایل تعریف نشده است، بنابراین این PersistentVolumeClaims (PVC) از منبع StorageClass پیشفرض برای تأمین یک PersistentVolume (PV) پشتیبانیشده توسط دیسک پایدار استفاده میکند.
۱. در Cloud Shell، فایل مانفیست را پیادهسازی کنید:
kubectl apply -f $WORKING_DIR/wordpress-volumeclaim.yaml
۲. تأمین PersistentVolume (PV) پشتیبانیشده توسط دیسک پایدار و اتصال آن به PersistentVolumeClaims (PVC) ممکن است تا ده ثانیه طول بکشد. کاربران میتوانند وضعیت را با دستور زیر بررسی کنند:
kubectl get persistentvolumeclaim
۳. زمانی که این فرایند کامل شد، کاربران میتوانند خروجی مشابه زیر را مشاهده کنند:
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
wordpress-volumeclaim Bound pvc-89d49350-3c44-11e8-80a6-42010a800002 200G RWO standard 5s
ایجاد یک CloudSQL برای نمونه MySQL
۱. در 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
پیادهسازی WordPress
پیکربندی یک حساب سرویس و ایجاد رمزهای عبور
۱. برای اینکه برنامه WordPress از طریق یک پروکسی Cloud SQL به نمونه 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 را دانلود خواهد کرد.
۶. سپس، یک رمز Kubernetes برای اعتبارنامههای MySQL با اجرای دستور زیر ایجاد کنید:
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
گام بعدی پیادهسازی کانتینر WordPress در خوشه Google Kubernetes Engine (GKE) است. فایل مانفیست wordpress_cloudsql.yaml یک Deployment را تعریف میکند که یک Pod واحد ایجاد میکند که به اجرای یک کانتینر با نمونه WordPress کمک میکند. این کانتینر ایجاد شده متغیر محیطی WORDPRESS_DB_PASSWORD را میخواند که شامل رمز cloudsql-db-credentials است که کاربر ایجاد کرده است. فایل مانفیست wordpress_cloudsql.yaml همچنین کانتینر WordPress را برای ارتباط با پایگاه داده MySQL از طریق پروکسی Cloud SQL که در کانتینر جانبی اجرا میشود، پیکربندی میکند. کاربران باید مقدار آدرس میزبان را در متغیر محیطی 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
۳. دستور زیر را برای بررسی اینکه آیا وضعیت به “در حال اجرا” تغییر کرده است، اجرا کنید:
kubectl get pod -l app=wordpress --watch
۴. زمانی که خروجی وضعیت زیر را نشان میدهد، کاربران میتوانند به مرحله بعدی بروند.
نام آماده وضعیت راهاندازی مجدد سن
wordpress-387015-02xxb 2/2 در حال اجرا ۰ ۹ ساعت
نمایان کردن سرویس WordPress
۱. ابتدا، یک سرویس از نوع LoadBalancer با اجرای دستور زیر ایجاد کنید. ایجاد یک بار متعادلکننده چند دقیقه طول خواهد کشید:
kubectl create -f $WORKING_DIR/wordpress-service.yaml
۲. سپس، پیادهسازی را زیر نظر داشته باشید و منتظر بمانید تا سرویس یک آدرس IP خارجی اختصاص داده شود:
kubectl get svc -l app=wordpress --watch
۳. زمانی که خروجی یک آدرس IP خارجی را نشان میدهد، کاربران میتوانند به مرحله بعدی بروند. توجه داشته باشید که آدرس IP خارجی کاربر با مثال زیر متفاوت خواهد بود. حتماً فیلد آدرس EXTERNAL_IP را برای استفاده در آینده یادداشت کنید.
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
wordpress 10.51.243.233 203.0.113.3 80:32418/TCP 1m
راهاندازی وبلاگ WordPress
برای راهاندازی وبلاگ WordPress، مراحل زیر را دنبال کنید:
۱. در یک مرورگر، به URL زیر بروید. پارامتر external-ip-address را با آدرس EXTERNAL_IP سرویسی که نمونه WordPress کاربر را نمایان میکند، جایگزین کنید:
http://external-ip-address
۲. در صفحه نصب WordPress، یک زبان را انتخاب کرده و سپس بر روی “ادامه” کلیک کنید.
۳. دستورالعملهای روی صفحه را دنبال کرده و سپس بر روی “نصب WordPress” کلیک کنید.
۴. سپس، بر روی دکمه ورود کلیک کنید.
۵. نام کاربری و رمز عبوری را که کاربر قبلاً ایجاد کرده است، وارد کنید.
۶. کاربران اکنون میتوانند یک سایت وبلاگ داشته باشند. برای بازدید از وبلاگ، به URL زیر در مرورگر بروید:
http://external-ip-address
نتیجهگیری
این آموزش مراحل پیادهسازی و راهاندازی یک پیادهسازی WordPress با یک کپی در Google Kubernetes Engine (GKE) با استفاده از یک پایگاه داده MySQL را ارائه میدهد. امیدواریم این آموزش مفید بوده باشد و در صورت داشتن هرگونه سوال یا پیشنهاد با ما تماس بگیرید.