פריסת WordPress ב-GKE עם אחסון מתמיד (persistent disk) ו-Cloud SQL

במדריך הזה נסביר איך להגדיר פריסה של WordPress עם עותק יחיד ב-Google Kubernetes Engine ‏ (GKE) באמצעות מסד נתונים של MySQL. במקום להתקין את MySQL, משתמשים ב-Cloud SQL, שמספק גרסה מנוהלת של MySQL. ‫WordPress משתמשת בPersistentVolumes (PV) ובPersistentVolumeClaims (PVC) כדי לאחסן נתונים.

נפח אחסון קבוע (PV) הוא ייצוג של נפח אחסון באשכול שהוקצה על ידי אדמין, או שהוקצה באופן דינמי על ידי Kubernetes, כדי למלא בקשה שבוצעה בבקשת נפח אחסון קבוע (PVC). בקשת PVC היא בקשה לאחסון של סוג אחסון מסוים שנשלחת על ידי משתמש, ואפשר למלא אותה באמצעות PV. נפחים מתמידים (PV) ותביעות לנפחים מתמידים (PVC) הם בלתי תלויים במחזור החיים של Pod, והם שומרים על הנתונים גם אחרי הפעלה מחדש, תזמון מחדש ואפילו מחיקה של Pod. ‫WordPress משתמש ב-Persistent Disk כאחסון לגיבוי של ה-PV.

רקע

‫WordPress הוא כלי לניהול בלוגים שמשתמש במסד נתונים רלציוני כדי לאחסן את המאמרים בבלוג ואת האובייקטים והמטא-נתונים שקשורים אליהם, ובמערכת הקבצים המקומית כדי לאחסן נכסים, כמו תמונות בפוסט בבלוג. במדריך הזה נעשה שימוש בקובץ אימג' של Docker הרשמית של WordPress מ-Docker Hub.

באופן כללי, מערכת קבצים בסיסית של קונטיינר לא מתאימה לאחסון נתונים קבועים. המאגרים שמופעלים ב-GKE הם בדרך כלל ישויות זמניות, ומנהל האשכול יכול למחוק, להוציא או לתזמן מחדש מאגרים שלא זמינים בגלל כשלים בצמתים או מסיבות אחרות. כשצמתים נכשלים, כל הנתונים שנשמרו במערכת קבצי הבסיס של מאגר נתונים הולכים לאיבוד.

שימוש ב-PV שמגובה על ידי Persistent Disk מאפשר לכם לאחסן את נתוני פלטפורמת WordPress מחוץ לקונטיינרים. כך, גם אם מאגרי התגים נמחקים, הנתונים שלהם נשמרים. בשימוש בסוג אחסון (storage class) שמוגדר כברירת מחדל, ה-Persistent Disk (ומכאן גם הנתונים) לא עובר עם ה-Pod אם ה-Pod מתוזמן מחדש לצומת אחר. יש כמה דרכים להעביר את הנתונים, אבל זה לא נושא המדריך הזה. מידע נוסף זמין במאמר בנושא כרכים קבועים עם Persistent Disk.

ב-WordPress נדרש PV לאחסון נתונים. במדריך הזה משתמשים בסוג אחסון שמוגדר כברירת מחדל כדי ליצור באופן דינמי Persistent Disk וליצור PVC לפריסה.

מטרות

  • יוצרים אשכול GKE.
  • יוצרים PV ו-PVC שמגובים על ידי דיסק אחסון מתמיד (persistent disk).
  • יוצרים מכונה של Cloud SQL ל-MySQL.
  • פורסים את WordPress.
  • מגדירים את הבלוג ב-WordPress.

עלויות

במסמך הזה משתמשים ברכיבים הבאים של Google Cloud, והשימוש בהם כרוך בתשלום:

כדי להעריך את ההוצאות בהתאם לתחזית השימוש שלכם, אתם יכולים להיעזר במחשבון העלויות.

משתמשים חדשים של Google Cloud ? יכול להיות שאתם זכאים לתקופת ניסיון בחינם.

כשמסיימים את המשימות שמתוארות במסמך הזה אפשר למחוק את המשאבים שיצרתם כדי להימנע מחיובים נוספים. מידע נוסף זמין בקטע הסרת המשאבים.

לפני שמתחילים

  1. נכנסים לחשבון Google Cloud . אם אתם משתמשים חדשים ב- Google Cloud, צרו חשבון כדי שתוכלו להעריך את הביצועים של המוצרים שלנו בתרחישים מהעולם האמיתי. לקוחות חדשים מקבלים בחינם גם קרדיט בשווי 300$ להרצה, לבדיקה ולפריסה של עומסי העבודה.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  3. Verify 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.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  5. Verify that billing is enabled for your Google Cloud project.

  6. במסוף Google Cloud , מפעילים את Cloud Shell.

    הפעלת Cloud Shell

    בחלק התחתון של Google Cloud המסוף יתחיל סשן של Cloud Shell ותופיע הודעה של שורת הפקודה. Cloud Shell היא סביבת מעטפת שבה ה-CLI של Google Cloud מותקן ומוגדרים ערכים לפרויקט הקיים. הסשן יופעל תוך כמה שניות.

  7. ב-Cloud Shell, מפעילים את GKE ואת Cloud SQL Admin APIs:
    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 (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)
    

    במדריך הזה, יוצרים אובייקטים של Kubernetes באמצעות קובצי מניפסט בפורמט YAML.

יצירת אשכול GKE

יוצרים אשכול של GKE כדי לארח את קונטיינר אפליקציית WordPress.

  • ב-Cloud Shell, יוצרים אשכול GKE בשם persistent-disk-tutorial:

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

    אחרי שיוצרים את האשכול החדש, מתחברים אליו:

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

יצירת PV ו-PVC שמגובים על ידי Persistent Disk

יוצרים PVC בתור האחסון שנדרש ל-WordPress. ב-GKE מותקן משאב StorageClass שמוגדר כברירת מחדל ומאפשר הקצאה דינמית של PVs שמגובים על ידי Persistent Disk. משתמשים בקובץ wordpress-volumeclaim.yaml כדי ליצור את ה-PVC שנדרשים לפריסה.

קובץ המניפסט הזה מתאר PVC שמבקש 200 GB של אחסון. לא הוגדר משאב StorageClass בקובץ, ולכן ה-PVC הזה משתמש במשאב ברירת המחדל StorageClass כדי להקצות PV שמגובה על ידי Persistent Disk.

  1. ב-Cloud Shell, פורסים את קובץ המניפסט:

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

    יכולות לעבור עד עשר שניות עד שה-PV יוקצה על ידי Persistent Disk ועד שהוא ישויך ל-PVC. אפשר לבדוק את הסטטוס באמצעות הפקודה הבאה:

    kubectl get persistentvolumeclaim
    

    הפלט מציג PersistentVolumeClaim עם סטטוס של Pending, כמו בדוגמה הבאה:

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

    ה-PersistentVolumeClaim נשאר במצב Pending עד שתשתמשו בו בהמשך במדריך הזה.

יצירת מכונה של Cloud SQL ל-MySQL

  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. כדי לאפשר לאפליקציית WordPress לגשת למופע MySQL דרך פרוקסי של Cloud SQL, צריך ליצור חשבון שירות:

    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. יוצרים סוד של Kubernetes עבור פרטי הכניסה של MySQL:

    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

השלב הבא הוא פריסת מאגר התגים של WordPress באשכול GKE.

קובץ המניפסט wordpress_cloudsql.yaml מתאר פריסה שיוצרת Pod יחיד שמריץ קונטיינר עם מופע של WordPress. הקונטיינר הזה קורא את משתנה הסביבה WORDPRESS_DB_PASSWORD שמכיל את הסוד cloudsql-db-credentials שיצרתם.

קובץ המניפסט הזה גם מגדיר את מאגר התגים של WordPress לתקשורת עם MySQL דרך Cloud SQL proxy שפועל במאגר התגים של ה-sidecar. ערך כתובת המארח מוגדר במשתנה הסביבה 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
    

    נדרשות כמה דקות לפריסת קובץ המניפסט הזה בזמן שדיסק מתמשך מצורף לצומת החישוב.

  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 חיצונית. כדי לחשוף את אפליקציית WordPress לתעבורת נתונים מהאינטרנט, צריך ליצור ולהגדיר שירות Kubernetes עם מאזן עומסים חיצוני מצורף. במדריך הזה אפשר לקרוא מידע נוסף על חשיפת אפליקציות באמצעות שירותים ב-GKE.

  1. יצירת שירות של type:LoadBalancer:

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

    יצירת מאזן עומסים נמשכת כמה דקות.

  2. צופים בפריסה ומחכים עד שמוקצית ל-Service כתובת 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 בכתובת EXTERNAL_IP של השירות שחושף את מופע WordPress:

    http://external-ip-address
    
  2. בדף WordPress installation (התקנת WordPress), בוחרים שפה ולוחצים על Continue (המשך).

  3. ממלאים את הפרטים בדף Information needed (מידע נדרש) ואז לוחצים על Install WordPress (התקנת WordPress).

  4. יש ללחוץ על התחברות.

  5. מזינים את שם המשתמש והסיסמה שיצרתם קודם.

  6. עכשיו יש לכם אתר בלוג. כדי להיכנס לבלוג, עוברים בדפדפן לכתובת ה-URL הבאה:

    http://external-ip-address
    

הסרת המשאבים

כדי להימנע מחיובים בחשבון Google Cloud בגלל השימוש במשאבים שנעשה במסגרת המדריך הזה, אפשר למחוק את הפרויקט שמכיל את המשאבים, או להשאיר את הפרויקט ולמחוק את המשאבים בנפרד.

מחיקת הפרויקט

  1. במסוף Google Cloud , נכנסים לדף Manage resources.

    כניסה לדף Manage resources

  2. ברשימת הפרויקטים, בוחרים את הפרויקט שרוצים למחוק ולוחצים על Delete.
  3. כדי למחוק את הפרויקט, כותבים את מזהה הפרויקט בתיבת הדו-שיח ולוחצים על Shut down.

מחיקת המשאבים הבודדים

אם השתמשתם בפרויקט קיים ואתם לא רוצים למחוק אותו, אתם יכולים למחוק את המשאבים בנפרד.

  1. מוחקים את השירות:

    kubectl delete service wordpress
    

    מחכים עד שמאזן העומסים שהוקצה לשירות wordpress יימחק. מאזן העומסים נמחק באופן אסינכרוני ברקע.

    צפייה בתהליך המחיקה:

    watch gcloud compute forwarding-rules list
    

    מאזן העומסים נמחק כשמופיע הפלט הבא:

    Listed 0 items.
    
  2. מחיקת הפריסה:

    kubectl delete deployment wordpress
    
  3. מוחקים את ה-PVC של WordPress:

    kubectl delete pvc wordpress-volumeclaim
    

    הפקודה הזו גם מוחקת אוטומטית את ה-PV ואת הדיסק הקבוע.

  4. מחיקת אשכול GKE:

    gcloud container clusters delete $CLUSTER_NAME --location=$REGION
    
  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
    

המאמרים הבאים