በ Yandex.Cloud ውስጥ 10 ዝግጅቶችን እንቀበላለን። ክፍል 000

ሰላም ለሁሉም, ጓደኞች!

* ይህ መጣጥፍ በ REBRAIN & Yandex.Cloud ክፍት አውደ ጥናት ላይ የተመሰረተ ነው፣ ቪዲዮዎችን የበለጠ ማየት ከፈለጉ በዚህ ሊንክ ሊያገኙት ይችላሉ - https://youtu.be/cZLezUm0ekE

በቅርብ ጊዜ የ Yandex.Cloud ቀጥታ ስርጭት የመሰማት እድል ነበረን. ለረጅም ጊዜ እና በጥብቅ እንዲሰማን ስለፈለግን ፣ ቀላል የዎርድፕረስ ብሎግ ከደመና መሠረት ጋር የመጀመር ሀሳቡን ወዲያውኑ ትተናል - በጣም አሰልቺ ነው። ከተወሰነ ውይይት በኋላ፣ በእውነተኛ ጊዜ ሁነታ ክስተቶችን ለመቀበል እና ለመተንተን ከአገልግሎቱ የምርት አርክቴክቸር ጋር ተመሳሳይ የሆነ ነገር ለማሰማራት ወሰንን።

አብዛኛዎቹ የመስመር ላይ (እና ብቻ ሳይሆኑ) ንግዶች ስለተጠቃሚዎቻቸው እና ድርጊቶቻቸው በአንድ ወይም በሌላ መንገድ ብዙ መረጃ እንደሚሰበስቡ ሙሉ በሙሉ እርግጠኛ ነኝ። ቢያንስ ይህ የተወሰኑ ውሳኔዎችን ለማድረግ አስፈላጊ ነው - ለምሳሌ የመስመር ላይ ጨዋታን የሚያስተዳድሩ ከሆነ - ተጠቃሚዎች በየትኛው ደረጃ ተጣብቀው አሻንጉሊትዎን እንደሚያስወግዱ ስታቲስቲክስ ማየት ይችላሉ። ወይም ለምን ተጠቃሚዎች ምንም ነገር ሳይገዙ ጣቢያዎን እንደሚለቁ (ሠላም, Yandex.Metrica).

ስለዚህ፣ የኛ ታሪክ፡ እንዴት በጐላንግ አፕሊኬሽን እንደፃፍን፣ kafka vs rabbitmq vs yqs ሞከርን፣ የውሂብ ዥረት ወደ Clickhouse ክላስተር ጽፈን እና yandex datalens ን በመጠቀም ምስላዊ መረጃን እንደፃፍን። በተፈጥሮ ፣ ይህ ሁሉ በዶክተር ፣ ቴራፎርም ፣ ጂትላብ ሲ እና በእርግጥ ፕሮሜቲየስ መልክ በመሠረተ ልማት ደስታዎች የተቀመመ ነበር። እንሂድ!

ሁሉንም ነገር በአንድ መቀመጫ ማዘጋጀት እንደማንችል ወዲያውኑ ቦታ ማስያዝ እፈልጋለሁ - ለዚህም በተከታታይ ውስጥ ብዙ መጣጥፎች ያስፈልጉናል። ስለ አወቃቀሩ ትንሽ፡-

ክፍል 1 (እያነበቡት ነው)። የማመሳከሪያ ደንቦቹን እና የመፍትሄውን አርክቴክቸር እንገልፃለን, እንዲሁም ማመልከቻ በ golang ውስጥ እንጽፋለን.
2 ክፍል. አፕሊኬሽኑን ወደ ምርት እንሰቅላለን፣ ሊሰፋ የሚችል እና ጭነቱን እንፈትሻለን።
3 ክፍል. መልእክቶችን በፋይል ሳይሆን በመጠባበቂያ ውስጥ ማከማቸት ለምን እንደሚያስፈልገን ለማወቅ እንሞክር፣ እንዲሁም የካፍ፣ rabbitmq እና yandex queue አገልግሎትን እርስ በእርስ እናወዳድር።
4 ክፍል. የክሊክሃውስ ክላስተርን እናሰማራዋለን፣ መረጃን እዚያ ካለው ቋት ለማስተላለፍ ዥረት እንጽፋለን እና በዳታሊንስ ውስጥ ምስላዊነትን እናዘጋጃለን።
5 ክፍል. መላውን መሠረተ ልማት ወደ ትክክለኛው ቅርጽ እናምጣ - gitlab ci ን በመጠቀም ci/cd እናዋቅር፣ ፕሮሜቴየስን እና ቆንስላን በመጠቀም የክትትል እና የአገልግሎት ግኝትን እናገናኝ።

ቲኬ

በመጀመሪያ ፣ የማጣቀሻ ውሎችን እንፍጠር - በውጤቱ ላይ በትክክል ምን ማግኘት እንፈልጋለን።

  1. እንደ ክስተቶች.kis.im (kis.im በሁሉም መጣጥፎች የምንጠቀመው የሙከራ ጎራ ነው) ኤችቲቲፒኤስን በመጠቀም ክስተቶችን መቀበል ያለበት የመጨረሻ ነጥብ እንዲኖረን እንፈልጋለን።
  2. ክስተቶች የቅጹ ቀላል json ናቸው፡ {"event"፡ "view", "os": "linux", "browser": "chrome"}። በመጨረሻው ደረጃ ላይ ትንሽ ተጨማሪ መስኮችን እንጨምራለን, ነገር ግን ይህ ትልቅ ሚና አይጫወትም. ከፈለጉ ወደ ፕሮቶቡፍ መቀየር ይችላሉ።
  3. አገልግሎቱ በሰከንድ 10 ዝግጅቶችን ማካሄድ መቻል አለበት።
  4. አዳዲስ ሁኔታዎችን በቀላሉ ወደ መፍትሄችን በመጨመር አግድም መመዘን መቻል አለበት። እና ለደንበኛ ጥያቄዎች መዘግየትን ለመቀነስ የፊት ለፊት ክፍልን ወደ ተለያዩ የጂኦግራፊያዊ አካባቢዎች ማንቀሳቀስ ከቻልን ጥሩ ይሆናል።
  5. ስህተትን መታገስ. መፍትሄው በበቂ ሁኔታ የተረጋጋ እና ማንኛውም ክፍሎች ሲወድቁ (በእርግጥ እስከ የተወሰነ መጠን) መኖር መቻል አለበት.

ሥነ ሕንፃ

በአጠቃላይ, ለዚህ ዓይነቱ ተግባር, ቀልጣፋ ልኬትን የሚፈቅዱ ክላሲካል አርክቴክቸር ለረጅም ጊዜ ተፈለሰፈ. ስዕሉ የመፍትሄያችንን ምሳሌ ያሳያል.

በ Yandex.Cloud ውስጥ 10 ዝግጅቶችን እንቀበላለን። ክፍል 000

ታዲያ ምን አለን፡-

1. በግራ በኩል የእኛ መሳሪያዎች በስማርትፎን ላይ በአሻንጉሊት ውስጥ የተጫዋቾችን ደረጃ በማለፍ ወይም በመስመር ላይ መደብር ውስጥ በመደበኛ አሳሽ ውስጥ ትዕዛዝ እየፈጠሩ የተለያዩ ክስተቶችን የሚፈጥሩ መሳሪያዎቻችን ይታያሉ. ክስተቱ፣ በ TOR ላይ እንደተገለጸው፣ ወደ መጨረሻ ነጥባችን የተላከ ቀላል json ነው - events.kis.im።

2. የመጀመሪያዎቹ ሁለት አገልጋዮች ቀላል ሚዛን ሰጪዎች ናቸው, ዋና ተግባራቸው የሚከተሉት ናቸው.

  • ያለማቋረጥ መገኘት። ይህንን ለማድረግ, ለምሳሌ, Keepalived መጠቀም ይችላሉ, ይህም በችግሮች ጊዜ ምናባዊ አይፒውን በአንጓዎች መካከል ይቀይራል.
  • TLS ያቋርጡ። አዎ፣ በእነሱ ላይ TLSን እናቋርጣለን። በመጀመሪያ፣ የእኛ መፍትሔ TORን እንዲያከብር፣ ሁለተኛም፣ የተመሰጠረ ግንኙነት የመመሥረትን ሸክም ከጀርባ አገልጋዮቻችን ለማስወገድ ነው።
  • ገቢ ጥያቄዎችን በሚገኙ የጀርባ አገልጋዮች ላይ ሚዛን አድርግ። እዚህ ያለው ቁልፍ ቃል ተደራሽ ነው። ከዚህ በመነሳት ሎድ ባላንስተሮች አገልጋዮቻችንን በአፕሊኬሽን መከታተል እና የትራፊክ ፍሰትን ወደ ያልተሳካላቸው ኖዶች ማመጣጠን ማቆም መቻል እንዳለባቸው ወደ መረዳት ደርሰናል።

3. ከተመጣጣኝ ተቆጣጣሪዎች በስተጀርባ ቀላል ቀላል መተግበሪያን የሚያስኬዱ የመተግበሪያ አገልጋዮች አሉን። በ HTTP በኩል የሚመጡ ጥያቄዎችን መቀበል፣ የተላከውን json ማረጋገጥ እና ውሂቡን ማቆየት መቻል አለበት።

4. ዲያግራሙ ካፍካን እንደ ቋት ያሳያል፣ ምንም እንኳን በእርግጥ ሌሎች ተመሳሳይ አገልግሎቶች በዚህ ደረጃ ጥቅም ላይ ሊውሉ ይችላሉ። በሶስተኛው መጣጥፍ ውስጥ Kafka, rabbitmq እናyqs እናነፃፅራለን.

5. የኛ አርክቴክቸር ዋናው ነጥብ Clickhouse ነው - ትልቅ መጠን ያለው ውሂብ እንዲያከማቹ እና እንዲያካሂዱ የሚያስችልዎ የአምድ ዳታቤዝ ነው። በዚህ ደረጃ, መረጃን ከጠባቂው ወደ, በእውነቱ, የማከማቻ ስርዓቱን ማስተላለፍ አለብን (በዚህ በአንቀጽ 4 ላይ ተጨማሪ).

ይህ እቅድ እያንዳንዱን ሽፋን በተናጥል በአግድም እንድንለካ ያስችለናል። Backend አገልጋዮች መቋቋም አይችሉም - ተጨማሪ እንጨምር - ምክንያቱም አገር አልባ መተግበሪያዎች ናቸው, እና ስለዚህ, ይህ ቢያንስ በራስ-ሰር ሊከናወን ይችላል. በካፍካ መልክ ያለው ቋት አይጎተትም - ተጨማሪ አገልጋዮችን እንጨምር እና የርዕሳችንን ክፍልፋዮች ወደ እነርሱ እናስተላልፍ። ጠቅታ ቤቱ ሊቋቋመው አልቻለም - አይቻልም

በነገራችን ላይ የቴክኒካዊ ተግባራችንን እና ልኬታችንን በተለያዩ የጂኦግራፊያዊ አካባቢዎች ውስጥ አማራጭ ክፍልን ተግባራዊ ለማድረግ ከፈለጉ ምንም ቀላል ነገር የለም.

በ Yandex.Cloud ውስጥ 10 ዝግጅቶችን እንቀበላለን። ክፍል 000

በእያንዳንዱ የጂኦግራፊያዊ ቦታ ላይ, ከትግበራ እና ከካፍካ ጋር የጭነት ሚዛንን እናሰማራለን. በአጠቃላይ 2 አፕሊኬሽን ሰርቨሮች፣ 3 የካፍ ኖዶች እና የደመና ሚዛን እንደ Cloudflare ያሉ በቂ ናቸው። በዚህ መንገድ በአሜሪካ ደንበኛ የተላከ መረጃ በአሜሪካ አገልጋዮች ላይ ይደርሳል። እና ከአፍሪካ የተገኘው መረጃ አፍሪካዊ ነው።

ከዚያ ሁሉም ነገር በጣም ቀላል ነው - የመስታወት መሳሪያውን ከካፍካ ስብስብ እንጠቀማለን እና ሁሉንም መረጃዎች ከሁሉም ቦታዎች ወደ ሩሲያ ወደሚገኘው ማዕከላዊ የመረጃ ማእከል እንቀዳለን. ውስጥ፣ ውሂቡን እንተነተን እና ለቀጣይ እይታ ወደ Clickhouse እንጽፋለን።

ስለዚህ, የሕንፃውን ንድፍ አውቀናል - Yandex.Cloud ን መንቀጥቀጥ እንጀምራለን!

ማመልከቻ በመጻፍ ላይ

ከደመና በፊት፣ አሁንም ትንሽ ታጋሽ መሆን እና ገቢ ክስተቶችን ለማስኬድ ቀላል የሆነ አገልግሎት መፃፍ አለቦት። ጎላንግን እንጠቀማለን, ምክንያቱም የኔትወርክ አፕሊኬሽኖችን ለመጻፍ እንደ ቋንቋ እራሱን በሚገባ አረጋግጧል.

አንድ ሰዓት ካሳለፍን በኋላ (ምናልባት ለሁለት ሰዓታት) ፣ እንደዚህ ያለ ነገር እናገኛለን https://github.com/RebrainMe/yandex-cloud-events/blob/master/app/main.go.

እዚህ መታወቅ ያለባቸው ዋና ዋና ነጥቦች ምንድን ናቸው:

1. ማመልከቻውን ሲጀምሩ ሁለት ባንዲራዎችን መግለጽ ይችላሉ. አንዱ ለገቢ http ጥያቄዎች (-addr) የምንሰማበት ወደብ ሃላፊነት አለበት። ሁለተኛው ዝግጅቶቻችንን የምንጽፍበት የካፍ አገልጋይ አድራሻ ነው (-kafka)

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

2. አፕሊኬሽኑ የሳራማ ቤተ-መጽሐፍትን ይጠቀማል ([] github.com/Shopify/sarama) ወደ ካፍካ ክላስተር መልእክት ለመላክ። ቅንብሮቹን ወዲያውኑ በከፍተኛው የማስኬጃ ፍጥነት ላይ እናስቀምጣለን-

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

3. እንዲሁም፣ የፕሮሜቲየስ ደንበኛ በእኛ መተግበሪያ ውስጥ ተገንብቷል፣ ይህም የተለያዩ መለኪያዎችን ይሰበስባል፣ ለምሳሌ፡-

  • ለመተግበሪያችን የጥያቄዎች ብዛት;
  • ጥያቄውን በሚፈጽምበት ጊዜ የስህተት ብዛት (የልኡክ ጽሁፍ ጥያቄን ለማንበብ የማይቻል ነው, የተሰበረ json, ለካፍ መጻፍ አይቻልም);
  • መልዕክቱን ወደ ካፍካ የሚጽፉበትን ጊዜ ጨምሮ ከደንበኛው የአንድ ጥያቄ ሂደት ጊዜ።

4. ማመልከቻችን የሚያስኬድባቸው ሶስት የመጨረሻ ነጥቦች፡-

  • /ሁኔታ - ልክ በሕይወት መኖራችንን ለማሳየት እሺ ተመለስ። ምንም እንኳን እንደ የካፍ ክላስተር መገኘት ያሉ አንዳንድ ቼኮች ማከል ይችላሉ።
  • /ሜትሪክስ — ይህን ዩአርኤል በመጠቀም፣ የፕሮሜቲየስ ደንበኛ የሰበሰባቸውን መለኪያዎች ይመልሳል።
  • /ፖስት - ከውስጥ json ጋር የPOST ጥያቄዎች የሚመጡበት ዋናው የመጨረሻ ነጥብ። የእኛ መተግበሪያ jsonን ትክክለኛነት ያረጋግጣል እና ሁሉም ነገር ደህና ከሆነ ውሂቡን ለካፍ ክላስተር ይጽፋል።

ኮዱ ፍጹም እንዳልሆነ ቦታ አስይዘዋለሁ - ሊጠናቀቅ ይችላል (እና አለበት!)። ለምሳሌ አብሮ የተሰራውን net/http መጠቀም አቁመህ ወደ ፈጣን ፈጣንhttp መቀየር ትችላለህ። ወይም የ json ትክክለኛነት ቼክን ወደ ሌላ ደረጃ በማዛወር የማስኬጃ ጊዜን እና ሲፒዩ ሀብቶችን ያሸንፉ - ውሂቡ ከመጠባበቂያው ወደ ክሊክ ቤት ክላስተር በሚተላለፍበት ጊዜ።

ከጉዳዩ የልማት ጎን በተጨማሪ ስለወደፊቱ መሠረተ ልማት አሰብን እና ማመልከቻችንን በዶክተር ለማሰማራት ወሰንን. ማመልከቻውን ለመገንባት የመጨረሻው Dockerfile - https://github.com/RebrainMe/yandex-cloud-events/blob/master/app/Dockerfile. በአጠቃላይ, በጣም ቀላል ነው, ትኩረት መስጠት የምፈልገው ብቸኛው ነጥብ የባለብዙ ስቴጅ ስብሰባ ነው, ይህም የእቃችንን የመጨረሻ ምስል ለመቀነስ ያስችላል.

በደመና ውስጥ የመጀመሪያ ደረጃዎች

በመጀመሪያ ፣ ይመዝገቡ ደመና.yandex.ru. ሁሉንም አስፈላጊ መስኮች ከሞሉ በኋላ አካውንት ይፈጠርልናል እና የደመና አገልግሎቶችን ለመፈተሽ የሚያገለግል የተወሰነ የገንዘብ መጠን ስጦታ ይሰጣል። ሁሉንም እርምጃዎች ከጽሑፎቻችን መድገም ከፈለጉ, ይህ ስጦታ ለእርስዎ በቂ መሆን አለበት.

ከምዝገባ በኋላ፣ የተለየ ደመና እና ነባሪ ማውጫ ለእርስዎ ይፈጠራል፣ በዚህ ውስጥ የደመና ሀብቶችን መፍጠር መጀመር ይችላሉ። በአጠቃላይ በ Yandex.Cloud ውስጥ የሀብት ግንኙነት ይህን ይመስላል።

በ Yandex.Cloud ውስጥ 10 ዝግጅቶችን እንቀበላለን። ክፍል 000

በአንድ መለያ ብዙ ደመና መፍጠር ይችላሉ። እና በደመናው ውስጥ ለተለያዩ የኩባንያው ፕሮጀክቶች የተለያዩ ማውጫዎችን ይስሩ። ስለዚህ ጉዳይ በሰነዱ ውስጥ የበለጠ ማንበብ ይችላሉ- https://cloud.yandex.ru/docs/resource-manager/concepts/resources-hierarchy. በነገራችን ላይ, በጽሑፉ ውስጥ ከታች ብዙ ጊዜ እጠቅሳለሁ. ሙሉ መሠረተ ልማትን ከባዶ ሳዘጋጅ፣ ሰነዱ ከአንድ ጊዜ በላይ ረድቶኛል፣ ስለዚህ እንድታጠኑት እመክራለሁ።

ደመናውን ለማስተዳደር ሁለቱንም የድር በይነገጽ እና የኮንሶል መገልገያ መጠቀም ይችላሉ - yc. መጫኑ የሚከናወነው በአንድ ትዕዛዝ ነው (ለሊኑክስ እና ማክ ኦኤስ)፡-

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

የውስጥ ደህንነትዎ ስክሪፕቶችን ከበይነመረቡ ስለማሄድ ከተናደደ በመጀመሪያ ፣ ስክሪፕቱን ከፍተው ማንበብ ይችላሉ ፣ እና በሁለተኛ ደረጃ ፣ ያለ ስርወ መብቶች ።

ለዊንዶውስ ደንበኛን መጫን ከፈለጉ መመሪያዎቹን መጠቀም ይችላሉ እዚህ እና ከዚያ ያስፈጽሙ yc initሙሉ ለሙሉ ለማበጀት;

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:~ $

በመርህ ደረጃ, ሂደቱ ቀላል ነው - በመጀመሪያ ደመናውን ለማስተዳደር, ደመናውን እና የሚጠቀመውን ማህደር ለመምረጥ የ outh token ማግኘት ያስፈልግዎታል.

በተመሳሳዩ ደመና ውስጥ ብዙ መለያዎች ወይም አቃፊዎች ካሉዎት ፣ በ yc config profile ፍጠር እና በመካከላቸው መቀያየርን በመጠቀም ተጨማሪ መገለጫዎችን በተለየ መቼት መፍጠር ይችላሉ።

ከላይ ከተጠቀሱት ዘዴዎች በተጨማሪ የ Yandex.Cloud ቡድን በጣም ጥሩ ጽፏል ተሰኪ ለ terraform የደመና ሀብቶችን ለማስተዳደር. እኔ በበኩሌ እንደ መጣጥፉ አካል የሚፈጠሩትን ሁሉንም ሀብቶች የገለጽኩበት የ git ማከማቻ አዘጋጅቻለሁ - https://github.com/rebrainme/yandex-cloud-events/. በዋናው ቅርንጫፍ ላይ ፍላጎት አለን ፣ በአገር ውስጥ እንዘጋው-


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 ውስጥ ጥቅም ላይ የዋሉ ሁሉም ዋና ዋና ተለዋዋጮች በ main.tf ፋይል ውስጥ ተመዝግበዋል. ለመጀመር፣ በሚከተለው ይዘት በ Terraform አቃፊ ውስጥ private.auto.tfvars ፋይል ይፍጠሩ፡

# 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 = ""

የኮንሶል መገልገያውን አስቀድመን ስላዋቀርን ሁሉም ተለዋዋጮች ከ yc ውቅር ዝርዝር ሊወሰዱ ይችላሉ። ባለማወቅ የግል መረጃን እንዳታተም ወዲያውኑ private.auto.tfvars ወደ .gitignore እንድታክሉ እመክራለሁ።

በprivate.auto.tfvars ውስጥ፣ ከ Cloudflare የመጣ መረጃንም ገለጽን - የዲ ኤን ኤስ መዝገቦችን ለመፍጠር እና ዋናዎቹን ክስተቶች.kis.im ጎራ ወደ አገልጋዮቻችን ተኪ ለማድረግ። Cloudflareን መጠቀም ካልፈለጉ፣ በ main.tf ውስጥ ያለውን የCloudflare አቅራቢውን አጀማመር እና አስፈላጊውን የዲ ኤን ኤስ መዝገቦችን የመፍጠር ሃላፊነት ያለውን የ dns.tf ፋይል ያስወግዱ።

በስራችን ውስጥ ሶስቱን ዘዴዎች - የዌብ በይነገጽ ፣ የኮንሶል መገልገያ እና ቴራፎርም እናጣምራለን።

ምናባዊ አውታረ መረቦች

እውነቱን ለመናገር ይህ እርምጃ ሊዘለል ይችል ነበር ምክንያቱም አዲስ ደመና ሲፈጥሩ በራስ-ሰር የተለየ አውታረ መረብ እና 3 ንዑስ አውታረ መረቦች ይፈጥራሉ - ለእያንዳንዱ ተደራሽ ዞን። ግን አሁንም ለፕሮጀክታችን የራሱ አድራሻ ያለው የተለየ ኔትወርክ መስራት እፈልጋለሁ። በ Yandex.Cloud ውስጥ ያለው የአውታረ መረብ አጠቃላይ እቅድ ከዚህ በታች ባለው ስእል ላይ ይታያል (በሐቀኝነት ከ https://cloud.yandex.ru/docs/vpc/concepts/)

በ Yandex.Cloud ውስጥ 10 ዝግጅቶችን እንቀበላለን። ክፍል 000

ስለዚህ, ሀብቶች እርስ በርስ የሚግባቡበት የጋራ አውታረ መረብ ይፈጥራሉ. ለእያንዳንዱ የተደራሽ ዞን፣ ንኡስ መረብ የራሱ አድራሻ ያለው እና ከጋራ አውታረ መረብ ጋር የተገናኘ ነው። በውጤቱም, በውስጡ ያሉት ሁሉም የደመና ሀብቶች ሊገናኙ ይችላሉ, በተለያዩ የመገኛ ቀጠናዎች ውስጥ እንኳን ሊሆኑ ይችላሉ. ከተለያዩ የደመና አውታረ መረቦች ጋር የተገናኙ ግብዓቶች እርስ በርስ ሊተያዩ የሚችሉት በውጫዊ አድራሻዎች ብቻ ነው። በነገራችን ላይ ይህ አስማት በውስጡ እንዴት እንደሚሰራ, ሀበሬ ላይ በደንብ ተብራርቷል።.

የአውታረ መረብ መፍጠር ከማከማቻው ውስጥ በ network.tf ፋይል ውስጥ ተገልጿል. እዚያም አንድ የጋራ የግል አውታረመረብ ውስጣዊ እንፈጥራለን እና ሶስት ንኡስ አውታረ መረቦችን ከእሱ ጋር በተለያዩ የተደራሽ ዞኖች እናገናኘዋለን - ውስጣዊ-a (172.16.1.0/24) ፣ የውስጥ - ለ (172.16.2.0/24) ፣ የውስጥ - ሐ (172.16.3.0/24) ).

ቴራፎርምን ያስጀምሩ እና አውታረ መረቦችን ይፍጠሩ፡

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.

በጣም ጥሩ! አውታረ መረባችንን ሰርተናል እና አሁን የውስጥ አገልግሎቶቻችንን ለመፍጠር ዝግጁ ነን።

ምናባዊ ማሽኖችን ይፍጠሩ

አፕሊኬሽኑን ለመፈተሽ ሁለት ቨርቹዋል ማሽኖችን መፍጠር ይበቃናል - አፕሊኬሽኑን ለመስራት እና ለማስኬድ የመጀመሪያው ያስፈልገናል፣ ሁለተኛው - ካፍካ ለማስኬድ፣ ገቢ መልዕክቶችን ለማከማቸት እንጠቀማለን። እና አፕሊኬሽኑን ለመቆጣጠር ፕሮሜቲየስን የምናዘጋጅበት ሌላ ማሽን እንፈጥራለን።

ቨርቹዋል ማሽኖች ሊዋቀሩ የሚችሉትን በመጠቀም ነው፣ስለዚህ ቴራፎርም ከመሮጥዎ በፊት፣ከመጨረሻዎቹ የአንሲቢስ ስሪቶች ውስጥ አንዱን እንዳለዎት ያረጋግጡ። እና አስፈላጊ ሚናዎችን በሚቻል ጋላክሲ ይጫኑ-

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.cfg ውቅር ፋይል ምሳሌ አለ። ምናልባት ጠቃሚ ሊሆን ይችላል.

ምናባዊ ማሽኖችን ከመፍጠርዎ በፊት የssh-egent ሩጫ እና ssh ቁልፍ መጨመሩን ያረጋግጡ፣ይህ ካልሆነ ቴራፎርም ከተፈጠሩት ማሽኖች ጋር መገናኘት አይችልም። እኔ፣በእርግጥ፣በ OS x ውስጥ ስህተት አጋጥሞኛል፡- https://github.com/ansible/ansible/issues/32499#issuecomment-341578864. እንደዚህ ያለ ታሪክ እራሱን እንዳይደግም ለመከላከል Terraformን ከመጀመርዎ በፊት ትንሽ ተለዋዋጭ ወደ env ያክሉ።

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

ከቴራፎርሙ ጋር ባለው አቃፊ ውስጥ አስፈላጊ ሀብቶችን እንፈጥራለን-

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 ...

ሁሉም ነገር በተሳካ ሁኔታ ከተጠናቀቀ (እንደሚፈለገው) ፣ ከዚያ ሶስት ምናባዊ ማሽኖች ይኖሩናል-

  1. ግንባታ - መተግበሪያን ለመፈተሽ እና ለመገንባት ማሽን. Docker በራስ-ሰር በችሎታ ተጭኗል።
  2. መከታተያ - የክትትል ማሽን - ፕሮሜቲየስ እና ግራፋና በላዩ ላይ ተጭኗል። የመግቢያ / የይለፍ ቃል መደበኛ: አስተዳዳሪ / አስተዳዳሪ
  3. ካፍካ በፖርት 9092 ላይ የሚገኝ ካፍ የተጫነ ትንሽ ማሽን ነው።

ሁሉም ቦታ ላይ መሆናቸውን እናረጋግጥ፡-

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 |
+----------------------+------------+---------------+---------+---------------+-------------+

ንብረቶቹ በቦታቸው ላይ ናቸው, እና ከዚህ አይፒ-አድራሻቸውን ማውጣት እንችላለን. ከታች በሁሉም ቦታ፣ በssh በኩል ለመገናኘት እና አፕሊኬሽኑን ለመሞከር ip-addresses እጠቀማለሁ። ከቴራፎርም ጋር የተገናኘ የCloudflare መለያ ካለህ፣ አዲስ የተፈጠሩ የዲ ኤን ኤስ ስሞችን ለመጠቀም ነፃነት ይሰማህ።
በነገራችን ላይ ቨርቹዋል ማሽን ሲፈጥሩ የውስጥ አይፒ እና የውስጥ ዲ ኤን ኤስ ስም ወጥቷል ስለዚህ በኔትወርኩ ውስጥ ያሉ አገልጋዮችን በስም ማግኘት ይችላሉ፡

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

ይህ የመጨረሻውን ነጥብ ከካፍክ ጋር ወደ ማመልከቻው ለመግለጽ ይጠቅመናል።

ማመልከቻውን አንድ ላይ በማጣመር

በጣም ጥሩ ፣ አገልጋዮች አሉ ፣ አንድ መተግበሪያ አለ - እሱን ለመሰብሰብ እና ለማተም ብቻ ይቀራል። ለስብሰባ, የተለመደው የዶከር ግንባታ እንጠቀማለን, ነገር ግን እንደ ምስል ማከማቻ, ከ Yandex - የእቃ መመዝገቢያ አገልግሎት እንወስዳለን. ግን መጀመሪያ ነገሮች መጀመሪያ።

አፕሊኬሽኑን ወደ ግንባታ ማሽን እንገለብጣለን ፣ በ ssh በኩል ይሂዱ እና ምስሉን እንገነባለን-

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

ግማሹ ስራው ተከናውኗል - አሁን የኛን መተግበሪያ በማሄድ እና ወደ ካፍ በመጠቆም አፈጻጸምን መሞከር እንችላለን፡-

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) $

አፕሊኬሽኑ በፅሁፍ ስኬት እና የክፋዩን መታወቂያ እና መልዕክቱ የወደቀበትን ማካካሻ በማመላከት ምላሽ ሰጥቷል። የሚቀረው ነገር ቢኖር በ Yandex.Cloud ውስጥ መዝገብ መፍጠር እና ምስላችንን እዚያ መስቀል ነው (በሦስት መስመሮች በመጠቀም ይህንን እንዴት ማድረግ እንደሚቻል በ registry.tf ፋይል ውስጥ ተገልጿል). ማከማቻ ይፍጠሩ፡

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.

በኮንቴይነር መዝገብ ውስጥ ብዙ የማረጋገጫ መንገዶች አሉ - የ oauth token፣ iam token ወይም የአገልግሎት መለያ ቁልፍ በመጠቀም። ስለነዚህ ዘዴዎች ተጨማሪ ዝርዝሮች በሰነዶቹ ውስጥ ይገኛሉ. https://cloud.yandex.ru/docs/container-registry/operations/authentication. የአገልግሎት መለያ ቁልፍን እንጠቀማለን፣ ስለዚህ መለያ እንፈጥራለን፡-

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.

አሁን ለእሱ ቁልፍ መስራት ይቀራል፡-

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

ስለማከማቻችን መታወቂያ መረጃ አግኝተናል፣ ቁልፉን አስተላልፈን እና ግባ፡-

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:~$

ምስሉን ወደ መዝገቡ ለመስቀል፣የኮንቴይነር መዝገብ መታወቂያ እንፈልጋለን፣ከ yc መገልገያ እንወስደዋለን፡-

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

ከዚያ በኋላ ምስላችንን በአዲስ ስም እንሰጣለን እና እንጭነዋለን፡-

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

ምስሉ በተሳካ ሁኔታ መጫኑን ማረጋገጥ እንችላለን፡-

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

በነገራችን ላይ የ yc መገልገያውን በሊኑክስ ማሽን ላይ ከጫኑ ትዕዛዙን መጠቀም ይችላሉ

yc container registry configure-docker

ዶከርን ለማዋቀር.

መደምደሚያ

ብዙ ጠንክረን ሰርተናል በዚህም የተነሳ፡-

  1. የወደፊት አገልግሎታችንን አርክቴክቸር ይዘን መጥተናል።
  2. የቢዝነስ አመክንዮአችንን ተግባራዊ የሚያደርግ መተግበሪያ በጎላንግ ጻፍን።
  3. ሰብስበን በግል ኮንቴይነሮች መዝገብ ውስጥ አፍስሰናል።

በሚቀጥለው ክፍል ወደ ሳቢው ክፍል እንሂድ - ማመልከቻችንን ወደ ምርት እንፈስሳለን እና በመጨረሻም ጭነቱን በእሱ ላይ እናስነሳለን. አትቀይር!

ይህ ቁሳቁስ በ REBRAIN እና Yandex.Cloud ክፍት ወርክሾፕ ቪዲዮ ውስጥ አለ-በሴኮንድ 10 ጥያቄዎችን ለ Yandex ክላውድ እንቀበላለን - https://youtu.be/cZLezUm0ekE

እንደዚህ አይነት ዝግጅቶችን በመስመር ላይ ለመገኘት እና በእውነተኛ ጊዜ ጥያቄዎችን ለመጠየቅ ፍላጎት ካሎት፣ ይገናኙ DevOps በREBRAIN ሰርጥ.

ለ Yandex.Cloud እንደዚህ አይነት ክስተት ለማካሄድ እድሉን ስለሰጠን ልዩ ምስጋና ልንሰጥ እንፈልጋለን. ከእነሱ ጋር አገናኝ - https://cloud.yandex.ru/prices

ወደ ደመና መሄድ ከፈለጉ ወይም ስለ መሠረተ ልማትዎ ጥያቄዎች ካሉዎት፣ ጥያቄ ለማቅረብ ነፃነት ይሰማህ.

PS በወር 2 ነፃ ኦዲት አለን፣ ምናልባት የእርስዎ ፕሮጀክት ከእነዚህ ውስጥ አንዱ ሊሆን ይችላል።

ምንጭ: hab.com

አስተያየት ያክሉ