Ewebata onye na-arụ ọrụ shei: imepụta ndị ọrụ maka Kubernetes ka dị mfe

Enweelarị akụkọ na blọgụ anyị na-ekwu maka ya ike onye ọrụ na Kubernetes na kedu ka dee onye ọrụ dị mfe n'onwe gị. Oge a, anyị ga-achọ igosi gị ihe ngwọta Open Source anyị, nke na-ewepụta ndị na-arụ ọrụ na ọkwa dị mfe - lelee. shei-arụ ọrụ!

Ntak-a?

Echiche nke onye na-arụ ọrụ shei dị nnọọ mfe: denye aha na ihe omume sitere na ihe Kubernetes, ma mgbe a nabatara ihe omume ndị a, malite mmemme mpụga, na-enye ya ozi gbasara ihe omume ahụ:

Ewebata onye na-arụ ọrụ shei: imepụta ndị ọrụ maka Kubernetes ka dị mfe

Mkpa ya bilitere mgbe, n'oge arụ ọrụ nke ụyọkọ, obere ọrụ malitere ịpụta na anyị chọrọ n'ezie ịmegharị n'ụzọ ziri ezi. A na-edozi obere ọrụ ndị a niile site na iji ederede bash dị mfe, ọ bụ ezie na, dịka ị maara, ọ ka mma ide ndị ọrụ na Golang. N'ụzọ doro anya, itinye ego na mmepe zuru oke nke onye na-arụ ọrụ maka obere ọrụ ọ bụla agaghị adị irè.

Onye ọrụ na 15 nkeji

Ka anyị leba anya n'ihe atụ nke ihe enwere ike ịmegharị ya na ụyọkọ Kubernetes yana otu onye ọrụ shei nwere ike isi nyere aka. Otu ihe atụ ga-abụ nke a: ịmegharị ihe nzuzo iji nweta ndekọ docker.

Pọd ndị na-eji onyonyo sitere na ndekọ nkeonwe ga-enwerịrị njikọ nzuzo nke nwere data maka ịnweta ndekọ n'ime ngosipụta ha. A ghaghị ịmepụta ihe nzuzo a na oghere aha ọ bụla tupu ịmepụta pods. Enwere ike iji aka mee nke a, ma ọ bụrụ na anyị edozie gburugburu ebe dị ike, mgbe ahụ, aha aha maka otu ngwa ga-aghọ ọtụtụ. Ma ọ bụrụ na enwekwaghị ngwa 2-3 ... ọnụ ọgụgụ nke nzuzo na-aghọ nke ukwuu. Na otu ihe ọzọ gbasara ihe nzuzo: Ọ ga-amasị m ịgbanwe igodo iji nweta ndekọ site n'oge ruo n'oge. N'ikpeazụ, ọrụ ntuziaka dị ka ihe ngwọta kpamkpam adịghị arụ ọrụ — anyị kwesịrị akpaaka e kere eke na emelite nke nzuzo.

Mfe akpaaka

Ka anyị dee script shei nke na-agba ọsọ otu ugboro n'otu sekọnd n'otu nkeji ma lelee oghere aha maka ọnụnọ nke nzuzo, ma ọ bụrụ na ọ nweghị ihe nzuzo, mgbe ahụ a na-emepụta ya. Uru nke ngwọta a bụ na ọ dị ka ihe odide shei na cron - usoro kpochapụwo na nke kwere nghọta nye onye ọ bụla. Ihe dị ala bụ na n'etiti oge n'etiti mmalite ya enwere ike ịmepụta aha ọhụrụ na ruo oge ụfọdụ ọ ga-anọgide na-enweghị ihe nzuzo, nke ga-eduga ná njehie na ịmepụta pods.

Akpaaka na onye na-arụ ọrụ shei

Ka edemede anyị rụọ ọrụ nke ọma, ọ dị mkpa ka edochie mmalite cron kpochapụwo na mmalite mgbe agbakwunyere oghere aha: na nke a, ị nwere ike ịmepụta ihe nzuzo tupu iji ya. Ka anyị hụ otu esi emejuputa nke a site na iji shell-operator.

Mbụ, ka anyị leba anya n'ihe odide ahụ. A na-akpọ script n'ụdị shei-operator nko. Nko ọ bụla mgbe ejiri ọkọlọtọ na-agba ọsọ --config na-agwa onye na-arụ ọrụ shei gbasara njikọ ya, ya bụ. na ihe omume ọ kwesịrị ịmalite. N'ọnọdụ anyị, anyị ga-eji onKubernetesEvent:

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

A kọwara ya ebe a na anyị nwere mmasị ịgbakwunye ihe omume (add) ihe ụdị namespace.

Ugbu a ịkwesịrị ịgbakwunye koodu nke a ga-eme mgbe ihe omume ahụ mere:

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

Nnukwu! Ihe si na ya pụta bụ obere edemede mara mma. Iji "ịtụte" ya, e nwere nzọụkwụ abụọ fọdụrụ: dozie ihe oyiyi ahụ wee malite ya na ụyọkọ ahụ.

Iji nko na-akwado onyonyo

Ọ bụrụ n’ilele n’edemede ahụ, ị ​​ga-ahụ na ejiri iwu ndị ahụ kubectl и jq. Nke a pụtara na ihe oyiyi ahụ ga-enwerịrị ihe ndị a: nko anyị, onye na-arụ ọrụ shei nke ga-enyocha ihe omume ma na-agba ọsọ nko, na iwu eji nko (kubectl na jq). Hub.docker.com enweela onyonyo emebere nke ọma nke etinyere onye ọrụ shell, kubectl na jq. Naanị ihe fọdụrụ bụ ịgbakwunye nko dị mfe 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

Na-agba ọsọ na ụyọkọ

Ka anyị leba anya nko ọzọ ma oge a dee ihe omume na ihe ọ na-eme na ụyọkọ ahụ:

  1. debanyere aha na namespace okike ihe;
  2. na-emepụta ihe nzuzo na oghere aha ndị ọzọ na-abụghị nke ebe a na-ewepụta ya.

Ọ tụgharịrị na pọd ebe a ga-ewepụta onyonyo anyị ga-enwerịrị ikike ime omume ndị a. Enwere ike ime nke a site na ịmepụta akaụntụ Service nke gị. Ekwesịrị ime ikike ahụ n'ụdị ClusterRole na ClusterRoleBinding, n'ihi na anyị nwere mmasị na ihe sitere na ụyọkọ dum.

Nkọwa ikpeazụ na YAML ga-adị ka nke a:

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

Ị nwere ike ịmalite foto a gbakọtara dị ka ntinye dị mfe:

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

Maka ịdị mma, a na-emepụta oghere aha dị iche ebe a ga-ewepụta onye na-arụ ọrụ shei na a ga-etinye ihe ngosi ndị mepụtara:

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

Nke ahụ bụ ihe niile: onye na-arụ ọrụ shei ga-amalite, denye aha na mmemme okike aha ma mee nko mgbe achọrọ ya.

Ewebata onye na-arụ ọrụ shei: imepụta ndị ọrụ maka Kubernetes ka dị mfe

N'ihi ya, Ederede shei dị mfe tụgharịrị bụrụ ezigbo onye ọrụ maka Kubernetes ma na-arụ ọrụ dịka akụkụ nke ụyọkọ. Na ihe a niile na-enweghị usoro mgbagwoju anya nke ndị na-emepe emepe na Golang:

Ewebata onye na-arụ ọrụ shei: imepụta ndị ọrụ maka Kubernetes ka dị mfe

Onwere ihe atụ ọzọ gbasara okwu a...Ewebata onye na-arụ ọrụ shei: imepụta ndị ọrụ maka Kubernetes ka dị mfe

Anyị ga-ekpughe ihe ọ pụtara n'ụzọ zuru ezu n'otu n'ime akwụkwọ ndị a.

Nzacha

Nchọgharị ihe dị mma, mana a na-enwekarị mkpa imeghachi omume na-agbanwe ụfọdụ ihe onwunwe, ọmụmaatụ, ịgbanwe ọnụ ọgụgụ nke oyiri na Deployment ma ọ bụ ịgbanwe ihe akara.

Mgbe mmemme rutere, onye na-arụ ọrụ shei na-enweta ngosipụta JSON nke ihe ahụ. Anyị nwere ike họrọ akụrụngwa masịrị anyị na JSON a wee mee nko naanị mgbe ha na-agbanwe. Enwere ubi maka nke a jqFilter, ebe ịkwesịrị ịkọwapụta okwu jq nke a ga-etinye na ngosipụta JSON.

Dịka ọmụmaatụ, iji meghachi omume na mgbanwe na labelụ maka ihe Nkwanye, ị ga-enyocha mpaghara ahụ labels pụọ n'ọhịa metadata. Nhazi ga-adị ka nke a:

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

Okwu jqFilter a na-atụgharị ngosipụta ogologo JSON nke Deployment ka ọ bụrụ JSON dị nkenke nwere akara:

Ewebata onye na-arụ ọrụ shei: imepụta ndị ọrụ maka Kubernetes ka dị mfe

Shell-operator ga-agba nko mgbe obere JSON a gbanwere, a ga-eleghara mgbanwe nke akụrụngwa ndị ọzọ anya.

Ọnọdụ mmalite nko

Nhazi nko na-enye gị ohere ịkọwapụta ọtụtụ nhọrọ maka ihe omume - dịka ọmụmaatụ, nhọrọ abụọ maka mmemme sitere na Kubernetes na nhazi 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"
]}

Obere digression: ee, shell-operator na-akwado na-agba ọsọ scripts style crontab. Enwere ike ịchọta nkọwa ndị ọzọ na akwụkwọ.

Iji mara ihe kpatara eji malite nko ahụ, onye na-arụ ọrụ shei na-emepụta faịlụ nwa oge wee gafee ụzọ ya na mgbanwe na nko. BINDING_CONTEXT_TYPE. Faịlụ ahụ nwere nkọwa JSON maka ihe kpatara eji agba nko. Dịka ọmụmaatụ, nkeji 10 ọ bụla nko ga-eji ọdịnaya ndị a na-agba ọsọ:

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

... na Monday ọ ga-amalite na nke a:

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

Iji onKubernetesEvent A ga-enwekwu JSON na-akpalite, n'ihi na o nwere nkọwa nke ihe ahụ:

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

Enwere ike ịghọta ihe dị n'ime ubi ahụ site na aha ha, enwere ike ịgụta nkọwa ndị ọzọ na akwụkwọ. Ihe atụ nke ịnweta aha akụrụngwa site na ubi resourceName iji jq egosilarị na nko na-emegharị ihe nzuzo:

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

Ị nwere ike nweta ubi ndị ọzọ n'otu aka ahụ.

Kedu ihe ọzọ?

N'ebe nchekwa ọrụ, na / ihe atụ directories, enwere ihe atụ nke nko ndị dị njikere ịgba ọsọ na ụyọkọ. Mgbe ị na-ede nko nke gị, ị nwere ike iji ha mee ihe ndabere.

Enwere nkwado maka ịnakọta metrics site na iji Prometheus - metrics dị na-akọwara na ngalaba METRỌ.

Dịka ị nwere ike iche, a na-ede onye na-arụ ọrụ shei na Go wee kesaa ya n'okpuru ikikere Open Source (Apache 2.0). Anyị ga-enwe ekele maka enyemaka mmepe ọ bụla oru ngo na GitHub: na kpakpando, na mbipụta, na sere arịrịọ.

Na-ebuli mkpuchi nke nzuzo, anyị ga-agwakwa gị na onye ọrụ shell bụ obere akụkụ nke sistemu anyị nwere ike idowe tinye-ons na ụyọkọ Kubernetes ruo ugbu a ma mee omume akpaka dị iche iche. Gụkwuo maka usoro a gwara n'ụzọ nkịtị na Mọnde na HighLoad ++ 2019 na St. Petersburg - n'oge na-adịghị anyị ga-ebipụta vidiyo na transcript nke akụkọ a.

Anyị nwere atụmatụ imeghe usoro ndị ọzọ: adon-operator na nchịkọta nko na modul anyị. Site n'ụzọ, addon-operator adịlarị dị na github, ma akwụkwọ maka ya ka na-aga n'ụzọ. A na-eme atụmatụ ntọhapụ nke nchịkọta modulu maka oge okpomọkụ.

Nọrọ na-ekiri!

PS

Gụọkwa na blọọgụ anyị:

isi: www.habr.com

Tinye a comment