زموږ په بلاګ کې لا دمخه د دې په اړه مقالې شتون لري
ولې؟
د شیل آپریټر نظر خورا ساده دی: د کوبرنیټس شیانو پیښو ته ګډون وکړئ ، او کله چې دا پیښې ترلاسه شي ، یو بهرنی برنامه پیل کړئ ، دا د پیښې په اړه معلومات چمتو کوي:
د دې اړتیا هغه وخت رامینځته شوه کله چې د کلسترونو عملیاتو په جریان کې ، کوچني کارونه څرګند شول چې موږ واقعیا په سمه توګه اتومات کول غواړو. دا ټول کوچني کارونه د ساده باش سکریپټونو په کارولو سره حل شوي، که څه هم، لکه څنګه چې تاسو پوهیږئ، دا غوره ده چې په ګولنګ کې آپریټرونه ولیکئ. په ښکاره ډول، د هر ډول کوچني کار لپاره د آپریټر په بشپړه پیمانه پراختیا کې پانګه اچونه به بې اغیزې وي.
په 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
په کلستر کې چلول
راځئ چې یو ځل بیا هک وګورو او دا ځل ولیکئ چې دا په کلستر کې کوم عملونه او د کوم شیانو سره ترسره کوي:
- د نوم ځای جوړولو پیښو کې ګډون کوي؛
- په نوم ځایونو کې یو راز رامینځته کوي پرته له هغه ځای چې دا پیل شوی.
دا معلومه شوه چې هغه پوډ چې زموږ عکس به په لاره واچول شي باید د دې کړنو ترسره کولو اجازه ولري. دا ستاسو د خپل خدمت حساب په جوړولو سره ترسره کیدی شي. اجازه باید د 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) لاندې ویشل شوی. موږ به د هر ډول پرمختیایي مرستې څخه مننه وکړو
د محرمیت پرده پورته کول، موږ به تاسو ته خبر درکړو چې شیل چلونکی دی کوچنی زموږ د سیسټم یوه برخه چې کولی شي د کوبرنیټس کلستر کې نصب شوي اضافې تازه وساتي او مختلف اتوماتیک کړنې ترسره کړي. د دې سیسټم په اړه نور ولولئ
موږ پلان لرو چې پاتې سیسټم خلاص کړو: اډون آپریټر او زموږ د هکونو او ماډلونو ټولګه. په لاره کې، اډون آپریټر لا دمخه دی
پاتې شه!
PS
زموږ په بلاګ کې هم ولولئ:
- «
د کوبرنیټس لپاره چلونکي: د دولتي غوښتنلیکونو چلولو څرنګوالی » - «
په ګولنګ کې د کبرنیټس لپاره د آپریټر لیکل » - «
د Grafana - Statusmap پینل لپاره نوی پلگ ان معرفي کول » - «
د لاګ هاؤس معرفي کول - په Kubernetes کې د لاګونو سره کار کولو لپاره د خلاصې سرچینې سیسټم » - «
موږ په رسمي ډول Dapp وړاندې کوو - د CI/CD ساتنې لپاره د DevOps یوټیلیټ ".
سرچینه: www.habr.com