Kubernetes の拡匵ず補足 (抂芁ずビデオ レポヌト)

Kubernetes の拡匵ず補足 (抂芁ずビデオ レポヌト)

8月XNUMX日のカンファレンスにお 聖ハむロヌド++ 2019「DevOps ず運甚」セクションの䞀郚ずしお、「Kubernetes の拡匵ず補完」レポヌトが提䟛され、その䜜成には Flant 瀟の埓業員 XNUMX 名が参加したした。 その䞭で、Kubernetes の機胜を拡匵しお補完したいず考えおいたものの、既成の簡単な゜リュヌションが芋぀からなかった倚くの状況に぀いお話しおいたす。 私たちはオヌプン゜ヌス プロゞェクトの圢で必芁な゜リュヌションを持っおおり、この講挔もそれらに捧げられおいたす。

䌝統に埓っお、私たちは喜んでご玹介したす レポヌトのビデオ (50 分、蚘事よりもはるかに有益) ずテキスト圢匏の䞻芁な芁玄。 行く

K8s のコアず远加機胜

Kubernetes は、業界ず長幎確立されおきた管理のアプロヌチを倉えおいたす。

  • 圌に感謝したす 抜象化では、構成のセットアップやコマンド (Chef、Ansible など) の実行などの抂念を䜿甚しお運甚するのではなく、コンテナヌやサヌビスなどのグルヌプ化を䜿甚したす。
  • ニュアンスを考えずに申請曞を䜜成できたす。 特定のサむト、ベアメタル、プロバむダヌのいずれかのクラりドなどで起動されたす。
  • K8s を䜿甚するず、か぀おないほどアクセスしやすくなりたす ベストプラクティス むンフラストラクチャの組織化に぀いお: スケヌリング技術、自己修埩、耐障害性など。

ただし、もちろん、すべおがそれほどスムヌズに進んだわけではありたせん。Kubernetes には、独自の新たな課題ももたらしたした。

Kubernetes ノヌ 党おのナヌザヌの悩みを解決するコンバむンです。 コア Kubernetes は、Kubernetes に存圚する最小限必芁な機胜のセットのみを担圓したす。 それぞれ 集たる

Kubernetes の拡匵ず補足 (抂芁ずビデオ レポヌト)

Kubernetes コアは、コンテナヌのグルヌプ化、トラフィックの管理などのための基本的なプリミティブ セットを定矩したす。 それらに぀いお詳しくは、 2幎前のレポヌト.

Kubernetes の拡匵ず補足 (抂芁ずビデオ レポヌト)

䞀方で、K8s は利甚可胜な機胜を拡匵する玠晎らしい機䌚を提䟛し、他の機胜を閉じるのに圹立ちたす。 特定の — ナヌザヌのニヌズ。 Kubernetes ぞの远加はクラスタヌ管理者の責任であり、[特定の問題を解決するために] クラスタヌを「適切な状態」にするために必芁なものすべおをむンストヌルしお構成する必芁がありたす。 これらはどのような远加ですか? いく぀かの䟋を芋おみたしょう。

アドオンの䟋

Kubernetes をむンストヌルするず、ノヌド内およびノヌ​​ド間のポッドの盞互䜜甚に非垞に必芁なネットワヌクが単独では機胜しないこずに驚くかもしれたせん。 Kubernetes カヌネルは必芁な接続を保蚌するのではなく、ネットワヌクを決定したす。 ОМтерфейс (CNI) サヌドパヌティのアドオンの堎合。 ネットワヌク構成を担圓するこれらのアドオンのいずれかをむンストヌルする必芁がありたす。

Kubernetes の拡匵ず補足 (抂芁ずビデオ レポヌト)

近い䟋は、デヌタ ストレヌゞ ゜リュヌション (ロヌカル ディスク、ネットワヌク ブロック デバむス、Ceph...) です。 圓初、圌らはコアにいたが、出珟ずずもに CSI 状況は、すでに説明したのず同様の状況に倉化したす。぀たり、むンタヌフェヌスは Kubernetes にあり、その実装はサヌドパヌティのモゞュヌルにありたす。

他の䟋ずしおは次のようなものがありたす。

  • 進入-コントロヌラヌ (圌らのレビュヌを参照しおください) 私たちの最近の蚘事).
  • 蚌明曞マネヌゞャヌ:

    Kubernetes の拡匵ず補足 (抂芁ずビデオ レポヌト)

  • 挔算子 これはアドオンのクラス党䜓 (前述の cert-manager を含む) であり、プリミティブずコントロヌラヌを定矩したす。 これらの䜜業ロゞックは私たちの想像力によっおのみ制限され、既補のむンフラストラクチャ コンポヌネント (DBMS など) をプリミティブに倉換するこずができたす。これにより、(䞀連のコンテナヌずその蚭定を䜿甚するよりも) はるかに簡単に䜜業できたす。 膚倧な数のオペレヌタヌが䜜成されおいたす。たずえその倚くがただ実皌働の準備ができおいないずしおも、それは時間の問題です。

    Kubernetes の拡匵ず補足 (抂芁ずビデオ レポヌト)

  • メトリクス - Kubernetes がむンタヌフェむス (メトリクス API) を実装 (Prometheus アダプタヌ、Datadog クラスタヌ ゚ヌゞェントなどのサヌドパヌティ アドオンなど) からどのように分離したかを瀺す別の図。
  • のために 監芖ず統蚈、実際に必芁なだけでなく、 プロメテりスずグラファナだけでなく、kube-state-metrics、node-exporter なども含たれたす。

そしお、これは远加機胜の完党なリストではありたせん...たずえば、珟圚私たちが蚭眮しおいるFlant瀟では 29 個のアドオン (これらはすべお、合蚈 249 個の Kubernetes オブゞェクトを䜜成したす)。 簡単に蚀えば、远加を行わなければクラスタヌの寿呜を確認するこずはできたせん。

オヌトメヌション

Operator は、私たちが毎日遭遇する日垞的な操䜜を自動化するように蚭蚈されおいたす。 挔算子を䜜成するこずが優れた解決策ずなる実際の䟋を次に瀺したす。

  1. アプリケヌションのむメヌゞを含むプラむベヌト (ログむンが必芁な) レゞストリがありたす。 各ポッドには、レゞストリでの認蚌を可胜にする特別なシヌクレットが割り圓おられおいるず想定されたす。 私たちのタスクは、ポッドがむメヌゞをダりンロヌドできるように、このシヌクレットが名前空間で確実に芋぀かるようにするこずです。 倚数のアプリケヌション (それぞれにシヌクレットが必芁) が存圚する可胜性があり、シヌクレット自䜓を定期的に曎新するず䟿利なので、シヌクレットを手動でレむアりトするオプションが䞍芁になりたす。 ここでオペレヌタヌが助けになりたす。名前空間が衚瀺されるのを埅ち、このむベントに基づいおシヌクレットを名前空間に远加するコントロヌラヌを䜜成したす。
  2. デフォルトでは、ポッドからむンタヌネットぞのアクセスは犁止されおいたす。 しかし、堎合によっおはそれが必芁になる堎合もありたす。たずえば、名前空間に特定のラベルが存圚するなど、特定のスキルを必芁ずせずに、アクセス蚱可メカニズムが簡単に機胜するこずが論理的です。 ここでオペレヌタヌはどのようにサポヌトしおくれるでしょうか? ラベルが名前空間に衚瀺されるのを埅機し、むンタヌネット アクセスに適切なポリシヌを远加するコントロヌラヌが䜜成されたす。
  3. 同様の状況: 特定の機胜を远加する必芁があるずしたす。 汚れ、同様のラベル䜕らかの接頭蟞が付いおいるがある堎合。 オペレヌタヌのアクションは明らかです...

どのクラスタヌでも、日垞的なタスクを解決する必芁があり、 正しく これは挔算子を䜿甚しお実行できたす。

説明されたすべおの話を芁玄するず、次のような結論に達したした。 Kubernetes での快適な䜜業に必芁な:A) アドオンをむンストヌルする、b オペレヌタヌを開発する (日垞の管理タスクを解決するため)。

Kubernetes のステヌトメントを䜜成するにはどうすればよいですか?

䞀般に、スキヌムは単玔です。

Kubernetes の拡匵ず補足 (抂芁ずビデオ レポヌト)

...しかし、その埌、次のこずが刀明したした。

  • Kubernetes API はかなり簡単ではなく、習埗するのに倚くの時間がかかりたす。
  • プログラミングも䞇人向けではありたせん (Go 蚀語が優先蚀語ずしお遞ばれたのは、Go 蚀語には特別なフレヌムワヌクがあるためです。 オペレヌタヌSDK);
  • 状況はフレヌムワヌク自䜓でも同様です。

ボトムラむン コントロヌラヌを曞く オペレヌタはしなければなりたせん 倚倧なリ゜ヌスを費やす 教材を勉匷するために。 これは、「倧芏暡な」オペレヌタ、たずえば MySQL DBMS の堎合には正圓化されたす。 しかし、䞊で説明した䟋 (シヌクレットの展開、むンタヌネットぞのポッドぞのアクセスなど) を芚えおいれば、これも正しく実行したいず考えおいたすが、費やされる劎力が珟圚必芁な結果を䞊回るこずが理解できるでしょう。

Kubernetes の拡匵ず補足 (抂芁ずビデオ レポヌト)

䞀般に、ゞレンマが生じたす。倧量のリ゜ヌスを費やしおステヌトメントを䜜成するための適切なツヌルを芋぀けるか、それずも昔ながらの方法 (ただし迅速に) を行うかです。 それを解決するために、これらの䞡極端の間の劥協点を芋぀けるために、私たちは独自のプロゞェクトを䜜成したした。 シェルオペレヌタヌ (圌の 最近の発衚 ハブ䞊).

シェルオペレヌタヌ

圌はどのように働いおいたすか? クラスタヌには、シェル挔算子を備えた Go バむナリを含むポッドがありたす。 圌の隣には次のセットがありたす。 フック (詳现に぀いおは、以䞋を参照しおください)。 シェルオペレヌタヌ自䜓は特定のものをサブスクラむブしたす 進展 Kubernetes API では、これが発生するず、察応するフックが起動されたす。

シェルオペレヌタヌはどのむベントでどのフックを呌び出すべきかをどのようにしお知るのでしょうか? この情報はフック自䜓によっおシェルオペレヌタヌに送信され、フックはそれを非垞に簡単に実行したす。

フックは、単䞀の匕数を受け入れる Bash スクリプトたたはその他の実行可胜ファむルです。 --config JSON で応答したす。 埌者は、どのオブゞェクトが察象ずなるか、および (これらのオブゞェクトの) どのむベントに応答する必芁があるかを決定したす。

Kubernetes の拡匵ず補足 (抂芁ずビデオ レポヌト)

私たちの䟋の XNUMX ぀である、アプリケヌション むメヌゞを䜿甚しおプラむベヌト レゞストリにアクセスするためのシヌクレットの分解のシェル オペレヌタヌでの実装を説明したす。 それは XNUMX ぀の段階で構成されたす。

ç·Žç¿’: 1. フックを曞く

たずフック内で凊理したす --configこれは、名前空間、特にその䜜成の瞬間に興味があるこずを瀺しおいたす。

[[ $1 == "--config" ]] ; then
  cat << EOF
{
  "onKubernetesEvent": [
    {
      "kind": "namespace",
      "event": ["add"]
    }
  ]
}
EOF



ロゞックはどのようになるでしょうか? こちらも非垞にシンプルです:



else
  createdNamespace=$(jq -r '.[0].resourceName' $BINDING_CONTEXT_PATH)
  kubectl create -n ${createdNamespace} -f - << EOF
Kind: Secret
...
EOF
fi

最初のステップは、どの名前空間が䜜成されたかを調べるこずであり、XNUMX 番目のステップは、次のコマンドを䜿甚しお名前空間を䜜成するこずです。 kubectl この名前空間の秘密。

ç·Žç¿’: 2. 画像を組み立おる

残っおいるのは、䜜成したフックをシェルオペレヌタヌに枡すこずだけです。これを行うにはどうすればよいでしょうか? シェル オペレヌタヌ自䜓は Docker むメヌゞずしお提䟛されるため、私たちのタスクは、このむメヌゞ内の特別なディレクトリにフックを远加するこずです。

FROM flant/shell-operator:v1.0.0-beta.1
ADD my-handler.sh /hooks

残っおいるのは、それを組み立おおプッシュするこずだけです。

$ docker build -t registry.example.com/my-operator:v1 .
$ docker push registry.example.com/my-operator:v1

最埌の仕䞊げは、むメヌゞをクラスタヌにデプロむするこずです。 これを行うには、次のように曞きたしょう 展開:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: my-operator
spec:
  template:
    spec:
      containers:
      - name: my-operator
        image: registry.example.com/my-operator:v1 # 1
      serviceAccountName: my-operator              # 2

泚意すべき点は次の XNUMX ぀です。

  1. 新しく䜜成されたむメヌゞの衚瀺。
  2. これは、Kubernetes でむベントをサブスクラむブし、名前空間にシヌクレットを割り圓おる暩限が (少なくずも) 必芁なシステム コンポヌネントであるため、フック甚の ServiceAccount (およびルヌルのセット) を䜜成したす。

結果 - 問題は解決したした 芪戚に Kubernetes の堎合、シヌクレットを分解するためのオペレヌタヌを䜜成する方法で。

その他のシェル オペレヌタヌ機胜

フックが動䜜する遞択したタむプのオブゞェクトを制限するには、 それらはフィルタリングできたす、特定のラベルに埓っお遞択たたは䜿甚 matchExpressions):

"onKubernetesEvent": [
  {
    "selector": {
      "matchLabels": {
        "foo": "bar",
       },
       "matchExpressions": [
         {
           "key": "allow",
           "operation": "In",
           "values": ["wan", "warehouse"],
         },
       ],
     }
     

  }
]

提䟛された 重耇排陀メカニズムこれにより、jq フィルタヌを䜿甚しお、倧きな JSON オブゞェクトを小さな JSON オブゞェクトに倉換できたす。倉曎を監芖したいパラメヌタヌのみが残りたす。

フックが呌び出されるず、シェルオペレヌタヌはフックを枡したす。 オブゞェクトデヌタ、あらゆるニヌズに察応できたす。

フックをトリガヌするむベントは Kubernetes むベントに限定されたせん。シェル オペレヌタヌは次のサポヌトを提䟛したす。 時間によるフックの呌び出し (埓来のスケゞュヌラの crontab に䌌おいたす)、および特別なむベント 始めるずき。 これらすべおのむベントを組み合わせお、同じフックに割り圓おるこずができたす。

そしお、シェル オペレヌタヌにはさらに XNUMX ぀の機胜がありたす。

  1. できたす 非同期的に。 Kubernetes むベント (オブゞェクトの䜜成など) が受信されたため、他のむベント (同じオブゞェクトの削陀など) がクラスタヌ内で発生した可胜性があり、フックはこれを考慮する必芁がありたす。 フックが゚ラヌで実行された堎合、デフォルトでは次のようになりたす。 想起 正垞に完了するたで (この動䜜は倉曎可胜です)。
  2. 茞出する メトリクス Prometheus の堎合、シェル オペレヌタヌが動䜜しおいるかどうかを把握でき、各フックの゚ラヌ数ず珟圚のキュヌ サむズを確認できたす。

レポヌトのこの郚分を芁玄するず、次のようになりたす。

Kubernetes の拡匵ず補足 (抂芁ずビデオ レポヌト)

アドオンのむンストヌル

Kubernetes で快適に䜜業するためには、アドオンをむンストヌルする必芁性に぀いおも蚀及されたした。 圓瀟が珟圚どのように取り組んでいるかを䟋に挙げお説明したす。

私たちはいく぀かのクラスタヌを䜿甚しお Kubernetes の䜿甚を開始したしたが、それに远加されたのは Ingress だけでした。 クラスタヌごずに異なる方法でむンストヌルする必芁があり、ベアメタル、AWS などのさたざたな環境に合わせおいく぀かの YAML 構成を䜜成したした。

クラスタヌが増えるず、構成も増えたす。 さらに、これらの構成自䜓を改善した結果、かなり異質なものになりたした。

Kubernetes の拡匵ず補足 (抂芁ずビデオ レポヌト)

すべおを敎理するために、スクリプト (install-ingress.sh) は、デプロむ先のクラスタヌのタむプを匕数ずしお受け取り、必芁な YAML 構成を生成し、それを Kubernetes にロヌルアりトしたす。

぀たり、私たちのさらなる道筋ずそれに関連する掚論は次のずおりです。

  • YAML 構成を操䜜するには、テンプレヌト ゚ンゞンが必芁です (最初の段階では、これは単玔な sed です)。
  • クラスタヌの数が増加するに぀れお、自動曎新の必芁性が生じたした (最も初期の解決策は、スクリプトを Git に眮き、cron を䜿甚しお曎新しお実行するこずでした)。
  • Prometheus にも同様のスクリプトが必芁でした (install-prometheus.sh) ただし、より倚くの入力デヌタずそのストレヌゞ (良い意味で䞀元化されクラスタヌ内) が必芁であり、䞀郚のデヌタ (パスワヌド) は自動的に生成される可胜性があるずいう事実で泚目に倀したす。

    Kubernetes の拡匵ず補足 (抂芁ずビデオ レポヌト)

  • 増え続けるクラスタヌに䜕か問題が展開されるリスクは垞に増倧しおいるため、むンストヌラヌが (぀たり、Ingress ず Prometheus 甚の XNUMX ぀のスクリプト) ステヌゞングが必芁でした (Git 内のいく぀かのブランチ、察応する安定クラスタヌたたはテストクラスタヌでそれらを曎新するためのいく぀かの cron)。
  • с kubectl apply 宣蚀的ではなく、オブゞェクトの䜜成のみが可胜で、そのステヌタスの決定やオブゞェクトの削陀はできないため、操䜜が難しくなりたした。
  • 圓時たったく実装しおいなかったいく぀かの機胜が欠けおいたした。
    • クラスタヌの曎新結果を完党に制埡したす。
    • クラスタヌから取埗できるデヌタに基づいおいく぀かのパラメヌタヌ (むンストヌル スクリプトの入力) を自動的に決定 (怜出)、
    • 継続的な発芋の圢での論理的展開。

私たちは、この蓄積された経隓をすべお他のプロゞェクトの枠組み内で実装したした。 アドオンオペレヌタヌ.

アドオンオペレヌタヌ

これは、すでに述べたシェル挔算子に基づいおいたす。 システム党䜓は次のようになりたす。

以䞋がシェル挔算子のフックに远加されたす。

  • 䟡倀芳のストレヌゞ,
  • ヘルムチャヌト,
  • コンポヌネント 倀ストアを監芖したす そしお、倉曎があった堎合には、Helm にチャヌトを再ロヌルするよう䟝頌したす。

Kubernetes の拡匵ず補足 (抂芁ずビデオ レポヌト)

したがっお、Kubernetes のむベントに反応しおフックを起動し、このフックからストレヌゞに倉曎を加えるこずができ、その埌、チャヌトが再ダりンロヌドされたす。 結果ずしお埗られる図では、フックのセットずチャヌトを XNUMX ぀のコンポヌネントに分離したす。これを モゞュヌル:

Kubernetes の拡匵ず補足 (抂芁ずビデオ レポヌト)

倚くのモゞュヌルが存圚する可胜性があり、それらにグロヌバル フック、グロヌバル倀ストア、およびこのグロヌバル ストアを監芖するコンポヌネントを远加したす。

これで、Kubernetes で䜕かが発生したずきに、グロヌバル フックを䜿甚しおそれに反応し、グロヌバル ストア内の䜕かを倉曎できたす。 この倉曎は認識され、クラスタヌ内のすべおのモゞュヌルがロヌルアりトされたす。

Kubernetes の拡匵ず補足 (抂芁ずビデオ レポヌト)

このスキヌムは、䞊蚘で説明したアドオンをむンストヌルするための芁件をすべお満たしおいたす。

  • Helm はテンプレヌト化ず宣蚀性を担圓したす。
  • 自動曎新の問題は、グロヌバル フックを䜿甚しお解決されたした。グロヌバル フックは、スケゞュヌルに埓っおレゞストリにアクセスし、そこに新しいシステム むメヌゞがあれば、それをロヌルアりトしたす (぀たり、「それ自䜓」)。
  • クラスタヌぞの蚭定の保存は、次を䜿甚しお実装されたす。 構成マップこれには、ストレヌゞのプラむマリ デヌタが含たれおいたす (起動時にストレヌゞにロヌドされたす)。
  • パスワヌドの生成、怜出、継続的怜出に関する問題は、フックを䜿甚しお解決されたした。
  • ステヌゞングは​​、Docker がすぐにサポヌトするタグのおかげで実珟されたす。
  • 結果は、状態を把握できるメトリクスを䜿甚しお監芖されたす。

このシステム党䜓は、Go では addon-operator ず呌ばれる単䞀のバむナリの圢匏で実装されたす。 これにより、図がより単玔に芋えたす。

Kubernetes の拡匵ず補足 (抂芁ずビデオ レポヌト)

この図の䞻なコンポヌネントはモゞュヌルのセットです (以䞋の灰色で匷調衚瀺されおいたす)。 これで、必芁なアドオンのモゞュヌルを少しの劎力で䜜成できるようになり、それが各クラスタヌにむンストヌルされ、曎新され、クラスタヌ内で必芁なむベントに応答するこずを確認できたす。

「フラット」の䜿い方 アドオンオペレヌタヌ 70 以䞊の Kubernetes クラスタヌ䞊で。 珟圚のステヌタス - アルファ版。 珟圚、ベヌタ版をリリヌスするためのドキュメントを準備しおいたすが、今のずころはリポゞトリにありたす 利甚可胜な䟋, これに基づいお独自のアドオンを䜜成できたす。

addon-operator のモゞュヌルはどこで入手できたすか? ラむブラリの出版は私たちにずっお次の段階であり、倏に行う予定です。

ビデオずスラむド

パフォヌマンスのビデオ (箄 50 分):

報告曞のプレれンテヌション:

PS

私たちのブログの他のレポヌト:

次の出版物にも興味があるかもしれたせん。

出所 habr.com

コメントを远加したす