شيل آپريٽر جو تعارف: ڪبرنيٽس لاءِ آپريٽر ٺاهڻ بلڪل آسان ٿي ويو آهي

اسان جي بلاگ تي اڳ ۾ ئي مضمون ٿي چڪا آهن بابت ڳالهائڻ 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 وٽ اڳ ۾ ئي هڪ تيار ٿيل تصوير آهي جنهن ۾ شيل آپريٽر، kubectl ۽ jq پيڪيج ٿيل آهن. باقي رهي ٿو هڪ سادي ٿلهو شامل ڪرڻ 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. نالي جي جڳهن ۾ هڪ راز ٺاهي ٿو ان کان سواءِ جتي اهو لانچ ڪيو ويو آهي.

اهو ظاهر ٿئي ٿو ته پوڊ جنهن ۾ اسان جي تصوير کي لانچ ڪيو ويندو انهن عملن کي ڪرڻ جي اجازت هوندي. اهو توهان جي پنهنجي سروس اڪائونٽ ٺاهڻ سان ڪري سگهجي ٿو. اجازت ClusterRole ۽ ClusterRoleBinding جي صورت ۾ ٿيڻ گهرجي، ڇاڪاڻ ته اسان کي پوري ڪلستر جي شين ۾ دلچسپي آهي.

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 منشور تي لاڳو ٿيندي.

مثال طور، Deployment objects جي ليبلز ۾ تبديلين جو جواب ڏيڻ لاءِ، توھان کي فيلڊ کي فلٽر ڪرڻ جي ضرورت آھي labels ميدان کان ٻاهر metadata. ترتيب هن طرح هوندي:

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

هي jqFilter ايڪسپريشن ڊيپلائيمينٽ جي ڊگھي JSON ظاهر کي مختصر JSON ۾ ليبل سان تبديل ڪري ٿو:

شيل آپريٽر جو تعارف: ڪبرنيٽس لاءِ آپريٽر ٺاهڻ بلڪل آسان ٿي ويو آهي

شيل-آپريٽر صرف ٿلهو هلائيندو جڏهن هي مختصر 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 Directories، ٿلهن جا مثال آهن جيڪي ڪلستر تي هلڻ لاءِ تيار آهن. جڏهن پنهنجا پنهنجا ٿلها لکندا، توهان انهن کي بنياد طور استعمال ڪري سگهو ٿا.

Prometheus استعمال ڪندي ميٽرڪ گڏ ڪرڻ لاءِ سپورٽ موجود آهي - دستياب ميٽرڪس سيڪشن ۾ بيان ڪيل آهن ميٽرڪ.

جئين توهان اندازو لڳائي سگهو ٿا، شيل آپريٽر Go ۾ لکيل آهي ۽ هڪ اوپن سورس لائسنس (Apache 2.0) جي تحت ورهايو ويو آهي. اسان ڪنهن به ترقياتي مدد لاء شڪرگذار ٿينداسين GitHub تي پروجيڪٽ: and stars, and problems, and pull requests.

رازداري جو پردو کڻڻ، اسان توهان کي به خبر ڏينداسين ته شيل آپريٽر آهي ننڍو اسان جي سسٽم جو حصو جيڪو ڪبرنيٽس ڪلسٽر ۾ انسٽال ٿيل ايڊ آنز کي اپڊيٽ رکي سگھي ٿو ۽ مختلف خودڪار ڪارناما انجام ڏئي سگھي ٿو. هن نظام جي باري ۾ وڌيڪ پڙهو ٻڌايو لفظي طور تي سومر تي HighLoad++ 2019 سينٽ پيٽرسبرگ ۾ - اسان جلد ئي هن رپورٽ جي وڊيو ۽ ٽرانسڪرپٽ شايع ڪنداسين.

اسان وٽ ھڪڙو منصوبو آھي ھن سسٽم جي باقي کي کولڻ لاءِ: ايڊون آپريٽر ۽ اسان جو مجموعو ٿلهو ۽ ماڊلز. رستي جي ذريعي، addon-operator اڳ ۾ ئي آهي GitHub تي دستياب آهي، پر ان لاءِ دستاويز اڃا تائين رستي تي آهي. اونهاري لاء ماڊلز جي گڏ ڪرڻ جي رٿابندي ڪئي وئي آهي.

ڏند رهو!

پي ايس

اسان جي بلاگ تي پڻ پڙهو:

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

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