Yandex.Cloud'da 10 etkinliği kabul ediyoruz. Bölüm 000

Herkese merhaba arkadaşlar!

* Bu makale REBRAIN ve Yandex.Cloud açık atölyesine dayanmaktadır, videoyu izlemeyi tercih ederseniz bu bağlantıdan ulaşabilirsiniz - https://youtu.be/cZLezUm0ekE

Yakın zamanda Yandex.Cloud'u canlı olarak deneme fırsatımız oldu. Uzun ve sıkı bir araştırma yapmak istediğimizden, bulut tabanlı basit bir Wordpress blogu başlatma fikrinden hemen vazgeçtik - çok sıkıcıydı. Biraz düşündükten sonra, olayları neredeyse gerçek zamanlı modda almak ve analiz etmek için üretim hizmeti mimarisine benzer bir şey uygulamaya karar verdik.

Çevrimiçi işletmelerin (ve yalnızca) büyük çoğunluğunun bir şekilde kullanıcıları ve eylemleri hakkında dağlar kadar bilgi topladığından kesinlikle eminim. En azından belirli kararları vermek için bu gereklidir - örneğin, bir çevrimiçi oyunu yönetiyorsanız, kullanıcıların en sık hangi düzeyde takılıp oyuncağınızı sildiği istatistiklere bakabilirsiniz. Veya kullanıcıların hiçbir şey satın almadan sitenizden neden ayrıldığını (merhaba Yandex.Metrica).

Öyleyse hikayemiz: golang'da nasıl bir uygulama yazdık, kafka, tavşan mq ve yqs'yi nasıl test ettik, bir Clickhouse kümesinde veri akışı yazdık ve yandex veri merceklerini kullanarak verileri nasıl görselleştirdik. Doğal olarak tüm bunlar, docker, terraform, gitlab ci ve tabii ki prometheus gibi altyapı lezzetleriyle tatlandırıldı. Hadi gidelim!

Her şeyi tek bir oturuşta yapılandıramayacağımız için hemen rezervasyon yaptırmak istiyorum - bunun için serideki birkaç makaleye ihtiyacımız olacak. Yapı hakkında biraz:

Bölüm 1 (okuyorsunuz). Çözümün özelliklerine ve mimarisine karar vereceğiz ve ayrıca golang'da bir uygulama yazacağız.
Bölüm 2. Uygulamamızı üretime alıyoruz, ölçeklenebilir hale getiriyoruz ve yükü test ediyoruz.
Bölüm 3. Mesajları neden dosyalarda değil de arabellekte saklamamız gerektiğini anlamaya çalışalım ve ayrıca kafka, tavşanmq ve yandex kuyruk hizmetini karşılaştıralım.
Bölüm 4 Bir Clickhouse kümesi konuşlandıracağız, oradaki tampondan veri aktarmak için bir akış hizmeti yazacağız ve datalens'te görselleştirmeyi ayarlayacağız.
Bölüm 5 Tüm altyapıyı uygun şekle getirelim - gitlab ci'yi kullanarak ci/cd'yi kurun, prometheus ve consul'u kullanarak izleme ve hizmet keşfini bağlayın.

TK

Öncelikle referans şartlarını formüle edelim - sonuç olarak tam olarak ne elde etmek istiyoruz.

  1. Olayları HTTPS kullanarak alması gereken events.kis.im (kis.im tüm makaleler boyunca kullanacağımız test alanıdır) gibi bir uç noktaya sahip olmak istiyoruz.
  2. Etkinlikler şuna benzer basit bir json'dur: {“event”: “view”, “os”: “linux”, “browser”: “chrome”}. Son aşamada biraz daha alan ekleyeceğiz ama bu büyük bir rol oynamayacak. Dilerseniz protobuf'a geçebilirsiniz.
  3. Hizmetin saniyede 10 olayı işleyebilmesi gerekir.
  4. Çözümümüze yeni örnekler ekleyerek yatay olarak ölçeklendirme mümkün olmalıdır. Müşteri isteklerindeki gecikmeyi azaltmak için ön kısmı farklı coğrafi konumlara taşıyabilirsek iyi olur.
  5. Hata toleransı. Çözüm yeterince kararlı olmalı ve herhangi bir parçanın (tabii ki belirli bir sayıya kadar) düşmesine dayanabilmelidir.

Mimari

Genel olarak, bu tür görevler için, verimli ölçeklendirmeye olanak tanıyan klasik mimariler uzun süredir icat edilmiştir. Şekil çözümümüzün bir örneğini göstermektedir.

Yandex.Cloud'da 10 etkinliği kabul ediyoruz. Bölüm 000

Peki elimizde ne var:

1. Sol tarafta, ister akıllı telefonda bir oyuncakta bir seviyeyi tamamlayan oyuncular, ister normal bir tarayıcı aracılığıyla bir çevrimiçi mağazada sipariş oluşturan oyuncular olsun, çeşitli etkinlikler üreten cihazlarımız var. Spesifikasyonda belirtildiği gibi bir olay, uç noktamız olan events.kis.im'e gönderilen basit bir json'dur.

2. İlk iki sunucu basit dengeleyicilerdir, ana görevleri şunlardır:

  • Sürekli ulaşılabilir olun. Bunu yapmak için, örneğin sorun olması durumunda sanal IP'yi düğümler arasında değiştirecek olan canlı tutmayı kullanabilirsiniz.
  • TLS'yi sonlandırın. Evet, bunların TLS'sini sonlandıracağız. Birincisi çözümümüzün teknik spesifikasyonlara uygun olması, ikincisi ise arka uç sunucularımızdan şifreli bağlantı kurma yükünü hafifletmek.
  • Mevcut arka uç sunucularına gelen istekleri dengeleyin. Buradaki anahtar kelimeye erişilebilir. Buna dayanarak, yük dengeleyicilerin sunucularımızı uygulamalarla izleyebilmesi ve başarısız düğümlere giden trafiği dengelemeyi durdurabilmesi gerektiği anlayışına vardık.

3. Dengeleyicilerden sonra oldukça basit bir uygulamayı çalıştıran uygulama sunucularımız var. HTTP yoluyla gelen istekleri kabul edebilmeli, gönderilen json'u doğrulayabilmeli ve verileri bir arabelleğe koyabilmelidir.

4. Diyagramda kafka bir tampon olarak gösterilmektedir, ancak elbette bu seviyede başka benzer hizmetler de kullanılabilir. Üçüncü yazımızda Kafka, Rabbitmq ve YQS'yi karşılaştıracağız.

5. Mimarimizin sondan bir önceki noktası, büyük miktarda veriyi depolamanıza ve işlemenize olanak tanıyan sütunlu bir veritabanı olan Clickhouse'dur. Bu düzeyde, verileri arabellekten depolama sisteminin kendisine aktarmamız gerekir (bununla ilgili daha fazla bilgi 4. makalede).

Bu tasarım, her katmanı bağımsız olarak yatay olarak ölçeklendirmemize olanak tanır. Arka uç sunucular bununla baş edemez - bir şey daha ekleyelim - sonuçta bunlar durum bilgisi olmayan uygulamalardır ve bu nedenle bu otomatik olarak bile yapılabilir. Kafka tarzı arabellek çalışmıyor; daha fazla sunucu ekleyelim ve konumumuzun bazı bölümlerini onlara aktaralım. Clickhouse bunu kaldıramaz, imkansızdır :) Hatta sunucuları da bağlayıp verileri parçalayacağız.

Bu arada, teknik spesifikasyonlarımızın ve ölçeğimizin isteğe bağlı kısmını farklı coğrafi konumlarda uygulamak istiyorsanız, bundan daha basit bir şey olamaz:

Yandex.Cloud'da 10 etkinliği kabul ediyoruz. Bölüm 000

Her coğrafi konumda uygulama ve kafka içeren bir yük dengeleyici yerleştiriyoruz. Genel olarak, 2 uygulama sunucusu, 3 kafka düğümü ve bir bulut dengeleyici, örneğin cloudflare yeterlidir; bu, uygulama düğümlerinin kullanılabilirliğini kontrol edecek ve istekleri müşterinin kaynak IP adresine göre coğrafi konuma göre dengeleyecektir. Böylece Amerikalı bir müşteri tarafından gönderilen veriler Amerikan sunucularına ulaşacaktır. Ve Afrika'dan gelen veriler Afrika'ya ait.

O zaman her şey oldukça basit; Kafka setindeki ayna aracını kullanıyoruz ve tüm konumlardaki tüm verileri Rusya'da bulunan merkezi veri merkezimize kopyalıyoruz. Dahili olarak verileri ayrıştırır ve daha sonraki görselleştirme için Clickhouse'a kaydederiz.

Böylece mimariyi çözdük; haydi Yandex.Cloud'u sallamaya başlayalım!

Başvuru yazma

Buluttan önce yine de biraz sabırlı olmanız ve gelen olayları işlemek için oldukça basit bir hizmet yazmanız gerekiyor. Golang'ı kullanacağız çünkü ağ uygulamaları yazmak için bir dil olarak kendini çok iyi kanıtlamıştır.

Bir saat (belki birkaç saat) harcadıktan sonra şöyle bir şey elde ederiz: https://github.com/RebrainMe/yandex-cloud-events/blob/master/app/main.go.

Burada belirtmek istediğim ana noktalar nelerdir:

1. Uygulamayı başlatırken iki bayrak belirleyebilirsiniz. Biri gelen http isteklerini (-addr) dinleyeceğimiz porttan sorumludur. İkincisi ise etkinliklerimizi kaydedeceğimiz kafka sunucu adresi içindir (-kafka):

addr     = flag.String("addr", ":8080", "TCP address to listen to")
kafka    = flag.String("kafka", "127.0.0.1:9092", "Kafka endpoints”)

2. Uygulama sarama kütüphanesini kullanır ([] github.com/Shopify/sarama) kafka kümesine mesaj göndermek için. Maksimum işlem hızını hedefleyen ayarları hemen yapıyoruz:

config := sarama.NewConfig()
config.Producer.RequiredAcks = sarama.WaitForLocal
config.Producer.Compression = sarama.CompressionSnappy
config.Producer.Return.Successes = true

3. Uygulamamız ayrıca aşağıdakiler gibi çeşitli ölçümleri toplayan yerleşik bir prometheus istemcisine sahiptir:

  • uygulamamıza yapılan taleplerin sayısı;
  • istek yürütülürken oluşan hataların sayısı (isteği okumak imkansız, json bozuk, Kafka'ya yazmak imkansız);
  • Kafka'ya mesaj yazma süresi de dahil olmak üzere müşteriden gelen bir isteğin işlem süresi.

4. Uygulamamızın işlediği üç uç nokta:

  • /status - hayatta olduğumuzu göstermek için basitçe tamam'a dönün. Ancak Kafka kümesinin kullanılabilirliği gibi bazı kontroller ekleyebilirsiniz.
  • /metrics - bu URL'ye göre prometheus istemcisi topladığı metrikleri döndürecektir.
  • /post, içinde json bulunan POST isteklerinin gönderileceği ana uç noktadır. Uygulamamız json'un geçerliliğini kontrol eder ve her şey yolundaysa verileri Kafka kümesine yazar.

Kodun mükemmel olmadığına dair bir rezervasyon yapacağım - tamamlanabilir (ve tamamlanmalıdır!). Örneğin, yerleşik net/http'yi kullanmayı bırakıp daha hızlı olan fasthttp'ye geçebilirsiniz. Veya json geçerlilik kontrolünü daha sonraki bir aşamaya (verilerin arabellekten clickhouse kümesine aktarıldığı zamana) taşıyarak işlem süresi ve işlemci kaynakları kazanabilirsiniz.

Konunun geliştirme tarafının yanı sıra hemen gelecekteki altyapımızı da düşündük ve uygulamamızı docker üzerinden dağıtmaya karar verdik. Uygulamayı oluşturmak için son Docker dosyası: https://github.com/RebrainMe/yandex-cloud-events/blob/master/app/Dockerfile. Genel olarak oldukça basit, dikkat etmek istediğim tek nokta, konteynerimizin son görüntüsünü küçültmemize olanak tanıyan çok aşamalı montajdır.

Bulutta ilk adımlar

Öncelikle kayıt olun cloud.yandex.ru. Gerekli tüm alanları doldurduktan sonra bize bir hesap oluşturulacak ve bulut hizmetlerini test etmek için kullanılabilecek belirli miktarda para hibe verilecek. Yazımızdaki tüm adımları tekrarlamak isterseniz bu hibe sizin için yeterli olacaktır.

Kayıt olduktan sonra sizin için bulut kaynakları oluşturmaya başlayabileceğiniz ayrı bir bulut ve varsayılan dizin oluşturulacaktır. Genel olarak Yandex.Cloud'da kaynakların ilişkisi şöyle görünür:

Yandex.Cloud'da 10 etkinliği kabul ediyoruz. Bölüm 000

Bir hesap için birden fazla bulut oluşturabilirsiniz. Ve bulutun içinde farklı şirket projeleri için farklı dizinler oluşturun. Bununla ilgili daha fazla bilgiyi belgelerde okuyabilirsiniz - https://cloud.yandex.ru/docs/resource-manager/concepts/resources-hierarchy. Bu arada, aşağıda metinde sık sık buna değineceğim. Tüm altyapıyı sıfırdan kurduğumda dokümantasyon bana birden fazla kez yardımcı oldu, bu yüzden incelemenizi tavsiye ederim.

Bulutu yönetmek için hem web arayüzünü hem de konsol yardımcı programını (yc) kullanabilirsiniz. Kurulum tek bir komutla gerçekleştirilir (Linux ve Mac Os için):

curl https://storage.yandexcloud.net/yandexcloud-yc/install.sh | bash

Dahili güvenlik uzmanınız komut dosyalarını İnternetten çalıştırma konusunda öfkeliyse, o zaman öncelikle komut dosyasını açıp okuyabilirsiniz ve ikinci olarak, onu kullanıcımız altında kök hakları olmadan çalıştırırız.

Windows için bir istemci yüklemek istiyorsanız talimatları kullanabilirsiniz. burada ve sonra yürütün yc inittamamen özelleştirmek için:

vozerov@mba:~ $ yc init
Welcome! This command will take you through the configuration process.
Please go to https://oauth.yandex.ru/authorize?response_type=token&client_id= in order to obtain OAuth token.

Please enter OAuth token:
Please select cloud to use:
 [1] cloud-b1gv67ihgfu3bp (id = b1gv67ihgfu3bpt24o0q)
 [2] fevlake-cloud (id = b1g6bvup3toribomnh30)
Please enter your numeric choice: 2
Your current cloud has been set to 'fevlake-cloud' (id = b1g6bvup3toribomnh30).
Please choose folder to use:
 [1] default (id = b1g5r6h11knotfr8vjp7)
 [2] Create a new folder
Please enter your numeric choice: 1
Your current folder has been set to 'default' (id = b1g5r6h11knotfr8vjp7).
Do you want to configure a default Compute zone? [Y/n]
Which zone do you want to use as a profile default?
 [1] ru-central1-a
 [2] ru-central1-b
 [3] ru-central1-c
 [4] Don't set default zone
Please enter your numeric choice: 1
Your profile default Compute zone has been set to 'ru-central1-a'.
vozerov@mba:~ $

Prensip olarak süreç basittir; öncelikle bulutu yönetmek için bir oauth belirteci almanız, bulutu ve kullanacağınız klasörü seçmeniz gerekir.

Aynı bulutta birden fazla hesabınız veya klasörünüz varsa, yc config profil oluşturma aracılığıyla ayrı ayarlarla ek profiller oluşturabilir ve bunlar arasında geçiş yapabilirsiniz.

Yukarıdaki yöntemlere ek olarak Yandex.Cloud ekibi çok iyi bir yazı yazdı. Terraform için eklenti bulut kaynaklarını yönetmek için. Kendi adıma, makalenin bir parçası olarak oluşturulacak tüm kaynakları anlattığım bir git deposu hazırladım - https://github.com/rebrainme/yandex-cloud-events/. Master dalıyla ilgileniyoruz, hadi yerel olarak klonlayalım:


vozerov@mba:~ $ git clone https://github.com/rebrainme/yandex-cloud-events/ events
Cloning into 'events'...
remote: Enumerating objects: 100, done.
remote: Counting objects: 100% (100/100), done.
remote: Compressing objects: 100% (68/68), done.
remote: Total 100 (delta 37), reused 89 (delta 26), pack-reused 0
Receiving objects: 100% (100/100), 25.65 KiB | 168.00 KiB/s, done.
Resolving deltas: 100% (37/37), done.
vozerov@mba:~ $ cd events/terraform/

Terraform'da kullanılan tüm ana değişkenler main.tf dosyasına yazılmıştır. Başlamak için terraform klasöründe aşağıdaki içeriğe sahip bir Private.auto.tfvars dosyası oluşturun:

# Yandex Cloud Oauth token
yc_token = ""
# Yandex Cloud ID
yc_cloud_id = ""
# Yandex Cloud folder ID
yc_folder_id = ""
# Default Yandex Cloud Region
yc_region = "ru-central1-a"
# Cloudflare email
cf_email = ""
# Cloudflare token
cf_token = ""
# Cloudflare zone id
cf_zone_id = ""

Konsol yardımcı programını zaten yapılandırdığımız için tüm değişkenler yc yapılandırma listesinden alınabilir. Özel verileri kazara yayınlamamak için hemen Private.auto.tfvars'ı .gitignore'a eklemenizi tavsiye ederim.

Private.auto.tfvars'da, DNS kayıtları oluşturmak ve events.kis.im ana etki alanını sunucularımıza proxy olarak göndermek için Cloudflare'den gelen verileri de belirttik. Cloudflare kullanmak istemiyorsanız, gerekli dns kayıtlarını oluşturmaktan sorumlu olan main.tf ve dns.tf dosyasındaki cloudflare sağlayıcısının başlatılmasını kaldırın.

Çalışmamızda üç yöntemi de birleştireceğiz: web arayüzü, konsol yardımcı programı ve terraform.

Sanal ağlar

Dürüst olmak gerekirse, bu adımı atlayabilirsiniz, çünkü yeni bir bulut oluşturduğunuzda, otomatik olarak ayrı bir ağınız olacak ve her kullanılabilirlik bölgesi için bir tane olmak üzere 3 alt ağ oluşturulacaktır. Ama yine de projemiz için kendi adreslemesiyle ayrı bir ağ oluşturmak istiyoruz. Ağın Yandex.Cloud'da nasıl çalıştığına dair genel şema aşağıdaki şekilde gösterilmektedir (dürüst olmak gerekirse, https://cloud.yandex.ru/docs/vpc/concepts/)

Yandex.Cloud'da 10 etkinliği kabul ediyoruz. Bölüm 000

Böylece kaynakların birbirleriyle iletişim kurabileceği ortak bir ağ oluşturursunuz. Her kullanılabilirlik bölgesi için, kendi adreslemesine sahip bir alt ağ oluşturulur ve genel ağa bağlanır. Sonuç olarak, içindeki tüm bulut kaynakları, farklı kullanılabilirlik bölgelerinde olsalar bile iletişim kurabilir. Farklı bulut ağlarına bağlı kaynaklar birbirini yalnızca harici adresler aracılığıyla görebilir. Bu arada bu büyü içeride nasıl çalışıyor? Habré'de çok iyi anlatılmıştı.

Ağ oluşturma, depodaki network.tf dosyasında açıklanmaktadır. Orada dahili bir ortak özel ağ oluşturuyoruz ve buna farklı kullanılabilirlik bölgelerinde üç alt ağ bağlıyoruz - dahili-a (172.16.1.0/24), dahili-b (172.16.2.0/24), dahili-c (172.16.3.0/24) ).

Terraform'u başlatın ve ağlar oluşturun:

vozerov@mba:~/events/terraform (master) $ terraform init
... skipped ..

vozerov@mba:~/events/terraform (master) $ terraform apply -target yandex_vpc_subnet.internal-a -target yandex_vpc_subnet.internal-b -target yandex_vpc_subnet.internal-c

... skipped ...

Plan: 4 to add, 0 to change, 0 to destroy.

Do you want to perform these actions?
  Terraform will perform the actions described above.
  Only 'yes' will be accepted to approve.

  Enter a value: yes

yandex_vpc_network.internal: Creating...
yandex_vpc_network.internal: Creation complete after 3s [id=enp2g2rhile7gbqlbrkr]
yandex_vpc_subnet.internal-a: Creating...
yandex_vpc_subnet.internal-b: Creating...
yandex_vpc_subnet.internal-c: Creating...
yandex_vpc_subnet.internal-a: Creation complete after 6s [id=e9b1dad6mgoj2v4funog]
yandex_vpc_subnet.internal-b: Creation complete after 7s [id=e2liv5i4amu52p64ac9p]
yandex_vpc_subnet.internal-c: Still creating... [10s elapsed]
yandex_vpc_subnet.internal-c: Creation complete after 10s [id=b0c2qhsj2vranoc9vhcq]

Apply complete! Resources: 4 added, 0 changed, 0 destroyed.

Harika! Ağımızı oluşturduk ve artık iç hizmetlerimizi oluşturmaya hazırız.

Sanal makineler oluşturma

Uygulamayı test etmek için yalnızca iki sanal makine oluşturmamız gerekecek - ilkine uygulamayı oluşturup çalıştırmak için, ikincisine gelen mesajları depolamak için kullanacağımız kafka'yı çalıştırmak için ihtiyacımız olacak. Ve prometheus'u uygulamayı izleyecek şekilde yapılandıracağımız başka bir makine oluşturacağız.

Sanal makineler ansible kullanılarak yapılandırılacağından terraform'a başlamadan önce ansible'ın en son sürümlerinden birine sahip olduğunuzdan emin olun. Ansible galaxy ile gerekli rolleri yükleyin:

vozerov@mba:~/events/terraform (master) $ cd ../ansible/
vozerov@mba:~/events/ansible (master) $ ansible-galaxy install -r requirements.yml
- cloudalchemy-prometheus (master) is already installed, skipping.
- cloudalchemy-grafana (master) is already installed, skipping.
- sansible.kafka (master) is already installed, skipping.
- sansible.zookeeper (master) is already installed, skipping.
- geerlingguy.docker (master) is already installed, skipping.
vozerov@mba:~/events/ansible (master) $

ansible klasörünün içinde kullandığım örnek bir .ansible.cfg yapılandırma dosyası var. İşe yarayabilir.

Sanal makineler oluşturmadan önce ssh-agent'ın çalıştığından ve bir ssh anahtarının eklendiğinden emin olun, aksi takdirde terraform oluşturulan makinelere bağlanamayacaktır. Elbette os x'te bir hatayla karşılaştım: https://github.com/ansible/ansible/issues/32499#issuecomment-341578864. Bunun tekrar olmasını önlemek için Terraform'u başlatmadan önce env'ye küçük bir değişken ekleyin:

vozerov@mba:~/events/terraform (master) $ export OBJC_DISABLE_INITIALIZE_FORK_SAFETY=YES

Terraformlu klasörde gerekli kaynakları oluşturuyoruz:

vozerov@mba:~/events/terraform (master) $ terraform apply -target yandex_compute_instance.build -target yandex_compute_instance.monitoring -target yandex_compute_instance.kafka
yandex_vpc_network.internal: Refreshing state... [id=enp2g2rhile7gbqlbrkr]
data.yandex_compute_image.ubuntu_image: Refreshing state...
yandex_vpc_subnet.internal-a: Refreshing state... [id=e9b1dad6mgoj2v4funog]

An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
  + create

... skipped ...

Plan: 3 to add, 0 to change, 0 to destroy.

... skipped ...

Her şey başarıyla biterse (ve olması gerekir), o zaman üç sanal makinemiz olacak:

  1. build - bir uygulamayı test etmek ve oluşturmak için kullanılan bir makine. Docker, Ansible tarafından otomatik olarak kuruldu.
  2. izleme - bir izleme makinesi - üzerine kurulu prometheus ve grafana. Giriş / şifre standardı: admin / admin
  3. kafka, kafka'nın kurulu olduğu ve 9092 numaralı bağlantı noktasından erişilebilen küçük bir makinedir.

Hepsinin yerli yerinde olduğundan emin olalım:

vozerov@mba:~/events (master) $ yc compute instance list
+----------------------+------------+---------------+---------+---------------+-------------+
|          ID          |    NAME    |    ZONE ID    | STATUS  |  EXTERNAL IP  | INTERNAL IP |
+----------------------+------------+---------------+---------+---------------+-------------+
| fhm081u8bkbqf1pa5kgj | monitoring | ru-central1-a | RUNNING | 84.201.159.71 | 172.16.1.35 |
| fhmf37k03oobgu9jmd7p | kafka      | ru-central1-a | RUNNING | 84.201.173.41 | 172.16.1.31 |
| fhmt9pl1i8sf7ga6flgp | build      | ru-central1-a | RUNNING | 84.201.132.3  | 172.16.1.26 |
+----------------------+------------+---------------+---------+---------------+-------------+

Kaynaklar mevcut ve buradan IP adreslerini alabiliriz. Bundan sonra ssh aracılığıyla bağlanmak ve uygulamayı test etmek için IP adreslerini kullanacağım. Terraform'a bağlı bir cloudflare hesabınız varsa, yeni oluşturulan DNS adlarını kullanmaktan çekinmeyin.
Bu arada, bir sanal makine oluştururken dahili bir IP ve dahili DNS adı verilir, böylece ağ içindeki sunuculara adlarına göre erişebilirsiniz:

ubuntu@build:~$ ping kafka.ru-central1.internal
PING kafka.ru-central1.internal (172.16.1.31) 56(84) bytes of data.
64 bytes from kafka.ru-central1.internal (172.16.1.31): icmp_seq=1 ttl=63 time=1.23 ms
64 bytes from kafka.ru-central1.internal (172.16.1.31): icmp_seq=2 ttl=63 time=0.625 ms
^C
--- kafka.ru-central1.internal ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 0.625/0.931/1.238/0.308 ms

Bu, uç noktayı uygulamaya kafk ile belirtmemiz açısından faydalı olacaktır.

Uygulamanın derlenmesi

Harika, sunucular var, bir uygulama var - geriye kalan tek şey onu bir araya getirmek ve yayınlamak. Yapı için olağan docker yapısını kullanacağız, ancak görüntü depolama olarak Yandex - konteyner kayıt defterinden bir hizmet kullanacağız. Ama önce ilk şeyler.

Uygulamayı yapım makinesine kopyalıyoruz, ssh aracılığıyla giriş yapıyoruz ve görüntüyü birleştiriyoruz:

vozerov@mba:~/events/terraform (master) $ cd ..
vozerov@mba:~/events (master) $ rsync -av app/ [email protected]:app/

... skipped ...

sent 3849 bytes  received 70 bytes  7838.00 bytes/sec
total size is 3644  speedup is 0.93

vozerov@mba:~/events (master) $ ssh 84.201.132.3 -l ubuntu
ubuntu@build:~$ cd app
ubuntu@build:~/app$ sudo docker build -t app .
Sending build context to Docker daemon  6.144kB
Step 1/9 : FROM golang:latest AS build
... skipped ...

Successfully built 9760afd8ef65
Successfully tagged app:latest

Savaşın yarısı tamamlandı - artık uygulamamızı başlatıp kafka'ya göndererek işlevselliğini kontrol edebiliriz:

ubuntu@build:~/app$ sudo docker run --name app -d -p 8080:8080 app /app/app -kafka=kafka.ru-central1.internal:9092</code>

С локальной машинки можно отправить тестовый event и посмотреть на ответ:

<code>vozerov@mba:~/events (master) $ curl -D - -s -X POST -d '{"key1":"data1"}' http://84.201.132.3:8080/post
HTTP/1.1 200 OK
Content-Type: application/json
Date: Mon, 13 Apr 2020 13:53:54 GMT
Content-Length: 41

{"status":"ok","partition":0,"Offset":0}
vozerov@mba:~/events (master) $

Uygulama, kaydın başarıyla yanıt verdi ve mesajın dahil edildiği bölümün ve ofsetin kimliğini gösterdi. Geriye kalan tek şey Yandex.Cloud'da bir kayıt defteri oluşturmak ve görselimizi buraya yüklemektir (bunun üç satır kullanılarak nasıl yapılacağı, kayıt defteri.tf dosyasında açıklanmaktadır). Bir depolama alanı oluşturun:

vozerov@mba:~/events/terraform (master) $ terraform apply -target yandex_container_registry.events

... skipped ...

Plan: 1 to add, 0 to change, 0 to destroy.

... skipped ...

Apply complete! Resources: 1 added, 0 changed, 0 destroyed.

Kapsayıcı kayıt defterinde kimlik doğrulamanın birkaç yolu vardır; oauth belirteci, iam belirteci veya hizmet hesabı anahtarı kullanarak. Bu yöntemler hakkında daha fazla ayrıntıyı belgelerde bulabilirsiniz. https://cloud.yandex.ru/docs/container-registry/operations/authentication. Hizmet hesabı anahtarını kullanacağız, böylece bir hesap oluşturacağız:

vozerov@mba:~/events/terraform (master) $ terraform apply -target yandex_iam_service_account.docker -target yandex_resourcemanager_folder_iam_binding.puller -target yandex_resourcemanager_folder_iam_binding.pusher

... skipped ...

Apply complete! Resources: 3 added, 0 changed, 0 destroyed.

Şimdi geriye kalan tek şey bunun için bir anahtar yapmak:

vozerov@mba:~/events/terraform (master) $ yc iam key create --service-account-name docker -o key.json
id: ajej8a06kdfbehbrh91p
service_account_id: ajep6d38k895srp9osij
created_at: "2020-04-13T14:00:30Z"
key_algorithm: RSA_2048

Depomuzun kimliği hakkında bilgi alıyoruz, anahtarı aktarıyoruz ve giriş yapıyoruz:

vozerov@mba:~/events/terraform (master) $ scp key.json [email protected]:
key.json                                                                                                                    100% 2392   215.1KB/s   00:00

vozerov@mba:~/events/terraform (master) $ ssh 84.201.132.3 -l ubuntu

ubuntu@build:~$ cat key.json | sudo docker login --username json_key --password-stdin cr.yandex
WARNING! Your password will be stored unencrypted in /home/ubuntu/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded
ubuntu@build:~$

Görüntüyü kayıt defterine yüklemek için kapsayıcı kayıt defteri kimliğine ihtiyacımız var, bunu yc yardımcı programından alıyoruz:

vozerov@mba:~ $ yc container registry get events
id: crpdgj6c9umdhgaqjfmm
folder_id:
name: events
status: ACTIVE
created_at: "2020-04-13T13:56:41.914Z"

Bundan sonra görselimizi yeni bir adla etiketleyip yüklüyoruz:

ubuntu@build:~$ sudo docker tag app cr.yandex/crpdgj6c9umdhgaqjfmm/events:v1
ubuntu@build:~$ sudo docker push cr.yandex/crpdgj6c9umdhgaqjfmm/events:v1
The push refers to repository [cr.yandex/crpdgj6c9umdhgaqjfmm/events]
8c286e154c6e: Pushed
477c318b05cb: Pushed
beee9f30bc1f: Pushed
v1: digest: sha256:1dd5aaa9dbdde2f60d833be0bed1c352724be3ea3158bcac3cdee41d47c5e380 size: 946

Resmin başarıyla yüklendiğini doğrulayabiliriz:

vozerov@mba:~/events/terraform (master) $ yc container repository list
+----------------------+-----------------------------+
|          ID          |            NAME             |
+----------------------+-----------------------------+
| crpe8mqtrgmuq07accvn | crpdgj6c9umdhgaqjfmm/events |
+----------------------+-----------------------------+

Bu arada, yc yardımcı programını bir Linux makinesine yüklerseniz şu komutu kullanabilirsiniz:

yc container registry configure-docker

Docker'ı yapılandırmak için.

Sonuç

Çok fazla sıkı çalışma yaptık ve sonuç olarak:

  1. Gelecekteki hizmetimizin mimarisini oluşturduk.
  2. Golang'da iş mantığımızı uygulayan bir uygulama yazdık.
  3. Topladık ve özel bir konteyner kayıt defterine döktük.

Bir sonraki bölümde ilginç konulara geçeceğiz; uygulamamızı üretime geçireceğiz ve son olarak üzerindeki yükü başlatacağız. Değiştirmeyin!

Bu materyal REBRAIN ve Yandex.Cloud açık atölyesinin video kaydında yer almaktadır: Yandex Cloud'da saniyede 10 isteği kabul ediyoruz - https://youtu.be/cZLezUm0ekE

Bu tür etkinliklere çevrimiçi olarak katılmak ve gerçek zamanlı olarak sorular sormak ilginizi çekiyorsa REBRAIN'den kanal DevOps.

Böyle bir etkinliğe ev sahipliği yapma fırsatı verdiği için Yandex.Cloud'a özellikle teşekkür etmek istiyoruz. Onlara bağlantı - https://cloud.yandex.ru/prices

Buluta geçmeniz gerekiyorsa veya altyapınızla ilgili sorularınız varsa, İstek göndermekten çekinmeyin.

Not: Ayda 2 ücretsiz denetimimiz vardır, belki sizin projeniz de bunlardan biri olabilir.

Kaynak: habr.com

Yorum ekle