etcd یک پایگاه‌داده‌ی key-value توزیع‌شده و با کارایی بالا است که برای ذخیره داده‌های حیاتی کوبرنتیز استفاده می‌شود. در کوبرنتیز، etcd نقش source of truth را ایفا می‌کند و تمام اطلاعات مربوط به وضعیت cluster (مانند وضعیت nodes، pods، configurations و غیره) را ذخیره می‌کند.

وظایف اصلی etcd در کوبرنتیز شامل موارد زیر است:

  1. State Management: ذخیره وضعیت جاری و desired state برای هماهنگی بین control plane و اجزای مختلف.
  2. Leader Election: پشتیبانی از فرآیندهای انتخاب رهبر (leader) برای هماهنگی در سیستم‌های توزیع‌شده.
  3. Configuration Management: ذخیره تنظیمات پیکربندی که توسط API Server کوبرنتیز خوانده و نوشته می‌شوند.

پایداری و دسترسی بالا (High Availability) در etcd بسیار مهم است، زیرا از دست دادن داده‌های etcd می‌تواند به از دست رفتن اطلاعات کل cluster منجر شود. برای این منظور در سرویس کوبرنتیز ستون، به طور خودکار از etcd نسخه‌ی پشتیبان (backup) گرفته می‌شود.

کامپوننت etcd از کامپوننت‌های مدیریتی کوبرنتیز است که در سرویس کوبرنتیز ابری ستون، توسط ستون نگهداری و بهینه‌سازی می‌شود. کاربر نیز می‌تواند با تنظیم مانیتورینگ و موارد مشابه از کیفیت نگهداری این کامپوننت در کلاستر، اطمینان حاصل کند.

سایز دیتابیس ETCD

دیتابیس etcd برای اینکه قابل اتکا باقی بماند، نیاز به نگهداری دوره‌ای دارد. این نگهداری معمولاً به صورت خودکار و بدون خرابی یا کاهش عملکرد توسط خود etcd انجام می‌شود و منابع ذخیره‌سازی مصرف شده توسط etcd را مدیریت می‌کند. مقدار ماکزیمم حافظه که etcd استفاده می‌کند توسط فلگ quota-backend-bytes محدود می‌شود. این مقدار در ابتدا به طور پیش‌فرض توسط etcd برابر با ۲ گیگابایت تنظیم می‌شود. همچنین حداکثر اندازه‌ی پیشنهادی etcd برای این مقدار 8 گیگابایت است و برای جلوگیری از جابجایی یا تمام شدن حافظه، ماشین باید حداقل به این اندازه مموری داشته باشد.
اگر یکی از اعضای etcd منابع بیشتری که از مقدار quota تعریف شده مصرف کند، یک هشدار (alarm) ایجاد می‌شود که etcd را در حالت تعمیر و نگهداری با عملیات محدود قرار می‌دهد. برای جلوگیری از پر شدن فضا، تاریخچه فضای کلید etcd به صورت خودکار توسط خود etcd فشرده (compact) می‌شود.

راه‌اندازی مانیتورینگ برای etcd

مانیتورینگ etcd برای اطمینان از سلامت و عملکرد کلاستر بسیار مهم است. این راهنما دستورالعمل‌های گام‌به‌گام برای تنظیم مانیتورینگ etcd و بررسی روش‌های مختلف برای انجام این کار را ارائه می‌دهد.

گام ۱: دسترسی به سرتیفیکیت‌های etcd

۱- یافتن پاد etcd

ابتدا پاد etcd را در کنترل پلین شناسایی کنید.

kubectl get pods -n kube-system

به دنبال پادی با نام مشابه <etcd-node-name> بگردید.

۲- استخراج سرتیفیکیت‌ها

سرتیفیکیت‌ها را از پاد etcd کپی کنید.

kubectl cp kube-system/<etcd-pod-name>:/etc/kubernetes/pki/etcd/ca.crt ./ca.crt
kubectl cp kube-system/<etcd-pod-name>:/etc/kubernetes/pki/etcd/healthcheck-client.crt ./client.crt
kubectl cp kube-system/<etcd-pod-name>:/etc/kubernetes/pki/etcd/healthcheck-client.key ./client.key

۳- ساخت یک Secret برای سرتیفیکیت‌ها

سرتیفیکیت‌های etcd را در یک secret ذخیره کنید.

kubectl create secret generic etcd-certs \
  --from-file=ca.crt=./ca.crt \
  --from-file=client.crt=./client.crt \
  --from-file=client.key=./client.key -n monitoring

گام ۲: راه‌اندازی Prometheus

اگر Prometheus را در کلاستر خود نصب نکرده‌اید، مراحل زیر را برای دیپلوی آن دنبال کنید. در غیر این صورت این گام را رد کنید:

۱- نصب kube-prometheus-stack

helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update

Prometheus و Grafana را با استفاده از چارت Helm دیپلوی کنید.

helm install prometheus-stack prometheus-community/kube-prometheus-stack -n monitoring --create-namespace

۲- دسترسی به Prometheus و Grafana

پس از دیپلوی می‌توانید از طریق port-forward و یا expose کردن سرویس‌ها به رابط‌های Prometheus و Grafana دسترسی پیدا کنید.

kubectl port-forward -n monitoring svc/prometheus-stack-prometheus 9090:9090
kubectl port-forward -n monitoring svc/prometheus-stack-grafana 3000:80

اطلاعات پیش‌فرض Grafana:

  • نام کاربری: admin
  • رمز عبور: با دستور زیر بازیابی کنید:
kubectl get secret -n monitoring prometheus-stack-grafana -o jsonpath="{.data.admin-password}" | base64 --decode```

گام ۳: تنظیم Prometheus برای جمع‌آوری متریک‌های etcd

۱- ساخت سرویس برای etcd

apiVersion: v1
kind: Service
metadata:
  name: etcd-metrics
  namespace: kube-system
  labels:
    k8s-app: etcd
spec:
  ports:
    - name: https-metrics
      port: 2379
      protocol: TCP
      targetPort: 2379
  selector:
    component: etcd

سپس آن را اعمال کنید.

kubectl apply -f etcd-service.yaml

۲- ساخت Service Monitor برای etcd

apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: etcd
  namespace: monitoring
  labels:
    release: prometheus-stack
spec:
  selector:
    matchLabels:
      k8s-app: etcd
  endpoints:
    - port: https-metrics
      scheme: https
      tlsConfig:
        caFile: /etc/prometheus/secrets/etcd-certs/ca.crt
        certFile: /etc/prometheus/secrets/etcd-certs/client.crt
        keyFile: /etc/prometheus/secrets/etcd-certs/client.key
      interval: 30s
  namespaceSelector:
    matchNames:
      - kube-system

سپس آن را اعمال کنید.

kubectl apply -f etcd-servicemonitor.yaml

۳- بررسی راه‌اندازی

تارگت های Prometheus را بررسی کنید تا اطمینان حاصل کنید متریک‌های etcd جمع‌آوری می‌شوند.

kubectl port-forward -n monitoring svc/prometheus-stack-prometheus 9090:9090

به http://localhost:9090/targets بروید و اطمینان حاصل کنید که تارگت های etcd به‌صورت UP ظاهر می‌شود.

گام ۴: استفاده از Grafana

۱- وارد کردن داشبورد etcd

یک داشبورد آماده etcd را از جامعه Grafana وارد کنید. به Dashboards > Import بروید و ID داشبورد را وارد کنید یا فایل JSON را آپلود کنید. به طور مثال می توانید ازاین دشبورد آماده استفاده نمایید.

grafana

۲- ساخت هشدارها (Alerts)

همچنین می‌توانید الرت‌هایی برای etcd ست کنید.

  • الرت برای سایز دیتابیس:‌
(etcd_server_quota_backend_bytes - etcd_debugging_mvcc_db_total_size_in_bytes) < 100 * 1024 * 1024
  • وضعیت لیدر: etcd_server_has_leader == 0
  • تأخیر دیسک: etcd_disk_backend_commit_duration_seconds
  • پیشنهادات ناموفق: etcd_server_proposals_failed_total