د شیل آپریټر معرفي کول: د کوبرنیټس لپاره آپریټرونه رامینځته کول خورا اسانه شوي

زموږ په بلاګ کې لا دمخه د دې په اړه مقالې شتون لري په 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 لا دمخه یو چمتو شوی عکس لري په کوم کې چې شیل آپریټر، کیوبیکل او 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 منشور کې به پلي شي.

د مثال په توګه، د ځای پرځای کولو شیانو لپاره لیبلونو کې بدلونونو ته ځواب ویلو لپاره، تاسو اړتیا لرئ چې ساحه فلټر کړئ 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

تاسو کولی شئ په ورته ډول نورې ساحې ترلاسه کړئ.

څه راتلونکو؟

د پروژې په ذخیره کې، په /د لارښودونو مثالونه، د هکونو مثالونه شتون لري چې په کلستر کې د چلولو لپاره چمتو دي. کله چې خپل هکونه ولیکئ ، تاسو کولی شئ دوی د اساس په توګه وکاروئ.

د Prometheus په کارولو سره د میټریکونو راټولولو لپاره ملاتړ شتون لري - موجود میټریکونه په برخه کې تشریح شوي مايټرېکس.

لکه څنګه چې تاسو اټکل کولی شئ، د شیل آپریټر په Go کې لیکل شوی او د خلاصې سرچینې جواز (Apache 2.0) لاندې ویشل شوی. موږ به د هر ډول پرمختیایي مرستې څخه مننه وکړو په GitHub کې پروژه: او ستوري، او مسلې، او غوښتنې غوښتنې.

د محرمیت پرده پورته کول، موږ به تاسو ته خبر درکړو چې شیل چلونکی دی کوچنی زموږ د سیسټم یوه برخه چې کولی شي د کوبرنیټس کلستر کې نصب شوي اضافې تازه وساتي او مختلف اتوماتیک کړنې ترسره کړي. د دې سیسټم په اړه نور ولولئ وویل په حقیقت کې د دوشنبې په ورځ په سینټ پیټرزبرګ کې HighLoad++ 2019 کې - موږ به ډیر ژر د دې راپور ویډیو او لیږد خپور کړو.

موږ پلان لرو چې پاتې سیسټم خلاص کړو: اډون آپریټر او زموږ د هکونو او ماډلونو ټولګه. په لاره کې، اډون آپریټر لا دمخه دی په GitHub کې شتون لري، مګر د دې لپاره اسناد لاهم په لاره کې دي. د ماډلونو راټولول د اوړي لپاره پلان شوي.

پاتې شه!

PS

زموږ په بلاګ کې هم ولولئ:

سرچینه: www.habr.com

Add a comment