ගබඩා ධාරිතා ලුහුබැඳීම සහිත තාවකාලික වෙළුම්: ස්ටෙරොයිඩ් මත EmptyDir

ගබඩා ධාරිතා ලුහුබැඳීම සහිත තාවකාලික වෙළුම්: ස්ටෙරොයිඩ් මත EmptyDir

සමහර යෙදුම් වලට දත්ත ගබඩා කිරීමටද අවශ්‍ය වේ, නමුත් නැවත ආරම්භ කිරීමෙන් පසු දත්ත සුරැකෙන්නේ නැති නිසා ඒවා ඉතා පහසු වේ.

උදාහරණයක් ලෙස, හැඹිලි සේවා RAM මගින් සීමා කර ඇත, නමුත් RAM වලට වඩා මන්දගාමී වන ගබඩා කිරීමට කලාතුරකින් භාවිතා වන දත්ත ගෙනයාමටද හැකිය, සමස්ත කාර්ය සාධනයට සුළු බලපෑමක් ඇති කරයි. සැකසීම් හෝ රහස් යතුරු වැනි ලිපිගොනු තුළ කියවීමට-පමණි ආදානයක් තිබිය හැකි බව වෙනත් යෙදුම් දැන සිටිය යුතුය.

Kubernetes දැනටමත් වර්ග කිහිපයක් තිබේ ephemeral පරිමාවන්, නමුත් ඔවුන්ගේ ක්රියාකාරිත්වය K8s හි ක්රියාත්මක වන දේට සීමා වේ.

එෆීමර් CSI වෙළුම් සැහැල්ලු දේශීය වෙළුම් සඳහා සහය ලබා දීම සඳහා CSI ධාවකයන් සමඟ Kubernetes දිගු කිරීමට ඉඩ ලබා දුන්නේය. මේ ආකාරයෙන් එය භාවිතා කළ හැකිය අත්තනෝමතික ව්යුහයන්: සැකසුම්, රහස්, හඳුනාගැනීමේ දත්ත, විචල්යයන්, සහ යනාදිය. සාමාන්‍ය ප්‍රමිතිගත ධාවක ක්‍රියා නොකරනු ඇතැයි උපකල්පනය කරන බැවින්, මෙම Kubernetes විශේෂාංගයට සහය දැක්වීමට CSI ධාවක වෙනස් කළ යුතුය - නමුත් එවැනි වෙළුම් පොඩ් සඳහා තෝරාගත් ඕනෑම නෝඩයක භාවිතා කළ හැකි යැයි උපකල්පනය කෙරේ.

සැලකිය යුතු ධාරක සම්පත් පරිභෝජනය කරන වෙළුම් සඳහා හෝ සමහර ධාරකවල පමණක් පවතින ගබඩා සඳහා මෙය ගැටළුවක් විය හැක. Kubernetes 1.19 EmptyDir වෙළුම්වලට සංකල්පමය වශයෙන් සමාන වන නව ඇල්ෆා පරීක්ෂණ පරිමාව විශේෂාංග දෙකක් හඳුන්වා දෙන්නේ එබැවිනි:

  • පොදු කාර්ය කාලීන වෙළුම්;

  • CSI ගබඩා ධාරිතාව ලුහුබැඳීම.

නව ප්රවේශයේ වාසි:

  • ගබඩා කිරීම දේශීය හෝ ජාලයක් හරහා සම්බන්ධ විය හැක;

  • වෙළුම් යෙදුමෙන් ඉක්මවිය නොහැකි නිශ්චිත ප්‍රමාණයක් තිබිය හැක;

  • ස්ථීර වෙළුම් සැපයීමට සහය වන සහ (ධාරිතා ලුහුබැඳීමට සහාය වීම සඳහා) ඇමතුම ක්‍රියාත්මක කරන ඕනෑම CSI ධාවකයක් සමඟ ක්‍රියා කරයි GetCapacity;

  • ධාවක සහ සැකසුම් මත පදනම්ව වෙළුම් වල ආරම්භක දත්ත තිබිය හැක;

  • පරිමාවක් සහිත සියලුම සම්මත මෙහෙයුම් සඳහා (ස්නැප්ෂොට් සෑදීම, ප්‍රමාණය වෙනස් කිරීම, ආදිය) සහය දක්වයි;

  • මොඩියුලයක් හෝ වෙළුම් පිරිවිතරයක් පිළිගන්නා ඕනෑම යෙදුම් පාලකයක් සමඟ වෙළුම් භාවිතා කළ හැක;

  • Kubernetes උපලේඛකයා විසින්ම සුදුසු නෝඩ් තෝරා ගනී, එබැවින් උපලේඛන දිගු සැපයීමට සහ වින්‍යාස කිරීමට හෝ webhooks වෙනස් කිරීමට තවදුරටත් අවශ්‍ය නොවේ.

යෙදුම් විකල්ප

එබැවින්, සාමාන්‍ය කාර්ය කාලීන පරිමා පහත භාවිත අවස්ථා සඳහා සුදුසු වේ:

memcached සඳහා RAM සඳහා ආදේශකයක් ලෙස ස්ථිර මතකය

memcached හි නවතම නිකුතු සහාය එකතු කළා ස්ථීර මතකය භාවිතා කිරීම (Intel Optane, ආදිය, ආසන්න වශයෙන් පරිවර්තකයා) සාමාන්‍ය RAM වෙනුවට. යෙදුම් පාලකයක් හරහා memcached යෙදවීමේදී, CSI ධාවක භාවිතයෙන් PMEM වෙතින් දී ඇති ප්‍රමාණයක පරිමාවක් වෙන් කරන ලෙස ඉල්ලා සිටීමට ඔබට සාමාන්‍ය කාර්ය කාලීන වෙළුම් භාවිතා කළ හැකිය. PMEM-CSI.

වැඩබිමක් ලෙස LVM දේශීය ගබඩාව

RAM ට වඩා විශාල දත්ත සමඟ ක්‍රියා කරන යෙදුම් සඳහා Kubernetes වෙතින් සාමාන්‍ය EmptyDir වෙළුම් ලබා දිය නොහැකි ප්‍රමාණය හෝ කාර්ය සාධන ප්‍රමිතික සමඟ දේශීය ආචයනය අවශ්‍ය විය හැකිය. උදාහරණයක් ලෙස, මෙම කාර්යය සඳහා එය ලියා ඇත TopoLVM.

දත්ත පරිමාවන් සඳහා කියවීමට පමණක් ප්‍රවේශය

පරිමාවක් වෙන් කිරීම සම්පූර්ණ පරිමාවක් නිර්මාණය වීමට හේතු විය හැක්කේ:

මෙම වෙළුම් කියවීමට-පමණි ආකාරයෙන් සවි කළ හැක.

කොහොමද මේ වැඩ කරන්නේ

සාමාන්‍ය අරමුණු තාවකාලික වෙළුම්

සාමාන්‍ය කාර්ය කාලීන වෙළුම්වල ප්‍රධාන ලක්ෂණය වන්නේ නව වෙළුම් ප්‍රභවයයි, EphemeralVolumeSource, වෙළුම් ඉල්ලීමක් සෑදීම සඳහා සියලුම ක්ෂේත්‍ර අඩංගු වේ (ඓතිහාසිකව ස්ථීර වෙළුම් ඉල්ලීමක් ලෙස හැඳින්වේ, PVC). නව පාලකය ඇත kube-controller-manager එවැනි පරිමාව ප්‍රභවයක් නිර්මාණය කරන කරල් දෙස බලා, එම කරල් සඳහා PVC නිර්මාණය කරයි. CSI ධාවකය සඳහා, මෙම ඉල්ලීම අනෙක් ඒවාට සමාන බව පෙනේ, එබැවින් මෙහි විශේෂ සහාය අවශ්‍ය නොවේ.

එවැනි PVC පවතින තාක් කල්, ඒවා පරිමාවේ වෙනත් ඉල්ලීම් මෙන් භාවිතා කළ හැක. විශේෂයෙන්ම, වෙළුමක් පිටපත් කිරීමේදී හෝ පරිමාවකින් ස්නැප්ෂොට් නිර්මාණය කිරීමේදී ඒවා දත්ත මූලාශ්‍රයක් ලෙස සඳහන් කළ හැක. PVC වස්තුවේ පරිමාවේ වත්මන් තත්ත්වය ද අඩංගු වේ.

ස්වයංක්‍රීයව සාදන ලද PVC වල නම් පූර්ව නිර්වචනය කර ඇත: ඒවා යටි ඉරකින් වෙන් කරන ලද පොඩ් නම සහ පරිමාවේ නමේ එකතුවකි. පෙර නිර්වචනය කළ නම් PVC සමඟ අන්තර් ක්‍රියා කිරීම පහසු කරයි, මන්ද ඔබ පොඩ් නම සහ පරිමාවේ නම දන්නේ නම් ඔබට එය සෙවීමට අවශ්‍ය නොවේ. අවාසිය නම්, නම දැනටමත් භාවිතයේ තිබිය හැකි අතර, එය Kubernetes විසින් හඳුනාගෙන ඇති අතර එහි ප්රතිඵලයක් වශයෙන් පොඩ් ආරම්භය අවහිර වී ඇත.

පොඩ් එක සමඟ පරිමාව මකාදැමීම සහතික කිරීම සඳහා, පාලකය හිමිකරු යටතේ ඇති පරිමාවට ඉල්ලීමක් කරයි. පොඩ් එක මකා දැමූ විට, සම්මත කුණු එකතු කිරීමේ යාන්ත්‍රණය ක්‍රියා කරයි, එමඟින් ඉල්ලීම සහ පරිමාව යන දෙකම මකා දමයි.

ගබඩා පන්තියේ සාමාන්‍ය යාන්ත්‍රණය හරහා ගබඩා ධාවකය විසින් ඉල්ලීම් ගැලපේ. ක්ෂණික හා ප්‍රමාද බන්ධන සහිත පන්ති වුවද (aka WaitForFirstConsumer) සහය දක්වයි, තාවකාලික වෙළුම් සඳහා එය භාවිතා කිරීම අර්ථවත් කරයි WaitForFirstConsumer, එවිට උපලේඛකයාට නෝඩයක් තෝරාගැනීමේදී නෝඩ් භාවිතය සහ ගබඩා ලබා ගැනීමේ හැකියාව යන දෙකම සලකා බැලිය හැක. මෙහි නව විශේෂාංගයක් දිස්වේ.

ගබඩා ධාරිතාව ලුහුබැඳීම

සාමාන්‍යයෙන් CSI ධාවක පරිමාව නිර්මාණය කරන්නේ කොතැනද යන්න පිළිබඳව උපලේඛකයාට දැනුමක් නැත. මෙම තොරතුරු ඉල්ලා සිටීම සඳහා උපලේඛනකරුට සෘජුවම රියදුරු සම්බන්ධ කර ගැනීමට ක්‍රමයක් නොමැත. එම නිසා, උපලේඛකයා ඡන්ද විමසීම් නෝඩ් කරන තෙක් පරිමාවට ප්‍රවේශ විය හැකි (ප්‍රමාද බන්ධන) එකක් සොයා ගන්නා තෙක් හෝ ස්ථානය තේරීම සම්පූර්ණයෙන්ම රියදුරුට (ක්ෂණික බැඳීම) ලබා දෙයි.

නව API CSIStorageCapacity, ඇල්ෆා අදියරේ පවතින, අවශ්‍ය දත්ත ආදිය කාලසටහන් කරන්නාට ලබා ගත හැකි වන පරිදි ආදිය ගබඩා කිරීමට ඉඩ සලසයි. සාමාන්‍ය කාර්ය කාලීන වෙළුම් සඳහා සහය මෙන් නොව, ඔබ රියදුරු යොදවන විට, ඔබ ගබඩා ධාරිතාව ලුහුබැඳීම සක්‍රීය කළ යුතුය: external-provisioner රියදුරුගෙන් ලැබෙන ධාරිතා තොරතුරු සාමාන්‍ය මාර්ගයෙන් ප්‍රකාශයට පත් කළ යුතුය GetCapacity.

උපලේඛකයාට ප්‍රමාද බන්ධනය භාවිතා කරන අසීමිත පරිමාවක් සහිත පොඩ් එකක් සඳහා නෝඩයක් තෝරා ගැනීමට අවශ්‍ය නම් සහ ධජය සැකසීම මගින් ධාවකය යෙදවීමේදී මෙම විශේෂාංගය සක්‍රීය කළේ නම් CSIDriver.storageCapacity, එවිට ප්රමාණවත් ගබඩා ධාරිතාවක් නොමැති නෝඩ් ස්වයංක්රීයව ඉවතලනු ඇත. මෙය සාමාන්‍ය කාර්ය කාලීන සහ ස්ථීර වෙළුම් දෙකටම ක්‍රියා කරයි, නමුත් CSI ephemeral වෙළුම් සඳහා නොවේ, මන්ද ඒවායේ පරාමිතීන් Kubernetes විසින් කියවිය නොහැක.

සාමාන්‍ය පරිදි, කරල් කාලසටහන් කිරීමට පෙර ක්ෂණිකව සම්බන්ධ කරන ලද වෙළුම් සාදනු ලබන අතර, ඒවායේ ස්ථානගත කිරීම ගබඩා ධාවකය විසින් තෝරා ගනු ලැබේ, එබැවින් වින්‍යාස කිරීමේදී external-provisioner පෙරනිමියෙන්, මෙම දත්ත කෙසේ හෝ භාවිතා නොකරන බැවින්, ක්ෂණික බන්ධන සහිත ගබඩා පන්ති මඟ හරිනු ලැබේ.

kubernetes උපලේඛකයාට යල් පැන ගිය තොරතුරු සමඟ වැඩ කිරීමට බල කෙරෙන බැවින්, පරිමාව නිර්මාණය කරන විට සෑම අවස්ථාවකදීම ධාරිතාව පවතින බවට සහතිකයක් නැත, නමුත් නැවත උත්සාහයකින් තොරව එය නිර්මාණය වීමේ සම්භාවිතාව කෙසේ වෙතත් වැඩි වේ.

සැ.යු. ඔබට වඩාත් සවිස්තරාත්මක තොරතුරු ලබා ගත හැකි අතර ආරක්ෂිතව “බළලුන්ගේ ස්ථාවරය මත පුහුණු වන්න”, සහ සම්පූර්ණයෙන්ම තේරුම්ගත නොහැකි තත්වයක් ඇති වුවහොත්, දැඩි පා courses මාලා වලදී සුදුසුකම් ලත් තාක්ෂණික සහාය ලබා ගන්න - කුබර්නෙට්ස් පදනම සැප්තැම්බර් 28-30 දිනවල පැවැත්වෙන අතර, වඩාත් උසස් විශේෂඥයින් සඳහා කුබර්නෙටස් මෙගා ඔක්තෝබර් 14-16.

Безопасность

CSIS ගබඩා ධාරිතාව

CSIStorageCapacity වස්තු නාම අවකාශ තුළ පවතී; එක් එක් CSI ධාවක තමන්ගේම නාම අවකාශයේ රෝල් කරන විට, දත්ත පැමිණෙන්නේ කොහෙන්ද යන්න පැහැදිලි බැවින් RBAC හිමිකම් එම අවකාශයේ CSIStorageCapacity වෙත සීමා කිරීම නිර්දේශ කෙරේ. Kubernetes මෙය කෙසේ හෝ පරීක්ෂා නොකරන අතර සාමාන්‍යයෙන් රියදුරන් එකම නාම අවකාශයේ තබා ඇත, එබැවින් අවසානයේ රියදුරන් ක්‍රියා කිරීමට බලාපොරොත්තු වන අතර වැරදි දත්ත ප්‍රකාශනය නොකිරීමට (මගේ කාඩ්පත අසාර්ථක වූ ස්ථානය මෙයයි, ආසන්න වශයෙන් රැවුල සහිත විහිළුවක් මත පදනම් වූ පරිවර්තකයෙක්)

සාමාන්‍ය අරමුණු තාවකාලික වෙළුම්

පරිශීලකයින්ට පොඩ් එකක් සෑදීමට (සෘජුව හෝ වක්‍රව) අයිතියක් තිබේ නම්, පරිමාව මත ඉල්ලීමක් සෑදීමට ඔවුන්ට අයිතියක් නොමැති වුවද, සාමාන්‍ය කාර්ය කාලීන වෙළුම් නිර්මාණය කිරීමට ඔවුන්ට හැකි වේ. මෙයට හේතුව RBAC අවසර පරීක්ෂාවන් පරිශීලකයාට නොව PVC නිර්මාණය කරන පාලකයට යොදන බැවිනි. එකතු කළ යුතු ප්‍රධාන වෙනස මෙයයි ඔබගේ ගිණුමට, විශ්වාස නොකළ පරිශීලකයින්ට වෙළුම් සෑදීමට අයිතියක් නොතිබිය යුතු පොකුරු මත මෙම විශේෂාංගය සබල කිරීමට පෙර.

උදාහරණ:

වෙනම ශාඛාව පීඑම්ඊඑම්-සීඑස්අයි හි ඇල්ෆා අදියරේ ඇති සියලුම විශේෂාංග සහිත QEMU අතථ්‍ය යන්ත්‍ර තුළ Kubernetes 1.19 පොකුරක් ධාවනය කිරීමට අවශ්‍ය සියලුම වෙනස්කම් අඩංගු වේ. ධාවක කේතය වෙනස් වී නැත, යෙදවීම පමණක් වෙනස් වී ඇත.

සුදුසු යන්ත්‍රයක (ලිනක්ස්, සාමාන්‍ය පරිශීලකයෙකුට භාවිතා කළ හැක Docker, බලන්න මෙහි විස්තර) මෙම විධානයන් පොකුර ගෙන එන අතර PMEM-CSI ධාවකය ස්ථාපනය කරයි:

git clone --branch=kubernetes-1-19-blog-post https://github.com/intel/pmem-csi.git
cd pmem-csi
export TEST_KUBERNETES_VERSION=1.19 TEST_FEATURE_GATES=CSIStorageCapacity=true,GenericEphemeralVolume=true TEST_PMEM_REGISTRY=intel
make start && echo && test/setup-deployment.sh

සෑම දෙයක්ම ක්‍රියාත්මක වූ පසු, ප්‍රතිදානයේ භාවිතය සඳහා උපදෙස් අඩංගු වේ:

The test cluster is ready. Log in with [...]/pmem-csi/_work/pmem-govm/ssh.0, run
kubectl once logged in.  Alternatively, use kubectl directly with the
following env variable:
   KUBECONFIG=[...]/pmem-csi/_work/pmem-govm/kube.config

secret/pmem-csi-registry-secrets created
secret/pmem-csi-node-secrets created
serviceaccount/pmem-csi-controller created
...
To try out the pmem-csi driver ephemeral volumes:
   cat deploy/kubernetes-1.19/pmem-app-ephemeral.yaml |
   [...]/pmem-csi/_work/pmem-govm/ssh.0 kubectl create -f -

CSIStorageCapacity වස්තු මිනිසුන් විසින් කියවීමට අදහස් නොකෙරේ, එබැවින් සමහර සැකසුම් අවශ්ය වේ. Golang සැකිලි පෙරහන් ගබඩා පන්ති පෙන්වනු ඇත, මෙම උදාහරණය නම, ස්ථලකය සහ ධාරිතාව පෙන්වයි:

$ kubectl get 
        -o go-template='{{range .items}}{{if eq .storageClassName "pmem-csi-sc-late-binding"}}{{.metadata.name}} {{.nodeTopology.matchLabels}} {{.capacity}}
{{end}}{{end}}' 
        csistoragecapacities
csisc-2js6n map[pmem-csi.intel.com/node:pmem-csi-pmem-govm-worker2] 30716Mi
csisc-sqdnt map[pmem-csi.intel.com/node:pmem-csi-pmem-govm-worker1] 30716Mi
csisc-ws4bv map[pmem-csi.intel.com/node:pmem-csi-pmem-govm-worker3] 30716Mi

තනි වස්තුවකට පහත අන්තර්ගතය ඇත:

$ kubectl describe csistoragecapacities/csisc-6cw8j
Name:         csisc-sqdnt
Namespace:    default
Labels:       <none>
Annotations:  <none>
API Version:  storage.k8s.io/v1alpha1
Capacity:     30716Mi
Kind:         CSIStorageCapacity
Metadata:
  Creation Timestamp:  2020-08-11T15:41:03Z
  Generate Name:       csisc-
  Managed Fields:
    ...
  Owner References:
    API Version:     apps/v1
    Controller:      true
    Kind:            StatefulSet
    Name:            pmem-csi-controller
    UID:             590237f9-1eb4-4208-b37b-5f7eab4597d1
  Resource Version:  2994
  Self Link:         /apis/storage.k8s.io/v1alpha1/namespaces/default/csistoragecapacities/csisc-sqdnt
  UID:               da36215b-3b9d-404a-a4c7-3f1c3502ab13
Node Topology:
  Match Labels:
    pmem-csi.intel.com/node:  pmem-csi-pmem-govm-worker1
Storage Class Name:           pmem-csi-sc-late-binding
Events:                       <none>

අපි තනි සාමාන්‍ය කාර්ය කාලීන පරිමාවක් සහිත ආදර්ශන යෙදුමක් නිර්මාණය කිරීමට උත්සාහ කරමු. ගොනු අන්තර්ගතය pmem-app-ephemeral.yaml:

# This example Pod definition demonstrates
# how to use generic ephemeral inline volumes
# with a PMEM-CSI storage class.
kind: Pod
apiVersion: v1
metadata:
  name: my-csi-app-inline-volume
spec:
  containers:
    - name: my-frontend
      image: intel/pmem-csi-driver-test:v0.7.14
      command: [ "sleep", "100000" ]
      volumeMounts:
      - mountPath: "/data"
        name: my-csi-volume
  volumes:
  - name: my-csi-volume
    ephemeral:
      volumeClaimTemplate:
        spec:
          accessModes:
          - ReadWriteOnce
          resources:
            requests:
              storage: 4Gi
          storageClassName: pmem-csi-sc-late-binding

නිර්මාණය කිරීමෙන් පසු, ඉහත උපදෙස් වල පෙන්වා ඇති පරිදි, අපට දැන් අමතර පොඩ් එකක් සහ PVC තිබේ:

$ kubectl get pods/my-csi-app-inline-volume -o wide
NAME                       READY   STATUS    RESTARTS   AGE     IP          NODE                         NOMINATED NODE   READINESS GATES
my-csi-app-inline-volume   1/1     Running   0          6m58s   10.36.0.2   pmem-csi-pmem-govm-worker1   <none>           <none>
$ kubectl get pvc/my-csi-app-inline-volume-my-csi-volume
NAME                                     STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS               AGE
my-csi-app-inline-volume-my-csi-volume   Bound    pvc-c11eb7ab-a4fa-46fe-b515-b366be908823   4Gi        RWO            pmem-csi-sc-late-binding   9m21s

PVC හිමිකරු - යටතේ:

$ kubectl get -o yaml pvc/my-csi-app-inline-volume-my-csi-volume
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  annotations:
    pv.kubernetes.io/bind-completed: "yes"
    pv.kubernetes.io/bound-by-controller: "yes"
    volume.beta.kubernetes.io/storage-provisioner: pmem-csi.intel.com
    volume.kubernetes.io/selected-node: pmem-csi-pmem-govm-worker1
  creationTimestamp: "2020-08-11T15:44:57Z"
  finalizers:
  - kubernetes.io/pvc-protection
  managedFields:
    ...
  name: my-csi-app-inline-volume-my-csi-volume
  namespace: default
  ownerReferences:
  - apiVersion: v1
    blockOwnerDeletion: true
    controller: true
    kind: Pod
    name: my-csi-app-inline-volume
    uid: 75c925bf-ca8e-441a-ac67-f190b7a2265f
...

සඳහා අපේක්ෂිත යාවත්කාලීන තොරතුරු pmem-csi-pmem-govm-worker1:

csisc-2js6n map[pmem-csi.intel.com/node:pmem-csi-pmem-govm-worker2] 30716Mi
csisc-sqdnt map[pmem-csi.intel.com/node:pmem-csi-pmem-govm-worker1] 26620Mi
csisc-ws4bv map[pmem-csi.intel.com/node:pmem-csi-pmem-govm-worker3] 30716Mi

වෙනත් යෙදුමකට 26620Mi ට වඩා අවශ්‍ය නම්, උපලේඛකයා සැලකිල්ලට නොගනී pmem-csi-pmem-govm-worker1 ඕනෑම අවස්ථාවක් තුළ.

ඊළඟට කුමක්ද?

විශේෂාංග දෙකම තවමත් සංවර්ධනය වෙමින් පවතී. ඇල්ෆා පරීක්ෂණ අතරතුර යෙදුම් කිහිපයක් විවෘත කරන ලදී. වැඩිදියුණු කිරීමේ යෝජනාව සබැඳි බීටා අදියර වෙත යාමට කළ යුතු කාර්යය මෙන්ම දැනටමත් සලකා බලා ප්‍රතික්ෂේප කර ඇති විකල්ප ලේඛනගත කරයි:

මූලාශ්රය: www.habr.com

අදහස් එක් කරන්න