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

תוכנת Distributed Cloud ל-Bare Metal בלבד מאפשרת לפרוס אשכול היברידי במכונות וירטואליות (VM) של OpenStack. הפריסה הזו מאפשרת לכם לשלב את OpenStack Load Balancing as a Service‏ (LBaaS) ואת OpenStack Cloud Provider for Kubernetes כדי לחשוף את שירותי Kubernetes מחוץ לסביבת OpenStack.

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

פריסה לדוגמה

במדריך הזה מופיעה דוגמה לפריסה של אשכול 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 (כתובת IP פרטית)
floating_ip (כתובת IP ציבורית)
משמשת כתחנת עבודה של אדמין: משמשת לפריסת Google Distributed Cloud במכונות האחרות.
abm-cp1 10.200.0.11 מישור הבקרה של האשכול: המארח הזה מריץ את מישור הבקרה של Kubernetes ואת מאזן העומסים.
abm-w1 10.200.0.12 צומת עובד של אשכול: המארח הזה מריץ את עומסי העבודה של Kubernetes.

פריסת Google Distributed Cloud

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

  1. מתקינים את הכלים שצריך ב-VM של תחנת העבודה של האדמין ב-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 במכונה הווירטואלית 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.36.200-gke.118/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.36.200-gke.118
      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 .

הסרת המשאבים

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

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

מה השלב הבא?