Shell-оператормен таныстыру: Kubernetes үшін операторларды жасау оңайырақ болды

Бұл туралы біздің блогымызда мақалалар болды Kubernetes-тегі оператордың мүмкіндіктері және қалай қарапайым операторды өзіңіз жазыңыз. Бұл жолы біз сіздердің назарларыңызға операторларды құруды өте оңай деңгейге жеткізетін Open Source шешімін ұсынғымыз келеді - тексеріңіз қабық операторы!

Неліктен?

Қабық операторының идеясы өте қарапайым: Kubernetes нысандарынан оқиғаларға жазылыңыз және бұл оқиғалар алынған кезде, оқиға туралы ақпаратпен қамтамасыз ететін сыртқы бағдарламаны іске қосыңыз:

Shell-оператормен таныстыру: Kubernetes үшін операторларды жасау оңайырақ болды

Оның қажеттілігі кластерлердің жұмысы кезінде біз шынымен дұрыс жолмен автоматтандыруды қалайтын шағын тапсырмалар пайда бола бастағанда пайда болды. Барлық осы шағын тапсырмалар қарапайым bash сценарийлері арқылы шешілді, дегенмен, сіз білетіндей, Голанг тілінде операторларды жазған дұрыс. Әрбір осындай шағын тапсырма үшін операторды толық ауқымды дамытуға инвестициялау тиімсіз болатыны анық.

Оператор 15 минутта

Kubernetes кластерінде нені автоматтандыруға болатынын және қабық операторы қалай көмектесетінін мысалға қарастырайық. Мысал келесідей болуы мүмкін: докер тізіліміне кіру үшін құпияны қайталау.

Жеке тізілімдегі кескіндерді пайдаланатын тұсқағаздар манифестінде тізілімге кіруге арналған деректері бар құпияға сілтеме болуы керек. Бұл құпияны подкасттарды жасамас бұрын әрбір аттар кеңістігінде жасау керек. Мұны қолмен жасауға болады, бірақ егер біз динамикалық орталарды орнатсақ, онда бір қолданбаның аттар кеңістігі көп болады. Ал егер де 2-3 қолданба болмаса... құпиялардың саны өте көп болады. Құпиялар туралы тағы бір нәрсе: тізілімге кіру кілтін мезгіл-мезгіл өзгерткім келеді. Ақырында, қол операциялары шешім ретінде мүлдем тиімсіз — құпияларды жасау мен жаңартуды автоматтандыруымыз керек.

Қарапайым автоматтандыру

N секунд сайын бір рет жұмыс істейтін және аттар кеңістігінде құпияның бар-жоғын тексеретін қабық сценарийін жазайық, егер құпия болмаса, онда ол жасалады. Бұл шешімнің артықшылығы, ол cron-дағы қабық сценарийіне ұқсайды - классикалық және барлығына түсінікті тәсіл. Кемшілігі - оның іске қосылуы арасындағы аралықта жаңа аттар кеңістігі жасалуы мүмкін және ол біраз уақыт құпиясыз қалады, бұл подкасттарды іске қосу кезінде қателерге әкеледі.

Shell-оператормен автоматтандыру

Сценарий дұрыс жұмыс істеуі үшін классикалық cron іске қосуды аттар кеңістігі қосылған кезде іске қосумен ауыстыру қажет: бұл жағдайда оны пайдаланбас бұрын құпияны жасауға болады. Мұны shell-оператор арқылы қалай жүзеге асыруға болатынын көрейік.

Алдымен сценарийді қарастырайық. Қабық-оператор терминдеріндегі сценарийлер ілгектер деп аталады. Әрбір ілмек жалаушамен жүгіргенде --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 сайтында shell-оператор, 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. іске қосылғаннан басқа аттар кеңістігінде құпияны жасайды.

Біздің кескініміз іске қосылатын бөлімде бұл әрекеттерді орындауға рұқсаттар болуы керек. Мұны жеке ServiceAccount жасау арқылы жасауға болады. Рұқсат 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

Барлығы: қабық операторы іске қосылады, аттар кеңістігін жасау оқиғаларына жазылады және қажет болған кезде ілмекті іске қосады.

Shell-оператормен таныстыру: Kubernetes үшін операторларды жасау оңайырақ болды

Осылайша, қарапайым қабық сценарийі Kubernetes үшін нақты операторға айналды және кластердің бөлігі ретінде жұмыс істейді. Мұның бәрі Голангта операторларды дамытудың күрделі процесінсіз:

Shell-оператормен таныстыру: Kubernetes үшін операторларды жасау оңайырақ болды

Бұл мәселеде тағы бір мысал бар ...Shell-оператормен таныстыру: Kubernetes үшін операторларды жасау оңайырақ болды

Оның мәнін келесі басылымдардың бірінде толығырақ ашамыз.

сүзу

Нысандарды қадағалау жақсы, бірақ жиі әрекет ету қажеттілігі туындайды кейбір объект қасиеттерін өзгерту, мысалы, Орналастырудағы көшірмелердің санын өзгерту немесе нысан белгілерін өзгерту үшін.

Оқиға келгенде, қабық операторы нысанның JSON манифестін алады. Біз осы JSON ішінде бізді қызықтыратын сипаттарды таңдап, ілгекті іске қоса аламыз тек олар өзгерген кезде. Бұл үшін алаң бар jqFilter, мұнда JSON манифестіне қолданылатын jq өрнегін көрсету қажет.

Мысалы, Орналастыру нысандарына арналған белгілердегі өзгерістерге жауап беру үшін өрісті сүзу қажет labels даладан тыс metadata. Конфигурация келесідей болады:

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

Бұл jqFilter өрнегі Deployment ұзын JSON манифестін белгілермен қысқа JSON-ға айналдырады:

Shell-оператормен таныстыру: Kubernetes үшін операторларды жасау оңайырақ болды

shell-operator осы қысқа JSON өзгерген кезде ғана ілмекті іске қосады және басқа сипаттардағы өзгерістер еленбейді.

Ілмекті іске қосу контекст

Ілмек конфигурациясы оқиғалардың бірнеше опциясын көрсетуге мүмкіндік береді - мысалы, Kubernetes оқиғаларының 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"
]}

Кішкентай шегініс: иә, қабық операторы қолдайды crontab стиліндегі сценарийлерді іске қосу. Толығырақ ақпаратты мына жерден табуға болады құжаттама.

Ілмектің неліктен іске қосылғанын анықтау үшін қабық операторы уақытша файлды жасайды және оған жолды ілмекке айнымалы мәнде береді. 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 көмегімен көрсеткіштерді жинауға қолдау бар - қол жетімді көрсеткіштер бөлімде сипатталған METRICS.

Сіз болжағандай, shell-оператор Go бағдарламасында жазылған және Open Source лицензиясы (Apache 2.0) бойынша таратылады. Біз дамудың кез келген көмегіне риза боламыз GitHub-тағы жоба: және жұлдыздар, мәселелер және сұраулар.

Құпиялылық пердесін алып, біз сізге снаряд операторы екенін де хабарлаймыз небольшая Kubernetes кластерінде орнатылған қондырмаларды жаңартып, әртүрлі автоматты әрекеттерді орындай алатын жүйеміздің бөлігі. Бұл жүйе туралы толығырақ оқыңыз деді дүйсенбі күні Санкт-Петербургтегі HighLoad++ 2019 бағдарламасында – біз жақын арада осы есептің бейнежазбасын және стенограммасын жариялаймыз.

Бізде осы жүйенің қалған бөлігін ашу жоспары бар: addon-operator және біздің ілгектер мен модульдер жинағы. Айтпақшы, addon-оператор қазірдің өзінде github сайтында қол жетімді, бірақ оған арналған құжаттама әлі де жолда. Модульдер топтамасын шығару жазға жоспарланған.

Бізбен бірге қалыңыз!

PS

Біздің блогта да оқыңыз:

Ақпарат көзі: www.habr.com

пікір қалдыру