ሼል-ኦፕሬተርን ማስተዋወቅ፡ ለኩበርኔትስ ኦፕሬተሮችን መፍጠር ቀላል ሆነ

በብሎጋችን ላይ ስለ የሚያወሩ ጽሑፎች ቀድሞውኑ ነበሩ። በ Kubernetes ውስጥ የኦፕሬተር ችሎታዎች እና እንዴት ቀላል ኦፕሬተርን እራስዎ ይፃፉ. በዚህ ጊዜ የኦፕሬተሮችን መፍጠር ወደ እጅግ በጣም ቀላል ደረጃ የሚወስደውን የኛን ክፍት ምንጭ መፍትሄ ለእርስዎ ልናቀርብልዎ እንፈልጋለን - ይመልከቱ ሼል-ኦፕሬተር!

ለምን?

የሼል ኦፕሬተር ሀሳብ በጣም ቀላል ነው-ከኩበርኔትስ ዕቃዎች ለክስተቶች ይመዝገቡ ፣ እና እነዚህ ክስተቶች ሲደርሱ ስለ ዝግጅቱ መረጃ በመስጠት የውጭ ፕሮግራምን ያስጀምሩ-

ሼል-ኦፕሬተርን ማስተዋወቅ፡ ለኩበርኔትስ ኦፕሬተሮችን መፍጠር ቀላል ሆነ

ክላስተር በሚሠራበት ጊዜ፣ በትክክል በትክክለኛው መንገድ አውቶማቲክ ለማድረግ የምንፈልግ ትናንሽ ሥራዎች መታየት ሲጀምሩ የፍላጎቱ ጉዳይ ተነስቷል። እነዚህ ሁሉ ትናንሽ ተግባራት ቀላል ባሽ ስክሪፕቶችን በመጠቀም ተፈትተዋል, ምንም እንኳን እርስዎ እንደሚያውቁት በጎልአንግ ውስጥ ኦፕሬተሮችን መጻፍ የተሻለ ነው. በግልጽ ለማየት እንደሚቻለው ለእያንዳንዱ እንደዚህ ዓይነት አነስተኛ ተግባር ኦፕሬተርን ሙሉ በሙሉ ለማዳበር ኢንቨስት ማድረግ ውጤታማ አይሆንም።

በ 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

በክላስተር ውስጥ መሮጥ

መንጠቆውን እንደገና እንመልከተው እና በዚህ ጊዜ በክላስተር ውስጥ ምን አይነት ድርጊቶችን እና በምን አይነት ነገሮች እንደሚሰራ ጻፍ፡-

  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

ያ ብቻ ነው፡ ሼል-ኦፕሬተር ይጀምራል፣ ለስም ቦታ ፈጠራ ክስተቶች ይመዝገቡ እና አስፈላጊ ሆኖ ሲገኝ መንጠቆውን ያስኬዳል።

ሼል-ኦፕሬተርን ማስተዋወቅ፡ ለኩበርኔትስ ኦፕሬተሮችን መፍጠር ቀላል ሆነ

በመሆኑም, ቀላል የሼል ስክሪፕት ለኩበርኔትስ ወደ እውነተኛ ኦፕሬተርነት ተቀይሯል። እና እንደ ክላስተር አካል ሆኖ ይሰራል። እና ይህ ሁሉ በጎላንግ ውስጥ ኦፕሬተሮችን የማዳበር ውስብስብ ሂደት ከሌለው-

ሼል-ኦፕሬተርን ማስተዋወቅ፡ ለኩበርኔትስ ኦፕሬተሮችን መፍጠር ቀላል ሆነ

በዚህ ጉዳይ ላይ ሌላ ምሳሌ አለ ...ሼል-ኦፕሬተርን ማስተዋወቅ፡ ለኩበርኔትስ ኦፕሬተሮችን መፍጠር ቀላል ሆነ

ከሚከተሉት ህትመቶች በአንዱ ትርጉሙን በበለጠ ዝርዝር እንገልፃለን።

ማጣራት

ነገሮችን መከታተል ጥሩ ነው, ነገር ግን ብዙውን ጊዜ ምላሽ የመስጠት ፍላጎት አለ አንዳንድ የነገር ባህሪያትን መለወጥለምሳሌ በ 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) ስር ተሰራጭቷል። ለማንኛውም የልማት እርዳታ አመስጋኞች እንሆናለን። በ GitHub ላይ ፕሮጀክት: እና ኮከቦች፣ እና ጉዳዮች፣ እና ጥያቄዎችን ይጎትቱ።

የምስጢር መጋረጃን በማንሳት ሼል-ኦፕሬተር መሆኑን እናሳውቅዎታለን ትንሽ የስርዓታችን አካል በ Kubernetes ክላስተር ውስጥ የተጫኑ ተጨማሪዎችን ማቆየት እና የተለያዩ አውቶማቲክ ድርጊቶችን ማከናወን የሚችል። ስለዚህ ስርዓት የበለጠ ያንብቡ ተነገረው በሴንት ፒተርስበርግ ውስጥ በሃይሎድ++ 2019 ሰኞ ላይ - የዚህን ዘገባ ቪዲዮ እና ግልባጭ በቅርቡ እናተምታለን።

የቀረውን የዚህ ስርዓት ለመክፈት እቅድ አለን። በነገራችን ላይ, addon-operator አስቀድሞ ነው በ github ላይ ይገኛል።፣ ግን ለእሱ ያለው ሰነድ አሁንም በመንገድ ላይ ነው። የሞጁሎች ስብስብ መለቀቅ በበጋው ወቅት የታቀደ ነው.

ተጠንቀቁ!

PS

በብሎጋችን ላይ ያንብቡ፡-

ምንጭ: hab.com

አስተያየት ያክሉ