פריסת אשכול ב-OpenStack

במדריך הזה מוסבר איך להתקין דוגמה של Google Distributed Cloud (תוכנה בלבד) על Bare Metal במכונות וירטואליות (VM) של OpenStack עם מערכות הפעלה נתמכות. הפריסה משתמשת בסקריפט כדי לפשט את ההתקנה של אשכול היברידי במכונות וירטואליות של OpenStack. במדריך מוסבר גם על דרך אחת להפעיל איזון עומסים כשירות (LBaaS). אתם יכולים להשתמש ב-OpenStack LBaaS וב-Kubernetes OpenStack Cloud Provider עם Google Distributed Cloud כדי לחשוף את שירותי Kubernetes מחוץ לאשכול OpenStack.

מכונות וירטואליות של OpenStack לא מוקצות באופן אוטומטי ב-Google Distributed Cloud, והקצאת המכונות הווירטואליות לא נכללת בהיקף המדריך הזה. כדי ללמוד על הדרישות של המכונה הווירטואלית ולעיין בדוגמה לפריסה, אפשר לעיין בדוגמה של Terraform ליצירת מכונות וירטואליות של OpenStack.

המדריך מורכב מהקטעים הבאים:

  1. פריסת Google Distributed Cloud

  2. מגדירים את ספק הענן OpenStack ל-Kubernetes באשכול המותקן כדי לשלב עם מאזני העומסים של Octavia

  3. אימות של שילוב ספק שירותי הענן OpenStack עם Kubernetes

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

פריסה לדוגמה

במדריך הזה מוצג פריסה לדוגמה של אשכול Bare Metal ב-OpenStack שמשולב עם OpenStack LBaaS. אתם צריכים להבין את הפקודות ואת ערכי ההגדרות ולהתאים אותם לסביבת OpenStack שלכם. הדיאגרמה הבאה מציגה את ה-Deployment (פריסה) שמתקבל:

‫Google Distributed Cloud מותקן ב-OpenStack.

דרישות מוקדמות

  • ‫OpenStack Ussuri עם LBaaS v2 שנפרס ופועל
  • חשבון שירות להורדת הכלי bmctl
  • מגדירים את המכונות הווירטואליות ואת הרשת ב-OpenStack כמו בדוגמה לפריסה. כדי להקצות הגדרה דומה בסביבת OpenStack, יש לכם את האפשרויות הבאות:
    1. כדי להקצות את המשאבים באופן אוטומטי, משתמשים בסקריפט Terraform הזה.
    2. הקצאת המשאבים באופן ידני.
  • המכונות הווירטואליות הבאות של OpenStack צריכות להיות מוכנות וזמינות דרך SSH:
שם כתובת IP מטרה
abm-ws ‫10.200.0.10 (private IP)
floating_ip (public IP)
משמש כתחנת עבודה לאדמין: משתמשים בו כדי לפרוס את Google Distributed Cloud במכונות האחרות.
abm-cp1 10.200.0.11 רמת הבקרה של האשכול: המארח הזה מריץ את רמת הבקרה של Kubernetes ואת מאזן העומסים.
abm-w1 10.200.0.12 צומת worker באשכול: המארח הזה מפעיל את עומסי העבודה של Kubernetes.

פריסת Google Distributed Cloud

בקטע הזה מוסבר איך לבצע את הפעולות הבאות:

  1. מתקינים את הכלים שצריך במכונה הווירטואלית של תחנת העבודה של האדמין abm-ws.
  2. הגדרת מזהה הפרויקט וחשבון השירות שנדרשים כדי להשלים את הפריסה בצורה מאובטחת
  3. יצירת קובץ תצורת אשכול
  4. יצירת אשכול

התקנת הכלים הדרושים

  1. מאחזרים את כתובת ה-IP הציבורית הצפה של המכונה הווירטואלית abm-ws:

    export OPENSTACK_IPS=$(openstack floating ip list --tags=abm_ws_floatingip -f json)
    export FLOATING_IP=$(jq -c '.[]."Floating IP Address"' <<< $OPENSTACK_IPS | tr -d '"')
    
  2. מוודאים שאפשר להשתמש ב-SSH כדי להתחבר באופן מאובטח למכונה הווירטואלית abm-ws ולהיכנס בתור משתמש root. המשתמש root שהוגדר על ידי סקריפטים של Terraform הוא abm.

    ssh ubuntu@$FLOATING_IP
    sudo -u abm -i
    
  3. מוודאים שאפשר להשתמש ב-SSH כדי להתחבר לצמתים האחרים:

    ssh abm@10.200.0.11 'echo SSH to $HOSTNAME succeeded'
    ssh abm@10.200.0.12 'echo SSH to $HOSTNAME succeeded'
    

    התגובות הצפויות לפקודות הקודמות הן:

    SSH to abm-cp1 succeeded
    SSH to abm-w1 succeeded
    
  4. מורידים את כלי שורת הפקודה kubectl במכונת ה-VM‏ abm-ws.

    curl -LO "https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl"
    chmod +x kubectl
    sudo mv kubectl /usr/local/sbin/
    
  5. מתקינים את Docker במכונה הווירטואלית abm-ws:

    curl -fsSL https://get.docker.com -o get-docker.sh
    sh get-docker.sh
    sudo usermod -aG docker abm
    newgrp docker
    

הגדרת Google Cloud הפרויקט וחשבון השירות

  1. מקבלים פרטי גישה ל-Google Cloud CLI עבור חשבון המשתמש.

    פרטי הכניסה האלה משמשים עם פקודות gcloud עוקבות.

    gcloud auth login
    
  2. מוודאים ש-Google Cloud CLI מוגדר לשימוש בפרויקט Google Cloud שבו רוצים לרשום את האשכול.

    gcloud config set project PROJECT_ID
    
  3. מגדירים את Application Default Credentials (ADC) לחשבון המשתמש בתחנת העבודה של האדמין. הפוליגון הזה ישמש כשמשתמשים בכלי bmctl ליצירת אשכול.

    gcloud auth application-default login
    
  4. יוצרים את חשבון השירות bm-gcr. משתמשים בחשבון השירות הזה כדי לבצע אימות מהאשכול.

    gcloud iam service-accounts create bm-gcr
    gcloud iam service-accounts keys create bm-gcr.json \
        --iam-account=bm-gcr@PROJECT_ID.iam.gserviceaccount.com
    
  5. מפעילים את ממשקי ה-API הנדרשים:

    gcloud services enable \
        anthos.googleapis.com \
        anthosaudit.googleapis.com \
        anthosgke.googleapis.com \
        cloudresourcemanager.googleapis.com \
        connectgateway.googleapis.com \
        container.googleapis.com \
        gkeconnect.googleapis.com \
        gkehub.googleapis.com \
        gkeonprem.googleapis.com \
        iam.googleapis.com \
        logging.googleapis.com \
        monitoring.googleapis.com \
        opsconfigmonitoring.googleapis.com \
        serviceusage.googleapis.com \
        stackdriver.googleapis.com \
        storage.googleapis.com
    
  6. נותנים הרשאות נוספות לחשבון השירות bm-gcr. הוספת ההרשאות מאפשרת לכם לא ליצור כמה חשבונות שירות לשירותים שונים.

    gcloud projects add-iam-policy-binding PROJECT_ID \
      --member="serviceAccount:bm-gcr@PROJECT_ID.iam.gserviceaccount.com" \
      --role="roles/gkehub.connect"
    
    gcloud projects add-iam-policy-binding PROJECT_ID \
      --member="serviceAccount:bm-gcr@PROJECT_ID.iam.gserviceaccount.com" \
      --role="roles/gkehub.admin"
    
    gcloud projects add-iam-policy-binding PROJECT_ID \
      --member="serviceAccount:bm-gcr@PROJECT_ID.iam.gserviceaccount.com" \
      --role="roles/logging.logWriter"
    
    gcloud projects add-iam-policy-binding PROJECT_ID \
      --member="serviceAccount:bm-gcr@PROJECT_ID.iam.gserviceaccount.com" \
      --role="roles/monitoring.metricWriter"
    
    gcloud projects add-iam-policy-binding PROJECT_ID \
      --member="serviceAccount:bm-gcr@PROJECT_ID.iam.gserviceaccount.com" \
      --role="roles/monitoring.dashboardEditor"
    
    gcloud projects add-iam-policy-binding PROJECT_ID \
      --member="serviceAccount:bm-gcr@PROJECT_ID.iam.gserviceaccount.com" \
      --role="roles/stackdriver.resourceMetadata.writer"
    
    gcloud projects add-iam-policy-binding PROJECT_ID \
      --member="serviceAccount:bm-gcr@PROJECT_ID.iam.gserviceaccount.com" \
      --role="roles/opsconfigmonitoring.resourceMetadata.writer"
    

יצירת קובץ תצורה של אשכול

  1. מורידים את כלי שורת הפקודה bmctl.

    mkdir baremetal && cd baremetal
    gcloud storage cp gs://anthos-baremetal-release/bmctl/1.34.100-gke.93/linux-amd64/bmctl .
    chmod a+x bmctl
    sudo mv bmctl /usr/local/sbin/
    
  2. יוצרים קובץ תצורה של האשכול:

    bmctl create config -c CLUSTER_NAME
    
  3. מעדכנים את קובץ התצורה לשימוש ב-OpenStack:

    cat > bmctl-workspace/CLUSTER_NAME/CLUSTER_NAME.yaml << EOB
    ---
    gcrKeyPath: /home/abm/bm-gcr.json
    sshPrivateKeyPath: /home/abm/.ssh/id_rsa
    gkeConnectAgentServiceAccountKeyPath: /home/abm/bm-gcr.json
    gkeConnectRegisterServiceAccountKeyPath: /home/abm/bm-gcr.json
    cloudOperationsServiceAccountKeyPath: /home/abm/bm-gcr.json
    ---
    apiVersion: v1
    kind: Namespace
    metadata:
      name: openstack-cluster-ns
    ---
    apiVersion: baremetal.cluster.gke.io/v1
    kind: Cluster
    metadata:
      name: CLUSTER_NAME
      namespace: openstack-cluster-ns
      annotations:
        baremetal.cluster.gke.io/external-cloud-provider: "true"
    spec:
      type: hybrid
      anthosBareMetalVersion: 1.34.100-gke.93
      gkeConnect:
        projectID: PROJECT_ID
      controlPlane:
        nodePoolSpec:
          clusterName: CLUSTER_NAME
          nodes:
          - address: 10.200.0.11
      clusterNetwork:
        pods:
          cidrBlocks:
          - 192.168.0.0/16
        services:
          cidrBlocks:
          - 10.96.0.0/20
      loadBalancer:
        mode: manual
        ports:
          controlPlaneLBPort: 443
        vips:
          controlPlaneVIP: 10.200.0.101
          ingressVIP: 10.200.0.102
      clusterOperations:
        location: us-central1
        projectID: PROJECT_ID
      storage:
        lvpNodeMounts:
          path: /mnt/localpv-disk
          storageClassName: node-disk
        lvpShare:
          numPVUnderSharedPath: 5
          path: /mnt/localpv-share
          storageClassName: standard
      nodeAccess:
        loginUser: abm
    
    ---
    apiVersion: baremetal.cluster.gke.io/v1
    kind: NodePool
    metadata:
      name: node-pool-1
      namespace: openstack-cluster-ns
    spec:
      clusterName: CLUSTER_NAME
      nodes:
      - address: 10.200.0.12
    EOB
    

יצירת האשכול

  1. יוצרים את האשכול:

    bmctl create cluster -c CLUSTER_NAME
    

הפעלת הפקודה bmctl מתחילה את ההגדרה של אשכול היברידי חדש. הפעולה הזו כוללת ביצוע בדיקות קדם-הפעלה בצמתים, יצירת אשכולות של אדמינים ומשתמשים וגם רישום האשכול ב- Google Cloud באמצעות Connect Agent. תהליך ההגדרה כולו יכול להימשך עד 15 דקות. במהלך יצירת האשכול, הפלט הבא מוצג:

Please check the logs at bmctl-workspace/CLUSTER_NAME/log/create-cluster-20210926-020741/create-cluster.log
[2021-09-26 02:07:59+0000] Creating bootstrap cluster...  kind get kubeconfig --name bmctl > ~/.kube/config && k get pods --all-namespaces
[2021-09-26 02:07:59+0000] Creating bootstrap cluster... OK
[2021-09-26 02:10:48+0000] Installing dependency components... OK
[2021-09-26 02:13:42+0000] Waiting for preflight check job to finish... OK
[2021-09-26 02:15:22+0000] - Validation Category: machines and network
[2021-09-26 02:15:22+0000]  - [PASSED] gcp
[2021-09-26 02:15:22+0000]  - [PASSED] node-network
[2021-09-26 02:15:22+0000]  - [PASSED] 10.200.0.11
[2021-09-26 02:15:22+0000]  - [PASSED] 10.200.0.11-gcp
[2021-09-26 02:15:22+0000]  - [PASSED] 10.200.0.12
[2021-09-26 02:15:22+0000]  - [PASSED] 10.200.0.12-gcp
[2021-09-26 02:15:22+0000] Flushing logs... OK
[2021-09-26 02:15:23+0000] Applying resources for new cluster
[2021-09-26 02:15:24+0000] Waiting for cluster to become ready OK
[2021-09-26 02:25:04+0000] Writing kubeconfig file
[2021-09-26 02:25:04+0000] kubeconfig of created cluster is at bmctl-workspace/CLUSTER_NAME/CLUSTER_NAME-kubeconfig, please run
[2021-09-26 02:25:04+0000] kubectl --kubeconfig bmctl-workspace/CLUSTER_NAME/CLUSTER_NAME-kubeconfig get nodes
[2021-09-26 02:25:04+0000] to get cluster node status.
[2021-09-26 02:25:04+0000] Please restrict access to this file as it contains authentication credentials of your cluster.
[2021-09-26 02:25:04+0000] Waiting for node pools to become ready OK
[2021-09-26 02:25:24+0000] Moving admin cluster resources to the created admin cluster
[2021-09-26 02:25:53+0000] Flushing logs... OK
[2021-09-26 02:25:53+0000] Deleting bootstrap cluster...

אימות ואינטראקציה עם האשכול

אפשר למצוא את קובץ kubeconfig של האשכול במכונה הווירטואלית abm-ws בתוך הספרייה bmctl-workspace. כדי לאמת את הפריסה, מבצעים את השלבים הבאים:

  1. מגדירים את משתנה הסביבה KUBECONFIG עם הנתיב לקובץ התצורה של האשכול כדי להריץ פקודות kubectl באשכול:

    export KUBECONFIG=$HOME/bmctl-workspace/CLUSTER_NAME/CLUSTER_NAME-kubeconfig
    kubectl get nodes
    

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

    NAME      STATUS   ROLES                  AGE     VERSION
    abm-cp1   Ready    control-plane,master   5m24s   v1.20.5-gke.1301
    abm-w1    Ready    <none>                 2m17s   v1.20.5-gke.1301
    

כניסה לאשכול מ Google Cloud המסוף

כדי לצפות בעומסי העבודה במסוף Google Cloud , צריך להיכנס לאשכול. הוראות ומידע נוסף על כניסה לאשכול זמינים במאמר בנושא עבודה עם אשכולות במסוף. Google Cloud

הסרת המשאבים

כדי לנקות את האשכול, מריצים את הפקודה הבאה במכונת ה-VM של תחנת העבודה לאדמין (abm-ws):

export KUBECONFIG=$HOME/bmctl-workspace/CLUSTER_NAME/CLUSTER_NAME-kubeconfig
bmctl reset --cluster CLUSTER_NAME

מה השלב הבא?