Install Spinnaker with Halyard on Kubernetes ( update 22 Aug 2020)

اسپیناکر ابزاری اپن‌سورس جهت پیاده‌سازی Continuous Delivery است که توسط کمپانی Netflix طراحی شده و به تیم‌های توسعه‌ٔ نرم‌افزار این امکان را می‌دهد تا اقدام به دیپلوی نسخه‌های جدید نرم‌افزارهای خود در محیط کلود نمایند (Continuous Delivery یا به اختصار CD به فرآیندی گفته می‌شود که طی آن دولوپرها می‌توانند نسخه‌های جدید اپلیکیشن را به شکلی سریع، ایمن و مطمئن جهت دیپلوی روی سرورهای اصلی آماده نمایند.)اگر با ابزار اسپیناکر آشنا نیستید ابتدا این مطلب رو بخونیدنیازمندی های قبل از نصب:Docker 18.x with proxies configuredA Kubernetes cluster Helm3مرحله اول:برای نصب و مدیریت اسپیناکر اول باید ابزار Halyard را نصب کنیم. که خود سایت رسمی اینطوری تعریفش کرده :Halyard is a command-line administration tool that manages the lifecycle of your Spinnaker deployment, including writing & validating your deployment’s configuration, deploying each of Spinnaker’s microservices, and updating the deployment.برای نصب دوتا راه حل کلی دارید . اول اینکه مستقیم روی سیستم عاملتون نصب کنید که فعلا سیستم های زیر رو فقط ساپورت میکنه :Ubuntu 14.04, 16.04 or 18.04 (Ubuntu 16.04 requires Spinnaker 1.6.0 or later)Debian 8 or 9macOS (tested on 10.13 High Sierra only)یا اینکه از داکرش استفاده کنید اینطوری هم مستقل از سیستم عامل کار میکنیم و کار باهاش خیلی راحت تره. در این اموزش ما از نسخه داکرش استفاده می کنیم.یک فایل docker-compose.yaml بسازید که محتوای داخلش مانند زیر باشد :version: &quot3.3&quot services: halyard: container_name: halyard restart: always image: gcr.io/spinnaker-marketplace/halyard:stable volumes: - ./k8s:/home/spinnaker/k8s/ - ./halyard:/home/spinnaker/.hal environment: KUBECONFIG: /home/spinnaker/k8s/config/kubeconfig.conf ports: - 8084:8084 - 9000:9000داکر کامپوز بالا فقط دوتا نکته مهم داره که حتما باید رعایت کنید . اول اینکه حتما kubeconfig.conf رو برای اتصال به کوبر داخل پوشه k8s/config قرار دهید. دوم اینکه پوشه کانفیگ halyard رو به بیرون mount کردیم که آن را از دست ندهیم. ساختار پوشه های ما در هاست بصورت زیر خواهد بود:├── docker-compose.yml├── halyard└── k8s └── config └──kubeconfig.confدر اخر فایل داکر کامپوز خودمون رو اجرا می کنیم:docker-compose up -d docker exec -it halyard bash source <(hal --print-bash-completion)فقط خط سوم نیاز به توضیح داره که اونم بخاطر اینکه فعال شدن command completion هستقبل از رفتن به مرحله بعدی یک namespace به نام spinnaker توی کوبرتون بسازیدمرحله دوم انتخاب Cloud Providersاسپیناکر از Cloud Providers های زیر پشتیبانی میکنه :Amazon Web ServicesAzureCloud FoundryDC/OSGoogle Compute EngineKubernetesOracleکه ما در این آموزش از Kubernetes استفاده می کنیم. پس اگر انتخاب شما بغیر از Kubernetes هست ادامه اموزش براتون مفید نیست.برای انتخاب Cloud Providers از کامند زیر استفاده کنید:hal config provider kubernetes enableدر مرحله بعد یک کاربر برای اسپیناکر می سازیم:hal config provider kubernetes account add <my_account> \ --provider-version v2 \ --context $(kubectl config current-context)در قسمت <my_account> یک نام کاربری دلخواه قرار دهید . و برای استفاده های بعدی در environment variable با نام ACCOUNT درست کنید . مانند زیرexport ACCOUNT=safaابزار Halyard از انواع Spinnaker deployment پشتیبانی میکنه برای فعال کردن حالت distributed deployment از گامند زیر استفاده کنید :hal config deploy edit --type distributed --account-name $ACCOUNTمرحله سوم انتخاب Persistent Storage :اسپیناکر به persistent store نیاز داره برای ذخیره continuous delivery pipelines و بقیه کانفیگ هاش. برای انتخاب میتونید از multiple storage providers های زیر انتخاب کنید Azure Storage Google Cloud Storage Minio Redis (warning: Unsupported and not recommended for production environments) S3 Oracle Object Storageبرای اینکار ما از minio استفاده میکنیم. پس برای ادامه کار موقت از کانتینر خارج بشید و برید داخل مستر Kubernetes تا با استفاده از helm ابزار minio رو نصب کنیم . فرض ما اینکه شما helm رو نصب کردید ( اگر از ورژن 3 استفاده کنید دیگه نیازی به tiller ندارید ). خب برای ساخت از کامند زیر استفاده می کنیمhelm install minio --namespace spinnaker bitnami/minio --set persistence.enabled=false,persistence.size=5Gi,persistence.existingClaim=spinnaker-pvcنکته اول : شما باید در Namespace فعلی یک PersistentVolumeClaim داشته باشید . من برای نمونه از spinnaker-pvc که از قبل ساخته بودم استفاده کردم. برای ساختن PVCs میتونید از NFS استفاده کنیدنکته دوم : بعد از اجرا شدن کامل helm باید MINIO_ACCESS_KEY و MINIO_SECRET_KEY استخراج و داخل export هامون قرار بدیم . برای این کار از دو دستور زیر استفاده نماییدexport MINIO_ACCESS_KEY=$(kubectl get secret --namespace spinnaker minio -o jsonpath=&quot{.data.access-key}&quot | base64 --decode) export MINIO_SECRET_KEY=$(kubectl get secret --namespace spinnaker minio -o jsonpath=&quot{.data.secret-key}&quot | base64 --decode) حال به کانتینر خودمون بر میگردیم و کامند زیرو رو اجرا می کنیم تا این اتصال بر قرار بشهecho $MINIO_SECRET_KEY | \ hal config storage s3 edit --endpoint http://minio.spinnaker.svc:9000 \ --access-key-id $MINIO_ACCESS_KEY \ --secret-access-keyنکته : حتما با فایل کانفیگ Hal رفته و در قسمت persistentStorage حتما پارمتر pathStyleAccess برابر true قرار بدید در غیر این صورت pod front50 مدام کرش خواهد کردسپس برای فعال کردن s3 storage provider از کامند زیر استفاده کنید :hal config storage edit --type s3مرحله چهارم Set versionاگر دقت کرده باشید در تمامی مراحل قبل موقع تنظیم در اخر لاگ ها یک پیغام به شما نمایش میده با این مفهوم که شما ورژن اسپناکر رو هنوز انتخاب نکردید. برای این کار ابتدا کامند زیر رو بزنید : hal version listخروجی دستور بالا مانند زیر هست - 1.18.10 (Longmire): Changelog: https://gist.github.com/spinnaker-release/306d7e241272980642e918f64ed91fe3 Published: Tue May 05 13:46:19 GMT 2020 (Requires Halyard >= 1.29 - 1.19.7 (Gilmore Girls A Year in the Life): Changelog: https://gist.github.com/spinnaker-release/cc4410d674679c5765246a40f28e3cad Published: Tue May 05 11:52:54 GMT 2020 (Requires Halyard >= 1.32) - 1.20.0 (Drive to Survive): Changelog: https://gist.github.com/spinnaker-release/75d50c7b931f1089e710a0e9d1acf8c4 Published: Mon May 04 17:58:56 GMT 2020 (Requires Halyard >= 1.32)هر نسخه ایی که میخواید رو انتخاب و با کامند زیر مشخص کنیدhal config version edit --version <version>مرحله پنجم Deploy Spinnakerاین اخرین مرحله از نصب هست . قبل از نصب Spinnaker حتما یک بار فایل کانفیگ زیرو بررسی کنید که ادرس فایل kubeconfig در اون درست تنظیم شده باشه و اگر مشکل داشته یا شما ادرس فایل رو از پیش فرض تغییر داید حتما ویرایش کنید . ادرس این فایل در vi /home/spinnaker/.hal/configو مقدار پارمترkubeconfigFile می باشد. سپس کامند زیر رو اجرا کنید تا اسپناکر بر روی کوبر شما نصب بشهhal deploy applyاگر برای اولین بار هست که نصب می کنید بخاطر دانلود ایمیج های مربوطه ممکنه کمی طولانی بشه. پس صبور باشید ( ایمیح ها تا حدود ۱ گیگ هستند )نکته : اگر در نصب بر روی کوبر به مشکل خوردید deploy apply رو در مود دیباگ اجرا کنید :Hal deploy apply --debug -l مرحله ششم Spinnaker reachableبرای دستیابی به پنل گرافیکی اسپناکر اگر از روش غیر داکر استفاده کردید از کامند زیر استفاده کنید :hal deploy connectسپس از طریق ادرس localhost:9000. میتونید به پنل گرافیکی دسترسی داشته باشیدولی اگر از روش داکر استفاده کردید برید سراغ مستر Kubernetes و مقدایر سرویس های زیر رو از ClusterIP به NodePort تغییر دهیدkubectl edit svc spin-deck -n spinnakerنمونه تغییر مشابه کد زیر میتونه باشه البته پورت خروجی رو میتونید به دلخواه تغییر بدید... spec: type: NodePort ports: - port: 9000 protocol: TCP targetPort: 9000 nodePort: 30900 selector: app: spin cluster: spin-deck sessionAffinity: None status: ...و همچنین سرویس زیر روkubectl edit svc spin-gate -n spinnakerخب حالا برمیگردیم سراغ کانتینر و اخرین تغییرات رو اعمال می کنیم. برای این کار ابتدا مقدار environment variable مرود نیاز رو با نام متغییر SPIN_HOST که ادرس دسترسی به کلاستر کوبر هست رو قرار بدید و سپس کامند های زیرhal config security ui edit \ --override-base-url &quothttp://$SPIN_HOST:30900&quot hal config security api edit \ --override-base-url &quothttp://$SPIN_HOST:30800&quot hal deploy applyخب بالاخره مراحل نصب به اتمام رسید و از طریق ادرس http://$SPIN_HOST:30900 می تونید به محیط گرافیکی اسپناکر متصل شوید.و در اخر هر زمان خواستید اسپیناکر رو از روی کوبر پاک کنید از کامند زیر استفاده کنیدhal deploy cleanدر اخر اگر همه چیز درست بود از فایل کانفیگتون حتما بک اپ بگیرد:hal backup createدر قسمت های بعدی سعی میکنم آموزش کار با اسپیناکر رو قرار بدم. با ارزوی موفقیت برای همه :)