Uygulamanızı Google Kubernetes Engine'de barındırın

Unsplash üzerinde True Agency tarafından fotoğraf
Bir geliştirici olarak, yaratılışınızı her zaman için bir Platform Olarak Servis Platformundan başka bir platformda, örneğin Heroku'da barındırmak korkutucu bir iştir.

Bu makalede, bir uygulamayı bir Altyapıya Hizmet olarak dağıtma sürecinde, örneğin Google Kubernetes Engine olarak işlemden geçireceğim ve "düşük seviye" barındırma hizmetleri konusundaki korkunuzu gidereceğini umuyorum.

kaynak: presslabs.com

Uygulamamıza ev sahipliği yapmak için aşağıdaki adımları izleyeceğiz:

  1. Kubernetes küme oluşturma
  2. Uygulamayı bağlantı kurma
  3. Kubernetes yapılandırmasını ayarlayın
  4. Nginx kurulumu ve yapılandırması
  5. DNS yapılandırması
  6. Güvenli Yuva Katmanı (SSL) sertifikaları sağlama

Uygulama

Uygulama React ve backend (Python Flask ve veritabanı ile Postgresql ile oluşturulan API) ile oluşturulmuş bir ön yüze sahiptir.

Tepki, Python şişesi ve Postgres
Bu temelde 3 katmanlı mimarinin bir uygulamasıdır; sunum katmanı (frontend), mantık katmanı (API) ve veri katmanı (veritabanı) hepsi ayrı ve bağımsız.
Uygulama, bir kullanıcının orada nasıl başarılı olacağına dair eylem öğeleriyle birlikte kova listesi öğelerini kaydedebileceği bir “kova listesi” uygulamasıdır.

Bu uygulamayı GKE'de barındırmanın ilk adımı, onu dockize etmektir. Diğer bir deyişle, uygulamanın 3 aşamasının her birini sabitlemek. Takip etmek için bu depoyu klonlayın.

Ön şartlar

Bu makalede kullanacağımız araçlar aşağıdakileri içerir:

  1. kubectl
  2. gcloud
  3. liman işçisi
  4. google bulut projesi

Yukarıdaki araçları ayarlamanızı sağlamak için ekrandaki talimatları izleyin. Bu, google bulut hesabınıza giriş yapmanızı içerebilir.

Bunların kurulumunu henüz yapmadıysanız, devam edin ve bu bağlantılar üzerinden kurulum yapın. Onlara zaten kurulum yaptıysanız, eşleşelim.

Kubernetes küme oluşturma

Bir kubernet kümesi oluşturarak başlayalım ve bu sırada yeni oluşturulan küme ile etkileşime girebilmek için gerekli tüm bilgileri yapılandırın.

Kubernet'lerde küme oluşturmanın birkaç yolu vardır; bunlardan bazıları arasında google bulut konsolu, komut satırı (gcloud) veya REST kullanımı.

Bunun için komut satırı (gcloud) kullanacağız. Bu, çalışmakta olduğunuz bir geliştirici olarak çalıştığımız terminalimizden çalışmamızı sağlar. Devam et ve önce bu ortam değişkenlerini ayarla.

Tüm bu ortam değişkenlerini bir env.sh dosyasında bir araya getirdim, terminalinizde hepsini bir seferde doldurmak için “source env.sh” dosyasını çalıştırabilirsiniz.
  1. $ PROJECT: bu google proje kimliğidir. Oluşturduğunuz veya bu proje için kullanmak istediğiniz proje.
  2. $ CLUSTER: Bu, oluşturmak istediğiniz kümenin adıdır.
  3. $ ZONE: bu kümenin oluşturulacağı bölgedir.
  4. $ GCR_REGISTRY: Bu, konteyner görüntülerinizin bulunduğu gcr kayıt defteridir.
  5. $ FRONTEND_DOCKER_IMAGE_NAME: bu, ön uç konteyner resminizin olmasını istediğiniz resim adıdır.
  6. $ DATABASE_DOCKER_IMAGE_NAME: Bu, veritabanı kabı resminizin olmasını istediğiniz resim adıdır.
  7. $ BACKEND_API_DOCKER_IMAGE_NAME: api kabı görüntüsünün olmasını istediğiniz resim adı bu.

Kümeyi oluşturmadan önce, henüz sahip olmadığımız bilmecenin bir parçası daha var. Bir servis hesabı. buraya gidin ve bir hizmet hesabı oluşturun ve bu rolleri atadığınızdan emin olun:

  1. burada belirtildiği gibi roller / storage.admin
  2. rolleri / project.owner

Tüm bu ortam değişkenleri ayarlandıktan ve servis hesapları ve rolleri atandıktan sonra bu komutu çalıştırabilirsiniz:

gcloud beta container --project “$ PROJECT” kümeleri “$ CLUSTER” yaratır - - “$ ZONE”

Bu komutun tamamlanması birkaç dakika sürecektir. Tamamlandığında, yeni oluşturulan kubernet kümesiyle etkileşime girmeniz için gereken bilgileri de doldurmuş olacak.

Şimdi bir kümeye sahibiz, kubernet oyunları başlasın.

Uygulamayı bağlantı kurma

kaynak: cengn.ca

Uygulamayı, her katmanın kendi klasörüne sahip olacak şekilde ayarladım. Bu, her katmanın liman işçisi dosyasını düzenlemeyi kolaylaştırır.

Terminalinizde dizini ön uç klasörüne değiştirin. Bu uygulama sürüm kontrolü altında olduğundan, liman görüntüyü oluşturmak istediğiniz dalı kontrol ettiğinizden emin olun.

Sadece 3 katman boyunca organize edilmek üzere, docker ile ilgili tüm dosyaları docker / klasöre koyarım. Böylece, ön uç uygulama katmanı klasörünün kökündeyken bu komutu çalıştırın

liman işçisi -t $ GCR_REGISTRY / $ PROJECT / $ FRONTEND_DOCKER_IMAGE_NAME: v1 -f docker / Dockerfile.

Bu, ön uç katmanı için liman işçisi görüntüsünü oluştururken ve yapılandırırken çalışması birkaç dakika sürecektir. Derleme tamamlandığında, devam edin ve API ve veritabanı docker görüntülerini de oluşturun.

Hala terminalinizde, api klasöründe dizini değiştirin ve arka uç API'si docker görüntüsünü oluşturmak için bu komutu çalıştırın.

liman işçisi -t $ GCR_REGISTRY / $ PROJECT / $ BACKEND_API_DOCKER_IMAGE_NAME: v1 -f liman işçisi / Docker dosyası.

Ve sonunda veritabanı katmanı için hazırlanalım. Terminalinizde dizini veritabanı klasörüne çevirin ve çalıştırın:

liman işçisi -t $ GCR_REGISTRY / $ PROJECT / $ DATABASE_DOCKER_IMAGE_NAME: v1 -f liman işçisi / Docker dosyası.

Yukarıdaki komutların başarılı bir şekilde tamamlanmasıyla birlikte 3 adet liman işçisi resmimiz olacak; Masaüstü / dizüstü bilgisayarınızda yerel olarak Frontend, API ve Veritabanı. Devam edin ve k8s-configuration klasöründeki deployments.yaml dosyasını yeni oluşturulan liman görüntülerinin adlarıyla düzenleyin.

Google Kubernetes Engine'in bu görüntüleri kullanması için, bunları erişilebilir hale getirmemiz gerekiyor. Bunu yapmanın bir yolu, onları Google Konteyner Kayıt Defterine zorlamaktır.

Google Konteyner Kayıt Defteri, kaynak: blog.deimos.fr
Bu, Google Cloud Platform’un liman hub'ı sürümüdür; google’ın konteyner resim deposu.

Terminalinizde koşun:

gcloud auth configure-docker

Bu, docker’ı google bulutun resmi docker resim depolarını, gcr.io, eu.gcr.io, us.gcr.io’yu kullanacak şekilde yapılandırır, böylece bir docker görüntüsünü bu havuzlara itmek için liman işçisi için yapıyorsun.

Şimdi tüm 3 resmi Google Konteyner Kayıt Defteri'ne gönderelim.

docker push $ GCR_REGISTRY / $ PROJECT / $ FRONTEND_DOCKER_IMAGE_NAME: v1 && docker push $ GCR_REGISTRY / $ PROJECT / $ BACKEND_API_DOCKER_IMAGE_NAME: v1 && docker itin

Bu tamamlandığında, şimdi odadaki filleri ele alalım; Uygulamayı Google Kubernetes Engine'a dağıtma.

kaynak: google.com

Kubernet'ler yapılandırma klasörü yapısı

Tüm kubernetleri yapılandırma dosyalarını k8s-configurations klasörüne koydum. Burada da benzer şekilde adlandırılmış yaml dosyalarına yerleştirilmiş dağıtımlar, giriş, sırlar ve servis yapılandırmaları bulunmaktadır.

  1. deployments.yaml. Bir dağıtım, uygulama bölmenizi (bir kapsayıcı içeren) yapılandırmalarınızı tutan bir "iş yüküdür". Bu yapılandırma dosyası, konteyner görüntüsünü, portları, etiketleri, çoğaltma sayısını vb. İçerir.
  2. services.yaml. Kubernetlerde, hizmetler farklı “iş yüklerinin” “tutkalı” dır. Bunlar kubernet eko sistemindeki kaplar arasında bağlantı sağlar. Bunun nedeni, kubernet'lerin yaratılma şekli, bir konteyner, aynı kapsülde değilse başka bir konteynerle “konuşamamak”. Temel olarak, ön uç ve API, aynı kapsül içerisinde değilse ve bu kurulum için aynı bölmede değilse, doğrudan birbirleriyle “konuşmaz”. Bu yüzden hizmetleri kullanmak zorundayız.
  3. ingress.yaml. Kubernetlerde, giriş, harici internet trafiğini bir kubernet kümesindeki hizmetlere yönlendiren bir kurallar kümesidir. Bu, dağıtımları internete maruz bırakmanız gereken birçok hizmetiniz varsa yararlıdır. Girişte, yalnızca bir HTTP yük dengeleyicisini kullanırsınız ve bulut bilişim maliyetleri açısından pahalı olabilecek her biri için ayrı bir yük dengeleyici kullanmaktan farklı olarak, Internet'e ihtiyaç duyan tüm dağıtımlara yönelik trafiği yönetir.
  4. secrets.yaml. Uygulamamız için ihtiyacımız olan sır, SSL sonlandırmasını kolaylaştıran bir SSL sertifikasıdır. Bu, uygulamamızın HTTPS ile güvenli bir şekilde erişilmesini sağlayacaktır.

Şimdi devam edelim ve kubernet yapılandırma dosyalarının içeriğini gerçek bulut hesaplama kaynaklarına dönüştürelim.

Google’ın en iyi uygulaması, konuşlandırmalardan önce ilk önce hizmetleri oluşturmamızdır. Bu yüzden önce services.yaml yapılandırma dosyasını uygulayalım. K8s konfigürasyon klasörüne gidin ve kodu gerçek hesaplama kaynaklarına dönüştürmeye başlayın.

Terminalinizde, k8s konfigürasyon klasöründeyken şunu çalıştırın:

kubectl create -f services.yaml

Çıktı şöyle görünmelidir:

iterm çıkışı
Bu komut, verilen services.yaml dosyasında bildirilen her kaynağı yaratacaktır.
Bu, kubernet kaynakları yaratmanın bildirimsel yoludur; hepsini bir yaml dosyasında ilan edin ve -f bayrağını kullanarak bu dosyayı kubectl create komutuna geçirin ve ardından sihir gerçekleşir.

Secrets.yaml dosyası, ingress.yaml dosyası ve deployments.yaml dosyası için de aynısını yapın. Çalıştırmak:

kubectl oluşturun -f ingress.yaml && kubectl oluşturun -f deployments.yaml && kubectl create -f secrets.yaml

Bu komut başarıyla tamamlandığında, kubernetes engine> workloads bölümünün altındaki GCP konsoluna gidin; burada oluşturduğunuz kaynakları bulacaksınız.

Google Kubernetes Motoru gösterge tablosu

Hiçbir şey görmüyorsanız, bu proje için ayarladığınız doğru hesaba geçtiğinden emin olun, sağ üst köşede ve sol üst köşede doğru projeyi aşağıda gösterildiği gibi seçtiğinizden emin olun.

google bulut platformu konsolu kontrol paneli

İş yükleri bölümüne bir göz atın, ön uç, API ve veritabanını hazırlamanız ve yeşil kene göstergeleriyle çalıştırmanız gerekir.

GKE iş yükleri kontrol paneli

Hizmetler bölümüne de gidin ve yeşil kene göstergeleri ile tüm servislerin hazır ve sağlıklı olduğundan emin olun.

GKE hizmetleri kontrol paneli

Bu noktada bir şey hariç her şey yolunda gitmeli. Google Cloud'daki uygulamamızın hiçbir bölümüne tarayıcı üzerinden erişemediğimiz bir giriş denetleyicisi.

Bir Giriş denetleyicisi, Giriş'i genellikle bir yük dengeleyici ile yerine getirmekle sorumludur. Yalnızca bir giriş kaynağı oluşturmak, bir giriş denetleyicisi olmadan çalışmayacaktır. Neyse ki bizim için ve dümen için, sıfırdan bir giriş denetleyicisi kurmanın karmaşık ayrıntılarına girmemize gerek yok.

Giriş kontrol cihazı konfigürasyonu

Bir Ingress kontrol cihazını devreye sokmak ve kümemizde çalıştırmak için dümeni kullanacağız.

kaynak: google.com
Dümen Kubernetes'e homebrew'in macOS'a, apt-get'in ubuntu'ya ve pip python'a. Kubernet'ler için bir paket yöneticisidir.

Helm, tek bir komutla bir pakette bir araya getirilmiş bağımlılıkları ve tüm uygulamaları kurmamızı sağlar. Dümeni kurarak ve yapılandırarak başlayalım.

Terminalinizde koşun:

curl -o get_helm.sh https://raw.githubusercontent.com/kubernetes/helm/master/scripts/get && chmod + x get_helm.sh && ./get_helm.sh && helm init

Yukarıdaki komut, dümen istemcisinin en son sürümünü alır ve yerel makinenize yükler (dizüstü bilgisayar / masaüstü)

Dümenin kümemizle çalışabilmesi için, kümede kurulu olan ve dümenin “konuşacak” bir sunucu tarafı bileşenine ihtiyacı vardır, bu durumda gereken tüm kaynakları oluşturacak komutları yönetmek ve iletmek için bir Giriş kontrol ünitesi.

Bu bileşene Tiller adı verilir. Yeke'yi bir Google Kubernetes kümesinde kurmak için, yeke için yapılandırılmış bir hizmet hesabına ve küme rolü bağlamasına ihtiyacımız var. Bu, yeke grubunun kubernet kaynaklarını kümemizin içine yerleştirmesini sağlayacaktır.

Terminalinizde, tiller'i gerektiği gibi kurmak ve yapılandırmak için aşağıdaki komutları çalıştırın:

kubectl servicccount oluştur - ad alanı kube-system tiller && kubectl clusterrolebinding oluşturma tiller-cluster-rule --clusterrole = cluster-admin --serviceaccount = kube-system: tiller && '{“Spec”: {“template”: {“spec”: {“serviceAccount”: ”tiller”}}}}' && dümen - servis hesabı hesabı yeke - güncelleme

Set kurulumunu onaylamak için aşağıdakileri çalıştırın:

kubectl konuşlandırmaları al -n kube sistemi | grep tiller-konuş

Bu, yeni oluşturduğunuz tiller-dploy dağıtımını sağlar.

Şimdi hem yerel çalışma istasyonumuzda hem de uzaktan kumanda kümemizde dümen ve yeke monte edildi. Şimdi devam edip Ingress kontrol cihazını kümemize kurabiliriz.

GKE için nginx girişi

Dışarıda çeşitli Ingress kontrolörleri var, bunun için ingress.yaml konfigürasyon dosyamızda açıkladığımız gibi nginx Ingress kontrol cihazını kullanacağız. Terminal koşunuzda:

dümen kurulumu - name nginx girişi sabit / nginx girişi - set rbac.create = true

Bu, nginx Giriş kontrol cihazını kuracaktır. Kurulumu onaylamak için aşağıdakileri çalıştırın:

kubectl nginx giriş denetleyicisi

Bu size harici bir IP ile loadBalancer tipi nginx denetleyici hizmetinin bir çıktısını verecektir.

Bu harici IP'nin oluşturulması biraz zaman alır, bu nedenle "beklemede" görürseniz, Google'ın size sağlaması için birkaç saniye / dakika verin.

Bu noktada, ön tarafa nginx giriş denetleyici hizmetinin harici IP'si üzerinden erişebilirsiniz. Ama aynı tuz bae gibi, neden sıradan olun. Bu IP’yi bir etki alanı adıyla bağlayalım, böylece http://35.90.3.9 yerine http://www.myapp.com gibi bir şey aracılığıyla erişebiliriz.

Eğer bir hesabınız yoksa, godaddy, hover, google-domain, vb. Ürünlerden bir tane satın alabilirsiniz. Etki alanımızı şimdi ayarlayalım.

DNS yapılandırması

kaynak: pngall.com

Bu demo makaleden bir hafta sonra alacağım kendi alan adımı kullandım. Etki alanı panonuza gidin ve ön uç, api ve veritabanı için alt etki alanı adları oluşturun.

Etki alanı adım davidmukiibi.com ve oluşturduğum alt alanlar şöyle görünüyor:

frontend.davidmukiibi.com
api.davidmukiibi.com
database.davidmukiibi.com
vurgulu alan kontrol paneli

Terminalinizde koşun:

kubectl hizmet almak | grep LoadBalancer | awk '{$ 4} yazdır

Bu komutun çıktısını kopyalayın; Bu, uygulamamızın internete maruz kaldığı harici IP adresidir.

Etki alanı panelinizde, bu harici IP adresini, oluşturduğumuz 3 kayıt kümesinin değeri olarak girin.

İngress.yaml dosyamızı kontrol ederseniz, giriş denetleyicimize giriş kaynağı aracılığıyla herhangi bir isteği bu açıklamayı kullanarak https'ye yönlendirmek için yönlendirdiğimizi fark edeceksiniz:

nginx.ingress.kubernetes.io/ssl-redirect: "true"

Bu, yalnızca uygulamamızla olan güvenli bağlantılara izin verecektir.

Uygulamanızla yalnızca güvenli bağlantılara izin vermek, özellikle kullanıcı verileriyle çalışıyorsa en iyi uygulamadır. Bununla birlikte, uygulamamız ile kullanıcı arasında uçtan uca şifrelemeye izin vermek için bir SSL sertifikasına ihtiyacımız var.

kaynak: google.com

3 ay boyunca geçerli ücretsiz SSL sertifikaları sunduğundan şifrelemeyi kullanalım. Herhangi bir sertifikanız varsa, ücretli veya ücretsiz olarak kullanabilirsiniz.

Ssl sertifikasını sağlama

SSL sertifikalarını şifrelemeden şifrelemek için certbot adlı bir araç kullanacağız. Letsencrypt ve certbot'u yükleyelim.

Dizini k8s yapılandırma klasörüne değiştirin, eğer ubuntu linux kullanıyorsanız, şunu çalıştırın:

apt-get install letsencrypt

MacOS kullanıyorsanız, şunu çalıştırın:

demlemek yükleme certbot & & pip yükleme letsencrypt - kullanıcı
İşletim sistemi kurulum adımlarınızı bulmak için buraya gidin.

Sahip olduğumuz bir alanla ilişkili 3 alt alan bulunduğundan, bir joker SSL sertifikası oluşturacağız. Bu davidmukiibi.com alan adının tüm alt alan adlarını karşılayacaktır.

Terminalinizde koşun:

certbot - manüel - günlükler - certbot - config-dir certbot - çalışma direktörü certbot - tercih edilen zorluklar dns için - server https://acme-v02.api.letsencrypt.org/directory --email e-posta adresiniz -d “* .davidmukiibi.com”
Yukarıdaki komuttaki “e-posta adresinizi” kendi e-posta adresinizle değiştirin.

Etki alanınızın joker karakter SSL sertifikasını sağlamak için ekrandaki talimatları izleyin. Bilgi istemine ulaştığınızda:

Lütfen adının altında bir DNS TXT kaydı dağıtın
_acme-challenge.erpnext.davidmukiibi.com, aşağıdaki değere sahip: 
“Davidmukiibi.com” kendi alan adınız olmalı

Etki alanı gösterge tablonuza gidin ve _acme-challenge.erpnext.davidmukiibi.com için bir "txt" kaydı oluşturun ve terminalinizde certbot tarafından verilen değeri doldurun.

NOT: “davidmukiibi.com” kendi etki alanı adınız olmalıdır
SSL TXT acme mücadelesi
Bu kaydı oluşturduktan sonra bir veya iki dakika verin

Terminale geri dönün ve Sertifika sağlama işlemine devam etmek için klavyenizdeki enter tuşuna basın.

Beklemek zorunda kalabilmenizin nedeni, zaman zaman yayılmasının daha uzun sürmesidir, bu nedenle sertifika görevlisinin sağlamada başarısız olması ve tüm süreci tekrarlamanız gerekmesidir.

Hepsi bittiğinde, certbot mevcut çalışma dizininizde bir “cerbot” klasörü yaratmış olacak. Ve ekran çıktısı sizi, SSL sertifikanızın ihtiyacımız olan 2 içe aktarma dosyasıyla, yani cert.pem ve privkey.pem dosyalarının olduğu yere yönlendirecektir. * .Pem dosyalarının bulunduğu dizinde, şunu çalıştırın:

kedi cert.pem | base64 | pbcopy

Bu cert.pem'i base64'e kodlar ve cert.pem kodlu sonuç çıktısını panoya kopyalar.

Secrets.yaml dosyasına gidin ve onu tls.crt değerine yapıştırın:

secrets.yaml

Çalıştırmak:

kedi privkey.pem | base64 | pbcopy

privkey.pem kodlamak ve sonucu tls.key değeri olarak yapıştırmak için: secrets.yaml dosyasına yapıştırın.

Komutlar: “cat cert.pem | base64 | pbcopy ”ve“ cat privkey.pem | base64 | pbcopy ”base64 privkey.pem ve cert.pem dosyalarını kodlar ve sonucu aynı anda kopyalar. Böylece terminalinizde çıkış olmaz, ancak bir metin editöründe ctrl + v veya cmd + v tuşlarsanız, kodlanmış sonucu göreceksiniz.

Secrets.yaml yukarıdaki gibi doldurulmuş halde çalıştırın:

kubectl create -f secrets.yaml

Bu, giriş kaynağımızın HTTPS kullanarak güvenli bir şekilde sonlandırılması için SSL sonlandırması için kullanacağı gizli bir kubernetes kaynağı yaratacaktır.

Fotoğraf Mimi Thian Unsplash üzerinde

Artık web tarayıcılarımızı çevirebilir ve uygulamamızı kontrol etmek için frontend.davidmukiibi.com adresine gidebiliriz.

Otomatik olarak HTTPS'ye yönlendirdiğine dikkat et. Bu, nginx giriş kontrol cihazını kullanarak gelen sihirdir.

İşte buyur. Sonunda Google Kubernetes Engine'de 3 katmanlı mimarlık uygulamasına ev sahipliği yaptı.

Devam edin ve artık ihtiyaç duymazsanız, henüz kullanmayacağınız ve Google Cloud tarafından faturalandırılacağı için yeni oluşturduğunuz kaynakları silin.

Kümeyi ve daha önce oluşturulan tüm kaynakları silmek için aşağıdakileri çalıştırın:

gcloud container kümeleri $ CLUSTER öğesini sil

Özel başvuru tüm başvuruyu bir araya getiren John'a.

Birlikte hazırladığım bu makaleden liman işçisi iş akışınızı çok kolaylaştıracak docker komutlarını yakalayın.

Burada paylaşılan bilgilere düzenlemeler veya eklemeler yapmaktan çekinmeyin. Ayrıca Twitter veya LinkedIn üzerinden bir sohbet için de ulaşabilirsiniz.