بکاپ گیری از Etcd و قرار دادن بر روی فضای ابری ابر آروان

بسیاری از اجزای kubernetes تقریباً stateless هستند. تمام داده ها در etcd ذخیره می شوند. etcd دیتابیس کلاستر kubernetes است و از آن می‌توان به عنوان عضوی مهم یاد برد . بنابراین، انجام یک فرآیند خوب پشتیبان گیری از داده های etcd بسیار مهم است. این مقاله در رابطه با نحوه بک آپ گیری از etcd می‌باشد.



طرح‌های پشتیبان‌گیری زیادی وجود دارد که می‌توانند این عملیات را برای etcd انجام دهند، اکثر روش ها مشابه هم هستند. اساساً از دستور etcdctl برای این فرآیند استفاده می‌شود.

چرا Object Storage؟

  • استفاده از یک فضای بسیار در دسترس ابری و یکپارچه با سرویس CDN ابر آروان
  • دارا بودن از Lifecycle Policy بر روی باکت برای نگهداری دیتا
  • امن بودن دیتا

در بخش اول نیاز به نصب s3cmd برای ارتباط با سرویس فضای ابری داشتم که به ترتیب مراحل زیر انجام شد:

۱.نصب ابزار s3cmd

apt install s3cmd -y

۲.کانفیگ s3cmd به دو روش تغییرات در فایل ./config و یا دستور s3cmd --configure

۳.اضافه کردن secret key, access key,endpoint و فرمت نمایش باکت

۳.و در آخر با استفاده از دستور s3cmd ls از ارتباط و صحت تنظیمات مربوطه اطمینان حاصل می کنیم.


در بخش بعدی نیاز به پیدا کردن ابزاری برای بک آپ گرفتن از تنظیمات و دیتا etcd داریم که من از دستور etcdctl استفاده کردم.

با توجه به این etcd بر روی پورت ۲۳۷۹ در دسترس هست با استفاده از curl عملکرد API رو بررسی میکنیم.


دسترسی به etcd معادل دسترسی به root در کلاستر است، بنابراین در حالت ایده آل فقط سرور API باید به آن دسترسی داشته باشد. با توجه به حساسیت داده‌ها، توصیه می‌شود فقط node هایی که نیاز به دسترسی به کلاستر یا تک نود etcd دارند مجوز بدهیم.


برای ایمن سازی etcd، یا باید قوانین فایروال را تنظیم کنیم یا از ویژگی های امنیتی ارائه شده توسط etcd استفاده کنیم. ویژگی های امنیتی etcd به زیرساخت کلید عمومی x509 )PKI) بستگی دارد. برای شروع، کانال های ارتباطی امن را با ایجاد یک جفت کلید و گواهی ایجاد کنیم. برای مثال، از جفت‌های کلید peer.key و peer.cert برای ایمن کردن ارتباط بین اعضای etcd و client.key و client.cert برای ایمن کردن ارتباط بین etcd و اعضایش استفاده کنیم.


در مثال زیر یک نمونه ایجاد ارتباط امن نمایش داده شده که برای اسکریپت هم استفاده شده.

ETCDCTL_API=3 etcdctl --endpoints 10.2.0.9:2379 \
--cert=/etc/kubernetes/pki/etcd/server.crt \
--key=/etc/kubernetes/pki/etcd/server.key \
--cacert=/etc/kubernetes/pki/etcd/ca.crt \

در ادامه برای جلوگیری از بین رفتن اطلاعات (حتی در مواردی که etcd به صورت کلاستر وجود داره) ورژن ۳ etcd قابلیتی برای گرفتن بک آپ یا به اصطلاح snapshot قرار داده که میتونیم از اون استفاده کنیم.


برای این کار به پاد مربوطه وارد شده و دستور زیر را اجرا میکنیم که به صورت آنی از دیتابیس بک آپ تهیه کنه.

ETCDCTL_API=3 etcdctl --endpoints $ENDPOINT snapshot save snapshot.db

۱.بعد از پیدا کردن این موارد شروع به نوشتن اسکریپت کردم. در بخش اول متغیر های NOWDATE برای زمان فایل بک آپ،BUCKET برای نام باکت در فضای ابری و DESTDIR برای مسیر ذخیره شده در باکت تعریف کردم.

۲.در بخش بعدی ایجاد یک مسیر موقت در /opt یا /tmp برای کپی فایل های مربوط به کلید ها و فایل snapshot ایجاد کردم.

۳.در ادامه کامند های مربوط به توضیحات بالا قرار داده شد و بعد از اجرا با توجه به فرمت تعیین شده در متغیر NOWDATE به مسیر موقت کپی شد.

۴.در بخش بعدی فایل مربوط به snapshot و دایرکتوری مربوطه با استفاده از ابزار های gzip و tar فشرده شد.

۵.در بخش بعد فایل های فشرده شده مورد نظر با استفاده از s3cmd به باکت مربوطه در فضای ابری آروان ارسال شد.

۶.در آخر هم تمامی محتویات پوشه موقت پاک شد.

ریپو اسکریپت:

https://gitlab.com/AshkanAbdolmaleki/etcd-backup/-/tree/main


با توجه به نیاز مطرح شده در پروژه اسکریپت در یک cronjob به صورت دوره ای و هر ۱۲ ساعت یک بار قرار گرفت.

همچنین امکان استفاده از Crontab هم وجود دارد.