Istio, dağıtılmış uygulamaları bağlamak, güvenliğini sağlamak ve izlemek için kullanışlı bir araçtır. Istio, yazılımı uygun ölçekte çalıştırmak ve yönetmek için uygulama kodunu ve dağıtım bağımlılıklarını paketlemek için kapsayıcılar ve bu kapsayıcıları yönetmek için Kubernetes dahil olmak üzere çeşitli teknolojiler kullanır. Bu nedenle Istio ile çalışmak için bu teknolojilere dayalı birden fazla hizmete sahip bir uygulamanın nasıl çalıştığını bilmeniz gerekir. olmadan Istio. Bu araçlar ve kavramlar size zaten tanıdık geliyorsa, bu öğreticiyi atlayıp doğrudan bu bölüme gitmekten çekinmeyin. Istio'yu Google Kubernetes Engine'e (GKE) yükleme veya bir uzantı yükleme GKE'de Istio.
Bu, bir örnek aracılığıyla size bu teknolojiler hakkında temel bir anlayış sunmak için kaynak kodundan GKE kapsayıcısına kadar tüm süreci adım adım anlatacağımız bir kılavuzdur. Ayrıca Istio'nun bu teknolojilerin gücünden nasıl yararlandığını da göreceksiniz. Bu, konteynerler, Kubernetes, hizmet ağları veya Istio hakkında hiçbir şey bilmediğinizi varsayar.
görevler
Bu eğitimde aşağıdaki görevleri tamamlayacaksınız:
Birden fazla hizmet içeren basit bir merhaba dünya uygulamasını öğrenme.
Uygulamayı kaynak kodundan çalıştırın.
Uygulamanın kaplarda paketlenmesi.
Kubernetes kümesi oluşturma.
Kapsayıcıları bir kümeye dağıtma.
Başlamadan önce
Kubernetes Engine API'sini etkinleştirmek için talimatları izleyin:
Bu eğitimde sanal makineyi hazırlayan Cloud Shell'i kullanabilirsiniz. Google Compute Engine'de g1-small Debian tabanlı Linux veya Linux veya macOS bilgisayarla.
Seçenek A: Cloud Shell'i Kullanma
Cloud Shell'i kullanmanın avantajları:
Python 2 ve Python 3 geliştirme ortamları (dahil) virtualenv) tamamen yapılandırılmıştır.
Komut Satırı Araçları bulut, liman işçisi, git и KubectlKullanacağımız dosyalar zaten kurulu.
Aralarından seçim yapabileceğiniz birkaç tane var metin editörleri:
Kod düzenleyiciCloud Shell penceresinin üst kısmındaki düzenleme simgesiyle açılır.
Cloud Shell'deki komut satırından açılan Emacs, Vim veya Nano.
Birden fazla hizmet içeren bir uygulamayı keşfetme
Örnek uygulama Python'da yazılmıştır ve aşağıdakileri kullanarak etkileşime giren iki bileşenden oluşur: DİNLENME:
sunucu: tek uç noktaya sahip basit sunucu ELDE ETMEK, /, konsola "merhaba dünya" yazdırır.
yük: trafiği gönderen komut dosyası sunucu, saniyede yapılandırılabilir sayıda istekle.
Bir uygulamayı kaynak kodundan çalıştırma
Örnek uygulamayı keşfetmek için Cloud Shell'de veya bilgisayarınızda çalıştırın.
1) Katalogda istio-örnekler/örnek-uygulamalar/helloserver Çalıştırmak sunucu:
python3 server/server.py
Başlangıçta sunucu aşağıdakiler görüntülenir:
INFO:root:Starting server...
2) İstekleri göndermek için başka bir terminal penceresi açın sunucu. Cloud Shell kullanıyorsanız başka bir oturum açmak için ekle simgesini tıklayın.
3) Şuraya bir istek gönderin: sunucu:
curl http://localhost:8080
sunucu cevapları:
Hello World!
4) Örnek kodu indirdiğiniz dizinden, içeren dizine gidin. yük:
cd YOUR_WORKING_DIRECTORY/istio-samples/sample-apps/helloserver/loadgen
Ağ oluşturma açısından bakıldığında, uygulamanın tamamı tek bir ana bilgisayarda (yerel bilgisayar veya Cloud Shell sanal makinesi) çalışır. Bu nedenle kullanabilirsiniz localhostistekleri göndermek için sunucu.
10) Durdurmak yük и sunucu, girmek Ctrl-c her terminal penceresinde.
11) Terminal penceresinde yük sanal ortamı devre dışı bırakın:
deactivate
Bir uygulamayı kaplarda paketleme
Uygulamayı GKE'de çalıştırmak için örnek uygulamayı paketlemeniz gerekir: sunucu и yük - içinde Konteynerler. Kapsayıcı, bir uygulamayı ortamından yalıtmak için paketlemenin bir yoludur.
Bir uygulamayı bir kapsayıcıya paketlemek için şunlara ihtiyacınız vardır: Dockerfile. Dockerfile uygulamanın kaynak kodunu ve bağımlılıklarını oluşturmak için komutları tanımlayan bir metin dosyasıdır. Docker görüntüsü. Oluşturulduktan sonra görüntüyü Docker Hub gibi bir kapsayıcı kayıt defterine yüklersiniz veya Konteyner Kayıt Defteri.
Örnek zaten var Dockerfile için sunucu и yük görüntüleri toplamak için gerekli tüm komutlarla. Altında - Dockerfile için sunucu:
FROM python:3-slim as base
FROM base as builder
RUN apt-get -qq update
&& apt-get install -y --no-install-recommends
g++
&& rm -rf /var/lib/apt/lists/*
# Enable unbuffered logging
FROM base as final
ENV PYTHONUNBUFFERED=1
RUN apt-get -qq update
&& apt-get install -y --no-install-recommends
wget
WORKDIR /helloserver
# Grab packages from builder
COPY --from=builder /usr/local/lib/python3.7/ /usr/local/lib/python3.7/
# Add the application
COPY . .
EXPOSE 8080
ENTRYPOINT [ "python", "server.py" ]
Ekip Python'DAN: Temel olarak 3-slim Docker'a en son sürümü kullanmasını söyler Python 3 resmi bir üs olarak.
Ekip KOPYALA. . kaynak dosyaları geçerli çalışma dizinine kopyalar (bizim durumumuzda yalnızca sunucu.py) kapsayıcının dosya sistemine.
GİRİŞ NOKTASI Kabı başlatmak için kullanılan komutu tanımlar. Bizim durumumuzda bu komut, eskiden çalıştırdığınız komutla neredeyse aynı sunucu.py kaynak kodundan.
Ekip MARUZ BIRAKMAK belirtir sunucu port üzerinden veri bekler 8080. Bu takım değil bağlantı noktaları sağlar. Bu, bağlantı noktasını açmak için gereken bir tür belgedir 8080 konteyneri başlatırken.
Uygulamanızı kapsayıcıya almaya hazırlanıyor
1) Aşağıdaki ortam değişkenlerini ayarlayın. Yer değiştirmek PROJECT_ID GCP proje kimliğinize.
export PROJECT_ID="PROJECT_ID"
export GCR_REPO="preparing-istio"
Değerleri kullanma PROJECT_ID и GCR_REPO Docker görüntüsünü oluştururken etiketlersiniz ve onu özel bir Container Registry'ye gönderirsiniz.
2) Komut satırı aracı için varsayılan GCP projesini ayarlayın bulut.
gcloud config set project $PROJECT_ID
3) Komut satırı aracı için varsayılan bölgeyi ayarlayın bulut.
Depodaki görsellerin listesini inceleyin ve görsellerin yüklendiğini doğrulayın:
gcloud container images list --repository gcr.io/$PROJECT_ID/preparing-istio
Komut, yeni yüklenen görsellerin adlarını görüntüler:
NAME
gcr.io/PROJECT_ID/preparing-istio/helloserver
gcr.io/PROJECT_ID/preparing-istio/loadgen
GKE kümesi oluşturma.
Bu konteynerler Cloud Shell sanal makinesinde veya bilgisayarda şu komutla çalıştırılabilir: docker koşmak. Ancak üretim ortamında konteynerleri merkezi olarak düzenlemenin bir yoluna ihtiyacınız var. Örneğin, konteynerlerin her zaman çalışmasını sağlayan bir sisteme ihtiyacınız var ve trafiğin artması durumunda ölçeği büyütüp ek konteyner örneklerini hızlandırmanın bir yoluna ihtiyacınız var.
Konteynerli uygulamaları çalıştırmak için kullanabilirsiniz G.K.E.. GKE, sanal makineleri bir kümede toplayan bir konteyner düzenleme platformudur. Her sanal makineye düğüm adı verilir. GKE kümeleri, açık kaynaklı Kubernetes küme yönetim sistemini temel alır. Kubernetes, kümeyle etkileşime geçmek için mekanizmalar sağlar.
Ekip bulut GCP projesinde ve belirttiğiniz varsayılan bölgede istioready kümesi oluşturur. Istio'yu çalıştırmak için en az 4 düğüme ve bir sanal makineye sahip olmanızı öneririz n1-standart-2.
Ekip birkaç dakika içinde kümeyi oluşturur. Küme hazır olduğunda komut şunun gibi bir çıktı verir: mesaj.
3) Artık Kubernetes ile iletişim kurabilirsiniz. Kubectl. Örneğin, aşağıdaki komut düğümlerin durumunu öğrenebilir:
kubectl get nodes
Komut, düğümlerin bir listesini oluşturur:
NAME STATUS ROLES AGE VERSION
gke-istoready-default-pool-dbeb23dc-1vg0 Ready <none> 99s v1.13.6-gke.13
gke-istoready-default-pool-dbeb23dc-36z5 Ready <none> 100s v1.13.6-gke.13
gke-istoready-default-pool-dbeb23dc-fj7s Ready <none> 99s v1.13.6-gke.13
gke-istoready-default-pool-dbeb23dc-wbjw Ready <none> 99s v1.13.6-gke.13
Kubernetes'in Temel Kavramları
Diyagramda GKE'deki bir uygulama gösterilmektedir:
GKE'de Container'ları dağıtmadan önce Kubernetes'in temel kavramlarını öğrenin. Daha fazlasını öğrenmek istiyorsanız en sonunda bağlantılar var.
Düğümler ve kümeler. GKE'de düğüm bir sanal makinedir. Diğer Kubernetes platformlarında bir düğüm, bir bilgisayar veya sanal makine olabilir. Küme, kapsayıcıya alınmış bir uygulamayı dağıttığınız tek bir birim olarak kabul edilebilecek bir düğüm koleksiyonudur.
Kapsüller. Kubernetes'te konteynerler pod'lar halinde çalışır. Kubernetes'teki Pod bölünmez bir birimdir. Bir Pod, bir veya daha fazla kapsayıcıyı barındırır. Sunucu kapsayıcılarını dağıtırsınız ve yük ayrı bölmelerde. Bir bölmede birden fazla kapsayıcı olduğunda (örneğin, bir uygulama sunucusu ve Proxy sunucu), kapsayıcılar tek bir varlık olarak yönetilir ve bölme kaynaklarını paylaşır.
Dağıtımlar. Kubernetes'te dağıtım, aynı bölmelerden oluşan bir koleksiyon olan bir nesnedir. Dağıtım, küme düğümleri arasında dağıtılan birden fazla bölmenin kopyasını başlatır. Dağıtım, arızalı veya yanıt vermeyen bölmeleri otomatik olarak değiştirir.
Kubernetes hizmeti. GKE'de uygulama kodunu çalıştırırken arasındaki bağlantı yük и sunucu. Cloud Shell sanal makinesinde veya masaüstünde hizmetleri başlattığınızda, istekler gönderdiniz. sunucu adrese göre localhost: 8080. Kapsüller, GKE'ye dağıtıldıktan sonra mevcut düğümlerde yürütülür. Varsayılan olarak, bölmenin hangi düğümde çalıştığı üzerinde hiçbir kontrolünüz yoktur; kapsüller kalıcı IP adresi yok.
Bir IP adresi almak için sunucu, bölmelerin üstünde bir ağ soyutlaması tanımlamanız gerekir. İşte bu Kubernetes hizmeti. Kubernetes hizmeti, bir dizi kapsül için kalıcı bir uç nokta sağlar. Birkaç tane var hizmet türleri. sunucu использует Yük dengeleyiciiletişim kurulacak harici bir IP adresi sağlayan sunucu kümenin dışından.
Kubernetes ayrıca DNS adlarını atayan yerleşik bir DNS sistemine de sahiptir (örneğin, helloserver.default.cluster.local) Hizmetler. Bu sayede küme içindeki podlar kümedeki diğer podlarla sabit bir adres üzerinden iletişim kurar. DNS adı, Cloud Shell veya bilgisayar gibi kümenin dışında kullanılamaz.
Kubernetes'in kullanım alanları bildirim modeli. Bu, Kubernetes'e tam olarak ne yapması gerektiğini söylemediğimiz, bunun yerine istenen durumu tanımladığımız anlamına gelir. Örneğin Kubernetes, sistemin gerçek durumunu istenen durumla tutarlı tutmak için gerektiğinde pod'ları başlatır ve durdurur.
İstenilen durumu bildirimlerde veya dosyalarda belirtirsiniz YAML. YAML dosyası bir veya daha fazla Kubernetes nesnesinin özelliklerini içerir.
Örnek, aşağıdakiler için bir YAML dosyası içeriyor: sunucu и yük. Her YAML dosyası, dağıtım nesnesinin ve Kubernetes hizmetinin istenen durumunu belirtir.
İlk alan spec İstenilen durumun bir açıklamasını içerir.
spesifik kopyalar istenilen kapsül sayısını gösterir.
Bölüm spesifikasyon şablonu bir bölme şablonunu tanımlar. Pod spesifikasyonunda bir alan var görüntü, Container Registry'den çıkarılması gereken görüntünün adını belirtir.
Yük dengeleyici: İstemciler, kalıcı bir IP adresine sahip olan ve kümenin dışından erişilebilen yük dengeleyicinin IP adresine istek gönderir.
hedefPort: hatırladığınız gibi, ekip MARUZ KALMA 8080 в Dockerfile bağlantı noktası sağlamadı. Limanı sen sağlıyorsun 8080böylece konteynerle iletişime geçebilirsiniz sunucu kümenin dışında. Bizim durumumuzda hellosvc.default.cluster.local:80 (Kısa isim: merhabasvc) bağlantı noktasına karşılık gelir 8080 Kapsül IP adresleri merhaba sunucu.
Liman: Clusterdaki diğer servislerin istek göndereceği port numarasıdır.
yükgen.yaml
Dağıtım nesnesi yükgen.yaml benzemek sunucu.yaml. Aradaki fark, dağıtım nesnesinin bir bölüm içermesidir. env. İhtiyaç duyulan ortam değişkenlerini tanımlar yük ve uygulamayı kaynaktan çalıştırırken yüklediğiniz.
Zaman yük alana gelen istekleri kabul etmiyor tip Belirtilen Küme IP'si. Bu tür, kümedeki hizmetlerin kullanabileceği kalıcı bir IP adresi sağlar ancak bu IP adresi harici istemcilere açık değildir.
değiştirmek PROJECT_ID GCP proje kimliğinize.
9) Kaydet ve kapat yükgen.yaml, metin düzenleyiciyi kapatın.
10) YAML dosyasını Kubernetes'e dağıtın:
kubectl apply -f loadgen.yaml
Başarılı bir şekilde tamamlandığında komut aşağıdaki kodu üretir:
deployment.apps/loadgenerator created
service/loadgensvc created
11) Bölmelerin durumunu kontrol edin:
kubectl get pods
Komut durumu gösterir:
NAME READY STATUS RESTARTS AGE
helloserver-69b9576d96-mwtcj 1/1 Running 0 58s
loadgenerator-774dbc46fb-gpbrz 1/1 Running 0 57s
12) Uygulama günlüklerini bölmeden çıkarın yük. Yer değiştirmek POD_ID önceki yanıttaki tanımlayıcıya.
kubectl logs loadgenerator-POD_ID
13) Harici IP adresleri edinin merhabasvc:
kubectl get service
Komut yanıtı şuna benzer:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
hellosvc LoadBalancer 10.81.15.158 192.0.2.1 80:31127/TCP 33m
kubernetes ClusterIP 10.81.0.1 <none> 443/TCP 93m
loadgensvc ClusterIP 10.81.15.155 <none> 80/TCP 4m52s
14) Şuraya bir istek gönderin: merhabasvc: yer değiştirmek EXTERNAL_IP harici IP adresine merhabasvc.
curl http://EXTERNAL_IP
Haydi Istio'yu ele alalım
Zaten GKE'ye dağıtılmış bir uygulamanız var. yük Kubernetes DNS'yi kullanabilir (merhabasvc:80) istekleri göndermek için sunucuve şu adrese istek gönderebilirsiniz: sunucu harici IP adresine göre. Kubernetes'in birçok özelliği olmasına rağmen hizmetler hakkında bazı bilgiler eksiktir:
Hizmetler nasıl etkileşime girer? Hizmetler arasındaki ilişkiler nelerdir? Hizmetler arasında trafik nasıl akıyor? farkında mısın yük istekleri gönderir sunucu, ancak uygulama hakkında hiçbir şey bilmediğinizi hayal edin. Bu soruları yanıtlamak için GKE'deki çalışan kapsüllerin listesine bakalım.
Metrikler. Ne kadardır sunucu gelen bir isteğe yanıt veriyor mu? Sunucu tarafından saniyede kaç istek alınıyor? Hata mesajları veriyor mu?
Güvenlik bilgileri. Arasındaki trafik yük и sunucu sadece geçiyor HTTP veya mTLS?
Istio tüm bu soruları yanıtlıyor. Bunu yapmak için Istio bir sepet proxy'si yerleştirir elçi her bölmede. Envoy proxy'si, uygulama kapsayıcılarına gelen ve giden tüm trafiği keser. Bu demektir sunucu и yük sepet proxy Elçisi aracılığıyla ve tüm trafiği alın yük к sunucu Elçi vekilinden geçer.
Envoy proxy'leri arasındaki bağlantılar bir hizmet ağı oluşturur. Hizmet ağı mimarisi, Kubernetes'in üzerinde bir kontrol katmanı sağlar.
Envoy proxy'leri kendi kapsayıcılarında çalıştığı için Istio, uygulama kodunda neredeyse hiçbir değişiklik yapılmadan bir GKE kümesinin üzerine kurulabilir. Ancak uygulamanızı Istio tarafından yönetilmeye hazır hale getirmek için bazı çalışmalar yaptınız:
Tüm konteynerler için hizmetler. Dağıtımlara sunucu и yük Kubernetes hizmetine bağlı. Eşit yükGelen istekleri almayan bir hizmet var.
Hizmetlerdeki bağlantı noktalarının adları olmalıdır. Hizmet bağlantı noktaları GKE'de adsız bırakılabilse de Istio, belirtmenizi gerektirir bağlantı noktası adı kendi protokolüne uygun olarak. YAML dosyasındaki bağlantı noktası sunucu denilen httpçünkü sunucu protokolü kullanıyor HTTP. Eğer hizmet использовал gRPC, bağlantı noktasına isim verirsiniz grpc.
Dağıtımlar işaretlendi. Bu nedenle trafiği aynı hizmetin sürümleri arasında bölmek gibi Istio'nun trafik yönetimi özelliklerini kullanabilirsiniz.
Istio'yu yükleme
Istio'yu kurmanın iki yolu vardır. Olabilmek GKE uzantısında Istio'yu etkinleştirin veya Istio'nun açık kaynak sürümünü yükleyin küme üzerinde. GKE'deki Istio ile GKE kümesi yaşam döngüsü boyunca Istio kurulumlarını ve yükseltmelerini kolayca yönetebilirsiniz. Istio'nun en son sürümünü veya Istio kontrol paneli yapılandırmanız üzerinde daha fazla kontrol sahibi olmak istiyorsanız GKE'de Istio uzantısı yerine açık kaynak sürümünü yükleyin. Yaklaşıma karar vermek için makaleyi okuyun GKE'de Istio'ya ihtiyacım var mı?.
Bir seçenek belirleyin, uygun kılavuzu inceleyin ve Istio'yu kümenize yüklemek için talimatları izleyin. Istio'yu yeni dağıtılan uygulamanızla kullanmak istiyorsanız, sepet uygulamasını etkinleştir ad alanı için varsayılan.
Очистка
Bu eğitimde kullandığınız kaynaklar için Google Cloud Platform hesabınıza ücret yansıtılmasını önlemek amacıyla Istio'yu yükledikten ve örnek uygulamayla oynadıktan sonra kapsayıcı kümesini silin. Bu işlem örnekleri, diskler ve ağ kaynakları gibi tüm küme kaynaklarını kaldıracaktır.