ደቡብብሪጅ በቼልያቢንስክ እና ቢትሪክስ በኩበርኔትስ

Sysadminka ስርዓት አስተዳዳሪ ስብሰባዎች በቼልያቢንስክ ውስጥ እየተካሄደ ነው, እና በመጨረሻ አንድ እኔ Kubernetes ውስጥ 1C-Bitrix ላይ መተግበሪያዎችን ለማስኬድ ያለንን መፍትሔ ላይ ሪፖርት ሰጠሁ.

Bitrix, Kubernetes, Ceph - በጣም ጥሩ ድብልቅ?

ከዚህ ሁሉ የሚሰራ መፍትሄ እንዴት እንደምናዘጋጅ እነግርዎታለሁ.

እንሂድ!

ደቡብብሪጅ በቼልያቢንስክ እና ቢትሪክስ በኩበርኔትስ

ስብሰባው የተካሄደው ኤፕሪል 18 በቼልያቢንስክ ነበር። ስለ ስብሰባዎቻችን በ ላይ ማንበብ ይችላሉ። የጊዜ ሰሌዳ እና ተመልከት YouTube.

በሪፖርት ወይም በአድማጭ ወደ እኛ መምጣት ከፈለጉ - እንኳን ደህና መጡ ፣ ይፃፉ [ኢሜል የተጠበቀ] እና በቴሌግራም t.me/vadimisakanov.

የእኔ ዘገባ

ደቡብብሪጅ በቼልያቢንስክ እና ቢትሪክስ በኩበርኔትስ

ስላይዶች

መፍትሄ "Bitrix in Kubernetes፣ ስሪት Southbridge 1.0"

በስብሰባው ላይ እንደተደረገው "ለዱሚዎች በኩበርኔትስ" ቅርጸት ስለእኛ መፍትሄ እናገራለሁ. ነገር ግን Bitrix, Docker, Kubernetes, Ceph የሚሉትን ቃላት ቢያንስ በዊኪፔዲያ ላይ ባሉ መጣጥፎች ደረጃ እንደሚያውቁ እገምታለሁ።

በኩበርኔትስ ውስጥ ስለ Bitrix ምን ዝግጁ ነው?

በኩበርኔትስ ውስጥ ስለ Bitrix አፕሊኬሽኖች አሠራር በመላው በይነመረብ ላይ በጣም ትንሽ መረጃ አለ።
እነዚህን ቁሳቁሶች ብቻ አገኘሁ:

ዘገባ በአሌክሳንደር ሰርቡል፣ 1ሲ-ቢትሪክስ እና አንቶን ቱዝሉኮቭ ከQsoft

እሱን ለማዳመጥ እመክራለሁ።

ከተጠቃሚው የራስዎን መፍትሄ ማዘጋጀት ሰርኪሮን ሀበሬ ላይ.
ተጨማሪ ተገኝቷል እንዲህ ያለ ውሳኔ.

አአና... በእውነቱ፣ ያ ብቻ ነው።

አስጠነቅቃችኋለሁ፣ ከላይ ባሉት ማገናኛዎች የመፍትሄዎቹን ጥራት አላረጋገጥንም። :)
በነገራችን ላይ መፍትሄችንን በምዘጋጅበት ጊዜ ከአሌክሳንደር ሰርቡል ጋር ተነጋገርኩኝ ፣ ከዚያ ሪፖርቱ ገና አልመጣም ፣ ስለሆነም በእኔ ስላይዶች ውስጥ “Bitrix Kubernetes አይጠቀምም” የሚል ንጥል አለ ​​።

ነገር ግን Bitrix በ Docker ውስጥ ለማሄድ ብዙ ዝግጁ የሆኑ Docker ምስሎች አሉ። https://hub.docker.com/search?q=bitrix&type=image

ይህ በኩበርኔትስ ውስጥ ለ Bitrix የተሟላ መፍትሄ ለመፍጠር በቂ ነው?
አይ. መፍታት ያለባቸው ብዙ ቁጥር ያላቸው ችግሮች አሉ።

በኩበርኔትስ ውስጥ ከ Bitrix ጋር ምን ችግሮች አሉ?

በመጀመሪያ, ከ Dockerhub የተዘጋጁ ምስሎች ለኩበርኔትስ ተስማሚ አይደሉም

የማይክሮ ሰርቪስ አርክቴክቸር መገንባት ከፈለግን (እና በ Kubernetes ውስጥ ብዙውን ጊዜ የምንሰራው) የኩበርኔትስ መተግበሪያችንን ወደ ኮንቴይነሮች መለየት እና እያንዳንዱ ኮንቴይነር አንድ ትንሽ ተግባር እንዲፈጽም (እና በጥሩ ሁኔታ እንዲሰራ) ማድረግ አለብን። ለምን አንድ ብቻ? በአጭር አነጋገር ቀላል የሆነው ይበልጥ አስተማማኝ ነው.
የበለጠ ግልጽ ለመሆን፣ ይህን ጽሑፍ እና ቪዲዮ ይመልከቱ፣ እባክዎ፡- https://habr.com/ru/company/southbridge/blog/426637/

Dockerhub ውስጥ Docker ምስሎች በዋናነት ሁሉ-በ-አንድ መርህ ላይ የተገነቡ ናቸው, ስለዚህ እኛ አሁንም የራሳችንን ብስክሌት መስራት እና ከባዶ ምስሎችን መፍጠር ነበር.

ሁለተኛ - የጣቢያው ኮድ ከአስተዳዳሪው ፓነል ተስተካክሏል

በጣቢያው ላይ አዲስ ክፍል ፈጠርን - ኮዱ ተዘምኗል (የአዲሱ ክፍል ስም ያለው ማውጫ ተጨምሯል)።

ከአስተዳዳሪው ፓነል የአንድ አካል ባህሪያትን ከቀየሩ, ኮዱ ተቀይሯል.

Kubernetes "በነባሪ" ከዚህ ጋር መስራት አይችልም, ኮንቴይነሮች አገር አልባ መሆን አለባቸው.

ምክንያት፡ በክላስተር ውስጥ ያለ እያንዳንዱ ኮንቴይነር (ፖድ) ከትራፊኩ የተወሰነውን ብቻ ያካሂዳል። ኮዱን በአንድ ኮንቴይነር (ፖድ) ብቻ ከቀየሩት ኮዱ በተለያየ ፖድ ውስጥ የተለየ ይሆናል, ጣቢያው በተለየ መንገድ ይሰራል, እና የተለያዩ የጣቢያው ስሪቶች ለተለያዩ ተጠቃሚዎች ይታያሉ. እንደዛ መኖር አትችልም።

ሶስተኛ - ጉዳዩን በማሰማራት መፍታት ያስፈልግዎታል

ሞኖሊት እና አንድ "አንጋፋ" አገልጋይ ካለን, ሁሉም ነገር በጣም ቀላል ነው: አዲስ የኮድ መሰረትን እናሰማራለን, የውሂብ ጎታውን እንሸጋገራለን, ትራፊክን ወደ አዲሱ የኮዱ ስሪት እንቀይራለን. መቀየር ወዲያውኑ ይከሰታል.
በኩበርኔትስ ውስጥ አንድ ጣቢያ ካለን, ወደ ማይክሮ ሰርቪስ ተቆርጧል, ኮድ ያላቸው ብዙ መያዣዎች አሉ - ኦህ. ኮንቴይነሮችን በአዲስ የኮዱ ሥሪት መሰብሰብ፣ ከአሮጌዎቹ ይልቅ መልቀቅ፣ የውሂብ ጎታውን በትክክል ማዛወር እና በጎብኝዎች ሳይስተዋሉ ማድረግ ያስፈልግዎታል። እንደ እድል ሆኖ, Kubernetes በዚህ ላይ ያግዘናል, በአጠቃላይ የተለያዩ አይነት ማሰማራትን ይደግፋል.

አራተኛ - ስታቲስቲክስን የማከማቸት ጉዳይ መፍታት ያስፈልግዎታል

ጣቢያዎ "ብቻ" 10 ጊጋባይት ከሆነ እና ሙሉ በሙሉ በመያዣዎች ውስጥ ካሰማሩት, እስከመጨረሻው ለማሰማራት የሚወስዱ 10 ጊጋባይት መያዣዎችን ያገኛሉ.
የጣቢያው "በጣም ከባድ" ክፍሎችን ከመያዣዎች ውጭ ማከማቸት ያስፈልግዎታል, እና ይህን እንዴት በትክክል ማድረግ እንደሚቻል ጥያቄው ይነሳል.

ከመፍትሄያችን ምን ጎደለው?

ሙሉው የ Bitrix ኮድ ወደ ማይክሮፎንክስ/ማይክሮ ሰርቪስ አልተከፋፈለም (ምዝገባ የተለየ እንዲሆን፣ የመስመር ላይ መደብር ሞጁል የተለየ ነው፣ ወዘተ.) በእያንዳንዱ መያዣ ውስጥ ሙሉውን የኮድ መሠረት እናከማቻለን.

በተጨማሪም የውሂብ ጎታውን በኩበርኔትስ ውስጥ አናከማችም (አሁንም ለልማት አካባቢዎች በ Kubernetes የውሂብ ጎታ ጋር መፍትሄዎችን ተግባራዊ አድርጌያለሁ, ነገር ግን ለምርት አይደለም).

ጣቢያው በኩበርኔትስ ላይ እንደሚሰራ ለጣቢያ አስተዳዳሪዎች አሁንም የሚታይ ይሆናል። "የስርዓት ፍተሻ" ተግባር በትክክል አይሰራም, የጣቢያውን ኮድ ከአስተዳዳሪው ፓኔል ለማረም በመጀመሪያ "ኮዱን ማረም እፈልጋለሁ" የሚለውን ቁልፍ ጠቅ ማድረግ አለብዎት.

ችግሮቹ ተለይተዋል, ማይክሮ ሰርቪስ የመተግበር አስፈላጊነት ተወስኗል, ግቡ ግልጽ ነው - በ Bitrix ላይ በ Kubernetes ውስጥ መተግበሪያዎችን ለማስኬድ የስራ ስርዓት ለማግኘት, የቢትሪክስ አቅምን እና የ Kubernetes ጥቅሞችን ይጠብቃል. ትግበራ እንጀምር።

ሥነ ሕንፃ

ከድር አገልጋይ (ሰራተኞች) ጋር ብዙ "የሚሰሩ" ፖዶች አሉ.
ከ cron ተግባራት በታች አንዱ (አንድ ብቻ ያስፈልጋል)።
ከአስተዳዳሪ ፓነል የጣቢያውን ኮድ ለማረም አንድ ማሻሻያ (እንዲሁም አንድ ብቻ ያስፈልጋል)።

ደቡብብሪጅ በቼልያቢንስክ እና ቢትሪክስ በኩበርኔትስ

ጥያቄዎችን እንፈታለን-

  • ክፍለ ጊዜዎችን የት ማከማቸት?
  • መሸጎጫውን የት ማከማቸት?
  • ጊጋባይት ስታስቲክስን በእቃ ማጠራቀሚያ ውስጥ ለማስቀመጥ ሳይሆን ስታቲስቲክስን የት እንደሚከማች?
  • የመረጃ ቋቱ እንዴት ይሰራል?

Docker ምስል

የዶከር ምስል በመገንባት እንጀምራለን.

በጣም ጥሩው አማራጭ አንድ ሁለንተናዊ ምስል አለን ፣ በእሱ መሠረት የሰራተኛ ፖድ ፣ ክሮንክስ ያላቸው ፖድ እና አሻሽል ፖድዎችን እናገኛለን።

እኛ እንደዚህ ያለ ምስል ሠራን።.

nginx፣ apache/php-fpm (በግንባታ ጊዜ ሊመረጥ ይችላል)፣ መልዕክት ለመላክ msmtp እና ክሮን ያካትታል።

ምስሉን በሚገጣጠምበት ጊዜ የጣቢያው አጠቃላይ ኮድ ወደ / መተግበሪያ ማውጫ ይገለበጣል (ከእነዚያ ክፍሎች በስተቀር ወደ የተለየ የጋራ ማከማቻ የምንዘዋወርበት)።

ማይክሮ አገልግሎቶች, አገልግሎቶች

የሰራተኛ ፓንዶች;

  • መያዣ በ nginx + መያዣ apache/php-fpm + msmtp
  • msmtpን ወደ ተለየ ማይክሮ ሰርቪስ ማዘዋወሩ አልሰራም፣ ቢትሪክስ በቀጥታ መልዕክት መላክ ባለመቻሉ መቆጣቱ ጀምሯል።
  • እያንዳንዱ መያዣ የተሟላ ኮድ ቤዝ አለው.
  • በመያዣዎች ውስጥ ኮድን የመቀየር ክልከላ።

ክሮን ስር፡

  • መያዣ በ apache, php, cron
  • የተሟላ ኮድ መሠረት ተካትቷል።
  • በኮንቴይነሮች ውስጥ ኮድን የመቀየር እገዳ

አሻሽል በሚከተለው ስር

  • nginx መያዣ + apache/php-fpm መያዣ + msmtp
  • በኮንቴይነሮች ውስጥ ኮድን ለመለወጥ ምንም ክልከላ የለም

የክፍለ ጊዜ ማከማቻ

የቢትሪክስ መሸጎጫ ማከማቻ

ሌላው አስፈላጊ ነገር: ከሁሉም ነገር ጋር ለመገናኘት የይለፍ ቃሎችን እናከማቻለን, ከመረጃ ቋት ወደ ፖስታ, በ kubernetes ሚስጥሮች ውስጥ. ጉርሻ እናገኛለን: የይለፍ ቃሎች የሚታዩት ምስጢሮችን የምንሰጣቸው ብቻ ነው, እና የፕሮጀክቱን ኮድ መሰረት ላለው ሁሉ አይደለም.

ለስታስቲክስ ማከማቻ

ማንኛውንም ነገር መጠቀም ይችላሉ: ceph, nfs (ግን nfs ን ለማምረት አንመክርም), የአውታረ መረብ ማከማቻ ከደመና አቅራቢዎች, ወዘተ.

ማከማቻው በመያዣዎች ውስጥ ከጣቢያው / ሰቀላ/ ማውጫ እና ሌሎች የማይንቀሳቀስ ይዘት ካላቸው ማውጫዎች ጋር መገናኘት አለበት።

የውሂብ ጎታ

ለቀላልነት, የውሂብ ጎታውን ከ Kubernetes ውጭ ለማንቀሳቀስ እንመክራለን. በኩበርኔትስ ውስጥ ያለው መሠረት የተለየ የተወሳሰበ ተግባር ነው ፣ እቅዱን የክብደት ቅደም ተከተል የበለጠ የተወሳሰበ ያደርገዋል።

የክፍለ-ጊዜ ማከማቻ

ሜምካሼድ እንጠቀማለን :)

የክፍለ-ጊዜ ማከማቻን በደንብ ያስተናግዳል፣ ተሰብስቧል እና እንደ ክፍለ-ጊዜ በ php ውስጥ "በቤተኛ" ይደገፋል። ብዙ የድረ-ገጽ አገልጋዮች ያሏቸው ስብስቦችን ስንገነባ በጥንታዊው ሞኖሊቲክ አርክቴክቸር ውስጥ እንዲህ ዓይነቱ ሥርዓት ብዙ ጊዜ ተፈትኗል። ለማሰማራት helm እንጠቀማለን።

$ helm install stable/memcached --name session

php.ini - እዚህ ምስሉ በ memcached ውስጥ ክፍለ ጊዜዎችን ለማከማቸት ቅንብሮችን ይዟል

ስለ አስተናጋጆች መረጃ በሜምካሼድ ለማስተላለፍ የአካባቢ ተለዋዋጮችን ተጠቀምን። https://kubernetes.io/docs/tasks/inject-data-application/define-environment-variable-container/.
ይህ በዲቪ, ደረጃ, ፈተና, ፕሮድ አከባቢዎች ውስጥ አንድ አይነት ኮድ እንዲጠቀሙ ይፈቅድልዎታል (በእነሱ ውስጥ የተካተቱት የአስተናጋጅ ስሞች ይለያያሉ, ስለዚህ ለእያንዳንዱ አካባቢ ለክፍለ-ጊዜዎች ልዩ የሆነ የአስተናጋጅ ስም ማስተላለፍ አለብን).
የቢትሪክስ መሸጎጫ ማከማቻ

ሁሉም ፖድዎች የሚጽፉበት እና የሚያነቡት ስህተትን የሚቋቋም ማከማቻ እንፈልጋለን።

እኛ ደግሞ memcached እንጠቀማለን።
ይህ መፍትሔ በቢትሪክስ በራሱ ይመከራል.

$ helm install stable/memcached --name cache

bitrix/.settings_extra.php - እዚህ Bitrix ውስጥ መሸጎጫው የሚከማችበት ቦታ ይገለጻል።

እንዲሁም የአካባቢ ተለዋዋጮችን እንጠቀማለን።

ክሮንታስኪ

በኩበርኔትስ ውስጥ Crontasksን ለማሄድ የተለያዩ አቀራረቦች አሉ።

  • Crontasks ን ለማሄድ ከፖድ ጋር የተለየ ማሰማራት
  • ክሮንጆብ ክሮንትን ለማስኬድ (ይህ የድር መተግበሪያ ከሆነ - ከ wget ጋር https://$host$cronjobname፣ ወይም kubectl exec በአንደኛው የሰራተኛ ፖድ ፣ ወዘተ.)
  • ወዘተ

በጣም ትክክለኛ በሆነው ጉዳይ ላይ መከራከር ይችላሉ ፣ ግን በዚህ ሁኔታ “ከፖድስ ጋር ለ ክሮንታክስ የተለየ ማሰማራት” የሚለውን አማራጭ መርጠናል ።

እንዴት እንደሚደረግ፡-

  • የ cron ተግባሮችን በ ConfigMap ወይም በ config/ addcron ፋይል በኩል ያክሉ
  • በአንድ አጋጣሚ ከሠራተኛው ፖድ ጋር ተመሳሳይ የሆነ መያዣ እናስነሳለን + በውስጡ የዘውድ ተግባራትን እንዲፈጽም እንፈቅዳለን
  • ተመሳሳዩ ኮድ መሠረት ጥቅም ላይ ይውላል ፣ ለማዋሃድ ምስጋና ይግባው ፣ የእቃ መጫኛ ስብስብ ቀላል ነው።

ምን ጥሩ ነገር እናገኛለን:

  • ከገንቢዎች አካባቢ (ዶከር) ጋር በሚመሳሰል አካባቢ ውስጥ የሚሰሩ ክሮንታስክዎች አሉን
  • Crontasks ለ Kubernetes "እንደገና መፃፍ" አያስፈልጋቸውም, ልክ እንደበፊቱ በተመሳሳይ መልኩ እና በተመሳሳይ ኮድ መሰረት ይሰራሉ.
  • ክሮን ተግባራት አስተዳዳሪዎች ብቻ ሳይሆኑ ለምርት ቅርንጫፍ ሙሉ መብት ባላቸው ሁሉም የቡድን አባላት ሊጨመሩ ይችላሉ።

Southbridge K8SDeploy ሞጁል እና ኮድ አርትዖት ከአስተዳዳሪ ፓነል

ስለ ማሻሻያ እየተነጋገርን ነበር?
እዚያ ትራፊክ እንዴት እንደሚመራ?
ሁሬ፣ ለዚህ ​​ሞጁል በPHP ጽፈናል :) ይህ ለBitrix ትንሽ የሚታወቀው ሞጁል ነው። እስካሁን በይፋ አልተገኘም፣ ግን ለመክፈት አቅደናል።
ሞጁሉ በቢትሪክስ ውስጥ እንደ መደበኛ ሞጁል ተጭኗል፡-

ደቡብብሪጅ በቼልያቢንስክ እና ቢትሪክስ በኩበርኔትስ

እና ይህን ይመስላል።

ደቡብብሪጅ በቼልያቢንስክ እና ቢትሪክስ በኩበርኔትስ

የጣቢያውን አስተዳዳሪ የሚለይ እና ኩበርኔትስ ወደ ማሻሻያ ፖድ ትራፊክ እንዲልክ የሚያስችል ኩኪ እንዲያዘጋጁ ይፈቅድልዎታል።

ለውጦቹ ሲጠናቀቁ git push ን ጠቅ ማድረግ ያስፈልግዎታል ፣ የኮዱ ለውጦች ወደ git ይላካሉ ፣ ከዚያ ስርዓቱ ከአዲሱ የኮዱ ስሪት ጋር ምስል ይገነባል እና በክላስተር ላይ “ይንከባለል” ፣ የድሮውን ፖዶች ይተካል። .

አዎ, ትንሽ ክራንች ነው, ግን በተመሳሳይ ጊዜ የማይክሮ ሰርቪስ አርክቴክቸር እንጠብቃለን እና ከ Bitrix ተጠቃሚዎች ኮዱን ከአስተዳዳሪ ፓነል ለማረም የሚወዱትን እድል አንወስድም. ዞሮ ዞሮ ይህ አማራጭ ነው፤ ኮዱን የማስተካከል ችግርን በተለየ መንገድ መፍታት ይችላሉ።

Helm ገበታ

በ Kubernetes ላይ መተግበሪያዎችን ለመገንባት፣ በተለምዶ የ Helm ጥቅል አስተዳዳሪን እንጠቀማለን።
ለBitrix መፍትሄችን በኩበርኔትስ፣ የእኛ መሪ ስርዓት አስተዳዳሪ ሰርጌ ቦንዳሬቭ ልዩ የሄልም ቻርት ፃፈ።

ሰራተኛን ይገነባል፣ ያጎላል፣ ክሮን ፖድ፣ ኢንግረስስን፣ አገልግሎቶችን ያዋቅራል እና ተለዋዋጮችን ከኩበርኔትስ ሚስጥሮች ወደ ፖድ ያስተላልፋል።

ኮዱን በጊትላብ ውስጥ እናከማቻለን እና የሄልም ግንባታን ከጊትላብ እናስኬዳለን።

ባጭሩ ይህን ይመስላል

$ helm upgrade --install project .helm --set image=registrygitlab.local/k8s/bitrix -f .helm/values.yaml --wait --timeout 300 --debug --tiller-namespace=production

Helm በተጨማሪም በስምሪት ወቅት የሆነ ችግር ከተፈጠረ "እንከን የለሽ" መልሶ መመለስን ይፈቅዳል። በድንጋጤ ውስጥ በማይሆኑበት ጊዜ ጥሩ ነው "ኮዱን በ ftp በኩል ያስተካክሉ ምክንያቱም ፕሮዱ ስለወደቀ" ግን Kubernetes በራስ-ሰር ያደርገዋል, እና ያለማቋረጥ.

አሰማር

አዎ እኛ የ Gitlab እና Gitlab CI አድናቂዎች ነን፣ እንጠቀማለን :)
በጊትላብ ውስጥ ለፕሮጀክት ማከማቻ ቦታ ሲሰጡ፣ Gitlab የአካባቢን አዲስ ስሪት የሚያሰማራ የቧንቧ መስመር ይጀምራል።

ደረጃዎች:

  • ግንባታ (አዲስ Docker ምስል መገንባት)
  • ሙከራ (ሙከራ)
  • ማጽዳት (የሙከራ አካባቢን ማስወገድ)
  • ግፋ (ወደ ዶከር መዝገብ እንልካለን)
  • ማሰማራት (መተግበሪያውን በሄልም በኩል ወደ Kubernetes እናሰማራለን)።

ደቡብብሪጅ በቼልያቢንስክ እና ቢትሪክስ በኩበርኔትስ

ሁሬ፣ ዝግጁ ነው፣ እንተገብረው!
ደህና፣ ወይም ካሉ ጥያቄዎችን ይጠይቁ።

ታዲያ ምን አደረግን።

ከቴክኒካል እይታ፡-

  • ዶከርራይዝድ ቢትሪክስ;
  • ቢትሪክስ ወደ ኮንቴይነሮች "ይቆርጣል", እያንዳንዳቸው በትንሹ ተግባራትን ያከናውናሉ;
  • የመያዣዎች ሀገር አልባ ሁኔታ ደረሰ;
  • በ Kubernetes ውስጥ Bitrix ን በማዘመን ችግሩን ፈታ;
  • ሁሉም የ Bitrix ተግባራት መስራታቸውን ቀጥለዋል (ሁሉም ማለት ይቻላል);
  • ወደ ኩበርኔትስ በማሰማራት እና በስርጭቶች መካከል መልሶ መመለሾ ላይ ሠርተናል።

ከንግድ አንፃር፡-

  • ስህተትን መታገስ;
  • የኩበርኔትስ መሳሪያዎች (ከ Gitlab CI ጋር ቀላል ውህደት, እንከን የለሽ ማሰማራት, ወዘተ);
  • ሚስጥራዊ የይለፍ ቃሎች (የይለፍ ቃል በቀጥታ ለተሰጣቸው ብቻ የሚታይ);
  • በአንድ መሠረተ ልማት ውስጥ ተጨማሪ አካባቢዎችን (ለልማት, ለሙከራዎች, ወዘተ) ለመፍጠር ምቹ ነው.

ምንጭ: hab.com

አስተያየት ያክሉ