Varsayılan olaraq AWS-də əsas CI / CD boru kəməri ilə etibarlı bir Kubernetes klasteri necə yaradılır

Müəlliflər: Matthew Sheppard & Donald Carnegie

Kuber-nədir?

Kubernetes (tələffüz olaraq "koo-burr-NET-eez") tətbiq konteynerlərinin yerləşdirilməsi, miqyası və işinin avtomatlaşdırılması üçün açıq mənbə platformadır. Sərin uşaqlar tez-tez (IOHO) çox yaxşı olmayan "k8s" ixtisarından istifadə edirlər. Kubernetes-in işi, infrastrukturunuzdan mümkün qədər səmərəli istifadə etmək, konteynerləşdirilmiş iş yüklərinizin mövcud olmasını və lazım olduqda miqyaslı olmasını təmin etməkdir. Bəzi şirkətlər bulud infrastruktur xərclərini ənənəvi VM əsaslı memarlıq ilə müqayisədə 50-70% azalda bildiklərini bildirdilər.

Uğurunuzu nəzarətdə saxlayın

Kubernetes, Cloud Native Computing Foundation və arxasındakı açıq mənbə cəmiyyəti üçün böyük bir uğur hekayəsidir. İlk dəfə 2014-cü ilin ortalarında Google mühəndisləri qrupunun rəhbərliyi altında kiçik bir layihə elan olundu, faktiki konteyner orkestr platforması və ümumi bulud ekosistemi boyunca əmtəə halına gəldi. Microsoft, Google, Amazon və IBM, idarə olunan Kubernetes təkliflərinin bir növünə sahibdir. Kubernetes, töhfələr və sürət baxımından Linux nüvəsindən sonra ikinci ən vacib açıq mənbə layihəsidir. Pokemon Go'u təmin etməkdən HBO GO abunəçilərinin Game of Thrones Sezon 7-ni asanlıqla yayımlaya biləcəyinə qədər bir çox sərin iş yükü üçün geniş istifadə olunur.

Davamlı Kubernetes

Müasir veb tətbiqetmələrin istifadəçiləri və inkişaf etdiriciləri olaraq, onların həftənin 7 günü 24 saat mövcud olduqlarını və gün ərzində bir neçə dəfə yeni versiyalarını təqdim edə biləcəklərini gözləyirik. Bu hədəfə çatmaq üçün təkcə Kubernetes kifayət deyil. Konteynerləşdirilmiş tətbiqetmələrimizi istədiyimiz zaman və harada işləməsini və ehtiyac duyduqları alət və mənbələrə sahib olmasını təmin edir. Bununla birlikdə, mühəndislərimizi tam gücləndirmək üçün Kubernetes ətrafında CI / CD boru kəməri çəkməliyik.

GitOps, Weaveworks tərəfindən Gitin Kubernetes klaster dövləti üçün həqiqətin bəyanedici bir mənbəyi kimi istifadə edilməsini təsvir etmək üçün hazırladığı bir termindir. Git, sistem sağlamlığımızı izləmə vasitəmiz olur və git-də konstruksiyalardan istifadə edirik. B. Gitdəki vəziyyəti bulud altyapısı ilə birləşdirmə vasitəsi olaraq istəkləri çəkin. Bir sözlə, təsdiqlənmiş çəkilmə tələbləri istehsalda canlı dəyişikliklərlə nəticələnir. Bu, çox güclü bir yanaşmadır, çünki infrastrukturu idarə etmək üçün kanıtlanmış bir mənbə kodu iş axını istifadə edilə bilər. Bunu tamamilə başa düşsək, köhnə məktəbin mürəkkəb, çox uzun çəkən və məsuliyyətə cəlb oluna bilməyən bürokratik dəyişikliklərə nəzarət proseslərindən qaça bilərik. İnfrastrukturunuzda edilən dəyişikliklər həmişə 100% görünür, izlənilə bilər və hesabat verir. Tarix həmişəlik Git anbarında saxlanılır və tarixin istənilən nöqtəsinə qayıtmaq asan bir şeydir.

Niyə Kubernetesdən istifadə etməliyəm?

Konteynerlər artıq bulud hesablamasında böyük bir uğur hekayəsidir. Alətlər qutumuzda keçirdikləri nisbətən qısa müddətə baxmayaraq, müasir bulud kompüterlərinin ayrılmaz bir hissəsinə çevrildilər və bir çox populyar tətbiqetmələr tərəfindən istifadə olunur. Bununla birlikdə, konteyner sistemlərinin təşkili, idarə olunması və saxlanılması ilə bağlı səylər çox böyük ola bilər. Kubernetesin girdiyi yer budur. Kubernetes, konteynerləşdirmənin bütün güclü üstünlüklərindən istifadə edir və yerləşdirilməsini və idarə edilməsini asanlaşdıran bir platforma təmin edir.

Kubernetes, DevOps üçün bir vasitədir. Əsas DevOps təcrübələrini tətbiq etməyə kömək edir və şirkətlərin DevOps tətbiq etməsinə yol açır. Harada quraşdırdığınızdan asılı olmayaraq, istər dizüstü kompüterinizdə, istərsə də bulud təminatçınızda və ya yerli məlumat mərkəzinizdə, konteynerləşdirilmiş tətbiqlərinizin tamamilə uyğun mühitlərlə avtomatik yerləşdirilməsini təmin edir. Kubernetes ilə yerində qurma və müvəffəqiyyətlə sınaq günləri bitdi, yalnız tətbiqinizin test və ya istehsal mühitində fərqli davrandığını tapmaq üçün!

YATR? (Başqa bir təlimat, doğrudanmı?)

Orada bir çox Kubernetes təlimatı var, niyə başqa birini yazmalısan? Yaxşı sual! Əyləncəli və müştərilər üçün Kubernetes qruplarını qurarkən, istehsal üçün hazırlana bilən AWS üzərində bir klaster qurmaq üçün lazım olan bütün parçaları ümumiləşdirən bir təlim görmədik. Sənədlərin əksəriyyəti orada, ancaq onu izləmək və hər vəziyyətdə necə işlədiyini öyrənmək bir xəzinə ovudur. Bu, ilk Kubernetes pilotlarına başlayan və ya yerli Minikube qrupundan çıxan hər kəs üçün xüsusilə çətinləşdirir.

Bu təlimatın məqsədi bu boşluğu aradan qaldırmaq və Kubernetes klasterinin quruluşunu addım-addım izah etməkdir:

  • Yüksək mövcudluq: Bəzi qovşaqlarımız aşağı düşərsə və ya AWS Mövcudluğu Bölgəsi aşağı düşərsə mühitlərimizin səhvləri həll edə biləcəyinə və konteynerli tətbiqetmələrimizin işləməyə davam etdiyinə əmin olmaq istəyirik. Buna nail olmaq üçün Kubernetes ustaları və qovşaqları 3 AWS Mövcudluğu Bölgəsində işləyir.
  • Ən az imtiyaz prinsipini tətbiq edir: Varsayılan olaraq bütün Podlar məhdudlaşdırıcı təhlükəsizlik kontekstində işləməlidir. Kubernetes qrupunda və ya əsas AWS mühitində dəyişiklik edə bilməməlisiniz. Kubernetes klasterində dəyişiklik etməsi lazım olan hər hansı bir pod, uyğun rol və qaydalarla adlandırılmış bir xidmət hesabından istifadə etməlidir. Bir qabın AWS API-yə zəng etməsi lazımdırsa, podun lazımi icazələrə sahib olmasını və yalnız müvəqqəti IAM etimadnaməsini istifadə etməsini təmin etmək üçün zənglər yönləndirilməlidir. Podların standart olaraq işlədiyini və klaster konfiqurasiyasının dəyişdirilə bilməməsini təmin etmək üçün bunu Kubernetes 'Role Based Access Control (RBAC) istifadə edərək edirik. Bəzi klaster xidmətləri icazə tələb edirsə, müəyyən bir xidmət hesabı yaradırıq, onu tələb olunan icazə aləminə bağlayırıq (yəni çoxluqda və ya yalnız bir ad məkanında) və bu xidmət hesabına lazımi icazələri veririk. AWS API-yə giriş kube2iam vasitəsi ilə həyata keçirilir. AWS API üçün nəzərdə tutulmuş qablardan gələn bütün trafik kube2iam-a yönləndirilir. Pod konfiqurasiyalarındakı şərhlərə əsasən, kube2iam, şərhdə göstərilən rola uyğun gələn müvəqqəti etimadnaməni əldə etmək və zəng edənə qaytarmaq üçün AWS API-yə zəng edir. Bütün digər AWS API zəngləri, ən az imtiyaz prinsipinin tətbiq olunmasını və siyasətlərin atlatılmamasını təmin etmək üçün kube2iam vasitəsilə yönləndirilir.
  • Route53 və Klassik Yük Balanslaşdırıcılarına inteqrasiya olunmuşdur: Bir tətbiq yerləşdirdiyimiz zaman konfiqurasiyada dünyaya necə təqdim ediləcəyini və harada tapılacağını elan etmək və bunu bizim üçün avtomatlaşdırmaq bacarığına sahib olmaq istəyirik. Kubernetes avtomatik olaraq bir tətbiqə Klassik bir Yük Balanslaşdırıcısı təqdim edir və xarici-dns bizə kod olaraq alt quruluşda istifadəsi asan bir tam keyfiyyətli domen adı (FQDN) təyin etməyimizə imkan verir.
  • Əsas bir CI / CD boru kəməri örtülüdür: klasterdə necə dəyişiklik etdiyimizi və tətbiqləri necə yerləşdirdiyimizi / yenilədiyimizi avtomatlaşdırmaq istəyirik. Küme konfiqurasiyamızı göstərən konfiqurasiya sənədləri Git deposuna ötürülür və CI / CD boru kəməri onları klasterə tətbiq edir. Buna nail olmaq üçün Travis-CI-ni əsas qolumuzda olan konfiqurasiyanı Kubernetes qrupuna tətbiq etmək üçün tətbiq edirik. Bu, GitOps-a doğru ilk addımdır, lakin bizə tam GitOps qabiliyyətini vermir.

Təlimatın sonunda belə görünən bir Kubernetes qrupu əldə edirik:

Son vəziyyətimiz olan Kubernetes qrupu

Başlamadan əvvəl

Kubernetes ilə artıq tanış olduğunu düşünürük. Kubernetes ilə yenisinizsə, Kubernetes əsasları təlimini oxuyun və əsas anlayışlarla tanış olun.

Klasterimizi yaratmaq üçün aşağıdakı alətlərin quraşdırıldığından əmin olmalıyıq:

  • kubectl kubectl (Kubernetes Control) bir kompüterdə (Minikube ilə) və ya buludda yerli olaraq işləyən bir Kubernetes qrupu ilə qarşılıqlı əlaqə qurmaq üçün bir komanda xətti vasitəsidir.
  • kops Kubernetes Əməliyyatlar (kops) layihəsi, buludda Kubernetes qruplarının yaradılması və istismarı üçün alətlər təqdim edir. Google Cloud & AWS (beta-dakı digər provayderlərlə birlikdə) hazırda dəstəklənir. Bu təlimatda Kops istifadə edərək klasterimizi yaradaraq idarə edəcəyik.
  • Terraform Terraform, istifadəçilərə infrastrukturu yüksək səviyyəli bir konfiqurasiya dilində müəyyənləşdirməyə imkan verən bir IAC (İnfrastruktur Kod kimi) vasitədir, daha sonra AWS və ya Google Cloud Platform kimi bir xidmət təminatçısında infrastruktur qurmaq üçün istifadə edilə bilər. Kops sahəmizi yaratmaq və Kops'un yaratdığı IAM siyasətlərini dəyişdirmək üçün Terraform'u istifadə edəcəyik.
  • AWS CLI AWS CLI, AWS ilə əlaqə qurmaq üçün bir əmr sətri vasitədir. Bu, AWS-də əməliyyatlar aparmaq üçün kops & Terraform tərəfindən tələb olunur.

Quraşdırma təlimatları üçün verilən bağlantılara baxın.

Bu təlimat Kubernetes v1.8 və kops v1.8.1 ilə yaradılmışdır.

Mac OS X-i homebrew ilə idarə edirik. Bunu qurmaq üçün yalnız aşağıdakı əmrləri işə salmaq lazımdır:

$ brew update $ brew install kubectl $ brew install kops $ brew install python3 $ easy_install pip $ pip install awscli - upgrade - user $ export PATH = ~ / .local / bin: $ PATH $ brew install terraform

Küməni yaradın

Adım 1: depomuzu klonlayın

$ git klonu https://github.com/slalom-london/k8s-tutorial

Addım 2: Route53-də klaster üçün istifadə ediləcək bir FQDN qurun

Quracağımız Kubernetes qrupu, xidmət son nöqtələrini və API nəzarət təyyarəsini təmin etmək üçün Route53-də yerləşdirilən bir FQDN istifadə edir. Yeni bir FQDN qeyd edə və ya mövcud bir FQDN köçürə bilərsiniz. Bu seçimlərdən hər biri üçün AWS aşağıdakıları həyata keçirir:

Adım 3: Kops üçün tələblər yaradın

Kops'un klaster yaratması üçün, S3 anbarının klaster konfiqurasiyasını və aşağıdakı qaydalara əlavə edilmiş bir IAM istifadəçi hesabını saxlaması lazımdır:

AmazonEC2FullAccess AmazonRoute53FullAccess AmazonS3FullAccess IAMFullAccess AmazonVPCFullAccess

prereqs / kops_pre_reqs.tf bunu sizin üçün yaradacaq. Terraform statusumuz üçün uzaqdan saxlama yeri olaraq istifadə ediləcək bir S3 vedrə də yaradacaq. Bu, birdən çox istifadəçiyə bir infrastruktur dəsti ilə ziddiyyət olmadan kod kimi işləməyə imkan verir. {My_bucket_name} və {my_tf_bucket_name} seçdiyiniz vedrə adı ilə əvəz etmək üçün sənədi yeniləməlisiniz.

Sonra aşağıdakı əmrləri işə salın:

$ cd tələbləri $ terraform init $ terraform planı $ terraform tətbiq olunur

AWS hesabınıza daxil olduqda, yeni yaradılmış Kops IAM istifadəçisi, Kops dövlət mağazası üçün S3 vedrə və Terraform dövlət mağazası üçün başqa S3 vedrə görəcəksən.

Adım 4: Kümeyi gücləndirmək üçün Kops istifadə edin

Əvvəlki addımda Kops üçün bir IAM hesabı yaratdıq. İndi bu hesabı istifadə etmək üçün AWS CLI müştərimizi qurmalıyıq. Terraformun əvvəlki addımda yaradılan vəziyyəti saxlamaq üçün istifadə etdiyi sənəddən Kops IAM ID və Secret əldə edə bilərik. Mətn redaktorunuzda terraform.tfstate açın və aşağıdakı bölməni tapın:

{İam_id} və {aws_secret_key} sahələrində dəyəri qeyd edin və aşağıdakı əmri işə salın:

$ aws configure --profile kops AWS Access Key ID [none]: {iam_id} AWS Secret Access Key [none]: {aws_secret_key} Default region name [none]: {your_chosen_aws_region} Default output format [none]: Mətn

Bundan sonra bəzi mühit dəyişənlərini təyin etməliyik ki, kops hansı AWS IAM hesabından istifadə edəcəyini və dövlət mağazasını harada yerləşdirəcəyini bilsin:

$ ixrac AWS_PROFILE = kops $ ixrac KOPS_STATE_STORE = s3: // {my_bucket_name}

İndi əsas hadisə üçün - klasterimizi qurmaq üçün Kops istifadə edək. AWS Regionunuzu, DNS Zonanızı və seçdiyiniz klaster adını əvəz edərək aşağıdakı əmri işə salın:

$ kops klaster yaradır --cloud aws \ --bastion \ --Node-Count 3 \ --node-size t2.medium \ --master size t2.medium \ --Zonen {your_selected_Aws_Region} a, {your_selected_Aws_Region} b, { your_selected_Aws_Region} c \ --Masterzones {your_selected_Aws_Region} a, {your_selected_Aws_Region} b, {your_selected_Aws_Region} c \ --dns-zone {your_dns_zone} \ - topology private \ --ingwork calico Sizin_cluster_adiniz} \ --out = k8s \ - target = terraform - yes

Bu əmr kops-a bir klaster yaratmaq istədiyimizi bildirir:

  • AWS istifadə edir
  • Müəyyən edilmiş mövcudluq zonalarının hər birində t2.medium ölçülü bir ana düyünə malikdir
  • T2. orta ölçülü 3 işləmə qovşağına malikdir. Kops, işçi qovşaqlarını bütün mövcudluq zonalarına bərabər şəkildə paylayır
  • Xüsusi şəbəkə topologiyasından istifadə edir. Bu, bütün qovşaqların özəl IP ünvanlarına sahib olduqlarını və ümumi İnternet üzərindən birbaşa əldə edilə bilmədiklərini göstərir
  • Calico'yu konteyner şəbəkəsi interfeysi kimi istifadə edir və xüsusi şəbəkə topologiyasının tələblərinə görə Kubenet'i əvəz edir
  • Kubernetes giriş icazələri üçün RBAC istifadə edir
  • --Out tərəfindən göstərilən qovluğa yazılacaq bir Terraform konfiqurasiya sənədində təsvir edilmişdir

kops, klaster yaratmaq üçün istifadə edilə bilən yeni yaradılmış bir k8s qovluğunda bir sıra Terraform konfiqurasiya sənədləri yaradır. Kümemizi yaratmazdan əvvəl, Terraform'a yeni yaratdığımız S3 vedrədə status saxlamağı tələb edən bir konfiqurasiya faylı əlavə edək.

$ Cd k8s $ terraform init $ terraform plan $ terraform tətbiq edin

Klasterinizin istifadəyə verilməsi üçün 10 ilə 15 dəqiqə arasında vaxt lazımdır. Aşağıdakı əmri işə salmaqla klasterin vəziyyətini yoxlaya bilərsiniz:

$ kops qrupları təsdiqləyir

Klaster bitdikdə aşağıdakı kimi nəticəni görməlisiniz:

Kümenin Kubectl kontekstindən istifadə edilməsi: cluster.zigzag-london.com
Cluster.zigzag-london.com saytını yoxlayın
TƏŞKİLAT QRUPLARI ADI ROL MACHINE TİPİ MIN MAX SUBNETS Bastions Bastion t2.micro 1 1 utility-au-west-1a, utility-eu-west-1b, utility-eu-west-1c master-eu-west-1a master t2.medium 1 1 au-west-1a master-au-west-1b master t2.medium 1 1 au-west-1b master-au-west-1c master t2.medium 1 1 au-west-1c qovşağı t2.medium 3 3 ab-west -1a, ab-qərb-1b, ab-qərb-1c
DÜĞÜN DURUMU ADI ROLU HAZIR ip-172-20-107-234.eu-west-1.compute.internal master Doğru ip-172-20-124-39.eu-west-1.compute.in daxili node True ip-172 -20-44-152.eu-west-1.compute.internal master True ip-172-20-60-188.eu-west-1.compute.internal node True ip-172-20-79-79.eu -west-1.compute.internal master true ip-172-20-87-125.eu-west-1.compute.internal node true
Cluster.zigzag-london.com klasteriniz hazırdır

CI / CD mühitinin qurulması

GitOps-u tətbiq etmək üçün anbarımızı izləmək və yeniləmələri işə salmaq üçün bir CI / CD mühitinə ehtiyacımız var. Bu təlimatda, hər anbarımızın əsas şöbəsinə basdıqda hazırlıq mərhələlərini yerinə yetirmək üçün CI / CD mühitimizi konfiqurasiya edəcəyik. Nümayişi asanlaşdırmaq üçün edirik. İnkişaf etdiricilərə buna icazə vermək qətiliklə pis bir təcrübədir. Gerçək bir layihədə kod təhlili və inkişaf meneceri üçün təsdiqləmə addımı ilə bir xüsusiyyət dallanma strategiyasını tövsiyə edirik.

Bu təlimat üçün bulud əsaslı bir CI xidməti olan TravisCI-dən istifadə edirik. TravisCI bu müddətdə pulsuzdur:

  • Depolarınızı Github-da yerləşdirirlər
  • Anbar ictimaiyyətə açıqdır

Adım 1: hesablar qurun və depo klonlayın

  • GitHub-a gedin və daxil olun
  • Yeni, boş bir anbar yaradın və adını "k8s-ci" qoyun.
  • Yerli kompüterinizdə bu deposu klonlayın:
$ git klonu
  • TravisCI-yə gedin və GitHub hesabınızla daxil olun. Sağ üst küncdə adınızı tıklayaraq istifadəçi profilinizə gedin.
  • Bu depo üçün TravisCI-ni aktivləşdirmək üçün GitHub deposunun yanındakı sürgünü vurun.

Adım 2: quraşdırma tetikleyicisi

GitOps tətbiq etdiyimiz üçün yalnız təsdiqlənmiş bir çəkiliş istəyi üzərində qurmaq istəyirik. Bunu Travis-də Daha çox Seçim → Ayarlar vuraraq konfiqurasiya edə bilərsiniz.

  • Push Branchların qurulduğundan əmin olun
  • "Push-pull istəkləri yaradın" qeyd olunduğundan əmin olun

Travis təlimatların çoxunu depoda saxlanılan Yaml sənədindən alır. Anbarınızın kökündə .travis.yml adlı boş bir fayl yaradın və onu deposumuzdakı .travis.yml faylından sazlaya bilərik:

  • Sətir 1: master filialında yalnız bir quruluşun aparılmalı olduğunu göstərir. Həqiqi bir dünya mühitində, ehtimal ki, bir filialı da itələməyi həyata keçirəcəyik, ancaq istehsal mühitində deyil, bir test mühitində. Bir üsul, yerləşdirmə skriptinə şərti məntiq tətbiq etmək üçün mühit dəyişkənlərindən istifadə etməkdir. Ancaq bu yazı üçün buna icazə verilmir.
  • Sətir 4: Bağımlılığımızı qurmaq üçün sudo ilə kök imtiyazlarına ehtiyacımız olduğunu göstərir
  • Sətir 5: Bu, hər bir skriptimiz üçün icrası mümkün hala gətirmək üçün icazə təyin etdiyimiz blokun başlanğıcıdır.
  • Sətir 10: Bu, faktiki yerləşdirməni həyata keçirən skriptləri işə salmadan əvvəl CI mühitini qurmaq üçün əvvəlcə işlədilməsi lazım olan skriptləri göstərdiyimiz blokun başlanğıcıdır.
  • Sətir 13: Bu, yerləşdirmə tapşırıqlarını yerinə yetirmək üçün işə salınacaq skriptləri göstərdiyimiz blokun başlanğıcıdır.

Adım 3: sirləri idarə edin

AWS sirlərimizi açıq havada açıq saxlamaq istəmirik. Bu son dərəcə pis bir informasiya təhlükəsizliyi praktikası olardı. Travis, yaradılış zamanı vurulacaq sirrlərinizi saxlamaq üçün istifadə edilə bilən bir CLI vasitəsi təqdim edir. Travis hər yeni hesab üçün yeni bir cüt ictimai və özəl açar yaradır. Bu sirlər bu açar cüt ilə şifrələnir və quruluş hər dəfə işlədildikdə mühit dəyişkənləri kimi daxil edilir. Bunu etmək üçün deposunuzun kökündən aşağıdakı əmrləri işə salın və tələb olunan məlumatlarla daxil olun:

$ sudo gem quraşdırma travis $ travis giriş --org

Anbarımızın qurma skriptləri kataloqunda əvvəlcədən quraşdırılmış iki ssenari var ki, sirlərinizi daxil edə bilərsiniz. Build_scripts qovluğunu k8s təlimat deposumuzun yerli nüsxəsindən öz k8s-ci deposunuza kopyalayın və aşağıdakı kimi yeniləyin:

  • large -rets.txt: Kubernetes giriş düymələrinizi əlavə edin. Bunu ~ / .kube / config-da tapa bilərsiniz
  • setup-secrets.sh: Kubernetes parolunuzu (yenidən ~ / .kube / config-da tapın) və ~ / .aws / etimadnaməsində AWS giriş düymələrini əlavə edin.

Ardından deposunuzun kökündən setup-secrets.sh skriptini aşağıdakı əmrlə çalıştırın:

$ chmod 755 build-scripts / setup-secrets.sh $ ./build-scripts/setup-secrets.sh

Sırların şifrəsini açmaq üçün lazım olduğu üçün setup-secrets.sh skriptinin sonradan qayıtdığına dair opensl əmrini qeyd edin.

Bu skript sirlərinizi Travis ilə şifrələyir və .travis.yml dosyanızı yeniləyir. Şifrələnmiş sirləri anbarınıza köçürün:

$ git build-scripts / large -rets.txt.enc .travis.yml əlavə et $ git commit -m "Şifrələnmiş sirləri həyata keçirin"

Artıq sirləriniz Travis-də saxlanıldığından, onları bütün fayllardan və skriptlərdən çıxarmağınızı şiddətlə tövsiyə edirik. Təsadüfən mənbə nəzarəti sirlərini açmaq çox asan ola bilər və müəllifləriniz də bu günahda günahkardırlar! Təsadüfi sirləri tapmaq üçün git-secret istifadə edirik. Bunu aşağıdakı addımlarla qura bilərsiniz:

$ brew install git -rets $ git -rets --install

Adım 4: asılılıqları qurun

TravisCI hər quruluşu təmiz bir Docker konteynerində çalışdırdığından, hər dəfə asılılıqlarımızı qurmalıyıq. Bu asılılıqlar bu məqalənin "Başlamadan əvvəl" bölməsində təsvir olunanlarla eynidir. Build -dependencies.sh adında bir fayl build-scripts qovluğunda yaradın və aşağıdakı konfiqurasiyanı yapışdırın:

İndi bu faylı anbarınıza köçürün:

$ git install-dependencies.sh əlavə et $ git commit -m "asılılıq qurmaq üçün bir skript əlavə et"

Adım 5: sirlərimizi aşılayın

İndi qurma addımlarımızı yerinə yetirəcəyimiz Docker konteynerində sirlərimizi qurmaq üçün bir skriptə ehtiyacımız var. Build-scripts qovluğunda inject-secrets.sh adlı bir fayl yaradın. Aşağıdakı skripti yapışdırın və aşağıdakı kimi yeniləyin:

  • {Buradakı klaster urlunuzu} Kubernetes klasterinizin urli ilə əvəz edin
  • Bu hissənin 3-cü addımında yazdığınız OpenSSL əmrini {buradakı şifrələmə mərhələsindən opensl əmrinizlə} əvəz edin və large -rets.txt.enc-dən əvvəl ./build-scripts/ əlavə edin.
  • {Your-aws-region} -u istifadə etdiyiniz AWS bölgəsi ilə əvəz edin

Bu skript sirlərimizi Travis mühitindən alır, şifrəsini açır və uyğun konfiqurasiya sənədlərinə daxil edir.

Yuxarıdakı skriptdə kub skonfiq adlı yığma skriptlər qovluğundakı bir sənəd olduğunu görəcəksiniz - bunu da yaratmalıyıq. Aşağıdakı məzmuna yapışdırın və {buradakı klaster url} dəyişəninizi Kubernetes klasterinizin url ilə dəyişdirin.

Bu iki faylı anbarınıza köçürün:

$ git add inject-secrets.sh kubeconfig $ git commit -m "Sirlər və Kubeconfig faylı əlavə etmək üçün bir skript əlavə edirik"

Addım 6: mühiti qurun

Tətbiqləri yerləşdirməmişdən əvvəl kube2iam və external-dns üçün konfiqurasiyanı yerləşdirərək klaster hazırlamalıyıq. Bu alətlərin hər biri üçün konfiqurasiya müəyyən bir qaydada tətbiq olunmalıdır:

  • Yeni AWS IAM rolu (və bu rol üçün lazımlı siyasət tapşırıqları) və qovşaqların işlədiyi AWS IAM roluna etibar əlaqəsi yaratmaq üçün Terraform konfiqurasiyasını tətbiq edin. Güvən əlaqəsi bir düyünün yeni IAM rolunu almasına imkan verir.
  • Bir xidmət hesabı yaratmaq, lazımi bir imtiyaz aləminə bağlamaq və bu xidmət hesabına lazımi imtiyazları vermək üçün Kubernetes'in RBAC konfiqurasiyasını tətbiq edin. Bu xidmət hesabı daha sonra hər xidməti təmin edən qabların konfiqurasiyasının bir hissəsi kimi göstərilir.
  • Xidmətlərin təmin edilməsi üçün Kubernetes konfiqurasiyalarını tətbiq edin. Tətbiq olunan xidmətdən asılı olaraq Kubernetes yerləşdirilməsi və ya DaemonSet ola bilər.

Dağıtım skriptimizi elə edəcəyik ki, klaster həmişə əvvəlcə konfiqurasiya edilsin.

Qovluğu xarici-dns və kube2iam üçün şablonlarla qovluğu anbarınıza köçürün.

Əvvəlcə Terraform konfiqurasiyamızı tətbiq edəcək bir skript hazırlayacağıq. Build-scripts qovluğunda deploy-terraform.sh adlı bir fayl yaradın və aşağıdakı kodu əlavə edin:

Bu skript deposumuzdakı qovluq quruluşundan təkrarlanır və tapdığı bütün Terraform konfiqurasiya sənədlərini tətbiq edir.

(Qeyd: Gerçək bir dünya istehsal mühitində, Terraformun zərərli bir şəkildə istifadə edilmədiyinə əmin olmaq üçün CI boru kəmərimizi nəzərdən keçirərdik.)

Bunu deposunuza tətbiq edin:

$ git add deploy-terraform.sh $ git commit -m "terraform yerləşdirmə skriptini əlavə et"

İndi 3 xidmətimizin hər biri üçün Terraform konfiqurasiyasını yeniləyə və anbara köçürə bilərik:

  • External_dns / pod-role-trust-policy.json-ı güncəlləyin və {your-node-iam-role-arn} -ı klasterinizdəki Kubernetes qovşaqları üçün IAM-ARN ilə əvəz edin. Bu, aşağıdakı əmri işə salmaqla müəyyən edilə bilər:
$ aws iam list-rolls | Grep düyün
  • {Your-aws-region} -u işlədiyiniz AWS Region və {your-tf-bucket} -ni Terraform dövlət mağazanızın olduğu vedrənin adı ilə əvəz etmək üçün external_dns / main.tf-i yeniləyin. xilas etdik.

Xidmət konfiqurasiyasını deposunuza tətbiq edin:

$ git external_dns / pod-role-trust-policy.json external_dns / external-dns-iam-setup.tf external_dns / external-dns-role-Rights.json external_dns / main.tf $ git commit -m "Cluster Terraform- Xidmət konfiqurasiyası əlavə edin "

Travis, konfiqurasiyanı hər dəfə basdıqda masterə tətbiq etmək üçün konfiqurasiya edilmişdir. Beləliklə, indi təkan verin:

$ git push

AWS hesabımıza tətbiq olunan bütün Terraform konfiqurasiyası iş jurnalında görünməlidir.

İndi Kubernetes mühitinin ehtiyac duyduğu bütün IAM rollarını və etibar əlaqələrini yaratdıq.

Bundan sonra Kubernetes konfiqurasiyalarını ətraf mühit tələblərinə uyğun tətbiq etmək üçün bir skriptə ehtiyacımız var. Bu addımı başa çatdırmaq üçün aşağıdakı faylları depodan öz anbarınıza kopyalayıb yeniləməlisiniz.

  • external_dns / external_dns.yaml: {your-DNS-Zone} -u istifadə etdiyiniz DNS zonası ilə, {your-ID} -ni xarici-dns tərəfindən yaradılan DNS girişlərini ehtiva edən bir şeylə əvəz edin (məs. adınız) və Terraform konfiqurasiyası tətbiq olunduqda yaradılan rol üçün {your -external-dns-iam-role-arn} və IAM ARN ilə. Bu, aşağıdakı əmri işə salmaqla müəyyən edilə bilər:
$ aws iam get-role - rol adı xarici_dns_pod_role
  • kube2iam və rbac /: Yeniləmə tələb olunmur

Bu yeniləmələr AWS API-yə girməli olduqları zaman hər podun hansı IAM rolunu oynaması lazım olduğunu göstərir.

İndi bu faylları depoya köçürün:

$ git add external_dns / external_dns.yaml rbac / kube2iam / $ git commit -m "k8s üçün xarici DNS konfiqurasiyası əlavə et"

İndi Kubernetes xidmətləri üçün yerləşdirmə skriptimizi yaradacağıq. Build-scripts qovluğunda deploy-k8s.sh adlı bir fayl yaradın. Faylın başlığı ilə belə başlayın:

Sonra, Kubernetes RBAC konfiqurasiyasını klasterə yerləşdirəcək aşağıdakı addımları əlavə edin:

Bu addımlar zəruridir, çünki xarici DNS xidmətinin bu xidməti çalıştırması və klasterə təqdim etməsi üçün Kubernetes API hüquqlarına ehtiyacı var. Xatırladaq ki, RBAC qabların standart olaraq Kubernetes API-yə daxil olmasını təmin edir. Bu, ən az imtiyaz prinsipinə uyğundur və hər hansı bir səbəbdən güzəşt edilərsə, qabıqların klaster parametrlərini dəyişdirməsinin qarşısını alır.

TravisCI-nin bu dəyişiklikləri tətbiq etməsi üçün .travis.yml-ə deploy-k8s.sh işlətmək üçün əlavə bir addım əlavə etməliyik. Öncədən yüklə bölməsinə aşağıdakıları əlavə edin:

- chmod + x ./build-scripts/deploy-k8s.sh

Və ssenaridə aşağıdakılar: Bölmə:

- "./build-scripts/deploy-k8s.sh"

İndi deploy-k8s.sh, .travis.yml köçürün və deposunuzu masterə köçürün və Travis build jurnalında səhv olmadığından əmin olun:

$ git build-scripts / deploy-k8s.sh .travis.yml $ git commit -m "k8s konfiqurasiyasını yerləşdirmək üçün Travis konfiqurasiyasını əlavə edin" $ git push

Terraform və RBAC konfiqurasiyasını CI / CD boru kəmərimizə əlavə etdikdən sonra kube2iam-ı yerləşdirmək üçün deploy-k8s.sh skriptimizə aşağıdakı addımları əlavə edək:

kube2iam əvvəlcə yerləşdirilir, çünki xarici-dns AWS API-ni kube2iam ilə vasitəçi adlandırır.

İndi deposunuzu ustaya köçürün və yığım jurnalında səhv olmadığından əmin olun:

$ git build-scripts / deploy-k8s.sh add $ git commit -m "K8s konfiqurasiyasını təmin etmək üçün Travis konfiqurasiyasını yeniləyin" $ git push

İndi bütün xidmətlərin düzgün təmin olunduğundan əmin olmaq üçün klasterimizi yoxlayın. external-dns bir yerləşdirmədir, buna görə vəziyyəti almaq üçün aşağıdakı əmri çalışdıra bilərik:

$ kubectl dağıtımları almaq --namespace = kube-sistem

Hər şey düzgün bir şəkildə həyata keçirildisə, görməlisiniz:

TƏLƏBLİ AD VƏZİFƏTİ YAŞ KALİKO-KUBE-nəzarətçi 1 1 1 1 1 saat calico-policy-controller 0 0 0 0 1h DNS-Controller 1 1 1 1h xarici-dns 1 1 1 1 1m kube-dns 2 2 2 2 1h kube -dns-autoscaler 1 1 1 1 1h

kube2iam bir DaemonSet olaraq yerləşdirilir, çünki AWS API-yə zəngləri ötürmək üçün bütün qovşaqlarda işləməlidir. Statusunu almaq üçün aşağıdakı əmri işə salırıq:

$ kubectl --namespace = kube sistemini alır

Hər şey qaydasındadırsa, belə bir şey görməliyik:

Arzu olunan ad, hal-hazırda mövcud olan düyün seçmə yaşı Kalikokknoten 6 6 6 6 6 1h kube2iam 3 3 3 3 3 7m

Adım 7: Bir test tətbiqini yerləşdirin

İndi klasterimizi qurmaq üçün apardığımız zəhmətdən faydalanmağın və iş axınımızın və infrastrukturumuzun gücünü bir test tətbiqini asanlıqla yerləşdirmək üçün kod kimi görməyin zamanıdır!

Əvvəlcə tətbiqlərimizi yerləşdirəcək deploy-k8s.sh skriptimizə bir yerləşdirmə addımı əlavə etməliyik:

Bu addım, deposumuzun tətbiq qovluğundakı bütün Kubernetes konfiqurasiya sənədlərini klasterə tətbiq edir. Bu dəyişikliyi tətbiq edin və masterə göndərin:

$ git build-scripts / deploy-k8s.sh add $ git commit -m "Tətbiqlər üçün k8s konfiqurasiyasını yerləşdirmək üçün Travis konfiqurasiyasını yeniləyin" $ git push

GitOps-a getməzdən əvvəl, bir test tətbiqini yerləşdirmək üçün bir GitOps proses axınını izləyək:

  • Aşağıdakı əmri işə salmaqla yerli bir filial yaradın:
$ git checkout -b testapp
  • Anbarınızda tətbiqlər adlı bir qovluq yaradın
  • Tətbiqlər qovluğunda hello_app_deployment.yaml adlı bir fayl yaradın və aşağıdakıları əlavə edin:

Bu konfiqurasiya 2 hissədən ibarətdir:

  1. Dağıtım: Bu, çalıştıracağımız konteynerin detallarını, əldə edilə bilən mənbələrin miqdarını, konteynerdəki tətbiqetmənin hansı portuna daxil ola biləcəyini və çalıştırmak istədiyimiz bu tətbiqin kopyalarının sayını verir. Bu vəziyyətdə "Salam, globe!" Adlı sadə bir konteyner işlədəcəyik. Və sonra konteynerin ana adını 8080 portuna çıxarır. Üç replika çalışdığımızı bildiririk - hər bir klaster qovşağımız üçün bir.
  2. Xidmət: Yerləşdirmənin daxili və ya xaricdən necə hazır olacağını müəyyənləşdirir. Test tətbiqetməmiz halında, port 80-dəki klaster IP-də daxili olaraq açıqlayırıq. Tətbiqimizə daxil ola biləcəyimiz istifadəçi dostu FQDN-i də təmin edirik (məs. Saluation.yourdomain.com). {Burada FQDN-nizi} dost FQDN ilə əvəz etməlisiniz.

İndi bu faylı yerli filialınıza köçürün və filialı uzaq depoya köçürün:

$ git add hello_app_deployment.yaml $ git commit -m "test tətbiqi əlavə et" $ git push -u mənşəli testapp

İndi GitHub'a daxil olduqda "testapp" adlı yeni bir filialımız olduğunu görməliyik:

Bir çəkmə sorğusunu tetikleyip ustaya birləşdirmək istəyirik. Buna görə "Tələbi müqayisə et və çək" düyməsini vurun və bu fəaliyyəti tamamlamaq üçün təlimatları izləyin.

Dağıtım tamamlandıqdan sonra aşağıdakı əmrləri işə salmaq və oxşar nəticəni yoxlamaqla test tətbiqetməmizin düzgün yerləşdirildiyini yoxlaya bilərik:

$ kubectl almaq yerləşdirmə salamları-yerləşdirmə
ADI TƏLƏB OLUNAN Cari mövcud yaş. Ünvan forması 3 3 3 3 24d
$ kubectl xidmətlər alır Salamlama xidməti
ADI KLİSTER-IP Xarici-IP PORT (lar) ALTER Salamlama Xidməti 100.65.66.9 a78b874f74ed0 ... 80: 32439 / TCP 6d

Ancaq əsl sübut, dost FQDN vasitəsilə tətbiqetməyimizlə əlaqədir! Hər şey düzgün bir şəkildə yerləşdirilibsə, görməlisiniz:

Uğur! Bu səhifəni indi yeniləsəniz, fərqli bir Kubernetes düyünündə işləyən tətbiqə daxil olmaq üçün brauzeriniz Klassik Yük Balanslaşdırıcıdan istifadə etdikdə host adı dəyişməlidir.

Xülasə

Bu təlimatda bir sıra yaxşı təhlükəsizlik standartlarına sahib bir Kubernetes klasteri qurduq və sonra onu sadə bir CI / CD boru kəməri ilə bükdük. Daha sonra CI / CD boru kəməri və Kubernetes klasterimizdən istifadə edərək sadə bir konteynerləşdirilmiş tətbiqetmənin necə yerləşdiriləcəyini və avtomatik olaraq yerləşdiriləcəyini müəyyən etmək üçün İnfrastrukturu istifadə etdik.

Bu, Kubernetesin alət zəncirinizə əlavə edildiyi zaman inkişaf etdiricilərinizə və DevOps bacarıqlarınıza gətirə biləcəyi çoxsaylı faydaların sadəcə sadə bir nümunəsidir!