በብሎጋችን ላይ ስለ የሚያወሩ ጽሑፎች ቀድሞውኑ ነበሩ።
ለምን?
የሼል ኦፕሬተር ሀሳብ በጣም ቀላል ነው-ከኩበርኔትስ ዕቃዎች ለክስተቶች ይመዝገቡ ፣ እና እነዚህ ክስተቶች ሲደርሱ ስለ ዝግጅቱ መረጃ በመስጠት የውጭ ፕሮግራምን ያስጀምሩ-
ክላስተር በሚሠራበት ጊዜ፣ በትክክል በትክክለኛው መንገድ አውቶማቲክ ለማድረግ የምንፈልግ ትናንሽ ሥራዎች መታየት ሲጀምሩ የፍላጎቱ ጉዳይ ተነስቷል። እነዚህ ሁሉ ትናንሽ ተግባራት ቀላል ባሽ ስክሪፕቶችን በመጠቀም ተፈትተዋል, ምንም እንኳን እርስዎ እንደሚያውቁት በጎልአንግ ውስጥ ኦፕሬተሮችን መጻፍ የተሻለ ነው. በግልጽ ለማየት እንደሚቻለው ለእያንዳንዱ እንደዚህ ዓይነት አነስተኛ ተግባር ኦፕሬተርን ሙሉ በሙሉ ለማዳበር ኢንቨስት ማድረግ ውጤታማ አይሆንም።
በ 15 ደቂቃዎች ውስጥ ኦፕሬተር
በኩበርኔትስ ክላስተር ውስጥ ምን በራስ-ሰር ሊሰራ እንደሚችል እና ሼል-ኦፕሬተር እንዴት እንደሚረዳ ምሳሌ እንመልከት። ምሳሌ የሚከተለው ሊሆን ይችላል፡ ወደ ዶከር መዝገብ ቤት ለመድረስ ሚስጥርን ማባዛት።
ከግል መዝገብ ቤት የሚመጡ ምስሎችን የሚጠቀሙ ፖዶች በመግለጫቸው ውስጥ መዝገቡን ለመድረስ ከውሂብ ጋር የሚስጥር አገናኝ መያዝ አለባቸው። ፖድ ከመፈጠሩ በፊት ይህ ሚስጥር በእያንዳንዱ የስም ቦታ መፈጠር አለበት። ይህ በእጅ ሊከናወን ይችላል ፣ ግን ተለዋዋጭ አካባቢዎችን ካዘጋጀን ፣ የአንድ መተግበሪያ የስም ቦታ ብዙ ይሆናል። እና ደግሞ 2-3 መተግበሪያዎች ከሌሉ ... የምስጢር ብዛት በጣም ትልቅ ይሆናል. እና ስለ ምስጢሮች አንድ ተጨማሪ ነገር: ከጊዜ ወደ ጊዜ መዝገቡን ለመድረስ ቁልፉን መለወጥ እፈልጋለሁ. በመጨረሻ፣ በእጅ የሚሰሩ ስራዎች እንደ መፍትሄ ሙሉ በሙሉ ውጤታማ ያልሆነ - ምስጢሮችን መፍጠር እና ማዘመንን በራስ-ሰር ማድረግ አለብን።
ቀላል አውቶማቲክ
በየ N ሴኮንድ አንድ ጊዜ የሚሰራ የሼል ስክሪፕት እንፃፍ እና የምስጢር መኖሩን የስም ቦታዎችን እንፈትሽ እና ሚስጥር ከሌለ ተፈጠረ። የዚህ መፍትሔ ጠቀሜታ በ cron ውስጥ የሼል ስክሪፕት ይመስላል - ለሁሉም ሰው የተለመደ እና ለመረዳት የሚቻል አቀራረብ። ጉዳቱ በአስጀማሪው መካከል ባለው የጊዜ ክፍተት ውስጥ አዲስ የስም ቦታ ሊፈጠር ይችላል እና ለተወሰነ ጊዜ ያለ ምስጢር ይቆያል ፣ ይህም ፖድዎችን በማስጀመር ላይ ወደ ስህተቶች ይመራል።
ከሼል-ኦፕሬተር ጋር አውቶማቲክ
የእኛ ስክሪፕት በትክክል እንዲሰራ ክላሲክ ክሮን ማስጀመሪያ የስም ቦታ ሲታከል በማስጀመሪያ መተካት ያስፈልጋል፡ በዚህ አጋጣሚ ከመጠቀምዎ በፊት ሚስጥር መፍጠር ይችላሉ። ሼል-ኦፕሬተርን በመጠቀም ይህንን እንዴት ተግባራዊ ማድረግ እንደሚቻል እንይ.
በመጀመሪያ, ስክሪፕቱን እንይ. በሼል-ኦፕሬተር ውስጥ ያሉ ስክሪፕቶች መንጠቆዎች ይባላሉ። ባንዲራ ይዞ ሲሮጥ እያንዳንዱ መንጠቆ --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
በክላስተር ውስጥ መሮጥ
መንጠቆውን እንደገና እንመልከተው እና በዚህ ጊዜ በክላስተር ውስጥ ምን አይነት ድርጊቶችን እና በምን አይነት ነገሮች እንደሚሰራ ጻፍ፡-
- ለስም ቦታ ፈጠራ ክስተቶች ተመዝግቧል;
- ከተነሳበት ቦታ ውጭ በስም ቦታዎች ላይ ምስጢር ይፈጥራል።
ምስላችን የሚነሳበት ፖድ እነዚህን ድርጊቶች ለማድረግ ፈቃድ ሊኖረው ይገባል ። ይህ የራስዎን የአገልግሎት መለያ በመፍጠር ሊከናወን ይችላል። ፈቃዱ በ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
ያ ብቻ ነው፡ ሼል-ኦፕሬተር ይጀምራል፣ ለስም ቦታ ፈጠራ ክስተቶች ይመዝገቡ እና አስፈላጊ ሆኖ ሲገኝ መንጠቆውን ያስኬዳል።
በመሆኑም, ቀላል የሼል ስክሪፕት ለኩበርኔትስ ወደ እውነተኛ ኦፕሬተርነት ተቀይሯል። እና እንደ ክላስተር አካል ሆኖ ይሰራል። እና ይህ ሁሉ በጎላንግ ውስጥ ኦፕሬተሮችን የማዳበር ውስብስብ ሂደት ከሌለው-
በዚህ ጉዳይ ላይ ሌላ ምሳሌ አለ ...
ከሚከተሉት ህትመቶች በአንዱ ትርጉሙን በበለጠ ዝርዝር እንገልፃለን።
ማጣራት
ነገሮችን መከታተል ጥሩ ነው, ነገር ግን ብዙውን ጊዜ ምላሽ የመስጠት ፍላጎት አለ አንዳንድ የነገር ባህሪያትን መለወጥለምሳሌ በ Deployment ውስጥ የተባዙትን ቁጥር ለመቀየር ወይም የነገር መለያዎችን ለመቀየር።
አንድ ክስተት ሲመጣ፣ ሼል-ኦፕሬተሩ የነገሩን JSON መግለጫ ይቀበላል። በዚህ JSON ላይ የሚስቡንን ንብረቶች መርጠን መንጠቆውን ማስኬድ እንችላለን ብቻ ሲቀየሩ. ለዚህ የሚሆን መስክ አለ jqFilter
በJSON ዝርዝር መግለጫ ላይ የሚተገበር የ jq አገላለጽ መግለጽ የሚያስፈልግህበት ቦታ።
ለምሳሌ፣ ለ Deployment ነገሮች መለያዎች ለውጦች ምላሽ ለመስጠት መስኩን ማጣራት ያስፈልግዎታል labels
ከሜዳ ውጪ metadata
. ቅንብሩ እንደዚህ ይሆናል
cat <<EOF
{
"onKubernetesEvent": [
{ "kind": "deployment",
"event":["update"],
"jqFilter": ".metadata.labels"
}
]}
EOF
ይህ jqFilter አገላለጽ የማሰማራትን ረጅም JSON አንጸባራቂ ወደ አጭር JSON ከመለያዎች ጋር ይቀይረዋል፡-
shell-operator መንጠቆውን የሚያስኬደው ይህ አጭር JSON ሲቀየር ብቻ ነው፣ እና በሌሎች ንብረቶች ላይ የሚደረጉ ለውጦች ችላ ይባላሉ።
መንጠቆ ማስጀመሪያ አውድ
የ መንጠቆ ውቅሩ ለክስተቶች ብዙ አማራጮችን እንዲገልጹ ይፈቅድልዎታል - ለምሳሌ ፣ 2 አማራጮች ከ Kubernetes እና 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
ሌሎች መስኮችን በተመሳሳይ መንገድ ማግኘት ይችላሉ።
ቀጥሎ ምንድነው?
በፕሮጀክት ማከማቻ ውስጥ፣ በ
ፕሮሜቲየስን በመጠቀም መለኪያዎችን ለመሰብሰብ ድጋፍ አለ - የሚገኙት መለኪያዎች በክፍሉ ውስጥ ተገልጸዋል
እርስዎ እንደሚገምቱት፣ ሼል-ኦፕሬተሩ በ Go ውስጥ ተጽፎ በክፍት ምንጭ ፈቃድ (Apache 2.0) ስር ተሰራጭቷል። ለማንኛውም የልማት እርዳታ አመስጋኞች እንሆናለን።
የምስጢር መጋረጃን በማንሳት ሼል-ኦፕሬተር መሆኑን እናሳውቅዎታለን ትንሽ የስርዓታችን አካል በ Kubernetes ክላስተር ውስጥ የተጫኑ ተጨማሪዎችን ማቆየት እና የተለያዩ አውቶማቲክ ድርጊቶችን ማከናወን የሚችል። ስለዚህ ስርዓት የበለጠ ያንብቡ
የቀረውን የዚህ ስርዓት ለመክፈት እቅድ አለን። በነገራችን ላይ, addon-operator አስቀድሞ ነው
ተጠንቀቁ!
PS
በብሎጋችን ላይ ያንብቡ፡-
- «
ኦፕሬተሮች ለ Kubernetes: ሁኔታዊ መተግበሪያዎችን እንዴት ማሄድ እንደሚቻል "; - «
በጎላንግ ውስጥ ለኩበርኔትስ ኦፕሬተር እንጽፋለን። "; - «
ለ Grafana - Statusmap panel አዲስ ፕለጊን በማስተዋወቅ ላይ "; - «
Loghouseን በማስተዋወቅ ላይ - በ Kubernetes ውስጥ ከሎግ ጋር ለመስራት ክፍት ምንጭ ስርዓት "; - «
ዳፕን በይፋ አቅርበናል - የ DevOps መገልገያ ለCI/ሲዲ ጥገና ».
ምንጭ: hab.com