Te whakauru anga-kaiwhakahaere: kua ngawari ake te hanga i nga kaiwhakahaere mo Kubernetes

Kua puta kee nga korero i runga i ta maatau blog e korero ana nga mana whakahaere i Kubernetes me pehea tuhi koe i tetahi kaiwhakahaere ngawari. I tenei wa e hiahia ana matou ki te whakaatu ki a koe i to maatau otinga Open Source, e kawe ana i te hanganga o nga kaiwhakahaere ki te taumata tino ngawari - tirohia anga-kaiwhakahaere!

He aha?

He tino ngawari te whakaaro mo te kaitoha-anga: ohauru ki nga huihuinga mai i nga taonga Kubernetes, a ka tae mai enei huihuinga, whakarewahia he kaupapa o waho, me nga korero mo te huihuinga:

Te whakauru anga-kaiwhakahaere: kua ngawari ake te hanga i nga kaiwhakahaere mo Kubernetes

Ko te hiahia mo tera i te wa e whakahaere ana nga tautau, ka tiimata nga mahi iti e tino hiahia ana matou ki te mahi aunoa i te huarahi tika. Ko enei mahi iti katoa i whakatauhia ma te whakamahi i nga tuhinga bash ngawari, ahakoa, e mohio ana koe, he pai ake te tuhi i nga kaiwhakahaere ki Golang. Ko te tikanga, ka kore e whai hua te haumi i roto i te whakawhanaketanga o te tangata whakahaere mo ia mahi iti.

Kaiwhakahaere i roto i te 15 meneti

Me titiro ki tetahi tauira o nga mea ka taea te mahi aunoa i roto i te roopu Kubernetes me te pehea e awhina ai te kaiwhakahaere anga. Ko tetahi tauira e whai ake nei: te whakahoki i tetahi mea ngaro kia uru atu ki te rehita docker.

Ko nga Pods e whakamahi ana i nga whakaahua mai i te rehita motuhake me whakauru ki roto i o raatau whakaaturanga he hononga ki tetahi mea ngaro me nga raraunga mo te uru atu ki te rehita. Me hanga tenei mea ngaro ki ia mokowāingoa i mua i te hanga pākākano. Ka taea te mahi a-ringa, engari ki te whakarite maatau i nga taiao hihiri, ka nui te waahi ingoa mo te tono kotahi. A, ki te kore e 2-3 nga tono ... ka tino nui te maha o nga mea ngaro. A ko tetahi atu mea mo nga mea ngaro: E hiahia ana ahau ki te whakarereke i te ki kia uru atu ki te rehitatanga mai i ia wa. Nāwai rā, mahi ā-ringa hei otinga tino koretake — me whakaaunoa i te hanga me te whakahou i nga mea ngaro.

aunoatanga ngawari

Me tuhi he tuhinga anga ka rere kotahi ia N hekona me te tirotiro i nga mokowā ingoa mo te noho ngaro, a ki te kore he mea ngaro, katahi ka hangaia. Ko te painga o tenei otinga ko te ahua o te tuhinga anga kei te cron - he huarahi matarohia me te maarama ki te katoa. Ko te mea kino kei roto i te waahi i waenga i ana whakarewatanga ka taea te hanga i tetahi mokowā ingoa hou mo etahi wa ka noho tonu kaore he mea ngaro, ka puta he hapa i te whakarewatanga o nga pene.

Aunoatanga me te anga-kaiwhakahaere

Kia tika te mahi o ta maatau tuhinga, me whakakapi te whakarewanga cron matarohia ki te whakarewatanga ina taapirihia he mokowāingoa: i tenei keehi, ka taea e koe te hanga mea ngaro i mua i te whakamahi. Kia kite tatou me pehea te whakatinana i tenei ma te whakamahi i te anga-kaiwhakahaere.

Tuatahi, me titiro ki te tuhinga. Ko nga tuhinga i roto i nga kupu anga-kaiwhakahaere ka kiia he matau. Ia matau ina rere me te haki --config he whakamohio atu ki te kaiwhakahaere anga mo ona herenga, ara. i runga i nga kaupapa e tika ana kia whakarewahia. I roto i to maatau ka whakamahia e matou onKubernetesEvent:

#!/bin/bash
if [[ $1 == "--config" ]] ; then
cat <<EOF
{
"onKubernetesEvent": [
  { "kind": "namespace",
    "event":["add"]
  }
]}
EOF
fi

Ka whakaahuahia i konei e hiahia ana matou ki te taapiri i nga huihuinga (add) momo momo namespace.

Inaianei me taapiri koe i te waehere ka mahia ina puta te huihuinga:

#!/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

Rawe! Ko te hua he tuhinga iti, ataahua. Hei "whakaora", e rua nga taahiraa e toe ana: te whakarite i te ahua me te whakarewa i te kohinga.

Te whakarite whakaahua me te matau

Mena ka titiro koe ki te tuhinga, ka kite koe kei te whakamahia nga whakahau kubectl и jq. Ko te tikanga me whai i te ahua nga mea e whai ake nei: to matau matau, he anga-kaiwhakahaere hei tirotiro i nga kaupapa me te whakahaere i te matau, me nga whakahau e whakamahia ana e te matau (kubectl me jq). Kei a Hub.docker.com he ahua kua oti te hanga i roto i te kootaki anga-kaiwhakahaere, kubectl me jq. Ko nga mea e toe ana ko te taapiri i tetahi matau ngawari 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

E rere ana i roto i te tautau

Ka titiro ano tatou ki te matau, ka tuhihia he aha nga mahi me nga mea e mahia ana e ia i roto i te tautau:

  1. ka ohauru ki nga huihuinga hanga mokowā ingoa;
  2. ka hanga he mea ngaro i roto i nga waahi ingoa i tua atu i te waahi ka whakarewahia.

Te ahua nei me whai mana te porowhita ka whakarewahia to maatau whakaahua ki te mahi i enei mahi. Ka taea tenei ma te hanga i to ake Pūkete Ratonga. Me mahi te whakaaetanga i roto i te ahua o ClusterRole me ClusterRoleBinding, na te mea kei te pirangi matou ki nga taonga mai i te kohinga katoa.

Ko te whakaahuatanga whakamutunga i roto i te YAML ka penei te ahua:

---
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

Ka taea e koe te whakarewa i te ahua kua whakaemihia hei Whakamahinga ngawari:

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

Mo te waatea, ka hangaia he mokowāingoa motuhake ki reira ka whakarewahia te anga-kaiwhakahaere ka whakamahia nga whakaaturanga i hangaia:

$ kubectl create ns example-monitor-namespaces
$ kubectl -n example-monitor-namespaces apply -f rbac.yaml
$ kubectl -n example-monitor-namespaces apply -f deployment.yaml

Heoi ano: ka timata te anga-kaiwhakahaere, ka ohauru ki nga kaupapa hanga mokowā ingoa ka whakahaere i te matau ina hiahiatia.

Te whakauru anga-kaiwhakahaere: kua ngawari ake te hanga i nga kaiwhakahaere mo Kubernetes

Ko te kupu, he tuhinga anga ngawari kua huri hei kaiwhakahaere pono mo Kubernetes ka mahi hei wahanga o te tautau. Na enei mea katoa kaore he mahinga uaua o te whakawhanake i nga kaiwhakahaere i Golang:

Te whakauru anga-kaiwhakahaere: kua ngawari ake te hanga i nga kaiwhakahaere mo Kubernetes

He whakaahua ano mo tenei take...Te whakauru anga-kaiwhakahaere: kua ngawari ake te hanga i nga kaiwhakahaere mo Kubernetes

Ka whakamaramahia e matou tona tikanga i roto i tetahi o nga panui e whai ake nei.

tātari

He pai te whai i nga taonga, engari he maha nga wa e hiahia ana koe ki te urupare te huri i etahi āhuatanga ahanoa, hei tauira, hei huri i te maha o nga tauira i roto i te Whakamahinga, hei huri ranei i nga tapanga ahanoa.

Ka tae mai tetahi huihuinga, ka whiwhi te kaiwhakahaere anga i te whakaaturanga JSON o te ahanoa. Ka taea e taatau te kowhiri i nga taonga e pai ana ki a maatau ki tenei JSON ka whakahaere i te matau anake ina huri ratou. He mara mo tenei jqFilter, me tohu koe i te kupu jq ka tukuna ki te whakaaturanga JSON.

Hei tauira, ki te whakautu ki nga huringa i roto i nga tapanga mo nga taonga Whakamahinga, me tātari te mara labels i waho o te mara metadata. Ka penei te whirihora:

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

Ko tenei kupu jqFilter ka huri i te whakaaturanga JSON roa a Deployment ki te JSON poto me nga tapanga:

Te whakauru anga-kaiwhakahaere: kua ngawari ake te hanga i nga kaiwhakahaere mo Kubernetes

Ko te kaiwhakahaere anga ka whakahaere noa i te matau ka huri tenei JSON poto, ka warewarehia nga huringa ki etahi atu taonga.

Te horopaki whakarewa matau

Ma te whirihora matau ka taea e koe te whakarite i nga whiringa maha mo nga huihuinga - hei tauira, e 2 nga whiringa mo nga huihuinga mai i Kubernetes me nga raarangi e 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"
]}

He rerekee iti: ae, ka tautoko te anga-kaiwhakahaere e whakahaere ana i nga tuhinga ahua crontab. Ka kitea etahi atu korero i roto tuhinga.

Hei wehewehe i te take i whakarewahia ai te matau, ka hangaia e te anga-kaiwhakahaere he konae rangitahi ka tukuna te ara ki reira ma te taurangi ki te matau. BINDING_CONTEXT_TYPE. Kei roto i te konae he whakamaarama JSON mo te take i rere ai te matau. Hei tauira, ia 10 meneti ka rere te matau me nga mea e whai ake nei:

[{ "binding": "every 10 min"}]

... a hei te Mane ka tiimata me tenei:

[{ "binding": "every 10 min"}, { "binding": "on Mondays at 12:10"}]

Ki onKubernetesEvent Ka nui ake nga kaiwhaiwhai JSON, na te mea kei roto he whakaahuatanga mo te ahanoa:

[
 {
 "binding": "onCreatePod",
 "resourceEvent": "add",
 "resourceKind": "pod",
 "resourceName": "foo",
 "resourceNamespace": "bar"
 }
]

Ko nga korero o nga mara ka taea te maarama mai i o raatau ingoa, ka panuihia etahi atu korero ki roto tuhinga. He tauira mo te tiki ingoa rauemi mai i te mara resourceName Ko te whakamahi i te jq kua whakaatuhia i roto i te matau e whakahoki ana i nga mea ngaro:

jq -r '.[0].resourceName' $BINDING_CONTEXT_PATH

Ka taea e koe te tiki atu mara i roto i te ara rite.

He aha te i muri?

I roto i te putunga kaupapa, in / tauira whaiaronga, he tauira matau kua reri ki te rere i runga i te tautau. Ka tuhi koe i au ake matau, ka taea e koe te whakamahi hei turanga.

He tautoko mo te kohi inenga ma te whakamahi i te Prometheus - ko nga inenga e waatea ana ka whakaahuahia i te waahanga METRICS.

Ka whakaaro pea koe, kua tuhia te anga-kaiwhakahaere ki te Haere ka tohatohahia i raro i te raihana Open Source (Apache 2.0). Ka mihi matou mo nga awhina whanaketanga kaupapa i GitHub: me nga whetu, me nga take, me nga tono toia.

Te hiki i te arai o te muna, ka whakamohio ano matou ki a koe ko te anga-kaiwhakahaere iti he waahanga o ta maatau punaha ka taea te whakauru i nga taapiri-ake ki roto i te roopu Kubernetes ki te waa me te mahi i nga momo mahi aunoa. Pānuihia atu mo tenei punaha korerotia mooni i te Mane i HighLoad ++ 2019 i St.

He mahere ta matou ki te whakatuwhera i te toenga o tenei punaha: te addon-operator me ta matou kohinga matau me nga waahanga. Ma te ara, kua oti kee te addon-operator e wātea ana i runga i te github, engari kei te haere tonu nga tuhinga mo taua mea. Ko te tukunga o te kohinga o nga waahanga kua whakaritea mo te raumati.

Kia ora!

PS

Pānuihia hoki i runga i ta maatau blog:

Source: will.com

Tāpiri i te kōrero