شیل آپریٹر کا تعارف: کبرنیٹس کے لیے آپریٹرز بنانا آسان ہو گیا ہے۔

ہمارے بلاگ پر پہلے ہی مضامین ہو چکے ہیں جن کے بارے میں بات کر رہے ہیں۔ Kubernetes میں آپریٹر کی صلاحیتیں۔ اور کیسے ایک سادہ آپریٹر خود لکھیں۔. اس بار ہم آپ کی توجہ کے لیے اپنا اوپن سورس حل پیش کرنا چاہیں گے، جو آپریٹرز کی تخلیق کو انتہائی آسان سطح پر لے جاتا ہے۔ شیل آپریٹر!

کیوں؟

شیل آپریٹر کا آئیڈیا کافی آسان ہے: Kubernetes آبجیکٹ کے ایونٹس کو سبسکرائب کریں، اور جب یہ ایونٹس موصول ہوں تو ایک بیرونی پروگرام شروع کریں، اسے ایونٹ کے بارے میں معلومات فراہم کریں:

شیل آپریٹر کا تعارف: کبرنیٹس کے لیے آپریٹرز بنانا آسان ہو گیا ہے۔

اس کی ضرورت اس وقت پیش آئی جب کلسٹرز کے آپریشن کے دوران چھوٹے چھوٹے کام نظر آنے لگے کہ ہم واقعی درست طریقے سے خودکار کرنا چاہتے ہیں۔ یہ تمام چھوٹے کام آسان باش اسکرپٹس کا استعمال کرتے ہوئے حل کیے گئے تھے، حالانکہ جیسا کہ آپ جانتے ہیں، آپریٹرز کو گولانگ میں لکھنا بہتر ہے۔ ظاہر ہے، ایسے ہر چھوٹے کام کے لیے آپریٹر کی مکمل ترقی میں سرمایہ کاری بے اثر ہوگی۔

15 منٹ میں آپریٹر

آئیے ایک مثال دیکھیں کہ کبرنیٹس کلسٹر میں خودکار کیا جا سکتا ہے اور شیل آپریٹر کس طرح مدد کر سکتا ہے۔ ایک مثال درج ذیل ہو گی: ڈاکر رجسٹری تک رسائی کے لیے ایک راز کو نقل کرنا۔

پوڈز جو نجی رجسٹری سے تصاویر استعمال کرتے ہیں ان کے مینی فیسٹ میں رجسٹری تک رسائی کے لیے ڈیٹا کے ساتھ راز کا لنک ہونا چاہیے۔ پوڈز بنانے سے پہلے اس راز کو ہر نام کی جگہ میں بنانا ضروری ہے۔ یہ دستی طور پر کیا جا سکتا ہے، لیکن اگر ہم متحرک ماحول قائم کرتے ہیں، تو ایک درخواست کے لیے نام کی جگہ بہت زیادہ ہو جائے گی۔ اور اگر 2-3 درخواستیں بھی نہ ہوں... رازوں کی تعداد بہت زیادہ ہو جاتی ہے۔ اور راز کے بارے میں ایک اور بات: میں وقتاً فوقتاً رجسٹری تک رسائی کے لیے کلید کو تبدیل کرنا چاہوں گا۔ بالآخر، دستی آپریشنز ایک حل کے طور پر مکمل طور پر غیر موثر - ہمیں رازوں کی تخلیق اور اپ ڈیٹ کو خودکار کرنے کی ضرورت ہے۔

سادہ آٹومیشن

آئیے ایک شیل اسکرپٹ لکھتے ہیں جو ہر N سیکنڈ میں ایک بار چلتا ہے اور کسی خفیہ کی موجودگی کے لئے نام کی جگہوں کو چیک کرتا ہے، اور اگر کوئی راز نہیں ہے، تو یہ بن جاتا ہے۔ اس حل کا فائدہ یہ ہے کہ یہ کرون میں شیل اسکرپٹ کی طرح لگتا ہے - ایک کلاسک اور ہر ایک کے لیے قابل فہم نقطہ نظر۔ منفی پہلو یہ ہے کہ اس کے لانچوں کے درمیان وقفہ میں ایک نیا نام کی جگہ بنائی جا سکتی ہے اور کچھ وقت کے لیے یہ راز کے بغیر رہے گا، جس سے پوڈز کو لانچ کرنے میں غلطیاں پیدا ہوں گی۔

شیل آپریٹر کے ساتھ آٹومیشن

ہمارے اسکرپٹ کو صحیح طریقے سے کام کرنے کے لیے، کلاسک کرون لانچ کو لانچ سے تبدیل کرنے کی ضرورت ہے جب نام کی جگہ شامل کی جائے: اس صورت میں، آپ اسے استعمال کرنے سے پہلے ایک راز بنا سکتے ہیں۔ آئیے دیکھتے ہیں کہ شیل آپریٹر کا استعمال کرتے ہوئے اسے کیسے نافذ کیا جائے۔

سب سے پہلے، اسکرپٹ کو دیکھتے ہیں. شیل آپریٹر کی اصطلاحات میں اسکرپٹ کو ہکس کہتے ہیں۔ ہر ہک جب جھنڈے کے ساتھ چلتا ہے۔ --config شیل آپریٹر کو اس کی پابندیوں کے بارے میں مطلع کرتا ہے، یعنی کن واقعات پر اسے شروع کیا جانا چاہئے۔ ہمارے معاملے میں ہم استعمال کریں گے۔ onKubernetesEvent:

#!/bin/bash
if [[ $1 == "--config" ]] ; then
cat <<EOF
{
"onKubernetesEvent": [
  { "kind": "namespace",
    "event":["add"]
  }
]}
EOF
fi

یہاں بیان کیا گیا ہے کہ ہم واقعات کو شامل کرنے میں دلچسپی رکھتے ہیں (addقسم کی اشیاء namespace.

اب آپ کو اس کوڈ کو شامل کرنے کی ضرورت ہے جو واقعہ کے پیش آنے پر عمل میں لایا جائے گا:

#!/bin/bash
if [[ $1 == "--config" ]] ; then
  # конфигурация
cat <<EOF
{
"onKubernetesEvent": [
{ "kind": "namespace",
  "event":["add"]
}
]}
EOF
else
  # реакция:
  # узнать, какой namespace появился
  createdNamespace=$(jq -r '.[0].resourceName' $BINDING_CONTEXT_PATH)
  # создать в нём нужный секрет
  kubectl create -n ${createdNamespace} -f - <<EOF
apiVersion: v1
kind: Secret
metadata:
  ...
data:
  ...
EOF
fi

زبردست! نتیجہ ایک چھوٹا، خوبصورت اسکرپٹ تھا۔ اسے "دوبارہ زندہ" کرنے کے لیے، دو مراحل باقی ہیں: تصویر تیار کریں اور اسے کلسٹر میں لانچ کریں۔

ہک کے ساتھ تصویر تیار کرنا

اگر آپ اسکرپٹ کو دیکھتے ہیں، تو آپ دیکھ سکتے ہیں کہ کمانڈز استعمال کیے گئے ہیں۔ kubectl и jq. اس کا مطلب یہ ہے کہ امیج میں درج ذیل چیزیں ہونی چاہئیں: ہمارا ہک، ایک شیل آپریٹر جو واقعات کی نگرانی کرے گا اور ہک کو چلائے گا، اور ہک (kubectl اور jq) کے ذریعے استعمال ہونے والی کمانڈز۔ Hub.docker.com کے پاس پہلے سے ہی ایک ریڈی میڈ امیج ہے جس میں شیل آپریٹر، کیوبیکٹل اور جے کیو پیک کیا گیا ہے۔ جو کچھ باقی ہے وہ ایک سادہ ہک شامل کرنا ہے۔ Dockerfile:

$ cat Dockerfile
FROM flant/shell-operator:v1.0.0-beta.1-alpine3.9
ADD namespace-hook.sh /hooks

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

ایک جھرمٹ میں چل رہا ہے۔

آئیے ہک کو دوبارہ دیکھتے ہیں اور اس بار لکھیں کہ یہ کلسٹر میں کون سے اعمال اور کن چیزوں کے ساتھ انجام دیتا ہے:

  1. نام کی جگہ تخلیق کے واقعات کو سبسکرائب کرتا ہے؛
  2. نام کی جگہوں میں اس کے علاوہ جہاں اسے لانچ کیا گیا ہے ایک راز بناتا ہے۔

اس سے پتہ چلتا ہے کہ جس پوڈ میں ہماری تصویر لانچ کی جائے گی اس کے پاس یہ کارروائیاں کرنے کی اجازت ہونی چاہیے۔ یہ آپ کا اپنا سروس اکاؤنٹ بنا کر کیا جا سکتا ہے۔ اجازت کلسٹر رول اور کلسٹر رول بائنڈنگ کی شکل میں ہونی چاہیے، کیونکہ ہم پورے کلسٹر کی اشیاء میں دلچسپی رکھتے ہیں۔

YAML میں حتمی تفصیل کچھ اس طرح نظر آئے گی:

---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: monitor-namespaces-acc

---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRole
metadata:
  name: monitor-namespaces
rules:
- apiGroups: [""]
  resources: ["namespaces"]
  verbs: ["get", "watch", "list"]
- apiGroups: [""]
  resources: ["secrets"]
  verbs: ["get", "list", "create", "patch"]

---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
  name: monitor-namespaces
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: monitor-namespaces
subjects:
  - kind: ServiceAccount
    name: monitor-namespaces-acc
    namespace: example-monitor-namespaces

آپ جمع شدہ تصویر کو ایک سادہ تعیناتی کے طور پر لانچ کر سکتے ہیں:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: my-operator
spec:
  template:
    spec:
      containers:
      - name: my-operator
        image: registry.example.com/my-operator:v1
      serviceAccountName: monitor-namespaces-acc

سہولت کے لیے، ایک علیحدہ نام کی جگہ بنائی گئی ہے جہاں شیل آپریٹر کو لانچ کیا جائے گا اور بنائے گئے مینی فیسٹس کو لاگو کیا جائے گا:

$ kubectl create ns example-monitor-namespaces
$ kubectl -n example-monitor-namespaces apply -f rbac.yaml
$ kubectl -n example-monitor-namespaces apply -f deployment.yaml

بس اتنا ہے: شیل آپریٹر شروع کرے گا، نام کی جگہ بنانے کے واقعات کو سبسکرائب کرے گا اور ضرورت پڑنے پر ہک چلائے گا۔

شیل آپریٹر کا تعارف: کبرنیٹس کے لیے آپریٹرز بنانا آسان ہو گیا ہے۔

اس طرح، ایک سادہ شیل اسکرپٹ Kubernetes کے لیے ایک حقیقی آپریٹر میں بدل گیا۔ اور ایک کلسٹر کے حصے کے طور پر کام کرتا ہے۔ اور یہ سب گولانگ میں آپریٹرز کی ترقی کے پیچیدہ عمل کے بغیر:

شیل آپریٹر کا تعارف: کبرنیٹس کے لیے آپریٹرز بنانا آسان ہو گیا ہے۔

اس سلسلے میں ایک اور مثال ہے...شیل آپریٹر کا تعارف: کبرنیٹس کے لیے آپریٹرز بنانا آسان ہو گیا ہے۔

ہم مندرجہ ذیل اشاعتوں میں سے کسی ایک میں اس کے معنی کو مزید تفصیل سے ظاہر کریں گے۔

فلٹرنگ

اشیاء کا سراغ لگانا اچھا ہے، لیکن اکثر اس پر ردعمل ظاہر کرنے کی ضرورت ہوتی ہے۔ کچھ آبجیکٹ کی خصوصیات کو تبدیل کرنامثال کے طور پر، تعیناتی میں نقل کی تعداد کو تبدیل کرنے یا آبجیکٹ لیبلز کو تبدیل کرنے کے لیے۔

جب کوئی واقعہ آتا ہے، شیل آپریٹر کو آبجیکٹ کا JSON مینی فیسٹ ملتا ہے۔ ہم ان خصوصیات کو منتخب کرسکتے ہیں جو اس JSON میں ہماری دلچسپی رکھتے ہیں اور ہک چلا سکتے ہیں۔ صرف جب وہ بدل جاتے ہیں. اس کے لیے ایک میدان ہے۔ jqFilter، جہاں آپ کو jq اظہار کی وضاحت کرنے کی ضرورت ہے جو JSON مینی فیسٹ پر لاگو ہوگا۔

مثال کے طور پر، تعیناتی اشیاء کے لیبل میں تبدیلیوں کا جواب دینے کے لیے، آپ کو فیلڈ کو فلٹر کرنے کی ضرورت ہے۔ labels میدان سے metadata. تشکیل اس طرح ہوگی:

cat <<EOF
{
"onKubernetesEvent": [
{ "kind": "deployment",
  "event":["update"],
  "jqFilter": ".metadata.labels"
}
]}
EOF

یہ jqFilter اظہار تعیناتی کے طویل JSON مینی فیسٹ کو لیبل کے ساتھ مختصر JSON میں بدل دیتا ہے:

شیل آپریٹر کا تعارف: کبرنیٹس کے لیے آپریٹرز بنانا آسان ہو گیا ہے۔

shell-operator صرف ہک چلائے گا جب یہ مختصر JSON تبدیل ہوتا ہے، اور دیگر خصوصیات میں تبدیلیوں کو نظر انداز کر دیا جائے گا۔

ہک لانچ سیاق و سباق

ہک کنفیگریشن آپ کو ایونٹس کے لیے کئی آپشنز بتانے کی اجازت دیتی ہے - مثال کے طور پر، کوبرنیٹس کے ایونٹس کے لیے 2 آپشنز اور 2 شیڈولز:

{"onKubernetesEvent":[
  {"name":"OnCreatePod",
  "kind": "pod",
  "event":["add"]
  },
  {"name":"OnModifiedNamespace",
  "kind": "namespace",
  "event":["update"],
  "jqFilter": ".metadata.labels"
  }
],
"schedule": [
{ "name":"every 10 min",
  "crontab":"* */10 * * * *"
}, {"name":"on Mondays at 12:10",
"crontab": "* 10 12 * * 1"
]}

ایک چھوٹا سا اختلاف: ہاں، شیل آپریٹر سپورٹ کرتا ہے۔ کرونٹاب اسٹائل اسکرپٹس چل رہا ہے۔. مزید تفصیلات میں مل سکتی ہیں۔ دستاویزات.

یہ تمیز کرنے کے لیے کہ ہک کیوں لانچ کیا گیا، شیل آپریٹر ایک عارضی فائل بناتا ہے اور ہک کے متغیر میں اس کا راستہ پاس کرتا ہے۔ BINDING_CONTEXT_TYPE. فائل میں ہک چلانے کی وجہ کی JSON تفصیل ہے۔ مثال کے طور پر، ہر 10 منٹ میں ہک درج ذیل مواد کے ساتھ چلے گا:

[{ "binding": "every 10 min"}]

اور پیر کو اس کا آغاز اس کے ساتھ ہوگا:

[{ "binding": "every 10 min"}, { "binding": "on Mondays at 12:10"}]

کے لیے onKubernetesEvent مزید JSON محرکات ہوں گے، کیونکہ اس میں آبجیکٹ کی تفصیل ہے:

[
 {
 "binding": "onCreatePod",
 "resourceEvent": "add",
 "resourceKind": "pod",
 "resourceName": "foo",
 "resourceNamespace": "bar"
 }
]

کھیتوں کے مواد کو ان کے ناموں سے سمجھا جا سکتا ہے، اور مزید تفصیلات اس میں پڑھی جا سکتی ہیں۔ دستاویزات. فیلڈ سے وسائل کا نام حاصل کرنے کی ایک مثال resourceName jq کا استعمال پہلے ہی ایک ہک میں دکھایا گیا ہے جو راز کو نقل کرتا ہے:

jq -r '.[0].resourceName' $BINDING_CONTEXT_PATH

آپ اسی طرح دوسرے فیلڈز حاصل کرسکتے ہیں۔

اس کے بعد کیا ہے؟

پروجیکٹ کے ذخیرے میں، میں /examples ڈائریکٹریز، ہکس کی مثالیں ہیں جو کلسٹر پر چلنے کے لئے تیار ہیں۔ اپنے ہکس لکھتے وقت، آپ انہیں بنیاد کے طور پر استعمال کرسکتے ہیں۔

Prometheus کا استعمال کرتے ہوئے میٹرکس کو جمع کرنے کے لیے تعاون موجود ہے - دستیاب میٹرکس کو سیکشن میں بیان کیا گیا ہے۔ میٹرکس.

جیسا کہ آپ اندازہ لگا سکتے ہیں، شیل آپریٹر گو میں لکھا گیا ہے اور اوپن سورس لائسنس (Apache 2.0) کے تحت تقسیم کیا گیا ہے۔ ہم کسی بھی ترقیاتی امداد کے شکر گزار ہوں گے۔ GitHub پر پروجیکٹ: اور ستارے، اور مسائل، اور پل کی درخواستیں۔

رازداری کا پردہ اٹھاتے ہوئے، ہم آپ کو یہ بھی بتائیں گے کہ شیل آپریٹر ہے۔ چھوٹا ہمارے سسٹم کا وہ حصہ جو Kubernetes کلسٹر میں انسٹال کردہ ایڈ آنز کو اپ ٹو ڈیٹ رکھ سکتا ہے اور مختلف خودکار کارروائیاں کر سکتا ہے۔ اس نظام کے بارے میں مزید پڑھیں بتایا لفظی طور پر پیر کو سینٹ پیٹرزبرگ میں HighLoad++ 2019 میں - ہم جلد ہی اس رپورٹ کی ویڈیو اور ٹرانسکرپٹ شائع کریں گے۔

ہمارے پاس اس سسٹم کے باقی حصوں کو کھولنے کا منصوبہ ہے: ایڈون آپریٹر اور ہمارے ہکس اور ماڈیولز کا مجموعہ۔ ویسے ایڈون آپریٹر پہلے سے ہی ہے۔ گیتوب پر دستیاب ہے۔، لیکن اس کے لیے دستاویزات ابھی بھی راستے میں ہیں۔ ماڈیولز کے مجموعہ کی رہائی کا منصوبہ موسم گرما کے لیے بنایا گیا ہے۔

دیکھتے رہنا!

PS

ہمارے بلاگ پر بھی پڑھیں:

ماخذ: www.habr.com

نیا تبصرہ شامل کریں