Ngawanohkeun cangkang-operator: nyieun operator pikeun Kubernetes ngan meunang gampang

Tos aya tulisan dina blog urang nyarioskeun kamampuhan operator di Kubernetes jeung kumaha nulis operator basajan sorangan. Kali ieu kami hoyong nampilkeun ka perhatian Anjeun solusi Open Source kami, nu nyandak kreasi operator ka tingkat super-gampang - pariksa kaluar cangkang-operator!

Kunaon?

Gagasan operator cangkang cukup saderhana: ngalanggan acara tina objék Kubernetes, sareng nalika acara ieu ditampi, ngajalankeun program éksternal, nyayogikeun inpormasi ngeunaan acara éta:

Ngawanohkeun cangkang-operator: nyieun operator pikeun Kubernetes ngan meunang gampang

Kabutuhan pikeun éta timbul nalika, nalika operasi klaster, tugas-tugas leutik mimiti muncul yén urang leres-leres hoyong ngajadikeun otomatis dina jalan anu leres. Sadaya pancén leutik ieu direngsekeun nganggo skrip bash saderhana, sanaos, sakumaha anjeun terang, langkung saé nyerat operator di Golang. Jelas, investasi dina ngembangkeun skala pinuh hiji operator pikeun tiap tugas leutik misalna bakal jadi teu epektip.

Operator dina 15 menit

Hayu urang tingali conto naon anu tiasa otomatis dina klaster Kubernetes sareng kumaha operator cangkang tiasa ngabantosan. Hiji conto bakal kieu: réplikasi rusiah pikeun ngakses pendaptaran docker.

Pods anu ngagunakeun gambar ti pendaptaran swasta kedah ngandung dina manifest maranéhanana tumbu ka rusiah jeung data pikeun ngakses pendaptaran. Rahasia ieu kudu dijieun dina unggal ngaranspasi saméméh nyieun pods. Ieu tiasa dilakukeun sacara manual, tapi upami urang nyetél lingkungan dinamis, maka rohangan ngaran pikeun hiji aplikasi bakal janten seueur. Sareng upami aya ogé henteu 2-3 aplikasi ... jumlah Rahasia janten ageung pisan. Sareng hiji deui ngeunaan rusiah: Abdi hoyong ngarobih konci pikeun ngakses pendaptaran ti waktos ka waktos. antukna, operasi manual salaku solusi sagemblengna teu epektip - urang kedah ngajadikeun otomatis nyiptakeun sareng ngapdet rusiah.

automation basajan

Hayu urang nulis skrip cangkang anu dijalankeun sakali unggal N detik sarta pariksa spasi ngaran pikeun ayana rusiah, sarta lamun euweuh rusiah, mangka dijieun. Kauntungannana leyuran ieu nya éta kasampak kawas skrip cangkang dina cron - pendekatan Palasik jeung kaharti ka dulur. The downside nyaeta dina interval antara peluncuran na bisa dijieun ngaranspasi anyar jeung pikeun sawatara waktu eta bakal tetep tanpa rusiah, nu bakal ngakibatkeun kasalahan dina launching pods.

Automation kalawan cangkang-operator

Pikeun skrip urang tiasa dianggo leres, peluncuran cron klasik kedah diganti ku peluncuran nalika ngaranspasi ditambah: dina hal ieu, anjeun tiasa nyiptakeun rusiah sateuacan dianggo. Hayu urang tingali kumaha nerapkeun ieu nganggo cangkang-operator.

Kahiji, hayu urang nempo naskah. Skrip dina istilah cangkang-operator disebut hook. Unggal hook lamun ngajalankeun kalawan bandéra --config informs cangkang-operator ngeunaan bindings na, i.e. dina acara naon eta kudu dibuka. Dina hal urang urang bakal ngagunakeun onKubernetesEvent:

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

Dijelaskeun di dieu yén kami resep nambihan acara (add) objék tina tipe namespace.

Ayeuna anjeun kedah nambihan kode anu bakal dieksekusi nalika kajadian lumangsung:

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

Hebat! hasilna éta leutik, naskah geulis. Pikeun "nyegerkeun" éta, aya dua léngkah anu tinggaleun: nyiapkeun gambar sareng ngaluncurkeunana dina kluster.

Nyiapkeun hiji gambar kalawan hook a

Upami anjeun ningali naskah, anjeun tiasa ningali yén paréntahna dianggo kubectl и jq. Ieu ngandung harti yén gambar kudu boga hal di handap: hook kami, cangkang-operator anu bakal ngawas acara tur ngajalankeun hook, sarta paréntah dipaké ku hook (kubectl na jq). Hub.docker.com parantos gaduh gambar siap-siap dimana shell-operator, kubectl sareng jq dibungkus. Kabéh anu tetep nyaéta pikeun nambahkeun hook basajan 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

Ngajalankeun dina klaster

Hayu urang tingali hook deui sareng waktos ieu nyerat tindakan naon sareng naon anu dilakukeun dina kluster:

  1. ngalanggan acara penciptaan namespace;
  2. nyiptakeun rusiah dina spasi ngaran lian ti hiji tempat eta dibuka.

Tétéla yén pod dimana gambar urang bakal diluncurkeun kedah gaduh idin pikeun ngalakukeun tindakan ieu. Ieu bisa dilakukeun ku nyieun ServiceAccount anjeun sorangan. Idin kedah dilakukeun dina bentuk ClusterRole sareng ClusterRoleBinding, sabab kami museurkeun objék tina sakabéh klaster.

Katerangan ahir dina YAML bakal katingali sapertos kieu:

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

Anjeun tiasa ngajalankeun gambar dirakit salaku deployment basajan:

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

Pikeun genah, rohangan ngaran anu misah didamel dimana operator cangkang bakal diluncurkeun sareng manifes anu diciptakeun bakal diterapkeun:

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

Éta sadayana: operator cangkang bakal ngamimitian, ngalanggan acara penciptaan namespace sareng ngajalankeun hook nalika diperyogikeun.

Ngawanohkeun cangkang-operator: nyieun operator pikeun Kubernetes ngan meunang gampang

Ku kituna, Aksara cangkang basajan robah jadi operator nyata pikeun Kubernetes tur dianggo salaku bagian tina klaster. Sareng sadaya ieu tanpa prosés kompléks ngembangkeun operator di Golang:

Ngawanohkeun cangkang-operator: nyieun operator pikeun Kubernetes ngan meunang gampang

Aya ilustrasi sejen dina hal ieu ...Ngawanohkeun cangkang-operator: nyieun operator pikeun Kubernetes ngan meunang gampang

Kami bakal ngungkabkeun maknana sacara langkung rinci dina salah sahiji publikasi di handap ieu.

nyaring

Nyukcruk objék téh alus, tapi aya mindeng kudu meta pikeun ngarobah sababaraha sipat objék, contona, pikeun ngarobah jumlah réplika dina Deployment atawa ngarobah labél objék.

Nalika hiji acara datang, cangkang-operator narima JSON manifest obyék. Urang tiasa milih sipat anu dipikaresep ku urang dina JSON ieu sareng ngajalankeun hook ngan nalika maranéhna robah. Aya sawah pikeun ieu jqFilter, dimana anjeun kudu nangtukeun ekspresi jq nu bakal dilarapkeun ka JSON manifest.

Contona, pikeun ngabales parobahan dina labél pikeun objék Deployment, Anjeun kudu nyaring sawah labels kaluar lapangan metadata. Konfigurasi bakal sapertos kieu:

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

Ekspresi jqFilter ieu ngarobah manifest JSON panjang Deployment kana JSON pondok sareng labél:

Ngawanohkeun cangkang-operator: nyieun operator pikeun Kubernetes ngan meunang gampang

cangkang-operator ngan bakal ngajalankeun hook nalika JSON pondok ieu robah, sarta parobahan sipat séjén bakal dipaliré.

Kontéks peluncuran Hook

Konfigurasi hook ngamungkinkeun anjeun pikeun nangtukeun sababaraha pilihan pikeun acara - contona, 2 pilihan pikeun acara ti Kubernetes sareng 2 jadwal:

{"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"
]}

A digression leutik: nuhun, cangkang-operator ngarojong ngajalankeun skrip gaya crontab. Langkung rinci tiasa dipendakan dina dokuméntasi.

Pikeun ngabedakeun naha hook diluncurkeun, cangkang-operator nyiptakeun file samentawis sareng ngalangkungan jalur éta dina variabel ka hook. BINDING_CONTEXT_TYPE. file ngandung pedaran JSON sahiji alesan pikeun ngajalankeun hook nu. Contona, unggal 10 menit hook bakal ngajalankeun kalawan eusi handap:

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

... sareng dina Senén éta bakal dimimitian ku ieu:

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

keur onKubernetesEvent Bakal aya deui pemicu JSON, sabab eta ngandung pedaran obyék:

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

Eusi sawah tiasa kahartos tina namina, sareng langkung rinci tiasa dibaca dokuméntasi. Conto meunangkeun ngaran sumberdaya ti sawah resourceName ngagunakeun jq geus ditémbongkeun dina hook nu ngayakeun réplikasi Rahasia:

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

Anjeun tiasa kéngingkeun widang anu sanés dina cara anu sami.

Naon saterusna?

Dina gudang proyék, di / conto diréktori, Aya conto kait anu siap dijalankeun dina klaster. Nalika nyerat kait anjeun nyalira, anjeun tiasa dianggo salaku dasar.

Aya dukungan pikeun ngumpulkeun métrik nganggo Prometheus - métrik anu sayogi dijelaskeun dina bagian éta METRIK.

Sakumaha anjeun panginten, operator cangkang ditulis dina Go sareng disebarkeun dina lisénsi Open Source (Apache 2.0). Kami bakal nganuhunkeun pikeun sagala bantuan pangwangunan proyék on GitHub: jeung béntang, jeung masalah, sarta requests narik.

Ngangkat jilbab tina rasiah, kami ogé bakal ngawartosan yén cangkang-operator téh leutik bagian tina sistem urang nu bisa tetep add-on dipasang dina klaster Kubernetes up to date jeung ngalakukeun sagala rupa aksi otomatis. Baca leuwih seueur tentang sistem ieu ngawartosan sacara harfiah dina Senén di HighLoad ++ 2019 di St.

Simkuring boga rencana pikeun muka nepi sesa sistem ieu: addon-operator sarta kumpulan kami hook na modul. Ku jalan kitu, addon-operator geus sadia dina GitHub, tapi dokuméntasi pikeun éta masih di jalan. Pelepasan kumpulan modul direncanakeun pikeun usum panas.

Tetep di dieu!

PS

Baca ogé dina blog urang:

sumber: www.habr.com

Tambahkeun komentar