הגדרה של Elastic Stack ב-GKE

במדריך הזה נסביר איך להריץ את Elastic Stack ב-GKE באמצעות האופרטור Elastic Cloud on Kubernetes ‏ (ECK).

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

המדריך הזה מיועד לאדמינים של Kubernetes או למהנדסי מהימנות אתרים.

מטרות

  • יוצרים אשכול GKE.
  • פורסים את אופרטור ECK.
  • הגדרת אשכולות של Elasticsearch ו-Kibana באמצעות אופרטור ECK.
  • פריסת Elastic Stack מלא באמצעות ECK operator.
  • התאמה אוטומטית של העומס באשכולות Elasticsearch ושדרוג הפריסה של Elastic Stack.
  • שימוש ב-Elastic Stack כדי לנטר סביבות Kubernetes.

עלויות

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

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

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

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

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

  1. נכנסים לחשבון Google Cloud . אם אתם משתמשים חדשים ב- Google Cloud, צרו חשבון כדי שתוכלו להעריך את הביצועים של המוצרים שלנו בתרחישים מהעולם האמיתי. לקוחות חדשים מקבלים בחינם גם קרדיט בשווי 300$ להרצה, לבדיקה ולפריסה של עומסי העבודה.
  2. התקינו את ה-CLI של Google Cloud.

  3. אם אתם משתמשים בספק זהויות חיצוני (IdP), קודם אתם צריכים להיכנס ל-CLI של gcloud באמצעות המאגר המאוחד לניהול זהויות.

  4. כדי לאתחל את ה-CLI של gcloud, הריצו את הפקודה הבאה:

    gcloud init
  5. יוצרים או בוחרים Google Cloud פרויקט.

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

    • Select a project: כדי לבחור פרויקט לא צריך תפקיד IAM ספציפי – אפשר לבחור כל פרויקט שקיבלתם בו תפקיד.
    • יצירת פרויקט: כדי ליצור פרויקט, צריך את התפקיד Project Creator (יצירת פרויקטים) (roles/resourcemanager.projectCreator), שכולל את ההרשאה resourcemanager.projects.create. איך מקצים תפקידים
    • יוצרים Google Cloud פרויקט:

      gcloud projects create PROJECT_ID

      מחליפים את PROJECT_ID בשם של פרויקט Google Cloud שיוצרים.

    • בוחרים את הפרויקט שיצרתם: Google Cloud

      gcloud config set project PROJECT_ID

      מחליפים את PROJECT_ID בשם הפרויקט ב- Google Cloud .

  6. מוודאים שהחיוב מופעל בפרויקט Google Cloud .

  7. מפעילים את GKE API:

    תפקידים שנדרשים להפעלת ממשקי API

    כדי להפעיל ממשקי API, צריך את תפקיד ה-IAM 'אדמין של Service Usage' (roles/serviceusage.serviceUsageAdmin), שכולל את ההרשאה serviceusage.services.enable. איך מקצים תפקידים

    gcloud services enable container.googleapis.com
  8. התקינו את ה-CLI של Google Cloud.

  9. אם אתם משתמשים בספק זהויות חיצוני (IdP), קודם אתם צריכים להיכנס ל-CLI של gcloud באמצעות המאגר המאוחד לניהול זהויות.

  10. כדי לאתחל את ה-CLI של gcloud, הריצו את הפקודה הבאה:

    gcloud init
  11. יוצרים או בוחרים Google Cloud פרויקט.

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

    • Select a project: כדי לבחור פרויקט לא צריך תפקיד IAM ספציפי – אפשר לבחור כל פרויקט שקיבלתם בו תפקיד.
    • יצירת פרויקט: כדי ליצור פרויקט, צריך את התפקיד Project Creator (יצירת פרויקטים) (roles/resourcemanager.projectCreator), שכולל את ההרשאה resourcemanager.projects.create. איך מקצים תפקידים
    • יוצרים Google Cloud פרויקט:

      gcloud projects create PROJECT_ID

      מחליפים את PROJECT_ID בשם של פרויקט Google Cloud שיוצרים.

    • בוחרים את הפרויקט שיצרתם: Google Cloud

      gcloud config set project PROJECT_ID

      מחליפים את PROJECT_ID בשם הפרויקט ב- Google Cloud .

  12. מוודאים שהחיוב מופעל בפרויקט Google Cloud .

  13. מפעילים את GKE API:

    תפקידים שנדרשים להפעלת ממשקי API

    כדי להפעיל ממשקי API, צריך את תפקיד ה-IAM 'אדמין של Service Usage' (roles/serviceusage.serviceUsageAdmin), שכולל את ההרשאה serviceusage.services.enable. איך מקצים תפקידים

    gcloud services enable container.googleapis.com
  14. מעניקים תפקידים לחשבון המשתמש. מריצים את הפקודה הבאה לכל אחד מהתפקידים הבאים ב-IAM: roles/container.clusterAdmin

    gcloud projects add-iam-policy-binding PROJECT_ID --member="user:USER_IDENTIFIER" --role=ROLE

    מחליפים את מה שכתוב בשדות הבאים:

    • PROJECT_ID: מזהה הפרויקט.
    • USER_IDENTIFIER: המזהה של חשבון המשתמש . לדוגמה, myemail@example.com.
    • ROLE: תפקיד ה-IAM שאתם מקצים לחשבון המשתמש.
  • אתם חייבים להיות הבעלים של שם דומיין. שם הדומיין לא יכול להיות ארוך מ-63 תווים. אתם יכולים להשתמש ב-Cloud Domains או ברשם אחר.

הכנת הסביבה

במדריך הזה תשתמשו ב-Cloud Shell כדי לנהל משאבים שמתארחים ב- Google Cloud. ב-Cloud Shell מותקנת מראש התוכנה שדרושה למדריך הזה, כולל kubectl,‏ Helm ו-gcloud CLI.

כדי להגדיר את הסביבה באמצעות Cloud Shell:

  1. מפעילים סשן של Cloud Shell מGoogle Cloud המסוף על ידי לחיצה על Activate Cloud Shell סמל ההפעלה של Cloud Shell. Google Cloud ייפתח סשן בחלונית התחתונה של מסוף Google Cloud .

  2. מוסיפים מאגר תרשימי Helm ומעדכנים אותו:

    helm repo add elastic https://helm.elastic.co
    helm repo update
    
  3. משכפלים את המאגר ב-GitHub:

    git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples.git
    
  4. עוברים לספריית העבודה:

    cd kubernetes-engine-samples/observability/elastic-stack-tutorial
    

יצירת אשכול GKE

יצירת אשכול GKE עם הפעלה של איסוף מדדים ממישור הבקרה:

gcloud container clusters create-auto elk-stack \
    --location="us-central1" \
    --monitoring="SYSTEM,WORKLOAD,API_SERVER,SCHEDULER,CONTROLLER_MANAGER"

פריסת אופרטור ECK

‫Elastic Cloud on Kubernetes ‏ (ECK) היא פלטפורמה לפריסה ולניהול של Elastic Stack באשכולות Kubernetes.

‫ECK מבצע אוטומציה של הפריסה והניהול של אשכולות Elastic Stack, וכך מפשט את תהליך ההגדרה והתחזוקה של Elastic Stack ב-Kubernetes. הוא מספק קבוצה של משאבים מותאמים אישית של Kubernetes שבהם אפשר להשתמש כדי ליצור ולהגדיר את Elasticsearch,‏ Kibana,‏ שרת ניהול ביצועי אפליקציות ורכיבים אחרים של Elastic Stack ב-Kubernetes. כך מפתחים וצוותי DevOps יכולים להגדיר ולנהל אשכולות של Elastic Stack בהיקף גדול.

‫ECK תומך בכמה צמתי Elasticsearch, במעבר אוטומטי של אפליקציות במקרה של כשל, בשדרוגים חלקים ובהצפנת SSL. ‫ECK כולל גם תכונות שמאפשרות לכם לעקוב אחרי הביצועים של Elasticsearch ולפתור בעיות שקשורות אליהם.

  1. מתקינים את תרשים ה-Helm של ECK:

    helm upgrade --install "elastic-operator" "elastic/eck-operator" \
        --version="2.8.0" \
        --create-namespace \
        --namespace="elastic-system" \
        --set="resources.limits.cpu=250m" \
        --set="resources.limits.memory=512Mi" \
        --set="resources.limits.ephemeral-storage=1Gi" \
        --set="resources.requests.cpu=250m" \
        --set="resources.requests.memory=512Mi" \
        --set="resources.requests.ephemeral-storage=1Gi"
    
  2. ממתינים עד שהנציג יהיה מוכן:

    watch kubectl get pods -n elastic-system
    

    הפלט אמור להיראות כך:

    NAME                 READY   STATUS    RESTARTS   AGE
    elastic-operator-0   1/1     Running   0          31s
    

    אם האופרטור STATUS הוא Running, חוזרים לשורת הפקודה על ידי לחיצה על Ctrl+C.

הגדרת Elastic Stack באמצעות ECK

אם משתמשים ב-Elastic Stack עם Elasticsearch,‏ Kibana ו-Elastic Agent שפועלים במצב Fleet, אפשר להגדיר פתרון יעיל, ניתן להתאמה לעומס ומנוהל באופן מלא לניהול נתונים ולהצגתם באופן חזותי באמצעות Kibana.

‫Kibana הוא כלי קוד פתוח לניתוח נתונים ולהמחשה חזותית שלהם, שמאפשר לכם לחפש, לנתח ולהציג נתונים בצורה ויזואלית ב-Elasticsearch.

‫Elastic Agent הוא כלי קל משקל להעברת נתונים שאוסף נתונים ממקורות שונים, כמו יומנים או מדדים, ושולח אותם אוטומטית אל Elasticsearch.

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

התאמה אוטומטית לעומס ב-Elasticsearch היא תכונה של ניטור עצמי שיכולה לדווח מתי יש צורך במשאבים נוספים על סמך מדיניות שהוגדרה על ידי אופרטור. לדוגמה, מדיניות יכולה לציין שרמה מסוימת צריכה להתרחב בהתאם למקום הפנוי בכונן. ‫Elasticsearch יכול לעקוב אחרי נפח הדיסק ולהציע שינוי גודל אם הוא צופה מחסור, אבל עדיין המפעיל צריך להוסיף את המשאבים הנדרשים. מידע נוסף על התאמה אוטומטית לעומס (automatic scaling) של Elasticsearch זמין במאמר בנושא התאמה אוטומטית לעומס (automatic scaling) במאמרי עזרה של Elasticsearch.

הגדרת אשכול Elasticsearch

‫Elasticsearch מספק מנוע חיפוש ומנוע לניתוח נתונים מבוזר מבוסס RESTful שנועד לאחסן ולחפש כמויות גדולות של נתונים במהירות וביעילות.

כשפורסים את Elastic Stack ב-Kubernetes, צריך לנהל את הגדרות המכונה הווירטואלית, ובמיוחד את vm.max_map_count setting, שנדרש על ידי Elasticsearch. ‫vm.max_map_count מציין את מספר אזורי הזיכרון שתהליך יכול להקצות לקובץ. כדי ש-Elasticsearch יפעל בצורה אופטימלית, הערך הזה צריך להיות לפחות 262144. מידע נוסף זמין במאמר בנושא זיכרון וירטואלי במסמכי התיעוד של ECK.

  1. בודקים את קובץ המניפסט הבא:

    # Copyright 2023 Google LLC
    #
    # Licensed under the Apache License, Version 2.0 (the "License");
    # you may not use this file except in compliance with the License.
    # You may obtain a copy of the License at
    #
    #      https://www.apache.org/licenses/LICENSE-2.0
    #
    # Unless required by applicable law or agreed to in writing, software
    # distributed under the License is distributed on an "AS IS" BASIS,
    # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    # See the License for the specific language governing permissions and
    # limitations under the License.
    
    apiVersion: scheduling.k8s.io/v1
    kind: PriorityClass
    metadata:
      name: user-daemonset-priority
    value: 999999999
    preemptionPolicy: PreemptLowerPriority
    globalDefault: false
    description: "User DaemonSet priority"
    ---
    apiVersion: apps/v1
    kind: DaemonSet
    metadata:
      name: max-map-count-setter
      namespace: elastic-system
      labels:
        k8s-app: max-map-count-setter
    spec:
      selector:
        matchLabels:
          name: max-map-count-setter
      template:
        metadata:
          labels:
            name: max-map-count-setter
        spec:
          priorityClassName: user-daemonset-priority
          nodeSelector:
            cloud.google.com/compute-class: "Balanced"
          initContainers:
            - name: max-map-count-setter
              image: docker.io/bash:5.2.15
              resources:
                requests:
                  cpu: 10m
                  memory: 10Mi
                  ephemeral-storage: 10Mi
                limits:
                  cpu: 50m
                  memory: 32Mi
                  ephemeral-storage: 10Mi
              securityContext:
                privileged: true
                runAsUser: 0
              command: ["/usr/local/bin/bash", "-e", "-c", "echo 262144 > /proc/sys/vm/max_map_count"]
          containers:
            - name: sleep
              image: docker.io/bash:5.2.15
              command: ["sleep", "infinity"]
              resources:
                requests:
                  cpu: 10m
                  memory: 10Mi
                  ephemeral-storage: 10Mi
                limits:
                  cpu: 10m
                  memory: 10Mi
                  ephemeral-storage: 10Mi
    

    המניפסט הזה מתאר DaemonSet שמגדיר את הגדרת הליבה ישירות במארח. ‫DaemonSet הוא בקר Kubernetes שעוזר לוודא שעותק של Pod פועל בכל צומת באשכול.

    המניפסט שלמעלה נמצא ברשימת ההיתרים להפעלה ב-Autopilot. אסור לשנות את המניפסט הזה, כולל תמונות המאגר.

  2. מחילים את המניפסט הזה על האשכול:

    kubectl apply -f max-map-count-setter-ds.yaml
    
  3. בודקים את קובץ המניפסט הבא:

    apiVersion: elasticsearch.k8s.elastic.co/v1
    kind: Elasticsearch
    metadata:
      name: elasticsearch
      namespace: elastic-system
    spec:
      version: "8.9.0"
      volumeClaimDeletePolicy: DeleteOnScaledownOnly
      podDisruptionBudget:
        spec:
          minAvailable: 2
          selector:
            matchLabels:
              elasticsearch.k8s.elastic.co/cluster-name: elasticsearch
      nodeSets:
        - name: default
          config:
            node.roles: ["master", "data", "ingest", "ml", "remote_cluster_client"]
          podTemplate:
            metadata:
              labels:
                app.kubernetes.io/name: elasticsearch
                app.kubernetes.io/version: "8.9.0"
                app.kubernetes.io/component: "elasticsearch"
                app.kubernetes.io/part-of: "elk"
            spec:
              nodeSelector:
                cloud.google.com/compute-class: "Balanced"
              initContainers:
                - name: max-map-count-check
                  command:
                    - sh
                    - -c
                    - while true; do mmc=$(cat /proc/sys/vm/max_map_count); if test ${mmc} -eq 262144; then exit 0; fi; sleep 1; done
                  resources:
                    requests:
                      cpu: 10m
                      memory: 16Mi
                      ephemeral-storage: 16Mi
                    limits:
                      cpu: 10m
                      memory: 16Mi
                      ephemeral-storage: 16Mi
              containers:
                - name: elasticsearch
                  resources:
                    requests:
                      cpu: 990m
                      memory: 4080Mi
                      ephemeral-storage: 1008Mi
                    limits:
                      cpu: 1000m
                      memory: 4080Mi
                      ephemeral-storage: 1008Mi
                  env:
                    - name: ES_JAVA_OPTS
                      value: "-Xms2g -Xmx2g"
          count: 3
          volumeClaimTemplates:
            - metadata:
                name: elasticsearch-data # Do not change this name unless you set up a volume mount for the data path.
              spec:
                accessModes:
                  - ReadWriteOnce
                resources:
                  requests:
                    storage: 2Gi
                storageClassName: standard-rwo

    המניפסט הזה מגדיר אשכול Elasticsearch עם השדות הבאים:

    • initContainers: ממתין לשינוי בהגדרות של ליבת המערכת של המארח של הזיכרון הווירטואלי.
    • podDisruptionBudget: מציין שהאשכול לא ייהרס במהלך תהליך ביטול הפיצול של ה-Pods.
    • config.node.roles: הגדרת תפקידים של צומת Elasticsearch. מידע נוסף על תפקידי הצמתים זמין במאמר בנושא צומת במאמרי העזרה של Elasticsearch.
  4. מחילים את המניפסט הזה על האשכול:

    kubectl apply -f elasticsearch.yaml
    
  5. מחכים עד שקלאסטר Elasticsearch יהיה מוכן:

    watch kubectl --namespace elastic-system get elasticsearches.elasticsearch.k8s.elastic.co
    

    הפלט אמור להיראות כך:

    NAME            HEALTH   NODES   VERSION   PHASE   AGE
    elasticsearch   green    3       8.8.0     Ready   5m3s
    

    אם קלאסטר Elasticsearch‏ HEALTH הוא green ו-PHASE הוא Ready, חוזרים לשורת הפקודה על ידי לחיצה על Ctrl+C.

הגדרת Kibana

  1. בודקים את קובץ המניפסט הבא:

    apiVersion: kibana.k8s.elastic.co/v1
    kind: Kibana
    metadata:
      name: kibana
      namespace: elastic-system
    spec:
      version: "8.9.0"
      count: 1
      elasticsearchRef:
        name: elasticsearch
        namespace: elastic-system
      http:
        tls:
          selfSignedCertificate:
            disabled: true
      config:
        server.publicBaseUrl: https://elk.BASE_DOMAIN
        xpack.reporting.kibanaServer.port: 5601
        xpack.reporting.kibanaServer.protocol: http
        xpack.reporting.kibanaServer.hostname: kibana-kb-http.elastic-system.svc
        xpack.fleet.agents.elasticsearch.hosts: ["https://elasticsearch-es-http.elastic-system.svc:9200"]
        xpack.fleet.agents.fleet_server.hosts: ["https://fleet-server-agent-http.elastic-system.svc:8220"]
        xpack.fleet.packages:
        - name: system
          version: latest
        - name: elastic_agent
          version: latest
        - name: fleet_server
          version: latest
        - name: kubernetes
          version: latest
        xpack.fleet.agentPolicies:
        - name: Fleet Server on ECK policy
          id: eck-fleet-server
          namespace: default
          monitoring_enabled:
          - logs
          - metrics
          unenroll_timeout: 900
          package_policies:
          - name: fleet_server-1
            id: fleet_server-1
            package:
              name: fleet_server
        - name: Elastic Agent on ECK policy
          id: eck-agent
          namespace: default
          monitoring_enabled:
          - logs
          - metrics
          unenroll_timeout: 900
          package_policies:
          - package:
              name: system
            name: system-1
          - package:
              name: kubernetes
            name: kubernetes-1
      podTemplate:
        metadata:
          labels:
            app.kubernetes.io/name: kibana
            app.kubernetes.io/version: "8.9.0"
            app.kubernetes.io/component: "ui"
            app.kubernetes.io/part-of: "elk"
        spec:
          containers:
          - name: kibana
            resources:
              requests:
                memory: 1Gi
                cpu: 500m
                ephemeral-storage: 1Gi
              limits:
                memory: 1Gi
                cpu: 500m
                ephemeral-storage: 1Gi

    במניפסט הזה מתואר משאב מותאם אישית של Kibana שמגדיר מדיניות של סוכנים עבור שרת ה-Fleet והסוכנים.

  2. מחילים את המניפסט הזה על האשכול:

    kubectl apply -f kibana.yaml
    
  3. מחכים שה-Pods יהיו מוכנים:

    watch kubectl --namespace elastic-system get kibanas.kibana.k8s.elastic.co
    

    הפלט אמור להיראות כך:

    NAME     HEALTH   NODES   VERSION   AGE
    kibana   green    1       8.8.0     6m47s
    

    כשהערך של Pods HEALTH הוא green, חוזרים לשורת הפקודה על ידי לחיצה על Ctrl+C.

הגדרת מאזן עומסים לגישה ל-Kibana

כדי לגשת ל-Kibana, צריך ליצור אובייקט Kubernetes Ingress, אישור בניהול Google, כתובת IP גלובלית ואזור DNS.

  1. יוצרים כתובת IP חיצונית גלובלית:

    gcloud compute addresses create "elastic-stack" --global
    
  2. יוצרים תחום מנוהל וקבוצה של רשומות ב-Cloud DNS:

    gcloud dns managed-zones create "elk" \
        --description="DNS Zone for Airflow" \
        --dns-name="elk.BASE_DOMAIN" \
        --visibility="public"
    
    gcloud dns record-sets create "elk.BASE_DOMAIN" \
        --rrdatas="$(gcloud compute addresses describe "elastic-stack" --global --format="value(address)")" \
        --ttl="300" \
        --type="A" \
        --zone="elk"
    
  3. מאצילים את תחום ה-DNS כתת-דומיין של הדומיין הבסיסי על ידי יצירת קבוצת רשומות NS עם רשימה של שרתי שמות. אפשר לקבל רשימה של שרתי שמות באמצעות הפקודה הבאה:

    gcloud dns record-sets describe elk.BASE_DOMAIN \
        --type="NS" \
        --zone="elk" \
        --format="value(DATA)"
    
  4. בודקים את קובץ המניפסט הבא:

    # Copyright 2023 Google LLC
    #
    # Licensed under the Apache License, Version 2.0 (the "License");
    # you may not use this file except in compliance with the License.
    # You may obtain a copy of the License at
    #
    #      https://www.apache.org/licenses/LICENSE-2.0
    #
    # Unless required by applicable law or agreed to in writing, software
    # distributed under the License is distributed on an "AS IS" BASIS,
    # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    # See the License for the specific language governing permissions and
    # limitations under the License.
    
    apiVersion: networking.gke.io/v1beta1
    kind: FrontendConfig
    metadata:
      name: elastic-stack
      namespace: elastic-system
    spec:
      redirectToHttps:
        enabled: true
        responseCodeName: MOVED_PERMANENTLY_DEFAULT
    ---
    apiVersion: networking.gke.io/v1
    kind: ManagedCertificate
    metadata:
      name: elastic-stack
      namespace: elastic-system
    spec:
      domains:
        - elk.BASE_DOMAIN
    ---
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: kibana
      namespace: elastic-system
      annotations:
        networking.gke.io/managed-certificates: elastic-stack
        networking.gke.io/v1beta1.FrontendConfig: elastic-stack
        kubernetes.io/ingress.global-static-ip-name: elastic-stack
        kubernetes.io/ingress.class: gce
    spec:
      defaultBackend:
        service:
          name: kibana-kb-http
          port:
            number: 5601
    

    קובץ המניפסט הזה מתאר ManagedCertificate שמקצה אישור SSL כדי ליצור את חיבור ה-TLS.

  5. מחילים את המניפסט על האשכול:

    kubectl apply -f ingress.yaml
    

הגדרת סוכנים של Elastic

  1. בודקים את קובץ המניפסט הבא:

    apiVersion: agent.k8s.elastic.co/v1alpha1
    kind: Agent
    metadata:
      name: fleet-server
      namespace: elastic-system
    spec:
      version: 8.9.0
      kibanaRef:
        name: kibana
        namespace: elastic-system
      elasticsearchRefs:
        - name: elasticsearch
          namespace: elastic-system
      mode: fleet
      fleetServerEnabled: true
      policyID: eck-fleet-server
      deployment:
        replicas: 1
        podTemplate:
          metadata:
            labels:
              app.kubernetes.io/name: fleet-server
              app.kubernetes.io/version: "8.9.0"
              app.kubernetes.io/component: "agent"
              app.kubernetes.io/part-of: "elk"
          spec:
            containers:
              - name: agent
                resources:
                  requests:
                    memory: 512Mi
                    cpu: 250m
                    ephemeral-storage: 10Gi
                  limits:
                    memory: 512Mi
                    cpu: 250m
                    ephemeral-storage: 10Gi
            volumes:
              - name: "agent-data"
                ephemeral:
                  volumeClaimTemplate:
                    spec:
                      accessModes: ["ReadWriteOnce"]
                      storageClassName: "standard-rwo"
                      resources:
                        requests:
                          storage: 10Gi
            serviceAccountName: fleet-server
            automountServiceAccountToken: true
            securityContext:
              runAsUser: 0

    המניפסט הזה מתאר סוכן Elastic שמגדיר שרת צי עם ECK.

  2. מחילים את המניפסט הזה על האשכול:

    kubectl apply -f fleet-server-and-agents.yaml
    
  3. מחכים שה-Pods יהיו מוכנים:

    watch kubectl --namespace elastic-system get agents.agent.k8s.elastic.co
    

    הפלט אמור להיראות כך:

    NAME            HEALTH   AVAILABLE   EXPECTED   VERSION   AGE
    elastic-agent   green    5           5          8.8.0     14m
    fleet-server    green    1           1          8.8.0     16m
    

    כשהערך של Pods HEALTH הוא green, חוזרים לשורת הפקודה על ידי לחיצה על Ctrl+C.

הגדרת רישום ביומן ומעקב

‫Elastic Stack יכול להשתמש ב-kube-state-metrics exporter כדי לאסוף מדדים ברמת האשכול.

  1. מתקינים את kube-state-metrics:

    helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
    helm repo update
    helm install kube-state-metrics prometheus-community/kube-state-metrics --namespace elastic-system
    
  2. מקבלים את פרטי הכניסה של המשתמש ב-Kibana elastic שמוגדרים כברירת מחדל:

    kubectl get secret elasticsearch-es-elastic-user -o yaml -n elastic-system -o jsonpath='{.data.elastic}' | base64 -d
    
  3. פותחים את https://elk.BASE_DOMAIN בדפדפן ונכנסים ל-Kibana באמצעות פרטי הכניסה.

  4. בתפריט, לוחצים על Analytics ואז על Dashboards (לוחות בקרה).

  5. בשדה החיפוש, מזינים Kubernetes overview ובוחרים באפשרות Overview dashboard כדי לראות מדדי בסיס.

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

הסרת המשאבים

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

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

    כדי למחוק Google Cloud פרויקט:

    gcloud projects delete PROJECT_ID

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

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

  1. מחיקת הרכיבים של Elastic Stack, האופרטור ECK ו-kube-state-metrics:

    kubectl --namespace elastic-system delete ingresses.networking.k8s.io elastic-stack
    kubectl --namespace elastic-system delete managedcertificates.networking.gke.io elastic-stack
    kubectl --namespace elastic-system delete frontendconfigs.networking.gke.io elastic-stack
    kubectl --namespace elastic-system delete agents.agent.k8s.elastic.co elastic-agent
    kubectl --namespace elastic-system delete agents.agent.k8s.elastic.co fleet-server
    kubectl --namespace elastic-system delete kibanas.kibana.k8s.elastic.co kibana
    kubectl --namespace elastic-system delete elasticsearches.elasticsearch.k8s.elastic.co elasticsearch
    kubectl --namespace elastic-system delete daemonsets.apps max-map-count-setter
    kubectl --namespace elastic-system delete pvc --selector='elasticsearch.k8s.elastic.co/cluster-name=elasticsearch'
    helm --namespace elastic-system uninstall kube-state-metrics
    helm --namespace elastic-system uninstall elastic-operator
    
  2. מוחקים את קבוצת רשומות ה-DNS, כתובת ה-IP, האזור המנוהל של ה-DNS ואת אשכול GKE:

    gcloud dns record-sets delete "elk.BASE_DOMAIN" \
        --type="A" \
        --zone="elk" \
        --quiet
    
    gcloud compute addresses delete "elastic-stack" \
        --global \
        --quiet
    
    gcloud dns managed-zones delete "elk" --quiet
    
    gcloud container clusters delete "elk-stack" \
        --location="us-central1" \
        --quiet
    

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

  • כדאי להעמיק את הקריאה ולהכיר דוגמאות לארכיטקטורות, תרשימים ושיטות מומלצות בנושאי Google Cloud. כל אלה זמינים במרכז הארכיטקטורה של Cloud.