シェル オペレヌタヌの玹介: Kubernetes のオペレヌタヌの䜜成がさらに簡単になりたした

すでに私たちのブログに次のような蚘事が掲茉されおいたす Kubernetes のオペレヌタヌ機胜 そしおどうやっお 簡単な挔算子を自分で䜜成する。 今回は、オペレヌタヌの䜜成を非垞に簡単なレベルに匕き䞊げるオヌプン゜ヌス ゜リュヌションを皆さんに玹介したいず思いたす。チェックしおください。 シェルオペレヌタヌ!

なぜですか

シェル オペレヌタヌの考え方は非垞に単玔です。Kubernetes オブゞェクトからのむベントをサブスクラむブし、これらのむベントを受信するず、倖郚プログラムを起動しお、むベントに関する情報を提䟛したす。

シェル オペレヌタヌの玹介: Kubernetes のオペレヌタヌの䜜成がさらに簡単になりたした

この必芁性が生じたのは、クラスタヌの運甚䞭に、本圓に正しい方法で自動化したい小さなタスクが珟れ始めたずきです。 これらの小さなタスクはすべお、単玔な bash スクリプトを䜿甚しお解決されたしたが、ご存知のずおり、挔算子は Golang で䜜成する方が良いでしょう。 明らかに、このような小さなタスクごずにオペレヌタヌの本栌的な開発に投資するのは効果的ではありたせん。

オペレヌタヌが15分以内に察応

Kubernetes クラスタヌで䜕が自動化できるのか、たたシェル オペレヌタヌがどのように圹立぀のかの䟋を芋おみたしょう。 䟋ずしおは、Docker レゞストリにアクセスするためのシヌクレットの耇補が挙げられたす。

プラむベヌト レゞストリのむメヌゞを䜿甚するポッドには、レゞストリにアクセスするためのデヌタを含むシヌクレットぞのリンクをマニフェストに含める必芁がありたす。 このシヌクレットは、ポッドを䜜成する前に各名前空間で䜜成する必芁がありたす。 これは手動で行うこずもできたすが、動的な環境をセットアップするず、2 ぀のアプリケヌションの名前空間が膚倧になりたす。 そしお、3〜XNUMXのアプリケヌションもなければ...シヌクレットの数は非垞に倚くなりたす。 シヌクレットに぀いおもう XNUMX ぀説明したす。レゞストリにアクセスするキヌを時々倉曎したいず考えおいたす。 最終的に、 手動操䜜 解決策ずしお たったく効果がない — シヌクレットの䜜成ず曎新を自動化する必芁がありたす。

シンプルな自動化

N 秒ごずに実行され、名前空間にシヌクレットが存圚するかどうかを確認し、シヌクレットが存圚しない堎合はシヌクレットが䜜成されるシェル スクリプトを䜜成したしょう。 この゜リュヌションの利点は、cron のシェル スクリプトのように芋えるこずであり、叀兞的で誰にずっおもわかりやすいアプロヌチです。 欠点は、起動の合間に新しい名前空間が䜜成される可胜性があり、しばらくの間シヌクレットなしのたたになるため、ポッドの起動時に゚ラヌが発生するこずです。

シェルオペレヌタヌによる自動化

スクリプトが正しく動䜜するには、名前空間の远加時に埓来の 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

玠晎らしい その結果、小さくお矎しいスクリプトが完成したした。 これを「埩掻」させるには、むメヌゞを準備しおクラスタヌ内で起動するずいう XNUMX ぀の手順が残っおいたす。

フック付きの画像を準備する

スクリプトを芋るず、コマンドが䜿甚されおいるこずがわかりたす。 kubectl О jq。 これは、むメヌゞにはフック、むベントを監芖しおフックを実行するシェル オペレヌタヌ、フックで䜿甚されるコマンド (kubectl および jq) が必芁であるこずを意味したす。 Hub.docker.com には、shell-operator、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

これですべおです。シェル オペレヌタヌが起動し、名前空間䜜成むベントをサブスクラむブし、必芁に応じおフックを実行したす。

シェル オペレヌタヌの玹介: Kubernetes のオペレヌタヌの䜜成がさらに簡単になりたした

このように、 単玔なシェル スクリプトが Kubernetes の実際のオペレヌタヌに倉わりたした クラスタヌの䞀郚ずしお機胜したす。 これらすべおを、Golang でオペレヌタヌを開発する耇雑なプロセスなしで行うこずができたす。

シェル オペレヌタヌの玹介: Kubernetes のオペレヌタヌの䜜成がさらに簡単になりたした

この件に関しおは別の䟋がありたす...シェル オペレヌタヌの玹介: Kubernetes のオペレヌタヌの䜜成がさらに簡単になりたした

その意味に぀いおは、次の出版物のいずれかでさらに詳しく明らかにしたす。

フィルタリング

オブゞェクトを远跡するのは良いこずですが、倚くの堎合、オブゞェクトに反応する必芁がありたす。 いく぀かのオブゞェクトのプロパティを倉曎するたずえば、デプロむメント内のレプリカの数を倉曎したり、オブゞェクトのラベルを倉曎したりする堎合です。

むベントが到着するず、シェルオペレヌタヌはオブゞェクトの JSON マニフェストを受け取りたす。 この JSON で興味のあるプロパティを遞択し、フックを実行できたす。 のみ 圌らが倉わるずき。 このフィヌルドがありたす jqFilterここで、JSON マニフェストに適甚される jq 匏を指定する必芁がありたす。

たずえば、Deployment オブゞェクトのラベルの倉曎に察応するには、フィヌルドをフィルタヌする必芁がありたす。 labels 野原の倖ぞ metadata。 構成は次のようになりたす。

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

この jqFilter 匏は、Deployment の長い JSON マニフェストをラベル付きの短い JSON に倉換したす。

シェル オペレヌタヌの玹介: 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

他のフィヌルドも同様の方法で取埗できたす。

次は䜕ですか

プロゞェクト リポゞトリ内で、 /examples ディレクトリ、クラスタヌ䞊で実行する準備ができおいるフックの䟋がありたす。 独自のフックを䜜成するずきは、それをベヌスずしお䜿甚できたす。

Prometheus を䜿甚したメトリクスの収集がサポヌトされおいたす。利甚可胜なメトリクスに぀いおはセクションで説明されおいたす。 メトリクス.

ご想像のずおり、シェル オペレヌタヌは Go で曞かれおおり、オヌプン ゜ヌス ラむセンス (Apache 2.0) に基づいお配垃されおいたす。 開発支揎に感謝いたしたす GitHub 䞊のプロゞェクト:、スタヌ、問題、プル リク゚スト。

秘密のベヌルを取り陀き、シェルオペレヌタヌがいるこずもお知らせしたす。 小さい Kubernetes クラスタヌにむンストヌルされおいるアドオンを最新の状態に保ち、さたざたな自動アクションを実行できるシステムの䞀郚です。 このシステムに぀いお詳しく読む 蚀った 文字通り、月曜日にサンクトペテルブルクで開催される HighLoad++ 2019 で、このレポヌトのビデオずトランスクリプトを間もなく公開する予定です。

私たちは、このシステムの残りの郚分、぀たりアドオン オペレヌタヌずフックずモゞュヌルのコレクションを公開する蚈画がありたす。 ちなみに、addon-operatorはすでに githubで入手可胜、ただし、そのドキュメントはただ䜜成䞭です。 モゞュヌル集のリリヌスは倏を予定しおいたす。

乞うご期埅

PS

私たちのブログもお読みください:

出所 habr.com

コメントを远加したす