Васеъ ва пурра кардани Kubernetes (баррасӣ ва гузориши видеоӣ)

Васеъ ва пурра кардани Kubernetes (баррасӣ ва гузориши видеоӣ)

8 апрель дар конференция Saint HighLoad++ 2019, дар доираи бахши "DevOps ва Амалиёт" гузориши "Вусъат додан ва пурра кардани Кубернетес" дода шуд, ки дар эҷоди он се корманди ширкати Flant иштирок доштанд. Дар он мо дар бораи ҳолатҳои сершумор сухан меронем, ки дар онҳо мо мехостем имкониятҳои Кубернетесро васеъ ва пурра кунем, аммо барои онҳо мо роҳи ҳалли омода ва соддаро наёфтаем. Мо ҳалли заруриро дар шакли лоиҳаҳои кушодаасос дорем ва ин суханронӣ низ ба онҳо бахшида шудааст.

Аз рӯи анъана мо бо хушнудӣ пешниҳод мекунем видеои гузориш (50 дақиқа, назар ба мақола бештар иттилоотӣ) ва хулосаи асосӣ дар шакли матн. Бирав!

Асос ва иловаҳо дар K8s

Кубернетес соҳа ва равишҳои идоракуниро, ки кайҳо муқаррар шудааст, тағир медиҳад:

  • Ташаккур ба ӯ абстраксияҳо, мо дигар бо мафҳумҳое, ба монанди насб кардани танзимот ё иҷро кардани фармон (Chef, Ansible...) кор намекунем, балки гурӯҳбандии контейнерҳо, хидматҳо ва ғайраро истифода мебарем.
  • Мо метавонем дархостҳоро бидуни андеша дар бораи нозукиҳои он омода созем сайти мушаххас, ки дар он ба кор андохта мешавад: металли урён, абри яке аз провайдерҳо ва ғайра.
  • Бо K8s шумо ҳеҷ гоҳ дастрас набудед таҷрибаҳои беҳтарин оид ба ташкили инфрасохтор: усулҳои миқёс, худтабобаткунӣ, таҳаммулпазирӣ ба хатогиҳо ва ғайра.

Аммо, албатта, ҳама чиз он қадар ҳамвор нест: Кубернетес инчунин мушкилоти нави худро овард.

Кубернитель не комбайнест, ки тамоми мушкилоти тамоми истифодабарандагонро ҳал мекунад. Ҷорӣ Кубернетес танҳо барои маҷмӯи ҳадди ақали вазифаҳои зарурие, ки дар онҳо мавҷуданд, масъул аст ҳар кластер:

Васеъ ва пурра кардани Kubernetes (баррасӣ ва гузориши видеоӣ)

Асоси Kubernetes маҷмӯи асосии ибтидоиро барои гурӯҳбандии контейнерҳо, идоракунии трафик ва ғайра муайян мекунад. Мо дар бораи онҳо дар муфассалтар сӯҳбат кардем гузориш 2 сол пеш.

Васеъ ва пурра кардани Kubernetes (баррасӣ ва гузориши видеоӣ)

Аз тарафи дигар, K8s барои васеъ кардани функсияҳои мавҷуда имкониятҳои бузург пешкаш мекунад, ки ба бастани дигарон кӯмак мекунанд - мушаххас — талаботи истифодабарандагон. Иловаҳо ба Kubernetes масъулияти маъмурони кластер мебошанд, ки онҳо бояд ҳама чизро насб ва танзим кунанд, то кластери худро "дар шакли дуруст" [барои ҳалли мушкилоти мушаххаси худ] гиранд. Инҳо чӣ гуна иловаҳо мебошанд? Биёед якчанд мисолҳоро дида бароем.

Намунаҳои иловаҳо

Пас аз насб кардани Kubernetes, мо шояд ҳайрон шавем, ки шабакае, ки барои ҳамкории подкҳо ҳам дар дохили гиреҳ ва ҳам байни гиреҳҳо зарур аст, худ аз худ кор намекунад. Ядрои Kubernetes пайвастҳои заруриро кафолат намедиҳад, балки он шабакаро муайян мекунад интерфейси (CNI) барои изофаҳои тарафи сеюм. Мо бояд яке аз ин иловаҳоро насб кунем, ки барои конфигуратсияи шабака масъул хоҳад буд.

Васеъ ва пурра кардани Kubernetes (баррасӣ ва гузориши видеоӣ)

Мисоли наздик ин ҳалли нигаҳдории додаҳост (диски маҳаллӣ, дастгоҳи блоки шабакавӣ, Ceph...). Дар аввал онҳо дар асл буданд, вале бо пайдоиши CSI вазъият ба чизе монанд ба он чизе, ки аллакай тавсиф шудааст, тағир меёбад: интерфейс дар Kubernetes аст ва татбиқи он дар модулҳои тарафи сеюм аст.

Намунаҳои дигар инҳоянд:

  • Ingress-назоратчиён (ба баррасии онҳо нигаред мақолаи охирини мо).
  • сертификат-менеҷер:

    Васеъ ва пурра кардани Kubernetes (баррасӣ ва гузориши видеоӣ)

  • Операторҳо як синфи пурраи изофаҳо мебошад (ки менеҷери номбаршударо дар бар мегирад), онҳо ибтидоӣ(ҳо) ва контроллер(ҳо)-ро муайян мекунанд. Мантиқи кори онҳо танҳо бо тасаввуроти мо маҳдуд аст ва ба мо имкон медиҳад, ки ҷузъҳои инфрасохтори тайёрро (масалан, DBMS) ба примитивҳо табдил диҳем, ки кор кардан бо онҳо (назар ба маҷмӯи контейнерҳо ва танзимоти онҳо) хеле осонтар аст. Шумораи зиёди операторҳо навишта шудаанд - ҳатто агар бисёре аз онҳо ҳанӯз ба истеҳсол омода набошанд, ин танҳо масъалаи вақт аст:

    Васеъ ва пурра кардани Kubernetes (баррасӣ ва гузориши видеоӣ)

  • Метрикҳо - мисоли дигаре, ки чӣ тавр Кубернетес интерфейсро (Metrics API) аз татбиқ ҷудо кардааст (иловаҳои тарафи сеюм ба монанди адаптери Prometheus, агенти кластери Datadog...).
  • барои мониторинг ва омор, ки дар амал на танхо зарур аст Прометей ва Графана, балки инчунин kube-state-metrics, гиреҳ-экспортёр ва ғайра.

Ва ин руйхати пурраи иловахо нест... Масалан, дар фирмаи «Флант» мо хозир васл карда истодаем 29 иловаҳо (ҳамаи онҳо ҳамагӣ 249 объекти Kubernetes эҷод мекунанд). Оддӣ карда гӯем, мо ҳаёти кластерро бе иловаҳо дида наметавонем.

Автоматика

Операторҳо барои автоматикунонии амалиёти муқаррарӣ тарҳрезӣ шудаанд, ки мо ҳар рӯз дучор мешавем. Инҳоянд мисолҳои воқеии ҳаёт, ки барои онҳо навиштани оператор як ҳалли олӣ хоҳад буд:

  1. Феҳристи хусусӣ (яъне воридшавиро талаб мекунад) бо тасвирҳо барои барнома мавҷуд аст. Тахмин меравад, ки ба ҳар як подк сирри махсус дода мешавад, ки имкон медиҳад аутентификатсия дар феҳрист. Вазифаи мо аз он иборат аст, ки ин асрор дар фазои ном пайдо шавад, то поддонҳо тасвирҳоро зеркашӣ кунанд. Барномаҳо метавонанд бисёр бошанд (ҳар кадоми онҳо ба сирр ниёз доранд) ва мунтазам нав кардани сирр муфид аст, бинобар ин имкони гузоштани асрор бо дастӣ аз байн меравад. Ин аст, ки оператор ба наҷот меояд: мо контроллереро эҷод мекунем, ки интизори пайдо шудани фазои номҳо хоҳад буд ва дар асоси ин ҳодиса ба фазои ном сирре илова мекунад.
  2. Бигзор ба таври нобаёнӣ дастрасӣ аз pods ба Интернет манъ аст. Аммо баъзан он метавонад талаб карда шавад: механизми иҷозати дастрасӣ ба таври оддӣ, бидуни талаб кардани малакаҳои мушаххас, масалан, мавҷудияти нишона дар фазои ном мантиқист. Чӣ тавр оператор дар ин ҷо ба мо кӯмак карда метавонад? Назоратчие сохта шудааст, ки мунтазири пайдо шудани нишона дар фазои ном мешавад ва сиёсати мувофиқро барои дастрасии Интернет илова мекунад.
  3. Вазъияти шабеҳ: фарз кунем, ки мо бояд як чизи муайянро илова кунем ифлос кардан, агар он тамғаи шабеҳ дошта бошад (бо ягон намуди префикс). Амалҳо бо оператор аёнанд...

Дар ҳама гуна кластер вазифаҳои муқаррарӣ бояд ҳал карда шаванд ва рост Инро бо истифода аз операторҳо кардан мумкин аст.

Хамаи вокеахои тасвиршударо чамъбаст карда, ба хулосае омадем, ки барои кори бароҳат дар Кубернетес ба шумо лозим аст: A) иловаҳо насб кунед, б) операторҳоро таҳия мекунанд (барои ҳалли вазифаҳои ҳаррӯзаи маъмур).

Чӣ тавр барои Кубернетес изҳорот нависед?

Умуман, схема оддӣ аст:

Васеъ ва пурра кардани Kubernetes (баррасӣ ва гузориши видеоӣ)

... аммо баъд маълум мешавад, ки:

  • API Kubernetes як чизи хеле ночиз аст, ки барои азхуд кардани он вақти зиёдро талаб мекунад;
  • барномасозӣ низ барои ҳама нест (забони Go ҳамчун забони афзалиятнок интихоб карда шуд, зеро барои он чаҳорчӯбаи махсус вуҷуд дорад - Оператор SDK);
  • Вазъият дар худи чаҳорчӯб низ ҳамин тавр аст.

Поёни хати: барои навиштани контролер (оператор) бояд захирахои калон сарф кунанд барои омухтани материал. Ин барои операторҳои "калон" асоснок хоҳад буд - масалан, барои DBMS MySQL. Аммо агар мо мисолҳои дар боло тавсифшударо ба ёд орем (кушода кардани асрор, дастрасӣ ба подкҳо ба Интернет ...), ки мо низ мехоҳем дуруст иҷро кунем, пас мо мефаҳмем, ки кӯшишҳои сарфшуда аз натиҷаи ҳозира ба мо зиёдтар хоҳанд буд:

Васеъ ва пурра кардани Kubernetes (баррасӣ ва гузориши видеоӣ)

Дар маҷмӯъ, як дилемма ба миён меояд: захираҳои зиёдеро сарф кунед ва асбоби дурустро барои навиштани изҳорот пайдо кунед ё онро бо усули кӯҳна иҷро кунед (вале зуд). Барои ҳалли он - пайдо кардани созиш байни ин ифротҳо - мо лоиҳаи худро эҷод кардем: оператори снаряд (инчунин нигаред эълони охирин дар марказ).

Шелл-оператор

Ӯ чӣ гуна кор мекунад? Кластер дорои як паҳлӯи дорои бинарии Go бо оператори shell мебошад. Дар паҳлӯи ӯ як маҷмӯи қалмоқҳо (тафсилоти бештар дар бораи онҳо - ба поён нигаред). Худи оператори shell ба муайян обуна мешавад чорабиниҳо дар API Kubernetes, ки ҳангоми пайдоиши он қалмоқҳои мувофиқро оғоз мекунад.

Оператор аз куҷо медонад, ки ба кадом рӯйдодҳо занг занад? Ин маълумотро ба снаряд-оператор худи калмакхо медиханд ва онхо ин корро хеле оддй мекунанд.

Қалмоқ скрипти Bash ё ягон файли иҷрошаванда аст, ки як далелро қабул мекунад --config ва бо JSON ҷавоб медиҳад. Охирин муайян мекунад, ки кадом объектҳо ба он таваҷҷӯҳ доранд ва ба кадом ҳодисаҳо (барои ин объектҳо) бояд ҷавоб диҳанд:

Васеъ ва пурра кардани Kubernetes (баррасӣ ва гузориши видеоӣ)

Ман иҷрои яке аз мисолҳои моро дар shell-оператор тасвир мекунам - сирри таҷзия барои дастрасӣ ба реестри хусусӣ бо тасвирҳои барнома. Он аз ду марҳила иборат аст.

Машқ: 1. Ҳукро нависед

Пеш аз ҳама, дар қалмоқе мо коркард мекунем --config, нишон медиҳад, ки мо ба фазоҳои номҳо ва махсусан, лаҳзаи офариниши онҳо таваҷҷӯҳ дорем:

[[ $1 == "--config" ]] ; then
  cat << EOF
{
  "onKubernetesEvent": [
    {
      "kind": "namespace",
      "event": ["add"]
    }
  ]
}
EOF
…

Мантиқ чӣ гуна хоҳад буд? Инчунин хеле оддӣ:

…
else
  createdNamespace=$(jq -r '.[0].resourceName' $BINDING_CONTEXT_PATH)
  kubectl create -n ${createdNamespace} -f - << EOF
Kind: Secret
...
EOF
fi

Қадами аввал фаҳмидани он, ки кадом фазои ном сохта шудааст, ва дуюм ин аст, ки бо истифода аз он эҷод кунед kubectl сирри ин фазои ном.

Амал: 2. Ҷамъбасти тасвир

Танҳо ин аст, ки қалмоқе, ки сохта шудааст, ба оператори shell - чӣ тавр бояд кард? Худи shell-оператор ҳамчун тасвири Docker меояд, аз ин рӯ вазифаи мо илова кардани қалмоқро ба директорияи махсус дар ин тасвир аст:

FROM flant/shell-operator:v1.0.0-beta.1
ADD my-handler.sh /hooks

Ҳама чиз боқӣ мемонад, ки онро ҷамъ кунед ва тела диҳед:

$ docker build -t registry.example.com/my-operator:v1 .
$ docker push registry.example.com/my-operator:v1

Дастрасии ниҳоӣ ин ҷойгир кардани тасвир дар кластер аст. Барои ин, биёед нависем љойгиркунии:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: my-operator
spec:
  template:
    spec:
      containers:
      - name: my-operator
        image: registry.example.com/my-operator:v1 # 1
      serviceAccountName: my-operator              # 2

Ду нуктаро бояд таваҷҷуҳ кард:

  1. нишон додани тасвири навтаъсис;
  2. Ин як ҷузъи системаест, ки (ҳадди ақал) ҳуқуқ барои обуна ба рӯйдодҳои Kubernetes ва ҷудо кардани асрор ба фазоҳои ном дорад, аз ин рӯ мо барои қалмоқ як ServiceAccount (ва маҷмӯи қоидаҳо) эҷод мекунем.

Натиҷа - мо мушкилоти худро ҳал кардем хешу табор барои Кубернетес ба тарзе, ки операторро барои вайрон кардани асрор эҷод кунад.

Дигар хусусиятҳои оператори shell

Барои маҳдуд кардани объектҳои навъи интихобкардаи шумо, ки қалмоқ бо он кор мекунад, онҳоро филтр кардан мумкин аст, интихоб аз рӯи нишонаҳо муайян (ё бо истифода аз matchExpressions):

"onKubernetesEvent": [
  {
    "selector": {
      "matchLabels": {
        "foo": "bar",
       },
       "matchExpressions": [
         {
           "key": "allow",
           "operation": "In",
           "values": ["wan", "warehouse"],
         },
       ],
     }
     …
  }
]

таъмин карда шудааст механизми нусхабардорӣ, ки - бо истифода аз филтри jq - ба шумо имкон медиҳад, ки объектҳои JSON-и калонро ба объектҳои хурд табдил диҳед, ки дар он танҳо он параметрҳое боқӣ мемонанд, ки мо мехоҳем тағиротро назорат кунем.

Вақте ки қалмоқ даъват карда мешавад, оператори снаряд аз он мегузарад маълумоти объект, ки онро барои хар гуна эхтиёчот истифода бурдан мумкин аст.

Ҳодисаҳое, ки қалмоқҳоро ба вуҷуд меоранд, бо рӯйдодҳои Kubernetes маҳдуд нестанд: оператори shell дастгирӣ мекунад занг задан бо вақт (монанд ба crontab дар нақшаи анъанавӣ), инчунин як чорабинии махсус дар оғозёбӣ. Ҳамаи ин рӯйдодҳоро метавон якҷоя кард ва ба як қалмоқ таъин кард.

Ва боз ду хусусияти оператори shell:

  1. Ин кор мекунад асинхронӣ. Азбаски ҳодисаи Kubernetes (масалан, объекти сохташаванда) гирифта шуд, дар кластер рӯйдодҳои дигар (масалан, ҳамон объекти нестшуда) метавонистанд рух диҳанд ва қалмоқҳо бояд инро ҳисоб кунанд. Агар қалмоқ бо хато иҷро шуда бошад, пас аз рӯи нобаёнӣ он хоҳад буд дубора занг занед то анҷоми бомуваффақият (ин рафторро тағир додан мумкин аст).
  2. содирот мекунад метрикхо барои Prometheus, ки бо он шумо метавонед фаҳмед, ки оё оператори shell кор мекунад, шумораи хатогиҳоро барои ҳар як қалмоқ ва андозаи навбати ҷорӣ фаҳмед.

Барои ҷамъбасти ин қисми гузориш:

Васеъ ва пурра кардани Kubernetes (баррасӣ ва гузориши видеоӣ)

Насб кардани изофа

Барои кори бароҳат бо Kubernetes, инчунин зарурати насб кардани замимаҳо зикр карда шуд. Ман дар ин бора ба шумо бо мисоли роҳи ширкати мо дар бораи он ки ҳоло мо инро мекунем, нақл мекунам.

Мо бо Kubernetes бо якчанд кластерҳо кор кардем, ки ягона илова ба онҳо Ingress буд. Онро дар ҳар як кластер ба таври гуногун насб кардан лозим буд ва мо якчанд конфигуратсияҳои YAML-ро барои муҳитҳои гуногун сохтем: металли урён, AWS...

Азбаски кластерҳо зиёд буданд, конфигуратсияҳо бештар буданд. Илова бар ин, мо ин конфигуратсияҳоро худамон такмил додем, ки дар натиҷа онҳо хеле гетерогенӣ шуданд:

Васеъ ва пурра кардани Kubernetes (баррасӣ ва гузориши видеоӣ)

Барои ба тартиб даровардани ҳама чиз, мо бо скрипт оғоз кардем (install-ingress.sh), ки ҳамчун далел навъи кластерро, ки мо ба он ҷойгир мекунем, гирифт, конфигуратсияи зарурии YAML-ро тавлид кард ва онро ба Kubernetes паҳн кард.

Хулоса, роҳи минбаъдаи мо ва далелҳои марбут ба он чунин буд:

  • барои кор бо конфигуратсияҳои YAML муҳаррики шаблон лозим аст (дар марҳилаҳои аввал ин sed оддӣ аст);
  • бо афзоиши шумораи кластерҳо, зарурати навсозии автоматӣ ба миён омад (ҳалли аввалин ин гузоштани скрипт дар Git, навсозии он бо истифода аз cron ва иҷро кардани он буд);
  • Барои Прометей скрипти шабеҳ лозим буд (install-prometheus.sh), бо вуҷуди ин, он аз он муҳим аст, ки он маълумоти бештари воридотӣ, инчунин нигоҳдории онҳоро талаб мекунад (ба таври хуб - мутамарказ ва дар кластер) ва баъзе маълумотҳо (паролҳо) метавонанд ба таври худкор тавлид карда шаванд:

    Васеъ ва пурра кардани Kubernetes (баррасӣ ва гузориши видеоӣ)

  • хатари паҳн кардани ягон чизи нодуруст ба шумораи афзояндаи кластерҳо мунтазам меафзояд, бинобар ин мо фаҳмидем, ки насбкунандагон (яъне ду скрипт: барои Ingress ва Prometheus) саҳнасозӣ лозим буд (якчанд филиалҳо дар Git, якчанд кронҳо барои навсозии онҳо дар кластерҳои мувофиқ ё санҷишӣ);
  • с kubectl apply бо он кор кардан душвор шудааст, зеро он декларативӣ нест ва метавонад танҳо объектҳоро эҷод кунад, аммо дар бораи ҳолати онҳо қарор қабул намекунад/нест кардан;
  • Мо баъзе вазифаҳоеро аз даст додем, ки дар он вақт умуман иҷро нашуда будем:
    • назорати пурраи натиҷаи навсозии кластер,
    • муайянкунии автоматии баъзе параметрҳо (ворид барои скриптҳои насбкунӣ) дар асоси маълумоте, ки аз кластер ба даст оварда мешаванд (кашф),
    • инкишофи мантикии он дар шакли кашфи пайваста.

Мо ҳамаи ин таҷрибаи ҷамъшударо дар доираи лоиҳаи дигари худ амалӣ кардем - addon-operator.

Илова-оператор

Он ба оператори қаблан зикршуда асос ёфтааст. Тамоми система чунин менамояд:

Инҳо ба қалмоқҳои оператори ҷабҳа илова карда мешаванд:

  • нигаҳдории арзишҳо,
  • Диаграммаи руль,
  • ҷузъи он мағозаи арзишҳоро назорат мекунад ва - дар сурати ягон тағирот - аз Ҳелм хоҳиш мекунад, ки диаграммаро аз нав гардонад.

Васеъ ва пурра кардани Kubernetes (баррасӣ ва гузориши видеоӣ)

Ҳамин тариқ, мо метавонем ба ҳодиса дар Кубернетес вокуниш нишон диҳем, қалмоқро оғоз кунем ва аз ин қалмоқ мо метавонем ба анбор тағирот ворид кунем, ки пас аз он диаграмма дубора бор карда мешавад. Дар диаграммаи натиҷа, мо маҷмӯи қалмоқҳо ва диаграммаро ба як ҷузъ ҷудо мекунем, ки мо онро даъват мекунем модул:

Васеъ ва пурра кардани Kubernetes (баррасӣ ва гузориши видеоӣ)

Модулҳои зиёде метавонанд вуҷуд дошта бошанд ва ба онҳо мо қалмоқҳои глобалӣ, мағозаи арзишҳои ҷаҳонӣ ва ҷузъе илова мекунем, ки ин мағозаи ҷаҳониро назорат мекунад.

Ҳоло, вақте ки дар Кубернетес чизе рӯй медиҳад, мо метавонем бо истифода аз қалмоқҳои глобалӣ ба он вокуниш нишон диҳем ва чизеро дар мағозаи ҷаҳонӣ тағир диҳем. Ин тағирот мушоҳида мешавад ва боиси паҳн шудани ҳамаи модулҳои кластер мегардад:

Васеъ ва пурра кардани Kubernetes (баррасӣ ва гузориши видеоӣ)

Ин схема тамоми талаботро барои насб кардани замимаҳо, ки дар боло зикр шудаанд, қонеъ мекунад:

  • Helm барои шаблонсозӣ ва декларативӣ масъул аст.
  • Масъалаи навсозии худкор бо истифода аз қалмоқҳои глобалӣ ҳал карда шуд, ки он тибқи ҷадвал ба реестр меравад ва агар дар он ҷо тасвири нави системаро бубинад, онро мебарорад (яъне “худ”).
  • Нигоҳдории танзимот дар кластер истифода бурда мешавад ConfigMap, ки маълумоти ибтидоиро барои анборҳо дар бар мегирад (ҳангоми оғозёбӣ онҳо ба анборҳо бор карда мешаванд).
  • Масъалаҳои тавлиди парол, кашф ва кашфи пайваста бо истифода аз қалмоқҳо ҳал карда шуданд.
  • Саҳнасозӣ ба шарофати тегҳо ба даст оварда мешавад, ки Docker онҳоро аз қуттӣ дастгирӣ мекунад.
  • Натиҷа бо истифода аз ченакҳо назорат карда мешавад, ки мо метавонем вазъиятро дарк кунем.

Ин тамоми система дар шакли як бинарӣ дар Go амалӣ карда мешавад, ки онро addon-operator меноманд. Ин диаграммаро соддатар мекунад:

Васеъ ва пурра кардани Kubernetes (баррасӣ ва гузориши видеоӣ)

Ҷузъи асосии ин диаграмма маҷмӯи модулҳо мебошад (дар поён бо ранги хокистарӣ таъкид шудааст). Акнун мо метавонем бо як кӯшиши каме барои иловаи зарурӣ модул нависем ва итминон ҳосил кунем, ки он дар ҳар як кластер насб карда мешавад, навсозӣ мешавад ва ба рӯйдодҳои дар кластер лозимшуда посух медиҳад.

"Флант" истифода мебарад addon-operator дар 70+ кластерҳои Kubernetes. Ҳолати кунунӣ - версияи алфа. Ҳоло мо ҳуҷҷатҳоро барои баровардани бета омода карда истодаем, аммо ҳоло дар анбор намунаҳои дастрас, дар асоси он шумо метавонед иловаи шахсии худро эҷод кунед.

Модулҳоро барои addon-operator аз куҷо гирифта метавонам? Нашри китобхонаи мо барои мо марҳилаи навбатӣ аст ва мо нақша дорем, ки ин корро дар тобистон анҷом диҳем.

Видеоҳо ва слайдҳо

Видео аз намоиш (~50 дақиқа):

Муаррифии гузориш:

PS

Дигар гузоришҳо дар блоги мо:

Шумо инчунин метавонед ба нашрияҳои зерин таваҷҷӯҳ кунед:

Манбаъ: will.com

Илова Эзоҳ