ڪتاب "DevOps لاء Kubernetes"

ڪتاب "DevOps لاء Kubernetes" سلام، خابرو شهرين! Kubernetes جديد بادل ماحولياتي نظام جي اهم عنصرن مان هڪ آهي. هي ٽيڪنالاجي ڪنٽينر ورچوئلائيزيشن کي قابل اعتماد، اسڪاليبلٽي ۽ لچڪ فراهم ڪري ٿي. جان ارنڊيل ۽ جسٽن ڊومنگس ڪبرنيٽس ايڪو سسٽم بابت ڳالهائيندا آهن ۽ روزمره جي مسئلن لاءِ ثابت ٿيل حل متعارف ڪرائيندا آهن. قدم بہ قدم، توھان پنھنجي ڪلائوڊ-ملي ايپليڪيشن ٺاھيندا ۽ ان کي سپورٽ ڪرڻ لاءِ انفراسٽرڪچر ٺاھيندا، ھڪ ڊولپمينٽ ماحول قائم ڪندا ۽ مسلسل ڊيپلائيمينٽ پائيپ لائين جيڪا توھان جي مدد ڪندي جيئن توھان جي ايندڙ ايپليڪيشنن تي ڪم ڪندي.

• ڪنٽينر ۽ ڪبرنيٽس سان شروع ڪريو بنياديات کان: موضوع سکڻ لاءِ ڪنهن خاص تجربي جي ضرورت ناهي. • پنهنجا ڪلسٽر هلايو يا Amazon، Google وغيره مان هڪ منظم ڪيل Kubernetes سروس چونڊيو. • ڪنٽينر جي زندگي ۽ وسيلن جي استعمال کي منظم ڪرڻ لاءِ Kubernetes استعمال ڪريو. • قيمت، ڪارڪردگي، لچڪ، طاقت ۽ اسڪاليبلٽي جي بنياد تي ڪلستر کي بهتر ڪريو. • توهان جي ايپليڪيشنن کي ترقي، جانچ، ۽ ترتيب ڏيڻ لاء بهترين اوزار سکو. • سيڪيورٽي ۽ ڪنٽرول کي يقيني بڻائڻ لاء موجوده صنعت جي عملن کي استعمال ڪريو. • پنھنجي سڄي ڪمپني ۾ DevOps اصولن کي لاڳو ڪريو ته جيئن ڊولپمينٽ ٽيمون وڌيڪ لچڪدار، تڪڙو ۽ موثر طريقي سان ڪم ڪري سگھن.

ڪتاب ڪنهن لاءِ آهي؟

ڪتاب تمام لاڳاپيل آهي انتظامي شعبن جي ملازمن لاءِ جيڪي سرورز، ايپليڪيشنن ۽ خدمتن لاءِ ذميوار آهن، ۽ گڏوگڏ ڊولپرز لاءِ جيڪي يا ته نئين ڪلائوڊ سروسز جي تعمير ۾ يا موجوده ايپليڪيشنن کي Kubernetes ۽ ڪلائوڊ ڏانهن منتقل ڪرڻ ۾ ملوث آهن. پريشان نه ٿيو، توهان کي ڄاڻڻ جي ضرورت ناهي ته ڪبرنيٽس يا ڪنٽينرز سان ڪيئن ڪم ڪجي - اسان توهان کي سڀ ڪجهه سيکارينداسين.

تجربا ڪبرنيٽس استعمال ڪندڙ پڻ تمام گھڻي قدر ڳوليندا، مضمونن جي گھري ڪوريج سان، جيئن ته RBAC، مسلسل مقرري، حساس ڊيٽا جو انتظام، ۽ مشاهدو. اسان کي اميد آهي ته ڪتاب جا صفحا ضرور توهان لاءِ ڪجهه دلچسپ هوندا، توهان جي صلاحيتن ۽ تجربي جي پرواهه ناهي.

ڪتاب ڪھڙن سوالن جو جواب ڏئي ٿو؟

ڪتاب جي منصوبابندي ڪرڻ ۽ لکڻ دوران، اسان ڪلائوڊ ٽيڪنالاجي ۽ ڪبرنيٽس تي سوين ماڻهن سان ڳالهايو، صنعت جي اڳواڻن ۽ ماهرن سان گڏ گڏوگڏ مڪمل نوان نوان سان ڳالهايو. هيٺيان چونڊيل سوال آهن جيڪي اهي هن اشاعت ۾ جواب ڏسڻ چاهيندا آهن.

  • "مون کي دلچسپي آهي ته توهان کي هن ٽيڪنالاجي تي وقت ڇو خرچ ڪرڻ گهرجي. ڪھڙا مسئلا مون کي ۽ منھنجي ٽيم کي حل ڪرڻ ۾ مدد ڪندو؟
  • "Kubernetes دلچسپ لڳي ٿو، پر داخلا لاء ڪافي وڏي رڪاوٽ آهي. هڪ سادي مثال تيار ڪرڻ ڏکيو ناهي، پر وڌيڪ انتظام ۽ ڊيبگنگ مشڪل آهي. اسان قابل اعتماد مشورو حاصل ڪرڻ چاهيون ٿا ته ماڻهو حقيقي دنيا ۾ ڪبرنيٽس ڪلستر کي ڪيئن منظم ڪن ٿا ۽ اسان کي ڪهڙيون مشڪلاتون پيش اچڻ جو امڪان آهي.
  • ”موضوعاتي صلاح مددگار ثابت ٿيندي. Kubernetes ماحولياتي نظام نئين ٽيمن کي چونڊڻ لاءِ تمام گھڻا اختيار ڏئي ٿو. جڏهن هڪ ئي ڪم ڪرڻ جا ڪيترائي طريقا آهن، توهان کي ڪيئن خبر آهي ته ڪهڙو بهترين آهي؟ هڪ چونڊ ڪيئن ڪجي؟

۽ شايد سڀ کان اهم سوالن مان:

  • "مان ڪبرنيٽس کي ڪيئن استعمال ڪري سگهان ٿو بغير منهنجي ڪمپني کي خراب ڪرڻ؟"

اقتباس. ترتيب ۽ ڳجهي شيون

Kubernetes ايپليڪيشن جي منطق کي ان جي ٺاھ جوڙ کان الڳ ڪرڻ جي صلاحيت (يعني، ڪنھن قدر يا سيٽنگون جيڪي وقت سان تبديل ٿي سگھن ٿيون) تمام مفيد آھي. ترتيب جي قيمتن ۾ عام طور تي ماحول جي مخصوص سيٽنگون، ٽئين پارٽي جي خدمت DNS پتا، ۽ تصديق جي سند شامل آهن.

يقينا، اهو سڀ ڪجهه سڌو سنئون ڪوڊ ۾ رکي سگهجي ٿو، پر اهو طريقو ڪافي لچڪدار ناهي. مثال طور، ھڪڙي ٺاھ جوڙ جي قيمت تبديل ڪندي توھان کي توھان جي ڪوڊ کي ٻيهر ٺاھڻ ۽ ترتيب ڏيڻ جي ضرورت پوندي. ھڪڙو بھتر حل اھو ھوندو ته ترتيب کي ڪوڊ کان الڳ ڪيو وڃي ۽ ان کي فائل يا ماحوليات جي متغيرن مان پڙھو.

Kubernetes ترتيب ڏيڻ لاء ڪيترائي مختلف طريقا مهيا ڪري ٿو. پهرين، توهان پوڊ ريپر جي وضاحت ۾ بيان ڪيل ماحوليات جي متغيرن جي ذريعي ايپليڪيشن کي قدر منتقل ڪري سگهو ٿا (ڏسو "ماحولياتي متغير" صفحي 192 تي). ٻيو، ترتيب واري ڊيٽا سڌو سنئون ڪبرنيٽس ۾ محفوظ ڪري سگھجي ٿو ConfigMap ۽ ڳجهي شيون استعمال ڪندي.

هن باب ۾، اسان انهن شين کي تفصيل سان ڳوليندا آهيون ۽ ڊيمو ايپليڪيشن استعمال ڪندي ترتيب ۽ حساس ڊيٽا کي منظم ڪرڻ لاء ڪجهه عملي طريقا ڏسو.

پوڊ شيل کي اپڊيٽ ڪرڻ جڏهن ترتيب جي تبديلي

تصور ڪريو ته توهان وٽ توهان جي ڪلستر ۾ هڪ مقرري آهي ۽ توهان ان جي ConfigMap ۾ ڪجهه قدر تبديل ڪرڻ چاهيو ٿا. جيڪڏهن توهان هيلم چارٽ استعمال ڪريو ٿا (ڏسو "هيلم: پيڪيج مئنيجر فار ڪبرنيٽس" صفحي 102 تي)، توهان خودڪار طريقي سان ترتيب جي تبديلي کي ڳولي سگهو ٿا ۽ هڪ صاف چال ۾ پنهنجا پوڊ شيل ٻيهر لوڊ ڪري سگهو ٿا. ھيٺ ڏنل تشريح شامل ڪريو پنھنجي مقرري جي وضاحت ۾:

checksum/config: {{ include (print $.Template.BasePath "/configmap.yaml") .
       | sha256sum }}

ترتيب ڏيڻ واري ٽيمپليٽ ۾ ھاڻي ٺاھ جوڙ جي پيراگرافن جي چڪاس شامل آھي: جيڪڏھن پيرا ميٽر تبديل ڪيا ويا آھن، رقم کي اپڊيٽ ڪيو ويندو. جيڪڏهن توهان هلم اپ گريڊ کي هلائيندا آهيو، هيلم اهو معلوم ڪندو ته ڊيپلائيشن جي وضاحت تبديل ٿي وئي آهي ۽ سڀني پوڊ شيل کي ٻيهر شروع ڪندو.

Kubernetes ۾ حساس ڊيٽا

اسان اڳ ۾ ئي ڄاڻون ٿا ته ConfigMap اعتراض ڪلستر ۾ ترتيب ڏيڻ واري ڊيٽا کي محفوظ ڪرڻ ۽ رسائي حاصل ڪرڻ لاء هڪ لچڪدار ميکانيزم مهيا ڪري ٿو. بهرحال، اڪثر ايپليڪيشنن وٽ معلومات هوندي آهي جيڪا حساس ۽ حساس هوندي آهي، جهڙوڪ پاسورڊ يا API ڪيز. اهو پڻ ConfigMap ۾ ذخيرو ٿي سگهي ٿو، پر اهو حل مثالي ناهي.

ان جي بدران، ڪبرنيٽس هڪ خاص قسم جو اعتراض پيش ڪري ٿو جيڪو حساس ڊيٽا کي ذخيرو ڪرڻ لاء ٺهيل آهي: راز. اڳيون، اچو ته هڪ مثال ڏسو ته هي اعتراض اسان جي ڊيمو ايپليڪيشن ۾ ڪيئن استعمال ڪري سگهجي ٿو.

شروع ڪرڻ لاءِ، ڏسو Kubernetes manifest for Secret Object (ڏسو hello-secret-env/k8s/secret.yaml):

apiVersion: v1
kind: Secret
metadata:
    name: demo-secret
stringData:
    magicWord: xyzzy

هن مثال ۾، magicWord خانگي چيڪ xyzzy آهي (en.wikipedia.org/wiki/Xyzzy_(computing)). لفظ xyzzy عام طور تي ڪمپيوٽر جي دنيا ۾ تمام گهڻو مفيد آهي. ConfigMap سان ملندڙ جلندڙ، توهان هڪ ڳجهي اعتراض ۾ ڪيترن ئي چاٻيون ۽ قيمتون ذخيرو ڪري سگهو ٿا. هتي، سادگي لاء، اسان صرف هڪ اهم-قدر جوڙو استعمال ڪندا آهيون.

ڳجهي شيون استعمال ڪندي ماحوليات جي متغير طور

ConfigMap وانگر، رازداري اعتراض ڪنٽينر ۾ ماحول جي متغير يا ان جي ڊسڪ تي فائل جي طور تي دستياب ٿي سگھي ٿو. هيٺ ڏنل مثال ۾، اسان هڪ ماحولياتي متغير مقرر ڪنداسين راز مان قيمت کي:

spec:
   containers:
       - name: demo
          image: cloudnatived/demo:hello-secret-env
          ports:
             - containerPort: 8888
          env:
             - name: GREETING
               valueFrom:
               secretKeyRef:
                  name: demo-secret
                  key: magicWord

منشور لاڳو ڪرڻ لاءِ ڊيمو مخزن ۾ ھيٺ ڏنل حڪم ھلايو:

kubectl apply -f hello-secret-env/k8s/
deployment.extensions "demo" configured
secret "demo-secret" created

اڳي وانگر، مقامي بندرگاهن کي ترتيب ڏيڻ لاءِ اڳتي وڌايو توهان جي برائوزر ۾ نتيجو ڏسڻ لاءِ:

kubectl port-forward deploy/demo 9999:8888
Forwarding from 127.0.0.1:9999 -> 8888
Forwarding from [::1]:9999 -> 8888

جڏهن پتو کوليو مقامي هلو:9999/ توھان کي ھيٺين ڏسڻ گھرجي:

The magic word is "xyzzy"

فائلن ۾ ڳجهي شيون لکڻ

ھن مثال ۾، اسان ڳجھي اعتراض کي ھڪڙي فائل جي طور تي ڪنٽينر سان ڳنڍيندا سين. ڪوڊ ڊيمو مخزن جي هيلو-سيڪريٽ فائل فولڊر ۾ واقع آهي.

ڳنڍڻ لاءِ راز کي فائل طور، اسان استعمال ڪنداسين ھيٺ ڏنل ڊيپلائيشن:

spec:
   containers:
       - name: demo
          image: cloudnatived/demo:hello-secret-file
          ports:
              - containerPort: 8888
          volumeMounts:
              - name: demo-secret-volume
                mountPath: "/secrets/"
                readOnly: true
   volumes:
      - name: demo-secret-volume
        secret:
           secretName: demo-secret

جيئن ذيلي سيڪشن ۾ ”Creating configuration files from ConfigMap objects“ p. 240، اسان هڪ حجم ٺاهيندا آهيون (هن صورت ۾ ڊيمو-سيڪريٽ-حجم) ۽ ان کي ڪنٽينر تي نصب ڪيو ويو آهي وولوم ماؤنٽس سيڪشن ۾. mountPath فيلڊ آھي /secrets، تنھنڪري Kubernetes ھن فولڊر ۾ ھڪڙي فائل ٺاھيندو ھر ڪي/قيمت واري جوڙي لاءِ ڳجھي اعتراض ۾ بيان ڪيل.

اسان جي مثال ۾، اسان صرف هڪ اهم-قيمتي جوڙو جو تعين ڪيو جنهن کي magicWord سڏيو ويندو آهي، تنهنڪري منشور ٺاهيندو هڪ واحد پڙهڻ لاءِ فائل /secrets/magicWord ڪنٽينر ۾ حساس ڊيٽا سان.

جيڪڏهن توهان هن پڌرنامي کي ساڳئي طريقي سان لاڳو ڪريو جيئن پوئين مثال، توهان کي ساڳيو نتيجو حاصل ڪرڻ گهرجي:

The magic word is "xyzzy"

ڳجهي شيون پڙهڻ

پوئين حصي ۾، اسان استعمال ڪيو kubectl describe حڪم هڪ ConfigMap جي مواد کي ڊسپلي ڪرڻ لاء. ڇا ساڳيو راز سان ڪري سگهجي ٿو؟

kubectl describe secret/demo-secret
Name:          demo-secret

Namespace:      default
Labels:             <none>
Annotations:
Type:               Opaque

Data
====
magicWord: 5   bytes

مهرباني ڪري نوٽ ڪريو ته ڊيٽا پاڻ کي ظاهر نه ڪيو ويو آهي. Kubernetes ۾ ڳجهي شيون Opaque قسم جون هونديون آهن، جنهن جو مطلب آهي ته انهن جو مواد kubectl describe output، log entries، يا ٽرمينل ۾ نه ڏيکاريو ويو آهي، جنهن ڪري حساس معلومات کي حادثاتي طور تي ظاهر ڪرڻ ناممڪن آهي.

حساس ڊيٽا جي انڪوڊ ٿيل YAML ورزن کي ڏسڻ لاءِ، استعمال ڪريو kubectl get command:

kubectl get secret/demo-secret -o yaml
apiVersion: v1
data:
   magicWord: eHl6enk=
kind: Secret
metadata:
...
type: Opaque

بنيادي 64

ڇا آهي eHl6enk=، اسان جي اصل قيمت کان بلڪل مختلف؟ هي اصل ۾ هڪ ڳجهو اعتراض آهي، جنهن جي نمائندگي base64 انڪوڊنگ ۾ آهي. بيس 64 هڪ اسڪيم آهي انڪوڊنگ لاءِ صوابديدي بائنري ڊيٽا کي اکرن جي اسٽرنگ طور.

ڇاڪاڻ ته حساس معلومات بائنري ٿي سگهي ٿي ۽ نه آئوٽ (جيئن ته TLS انڪرپشن ڪي جي صورت ۾ آهي)، ڳجهي شيون هميشه بيس 64 فارميٽ ۾ محفوظ ڪيون وينديون آهن.

متن beHl6enk= اسان جي ڳجهي لفظ xyzzy جو بنيادي 64 انڪوڊ ٿيل نسخو آهي. توھان ھن جي تصديق ڪري سگھوٿا بيس 64 -ڊيڪوڊ ڪمانڊ کي هلائڻ سان ٽرمينل ۾:

echo "eHl6enk=" | base64 --decode
xyzzy

تنهن ڪري، جڏهن ته ڪبرنيٽس توهان کي ٽرمينل يا لاگ فائلن ۾ حساس ڊيٽا کي حادثاتي طور تي نڪرڻ کان بچائيندو آهي، جيڪڏهن توهان ڪنهن مخصوص نالي واري جڳهه ۾ ڳجهي شين تي اجازتون پڙهيا آهن، ته ڊيٽا بيس 64 ۽ بعد ۾ ڊيڪوڊ ٿي سگهي ٿي.

جيڪڏهن توهان کي بيس 64 انڪوڊ ڪرڻ جي ضرورت آهي ڪجهه متن (مثال طور، ان کي راز ۾ رکڻ لاء)، استعمال ڪريو base64 حڪم بغير دليلن جي:

echo xyzzy | base64
eHl6enkK

ڳجهي شين تائين رسائي

ڳجهي شيون ڪير پڙهي ۽ ايڊٽ ڪري سگهي ٿو؟ اهو RBAC پاران طئي ڪيو ويو آهي، هڪ رسائي ڪنٽرول ميڪانيزم (اسان ان تي تفصيل سان بحث ڪنداسين "رول تي ٻڌل رسائي ڪنٽرول جو تعارف" صفحي 258 تي). جيڪڏهن توهان هڪ ڪلستر هلائي رهيا آهيو جنهن ۾ RBAC نه آهي يا فعال نه آهي، توهان جون سڀئي ڳجهيون شيون ڪنهن به استعمال ڪندڙن ۽ ڪنٽينرز لاءِ دستياب آهن (اسان بعد ۾ وضاحت ڪنداسين ته توهان وٽ RBAC کان سواءِ ڪو به پيداوار ڪلسٽر نه هجڻ گهرجي).

غير فعال ڊيٽا انڪريشن

انهن بابت ڇا آهي جن کي etcd ڊيٽابيس تائين رسائي آهي جتي ڪبرنيٽس ان جي سموري معلومات محفوظ ڪري ٿو؟ ڇا اھي حساس ڊيٽا پڙھي سگھن ٿا بغير اجازت جي API ذريعي ڳجھي شيون پڙھڻ جي؟

نسخو 1.7 کان وٺي، ڪبرنيٽس غير فعال ڊيٽا انڪرپشن کي سپورٽ ڪري ٿو. ان جو مطلب اهو آهي ته حساس معلومات etcd جي اندر ڊسڪ تي محفوظ ٿيل آهي ۽ اهي پڙهي نٿا سگهن جيڪي ڊيٽابيس تائين سڌو رسائي رکن ٿا. ان کي ختم ڪرڻ لاءِ، توهان کي هڪ ڪنجي جي ضرورت آهي جيڪا صرف ڪبرنيٽس API سرور وٽ آهي. صحيح ترتيب ڏنل ڪلستر ۾، غير فعال انڪرپشن کي فعال ڪيو وڃي.

توهان چيڪ ڪري سگهو ٿا ته غير فعال انڪرپشن توهان جي ڪلستر ۾ هن طريقي سان ڪم ڪري ٿي:

kubectl describe pod -n kube-system -l component=kube-apiserver |grep encryption
        --experimental-encryption-provider-config=...

جيڪڏھن توھان نه ڏسندا آھيو تجرباتي-انڪريپشن-فراهم ڪندڙ-config پرچم، غير فعال انڪرپشن فعال نه آھي. جڏهن Google Kubernetes Engine يا ٻيون Kubernetes مئنيجمينٽ خدمتون استعمال ڪندي، توهان جي ڊيٽا کي مختلف ميڪانيزم استعمال ڪندي انڪريپٽ ڪيو ويو آهي، تنهنڪري پرچم موجود نه هوندو. پنهنجي ڪبرنيٽس وينڊر سان چيڪ ڪريو ته ڏسو ته ڇا etcd مواد انڪريپٽ ٿيل آهي.

رازداري ڊيٽا کي محفوظ ڪرڻ

ڪجھ ڪبرنيٽس وسيلا آھن جن کي ڪڏھن به ڪلستر مان نه ھٽايو وڃي، جھڙوڪ انتهائي حساس ڳجھي شيون. توھان ھيلم مئنيجر پاران مهيا ڪيل تشريح استعمال ڪندي ھڪڙي وسيلن کي ختم ٿيڻ کان بچائي سگھو ٿا:

kind: Secret
metadata:
    annotations:
        "helm.sh/resource-policy": keep

رازداري آبجیکٹ مينيجمينٽ حڪمت عمليون

مثال طور پوئين حصي مان، حساس ڊيٽا کي محفوظ ڪيو ويو غير مجاز رسائي کان فوري طور تي ڪلستر ۾ ذخيرو ٿيڻ کان پوء. پر ظاهر ڪيل فائلن ۾ اهي سادي متن جي طور تي محفوظ ڪيا ويا.

توهان کي ڪڏهن به ڳجهي معلومات فائلن ۾ نه رکڻ گهرجي جيڪي ورزن ڪنٽرول ۾ آهن. توهان پنهنجي ڪبرنيٽس ڪلستر تي لاڳو ڪرڻ کان پهريان هن معلومات کي ڪيئن محفوظ ۽ منظم ڪري سگهو ٿا؟

توهان پنهنجي ايپليڪيشنن ۾ حساس ڊيٽا کي سنڀالڻ لاءِ ڪي به اوزار يا حڪمت عمليون چونڊي سگهو ٿا، پر توهان کي اڃا به گهٽ ۾ گهٽ هيٺين سوالن جا جواب ڏيڻا پوندا.

  • ڪٿي حساس ڊيٽا کي محفوظ ڪيو وڃي ته جيئن اهو انتهائي پهچ آهي؟
  • توهان جي فعال ايپليڪيشنن تائين حساس ڊيٽا کي ڪيئن پهچائجي؟
  • توهان جي ايپليڪيشنن کي ڇا ٿيڻ گهرجي جڏهن توهان حساس ڊيٽا کي تبديل يا تبديل ڪندا آهيو؟

ليکڪن جي باري ۾

جان ارنڊيل ڪمپيوٽر انڊسٽري ۾ 30 سالن جو تجربو رکندڙ صلاحڪار آهي. هن ڪيترائي ڪتاب لکيا آهن ۽ مختلف ملڪن جي ڪيترن ئي ڪمپنين سان ڪم ڪيو آهي، انهن کي بادل-مقامي انفراسٽرڪچر ۽ ڪبرنيٽس تي صلاح ڏني آهي. پنهنجي فارغ وقت ۾، هو سرفنگ جو مزو وٺندو آهي، هڪ سٺو پستول شوٽر آهي، ۽ هڪ شوقين جي حيثيت سان پيانو وڄائيندو آهي. انگلينڊ جي ڪارن وال ۾ هڪ افسانوي ڪٿا ۾ رهي ٿو.

جسٽن ڊومنگس - سسٽم ايڊمنسٽريشن انجنيئر هڪ DevOps ماحول ۾ ڪم ڪندڙ ڪبرنيٽس ۽ ڪلائوڊ ٽيڪنالاجيز سان. هو ٻاهر وقت گذارڻ، ڪافي پيئڻ، ڪربنگ ۽ ڪمپيوٽر تي ويهڻ ۾ مزو وٺندو آهي. سيٽل، واشنگٽن ۾ رهي ٿو، هڪ شاندار ٻلي سان ۽ هڪ اڃا به وڌيڪ شاندار زال ۽ بهترين دوست، ايڊريئن.

» ڪتاب بابت وڌيڪ معلومات لاء، مهرباني ڪري دورو ڪريو پبلشر جي ويب سائيٽ
» مضمونن جو جدول
» اقتباس

Khabrozhiteli لاءِ ڪوپن تي 25٪ رعايت - ڪوبنيٿس

ڪتاب جي پيپر ورشن جي ادائگي تي، هڪ ڪتاب اي ميل تي موڪليو ويندو.

جو ذريعو: www.habr.com

تبصرو شامل ڪريو