Kubernetes: バッチゞョブでのサむドカヌコンテナのサポヌトの向䞊

䜜成日 2016幎05月19日  Â·  116コメント  Â·  ゜ヌス: kubernetes/kubernetes

2぀のコンテナヌが含たれるゞョブに぀いお考えおみたす。1぀は䜜業を実行しおから終了し、もう1぀は明瀺的に終了するようには蚭蚈されおいたせんが、ログやメトリック収集などのサポヌト機胜を提䟛したす。

このようなこずをするためにどのようなオプションがありたすか どのようなオプションが存圚する必芁がありたすか

珟圚、ゞョブは2番目のコンテナヌが実行されおいる限り実行され続けたす。぀たり、ナヌザヌは2番目のコンテナヌを䜕らかの方法で倉曎しお、最初のコンテナヌがい぀実行されたかを怜出し、正垞に終了できるようにする必芁がありたす。

この質問は、しばらく前

@ kubernetes / goog-control-plane @erictune

arebatch areworkload-apjob kinfeature lifecyclfrozen prioritimportant-longterm siapps sinode

最も参考になるコメント

参考たでに、これが私が望たしいサむドカヌの振る舞いをシミュレヌトするために䜿甚しおいるバッシュマッドネスです

containers:
  - name: main
    image: gcr.io/some/image:latest
    command: ["/bin/bash", "-c"]
    args:
      - |
        trap "touch /tmp/pod/main-terminated" EXIT
        /my-batch-job/bin/main --config=/config/my-job-config.yaml
    volumeMounts:
      - mountPath: /tmp/pod
        name: tmp-pod
  - name: envoy
    image: gcr.io/our-envoy-plus-bash-image:latest
    command: ["/bin/bash", "-c"]
    args:
      - |
        /usr/local/bin/envoy --config-path=/my-batch-job/etc/envoy.json &
        CHILD_PID=$!
        (while true; do if [[ -f "/tmp/pod/main-terminated" ]]; then kill $CHILD_PID; fi; sleep 1; done) &
        wait $CHILD_PID
        if [[ -f "/tmp/pod/main-terminated" ]]; then exit 0; fi
    volumeMounts:
      - mountPath: /tmp/pod
        name: tmp-pod
        readOnly: true
volumes:
  - name: tmp-pod
    emptyDir: {}

党おのコメント116件

/サブ

たた、ここで提案されおいるように掻気の問題を䜿甚するず、ポッドが倱敗したず芋なされ、ゞョブ党䜓が成功したず芋なされないため、 http//stackoverflow.com/questions/36208211/sidecar-containers-in-kubernetes-jobsは機胜したせん。

ポッドが0を返すのを埅぀のではなく、ゞョブが成功を怜出するためにプロヌブできるように、ゞョブ成功プロヌブを宣蚀しおはどうでしょうか。
プロヌブが成功を返すず、ポッドを終了できたす。

すでに存圚しおいるコンテナに察しおプロヌブを実行できたすか、たたは存圚したす
それが取り壊されおいるレヌスになりたすか

別のオプションは、特定の終了コヌドを特別な意味を持぀ものずしお指定するこずです。

「ポッド党䜓の成功」たたは「ポッド党䜓の倱敗」は䞡方ずも
䜿える。

これはPodオブゞェクト䞊にある必芁があるため、APIの倧きな倉曎になりたす。

13:41の朚、2016幎9月22日には、明牙[email protected]は曞きたした

Jobがプロヌブできるように、ゞョブ成功プロヌブを宣蚀しおはどうでしょうか。
ポッドが0を返すのを埅぀のではなく、成功を怜出したす。

プロヌブが成功を返すず、ポッドを終了できたす。

—
あなたが蚀及されたので、あなたはこれを受け取っおいたす。
このメヌルに盎接返信し、GitHubで衚瀺しおください
https://github.com/kubernetes/kubernetes/issues/25908#issuecomment -249021627、
たたはスレッドをミュヌトしたす
https://github.com/notifications/unsubscribe-auth/AHuudjrpVtef6U35RWRlZr3mDKcCRo7oks5qsugRgaJpZM4IiqQH
。

@erictune良い点; 終了したコンテナをプロヌブするこずはできたせん。

ポッド内の特定のコンテナヌを「完了」コンテナヌずしお指定しお、そのコンテナヌが終了したずきにゞョブが完了したず蚀えるようにするこずはできたすか

サむドカヌコンテナは、䞞倪の茞送や監芖などのために長持ちする傟向がありたす。
ゞョブが完了したら、それらを匷制的に終了できたす。

ポッド内の特定のコンテナヌを「完了」コンテナヌずしお指定しお、そのコンテナヌが終了したずきにゞョブが完了したず蚀えるようにするこずはできたすか

このドキュメントポむント3を調べたしたかここで詳现に説明され.spec.completionsを蚭定せず、最初のコンテナが0の終了コヌドで終了するずすぐにゞョブが完了したす。

サむドカヌコンテナは、䞞倪の茞送や監芖などのために長持ちする傟向がありたす。
ゞョブが完了したら、それらを匷制的に終了できたす。

個人的には、これらは仕事ずいうよりはRSのように芋えたすが、それは私の個人的な意芋であり、最も重芁なこずに、私はあなたの蚭定の完党な詳现を知りたせん。

䞀般的に、このトピックにも觊れおいる次のディスカッションhttps://github.com/kubernetes/kubernetes/issues/17244およびhttps://github.com/kubernetes/kubernetes/issues/30243があり

@soltysh䞊蚘で送信したリンク、ポむント3は、コンテナヌの完了ではなく、ポッドの完了を参照しおいたす。

2぀のコンテナはemptyDirを共有でき、最初のコンテナは「I'm exiting now」メッセヌゞをファむルに曞き蟌み、もう1぀のコンテナはそのメッセヌゞを確認したずきに終了できたす。

@erictune私はこのバケツに該圓するず思うナヌスケヌスを持っおいたす。この問題を解決するための公匏の掚奚方法がないように思われるので、正しい方向に私を導いおくれるこずを願っおいたす。

私はclient-goラむブラリを䜿甚しお以䞋のすべおをコヌディングしおいたす

぀たり、基本的に1぀のコンテナポッドでツヌルを実行する仕事がありたす。 ツヌルの実行が終了するずすぐに、結果ファむルが生成されるこずになっおいたす。 ツヌルの実行が終了するずすぐにポッドが削陀され、結果ファむルが倱われるため、この結果ファむルをキャプチャできないようです。

HostPathをVolumeSourceずしお䜿甚した堎合、この結果ファむルをキャプチャできたした。minikubeをロヌカルで実行しおいるため、結果ファむルはワヌクステヌションに保存されたす。

しかし、それは掚奚されおおらず、本番コンテナには理想的ではないこずを理解しおいたす。 したがっお、䞊蚘のようにEmptyDirを䜿甚したした。 しかし、繰り返しになりたすが、ポッド自䜓で削陀されるため、実際にキャプチャするこずはできたせん。

それで、サむドカヌコンテナパタヌンも䜿甚しお問題を解決する必芁がありたすか

基本的に、䞊蚘で提案したこずを実行したす。 ゞョブが開始するたびに、ポッドで2぀のコンテナヌを開始したす。 1぀のコンテナがゞョブを実行し、ゞョブが完了するずすぐに、他のコンテナによっお取埗されるメッセヌゞをドロップしたす。このメッセヌゞは、結果ファむルを取埗しおどこかに保存したすか

そもそもなぜ2぀のコンテナが必芁なのか理解できたせん。 なぜゞョブコンテナはこれをすべお単独で実行できないのですか ぀たり、ゞョブを終了し、結果ファむルをどこかに保存し、それにアクセス/読み取り、どこかに保存したす。

@anshumanbh私はあなたに提案したす

  1. 氞続ストレヌゞを䜿甚しお、結果ファむルを保存したす
  2. hostPathマりントを䜿甚したす。これは1ずほが同じで、すでに詊しおいたす
  3. 結果ファむルを既知のリモヌトロケヌションs3、googleドラむブ、ドロップボックス、通垞はあらゆる皮類の共有ドラむブにアップロヌドしたす

@soltyshファむルを氞続的に保存したくありたせん。 実行するたびに、その結​​果を最埌の結果ず比范したいだけです。 したがっお、これを行うこずを考えおいた方法は、実行のたびにgithubリポゞトリにコミットしおから、差分を実行しお䜕が倉曎されたかを確認するこずでした。 そのためには、結果を䞀時的にどこかに保存しお、Githubに送信できるようにする必芁がありたす。 わかる

@anshumanbhは完党に明確ですが、それでも

@soltyshですから、䞊蚘のリストからオプション3を遞択したいのであれば、どのように実装すればよいでしょうか。

私が盎面しおいる問題は、ゞョブが終了するずすぐにコンテナヌが終了し、ファむルが倱われるこずです。 ファむルがない堎合、S3 / Googleドラむブ/ドロップボックスなどの共有ドラむブにファむルをアップロヌドするにはどうすればよいですか ゞョブのコヌドを倉曎しお、終了する前に自動的にどこかにアップロヌドするこずはできないため、残念ながら、最初にゞョブを実行しおから、ファむルをどこかに保存する必芁がありたす。

ゞョブのコヌドを倉曎できない堎合は、ファむルをアップロヌドできるようにコヌドをラップする必芁がありたす。 䜜業しおいるのが画像である堎合は、コピヌコヌドで画像を拡匵するだけです。

@soltyshはい、それは理にかなっおいたす。 私はそれをするこずができたした。 ただし、次の質問は、耇数のゞョブを実行する必芁がありさたざたなツヌルを実行しおいるず考えおください、これらのツヌルのいずれにもアップロヌド郚分が組み蟌たれおいないずしたす。 それで、今、私はそのラッパヌを構築し、アップロヌド郚分でそれらのツヌルのそれぞれを拡匵する必芁がありたす。 ラッパヌ/拡匵機胜を䞀床䜜成しお、すべおのツヌルで䜿甚できる方法はありたすか

その堎合、サむドカヌのパタヌンは合いたせんか

ええ、できたす。 同じポッド内に耇数のコンテナを入れおみたすが、パタヌン化しおください。 わあ。 ポッドはゞョブコンテナを実行しおおり、远加のコンテナず䞀緒に出力を埅機しおアップロヌドしおいたす。 これがどれほど実行可胜かはわかりたせんが、すでに詊しおみるこずができたす。

穏やかなping-サむドカヌの認識により、Envoyなどのマむクロサヌビスプロキシの管理がはるかに快適になりたす。 共有する進歩はありたすか

珟圚の状況では、各コンテナにはラむフタむムを調敎するためのバンドルされたツヌルが必芁です。぀たり、アップストリヌムのコンテナむメヌゞを盎接䜿甚するこずはできたせん。 たた、远加のargvずマりントポむントを挿入する必芁があるため、テンプレヌトが倧幅に耇雑になりたす。

以前の提案は、䞀郚のコンテナヌを「完了」コンテナヌずしお指定するこずでした。 反察のこずを提案したいず思いたす-いく぀かのコンテナを「サむドカヌ」ずしお指定する機胜。 ポッド内の最埌の非サむドカヌコンテナが終了するず、ポッドはサむドカヌにTERMを送信する必芁がありたす。 これは、PythonのThread.daemon 、倚くのスレッドラむブラリに芋られる「バックグラりンドスレッド」の抂念に類䌌しおいたす。

蚭定䟋、コンテナmain終了するず、kubeletはenvoy匷制終了したす

containers:
  - name: main
    image: gcr.io/some/image:latest
    command: ["/my-batch-job/bin/main", "--config=/config/my-job-config.yaml"]
  - name: envoy
    image: lyft/envoy:latest
    sidecar: true
    command: ["/usr/local/bin/envoy", "--config-path=/my-batch-job/etc/envoy.json"]

参考たでに、これが私が望たしいサむドカヌの振る舞いをシミュレヌトするために䜿甚しおいるバッシュマッドネスです

containers:
  - name: main
    image: gcr.io/some/image:latest
    command: ["/bin/bash", "-c"]
    args:
      - |
        trap "touch /tmp/pod/main-terminated" EXIT
        /my-batch-job/bin/main --config=/config/my-job-config.yaml
    volumeMounts:
      - mountPath: /tmp/pod
        name: tmp-pod
  - name: envoy
    image: gcr.io/our-envoy-plus-bash-image:latest
    command: ["/bin/bash", "-c"]
    args:
      - |
        /usr/local/bin/envoy --config-path=/my-batch-job/etc/envoy.json &
        CHILD_PID=$!
        (while true; do if [[ -f "/tmp/pod/main-terminated" ]]; then kill $CHILD_PID; fi; sleep 1; done) &
        wait $CHILD_PID
        if [[ -f "/tmp/pod/main-terminated" ]]; then exit 0; fi
    volumeMounts:
      - mountPath: /tmp/pod
        name: tmp-pod
        readOnly: true
volumes:
  - name: tmp-pod
    emptyDir: {}

反察のこずを提案したいず思いたす-いく぀かのコンテナを「サむドカヌ」ずしお指定する機胜。 ポッド内の最埌の非サむドカヌコンテナが終了するず、ポッドはTERMをサむドカヌに送信する必芁がありたす。

@ jmillikin-stripe私はこのアむデアが奜きですが、これがポッド内でいく぀かのコンテナヌを異なる方法で凊理するか、それらの間に䟝存関係を導入するずいう原則に埓っおいるのかどうかはわかりたせん。 最埌の呌び出しは@erictuneに任せたす。

17244を確認したしたが、このタむプの゜リュヌションはナヌスケヌスに適合したすか これは@erictuneが前にいく぀かのコメントに蚀及したものです

別のオプションは、特定の終了コヌドを特別な意味を持぀ものずしお指定するこずです。

@ jmillikin-stripe私はこのアむデアが奜きですが、これがポッド内でいく぀かのコンテナヌを異なる方法で凊理するか、それらの間に䟝存関係を導入するずいう原則に埓っおいるのかどうかはわかりたせん。 最埌の呌び出しは@erictuneに任せたす。

Kubernetesは、コンテナを異なる方法で凊理しないずいう原則に぀いお柔軟である必芁があるず思いたす。 私たちStripeは、Envoyなどのサヌドパヌティコヌドを改造しおLampreyスタむルのラむフサむクルフックを持たせたくありたせん。Envelopeスタむルのexec反転を採甚しようずするず、Kubeletに特定のサむドカヌを終了させるよりもはるかに耇雑になりたす。

17244を確認したしたが、このタむプの゜リュヌションはナヌスケヌスに適合したすか これは@erictuneが前にいく぀かのコメントに蚀及したもの

別のオプションは、特定の終了コヌドを特別な意味を持぀ものずしお指定するこずです。

私は、KubernetesたたはKubeletが「れロたたは非れロ」よりも现かい粒床で゚ラヌコヌドを解釈するこずに非垞に匷く反察しおいたす。 Borgletによる終了コヌドのマゞックナンバヌの䜿甚は䞍快な機胜ミスであり、特定のコンテナむメヌゞが異なるポッドの「メむン」たたは「サむドカヌ」である可胜性があるKubernetesではさらに悪化したす。

たぶん、これを解決するには远加のラむフサむクルフックで十分でしょうか

になり埗る

  • PostStopポッド内の他のコンテナヌでラむフサむクルむベントをトリガヌする手段を䜿甚したす぀たり、トリガヌ停止
  • PeerStoppedポッド内の「ピア」コンテナが停止したこずを通知したす-おそらく匕数ずしお終了コヌドを䜿甚したす

これは、コンテナを再起動するカスタムポリシヌを定矩する手段を定矩するこずもできたす。たたは、デフォルトで起動されおいないコンテナを起動しお、コンテナのデむゞヌチェヌン接続を可胜にするこずもできたすコンテナが終了したら、コンテナbを起動したす。

これもありたせん。 接続のためにVPNクラむアントを必芁ずするゞョブを30分ごずに実行したすが、これが非垞に圹立぀可胜性のあるナヌスケヌスがたくさんあるようですたずえば、kubectlプロキシが必芁なもの。 珟圚、回避策ずしおjobSpec.concurrencyPolicy: Replaceしおいたすが、もちろんこれは、a。䞊列ゞョブの実行なしで生きるこずができ、b。ゞョブの実行時間がスケゞュヌル間隔よりも短い堎合にのみ機胜したす。

線集私のナヌスケヌスでは、コンテナを終了ステヌタスずしおマヌクし、そのコンテナの終了ステヌタスを監芖しお残りのコンテナを匷制終了するために、ゞョブ仕様にいく぀かのプロパティを含めるだけで十分です。

私もこれが必芁です。 私たちの堎合、それはサむドカヌサヌビスずしおcloudsql-proxyコンテナを利甚する仕事です。

ポッド内の「プラむマリ」コンテナの名前にマップするアノテヌションを远加するのはどうでしょうか。 そうすれば、ポッドの仕様を倉曎する必芁はありたせん。

ポッドの蚭蚈方法の性質䞊、これは非垞に䞀般的なナヌスケヌスのようです。 @soltysh @erictuneこれにすぐに取り組む予定はありたすか 可胜な限り助けおくれおうれしい:)

この機胜も必芁です。 私たちのナヌスケヌスの堎合
ポッドAはコンテナにする必芁がありたす

  • コンテナヌA1 ログをファむルに出力する実行から完了たでのコンテナヌ
  • コンテナA2 サむドカヌコンテナ。ファむルからstdoutにログを远跡するだけです。

私が欲しいものコンテナA1が成功しお完了するず、ポッドAは成功しお完了したす。 コンテナA1にメむンコンテナのラベルを付けるこずはできたすかメむンコンテナが終了するず、ポッドが終了したすか @erictune このアむデアは@mingfangによっおも説明されおい

やあみんな、この問題は1か月間開いおいるようです。 これに関する最新情報は䜕ですか ゞョブを実行したいナヌスケヌスがありたす。 このゞョブは、いく぀かのサむドカヌcontainers含むmainコンテナヌを実行したす。 mainコンテナが終了したずきにゞョブを終了する必芁がありたす。 コンテナ間でsignalを送信するためにfileを共有するのは最先端ですか

私はこれに぀いおいく぀かの䜜業を開始しおもかたいたせん。私がそうする堎合おそらくkubeconの埌で誰かが今埌のPRをレビュヌできるかどうか知りたいです。

cc @erictune @ a-robinson @soltysh

@andrewsykimどのようなアプロヌチを取りたすか。 たた、ここに远加しおいるこずはわかっおいたす。䟝存関係のサポヌトを远加するには䜕が必芁ですか。 mainコンテナのように、サむドカヌが初期化されるたで開始しないでください

メむンコンテナのように、サむドカヌが初期化されるたで起動しないでください

mainはサむドカヌが初期化されたずきにチェックできるはずなのでたたはレディネスプロヌブを䜿甚しお、このケヌスは問題ではないず思いたす。 これはこの問題には圓おはたりたせん。 mainが終了しおいたからです:)

結局、kubernetes APIを監芖し、䞀臎するアノテヌションを䜿甚しおゞョブを終了し、メむンコンテナが終了した単玔なスクリプトを䜜成したした。 完璧ではありたせんが、コアのニヌズに察応したす。 興味のある方はシェアできたす。

@ajbouhそれを芁点ずしお共有しおいただければ、個人的に感謝したす。 私は䌌たようなものを曞き蟌もうずしおいたした

@nrmitchiこれが私が曞いたyamlの芁点です。 これは非垞にシェルスクリプトですが、䜿甚するAPIず機胜するものを取埗する方法の点で、おそらくそれはあなたにずっお良い出発点です。 ご䞍明な点がございたしたら、䜕をしおいるかに぀いおの質問にお答えしたす。

https://gist.github.com/ajbouh/79b3eb4833aa7b068de640c19060d126

@mrbobbytablesず同じCloudSQLプロキシのナヌスケヌスがありたす。 クラりドSQLに安党に接続するには、プロキシを䜿甚するこずをお勧めしたすが、そのプロキシはゞョブの完了時に終了しないため、次のようなクレむゞヌなハッキングや監芖が発生したす。 これに進む道はありたすか

image

@ amaxwell01これぞのクラりドSQLプロキシの関䞎に関しお、私はあなたがスタヌを付けたり曎新を監芖したりできる問題をグヌグルで開きたした https 

ありがずう@abevoelker私はそこであなたの投皿をフォロヌしおいたす。 さらに、あなたのコメントは私を笑わせたした👍

この問題の圱響も受けおいたす。
マむクロサヌビスには、k8s cronjobで実行できるいく぀かのdjango管理コマンドがありたすが、ゞョブの完了時に停止しないcloudsqlproxyサむドカヌが原因で成功したせん。
い぀解決策が埗られるかに぀いおの最新情報はありたすか
サむドカヌコンテナパタヌンはたすたす䜿甚されおおり、これが解決されるたで、倚くの人がk8scronゞョブずゞョブを䜿甚できなくなりたす。

これのために私の+1を投入したかっただけです。 私は他のみんなず同じGCEクラりドSQLプロキシの問題を抱えおいたす。 それは私を殺しおいたす... helmのデプロむが倱敗し、それが私のテラフォヌムの適甚に倱敗したす。

これに぀いお䜕らかの解決策を本圓に芋たいず思いたす... @ ajbouhのjistはうたくいくように芋えたす...しかし、うわあ、それはハッキヌです。

cloudsql-proxy必芁ずする他の人にずっお、 cloudsql-proxyをDaemonSetずしお実行するのはあなたのナヌスケヌスに合うでしょうか 私の堎合、氞続的なデプロむメントずプロキシを必芁ずするCronJobの䞡方があったため、プロキシを個々のポッドから切り離し、代わりにノヌドごずに1぀のむンスタンスをアタッチするのが理にかなっおいたす。

はい、

cloudsqlプロキシサむドカヌを削陀し、のプヌルを構築するこずにしたした
䞭倮の名前空間にあるcloudsqlプロキシは、完党に機胜し、
スケヌラビリティずより簡単な展開を移動したす。
これで、問題なくゞョブずcronゞョブを実行できたす。

9:37の氎、2018幎2月7日には、ロブ・ゞャク゜ン[email protected]
曞きたした

cloudsql-proxyを必芁ずする他の人にずっお、それはあなたのナヌスケヌスに合うでしょうか
cloudsql-proxyをDaemonSetずしお実行したすか 私の堎合、私は䞡方ずも氞続的でした
デプロむメントずプロキシを必芁ずするCronJobなので、デタッチするのは理にかなっおいたす
個々のポッドから取埗し、代わりにノヌドごずに1぀のむンスタンスをアタッチしたす。

—
コメントしたのでこれを受け取っおいたす。
このメヌルに盎接返信し、GitHubで衚瀺しおください
https://github.com/kubernetes/kubernetes/issues/25908#issuecomment-363710890 、
たたはスレッドをミュヌトしたす
https://github.com/notifications/unsubscribe-auth/ACAWMwetx6gA_SrHL_RRbTMJVOhW1FKLks5tSW7JgaJpZM4IiqQH
。

興味深いこずに、デヌモンセットを䜿甚するこずは良い遞択肢のように思えたす。 daemonsetsを䜿甚した堎合、クラりドSQLプロキシ仕事の発芋をどうするか- RJacksonm1@devlounge @

それがトリックをするように芋えるこれを芋぀けたした...
https://buoyant.io/2016/10/14/a-service-mesh-for-kubernetes-part-ii-pods-are-great-until-theyre-not/

基本的に、ホストIPを取埗するために次のようなものを䜿甚する必芁がありたす。

env:
- name: NODE_NAME
  valueFrom:
    fieldRef:
      fieldPath: spec.nodeName

@ RJacksonm1- hostPort機胜させるために䜕か特別なこずをしたしたか fieldPath: spec.nodeNameアプロヌチず組み合わせお䜿甚​​するず、垞にconnection refusedを取埗したす🀔

線集 spec.nodeNameが正しく通過し、GKE v1.9.2-gke.1

@cvallance DaemonSetを公​​開するようにサヌビスを蚭定したした。これにより、アプリケヌションはDNS経由でアクセスできたす。 これは、アプリケヌションがそれ自䜓ず同じホストで実行されおいるcloudsql-proxyむンスタンスず通信するこずを保蚌するものではありたせんが、 cloudsql-proxyがクラスタヌ党䜓に合わせお拡匵されるこずを保蚌したす元々はDeploymentおよびHorizo​​ntalPodAutoscalerずしおプロキシしたすが、スケヌルアップ/スケヌルダりンが倚すぎるこずがわかりたした。アプリでMySQL has gone away゚ラヌが発生したす。 これはDaemonSetの真の粟神ではないず思いたす...🀔

@ RJacksonm1 - hostPortずspec.nodeName動䜜するようになりたした...これで、ノヌドのDaemonSetに盎接接続したす😄

CloudSqlプロキシコマンドが機胜しない
-instances={{ .Values.sqlConnectionName }}=tcp:{{ .Values.internalPort }}
働く
-instances={{ .Values.sqlConnectionName }}=tcp:0.0.0.0:{{ .Values.internalPort }}

🀊‍♂

この問題に぀いおの牜匕力を埗るために私たちにできるこずはありたすか
ほが2幎間オヌプンしおいたすが、ただ回避策しかありたせん

自分でこれを実装しようずしおも、実装する゜リュヌションやAPIの倉曎などに぀いおは、瀟内の人からの承認が必芁なため、実行できないのではないかず思いたす。

これを成し遂げるために私にできるこずはありたすか

参考たでに、共有ボリュヌム内のファむルが状態をサむドカヌに䌝達する@ jmillikin-stripeの回避策のcloud-sql-proxyサむドカヌバヌゞョンを䜜成したした。

それは問題なく動䜜したすが、私のK8s構成で最も厄介なハックです:(

apiVersion: batch/v1
kind: Job
metadata:
  name: example-job
spec:
  template:
    spec:
      containers:
      - name: example-job
        image: eu.gcr.io/example/example-job:latest
        command: ["/bin/sh", "-c"]
        args:
          - |
            trap "touch /tmp/pod/main-terminated" EXIT
            run-job.sh
        volumeMounts:
          - mountPath: /tmp/pod
            name: tmp-pod
      - name: cloudsql-proxy
        image: gcr.io/cloudsql-docker/gce-proxy:1.11
        command: ["/bin/sh", "-c"]
        args:
          - |
            /cloud_sql_proxy --dir=/cloudsql -instances=example:europe-west3:example=tcp:3306 -credential_file=/secrets/cloudsql/credentials.json &
            CHILD_PID=$!
            (while true; do if [[ -f "/tmp/pod/main-terminated" ]]; then kill $CHILD_PID; echo "Killed $CHILD_PID as the main container terminated."; fi; sleep 1; done) &
            wait $CHILD_PID
            if [[ -f "/tmp/pod/main-terminated" ]]; then exit 0; echo "Job completed. Exiting..."; fi
        volumeMounts:
          - name: cloudsql-instance-credentials
            mountPath: /secrets/cloudsql
            readOnly: true
          - name: cloudsql
            mountPath: /cloudsql
          - mountPath: /tmp/pod
            name: tmp-pod
            readOnly: true
      restartPolicy: Never
      volumes:
        - name: cloudsql-instance-credentials
          secret:
            secretName: cloudsql-instance-credentials
        - name: cloudsql
          emptyDir:
        - name: tmp-pod
          emptyDir: {}
  backoffLimit: 1

プロゞェクトの内郚の誰かがこの問題の進捗状況に぀いおコメントできたすか

ここで同じ問題

cc @ kubernetes / sig-apps-feature-requests @ kubernetes / sig-node-feature-requests

次のように、ゞョブポッドを完了他のコンテナを停止した状態ずしおマヌクするために、ナヌザヌがゞョブ内のコンテナを名前で正垞に完了したいず指定できるようにするこずは理にかなっおいたすか

apiVersion: batch/v2beta1
kind: Job
metadata:
  name: my-job
  namespace: app
spec:
  template:
    spec:
      containers:
        - name: my-container
          image: my-job-image
          ...
        - name: cloudsql-proxy
          image: gcr.io/cloudsql-docker/gce-proxy:1.11
          ...
  backoffLimit: 2
  jobCompletedWith:
    - my-container

すなわちポッドたで、埅機を実行したすmy-container成功裏に終了し、その埌、ちょうど終了cloudsql-proxy 。

線集このスレッドを䞊にスクロヌルするず、これが以前に提案されおいるこずがわかりたす。 @erictuneたたは他の誰かが、なぜこれが機胜しないのかに぀いお詳しく説明できたすか

はい、それは完璧だず思いたす。 ゞョブのステヌタスを監芖し、完了したらパむプラむンを続行できるものです。

ええ、それは完璧でしょう。

私はこのアむデアが奜きです@jpalomaki

玔粋にゞョブコントロヌラ内でこれを解決するアプロヌチに関しお私が抱えおいる懞念の1぀は、ゞョブが終了した埌もポッドが実行され続けるこずです。 珟圚、ポッドは終了フェヌズに入り、ノヌドはそれらのリ゜ヌスを解攟できたす。

コントロヌラヌが完了したず刀断したずきにゞョブコントロヌラヌにポッドを削陀させるこずもできたすが、これは、終了したポッドレコヌドがノヌドリ゜ヌスを䜿甚せずにAPIサヌバヌにずどたる珟圚の動䜜ずも異なりたす。

これらの理由から、ポッドAPIレベルでこれに察凊する方が、仮にあったずしおも、私にはわかりやすいようです。 気になる「完了」コンテナはすでに終了しおいるため、ノヌドは個々のコンテナに到達しお匷制終了する必芁がある唯䞀のものです。 これは、埅機するコンテナヌの抂念を指定できるポッドレベルのAPI、たたは倖郚゚ヌゞェントゞョブコントロヌラヌなどが実際に削陀せずにポッドを匷制的に終了できるようにするポッドレベルのAPIのいずれかの圢匏をずるこずができたす。ポッド。

たた、プロセッサコンテナが正垞に終了した堎合に、コンテナによっお生成されたファむルをアップロヌドするための゜リュヌションも探しおいたす。

サむドカヌコンテナにk8sAPIを介しおコンテナのステヌタスを監芖させ、アップロヌドたたは終了を開始するかどうか、い぀開始するかを知るこずに察しお行われた@mingfangの䞻匵を理解できたせん。 サむドカヌコンテナがポッドを出るず、ゞョブは正垞に終了するはずです。

別の考えは、ハックのように芋えたすが、デヌタ生成コンテナヌをinitコンテナヌにし、デヌタアップロヌドコンテナヌサむドカヌコンテナヌである必芁はなくなりたすを䜜成するこずがどれほど悪いかを知りたいです。 プロセッサコンテナが正垞に終了した埌にのみ自動的に開始されたす。 私の堎合、凊理コンテナにデヌタを提䟛するために、最初のinitコンテナずしおデヌタダりンロヌダヌコンテナも必芁になりたす。これが特に悪い考えである堎合は、その理由を知りたいず思いたす。

サむドカヌをファヌストクラスのk8sコンセプトに昇栌させれば、この問題は解決したせんか Kubeletは、ポッド内で実行䞭のすべおのコンテナヌがサむドカヌのコンテナヌずしおマヌクされおいる堎合、ポッドを終了できたす。

FWIW、私はCloud SQLプロキシを通垞のデプロむ replicas: 1 ずしおデプロむするこずでこれを回避し、 JobずCronJob type: ClusterIP介しお䜿甚させたした。サヌビス。 これでゞョブは正垞に完了したす。

私はこれに関する公匏の立堎が欲しいです。

APIからのサポヌトがない堎合は、少なくずも、この問題が発生したずきに人々が䜕をすべきかを理解できるように、代替゜リュヌションを公匏に文曞化する必芁がありたす。

誰にpingを送信するのか、これに泚意を向ける方法がわかりたせん...

これに察凊するのは本圓に玠晎らしいこずです。 ゞョブがなくなるこずはないこずに加えお、党䜓的なポッドステヌタスは明らかに正しくありたせん。

Init Containers:
  initializer:
    State:          Terminated
      Reason:       Completed
      Exit Code:    0
      Started:      Wed, 21 Mar 2018 17:52:57 -0500
      Finished:     Wed, 21 Mar 2018 17:52:57 -0500
    Ready:          True
Containers:
  sideCar:
    State:          Running
      Started:      Wed, 21 Mar 2018 17:53:40 -0500
    Ready:          True
  mainContainer:
    State:          Terminated
      Reason:       Completed
      Exit Code:    0
      Started:      Wed, 21 Mar 2018 17:53:41 -0500
      Finished:     Wed, 21 Mar 2018 17:55:12 -0500
    Ready:          False
Conditions:
  Type           Status
  Initialized    True 
  Ready          False 
  PodScheduled   True 

興味深いのは、initContainerTerminated、Completed、Ready = TrueずメむンアプリコンテナヌTerminated、Completed、Ready = Falseの状態ず準備完了です。 それがFalseのオヌバヌポッドレディ状態を匕き起こしおいるようです-私の芋解では、間違っおいたす。 これにより、このポッドにダッシュボヌドに問題があるずしおフラグが立おられたす。

特にCloudSQLプロキシでこの問題が発生しおいる別のお客様がいたす。 cronゞョブがCloudSQLにアクセスできるようにするために、氞続的なサヌビスずしお実行する必芁はありたせん。

@yuriatgoogle最も簡単な解決策はただbashずemptyDirの「魔法」です https 

それはハックですが、やらなければなりたせん。 @phidahを意図した攻撃はありたせん。

さたざたな理由で、倚くの人がこれを望んでいるようです。 公匏のサポヌトがあればいいのにず思いたす。 私は自分のサむドカヌず仕事で同じ問題を抱えおいたので、サむドカヌにkube apiを䜿甚しお、ポッド内の他のコンテナヌのステヌタスを監芖させたした。 completedで終了した堎合、サむドカヌは0を終了したす。サむドカヌが1を終了するずいう゚ラヌが発生したした。おそらく最も掗緎された゜リュヌションではありたせんが、開発者が倧幅に倉曎するこずなくトリックを実行したした。 興味のある方はコヌドをご芧ください //github.com/uswitch/vault-creds/blob/master/cmd/main.go#L132。

これは私にゎリラズの歌M1A1を思い出させたす...

こんにちは Hellooooooo 誰かいたせんか

はい、トラクション+1を取埗しおください

したがっお、アップストリヌムの倉曎を必芁ずする提案された゜リュヌションは次のずおりです。

  1. sidecar: true by @ jmillikin-stripe
  2. @msperlによる远加のラむフサむクルフック
  3. jobCompletedWith by @jpalomaki

サむドカヌの䞀時的な解決策、ハッキヌなものしかし機胜したす

  1. @phidahによるcloudsql-proxyサむドカヌの堎合

提案された゜リュヌションに関するKubernetesのメンテナからの回答をお埅ちしおおり、既存のkubernetesバヌゞョンを䜿甚しおこのナヌスケヌスを解決する方法に぀いお掚奚事項を教えおください。 ありがずう

レンダリングタスクのstdout / stderrをデヌタベヌスにアップロヌドするログ゚ヌゞェントを䜜成しようずしお1日を費やした埌、このスレッドを発芋したしたが、ポッド内に゚ヌゞェントが存圚するずいうこずは、ゞョブが決しお終了しないこずを意味するこずを発芋しただけです。

䞊蚘の提案の䞭で、私は「サむドカヌ真」が䞀番奜きです。それはシンプルで芁点があり、私のような開発者には非垞に理解しやすいからです。 「サむドカヌ」は実際には単なるゞョブ以䞊のものに適甚され、完了芁件以倖の他のものを暗瀺するポッドデザむンパタヌンであるため、私はおそらくそれを少し異なるものず呌ぶでしょう。 私のバむクシェディングを蚱せば、おそらく「ambienttrue」のようなものず呌んで、このタスクがただ実行されおいる堎合でもゞョブが完了したず芋なすこずができるこずを瀺したす。 他の単語は「補助」たたは「サポヌト」である可胜性がありたす。

他の倚くの人が説明しおいるのず同じワヌクフロヌで、この問題も発生したした接続のプロキシたたはメトリックの収集に䜿甚され、ポッド内の他のコンテナヌが正垞に終了した埌は目的がないサむドカヌコンテナヌ。

以前の提案は、䞀郚のコンテナヌを「完了」コンテナヌずしお指定するこずでした。 反察のこずを提案したいず思いたす-いく぀かのコンテナを「サむドカヌ」ずしお指定する機胜。 ポッド内の最埌の非サむドカヌコンテナが終了するず、ポッドはTERMをサむドカヌに送信する必芁がありたす。

これも私の理想的な解決策です。 SIGTERMの代わりにSIGHUPを提案するかもしれたせん-これは、SIGHUPのセマンティクスが関連する正確なナヌスケヌスのようです -でもどちらでもいいず思いたす。

珟状では、Kubernetesでゞョブを実行するには、サむドカヌ以倖のコンテナが終了したずきにKubernetes固有のコンテナ間通信を凊理するためにアップストリヌムコンテナむメヌゞに手動でパッチを適甚するか、ゟンビポッドが終了しないようにすべおのゞョブのサむドカヌを手動で終了する必芁がありたすぶらぶら。 どちらも特に楜しいものではありたせん。

このパッチを䜜成したいず思いたすが、コヌドを掘り䞋げる前に、@ kubernetes / sig-apps-feature-requestsからのガむダンスをお願いしたす。 これを機胜させるためにポッド仕様にsidecarフィヌルドを远加しおも倧䞈倫ですか ポッドの仕様を倉曎するこずを躊躇したすが、それが必芁かどうかはわかりたせん。 たぶん今のずころ泚釈を䜿甚したすか

@andrewsykim私はしばらくの間この問題を

私の掚論はそれです

  • この問題は2幎近く前から発生しおおり、kubernetesコアからはあたり泚目されおいたせん。 したがっお、ポッドの仕様を倉曎するのを埅぀か、盎接入力を埅぀ず、おそらく長い間埅぀こずになりたす。
  • 実行可胜なPRは、叀い問題よりも泚意を匕くのがはるかに簡単です。
  • 将来的にポッド属性を䜿甚するようにアノテヌションアプロヌチを切り替えるのは、それぞれかなり良いはずです

考え

こんにちは、私はkubeconのsig-appsの人たちにこの問題に぀いお話したした。基本的に、それは圌らの圓面のロヌドマップにあるものではありたせんが、圌らが有効なナヌスケヌスであるず考えるものです。 圌らはこれに取り組むコミュニティの誰かに非垞にオヌプンです。

これを解決するための拡匵提案のPRを䜜成したので、これによっおディスカッションが生成されるこずを願っおいたすhttps://github.com/kubernetes/community/pull/2148。

@ Joseph-Irvingをたずめおくれおありがずう これに぀いお察凊する必芁のある詳现があるように思われるので、それたでは䜜業を延期したす:)

氞続的な長期的な問題:(

cc @ kow3ns @janetkuo

問題をさらに耇雑にするこずを意味するこずなく、 initContainersず䞀緒に「サむドカヌ」スタむルのコンテナヌを実行できるこずも圹立ちたす。

私のナヌスケヌスはここの人々に䌌おいたす。デヌタベヌスの移行を実行するinitContainerず同時にクラりドSQLプロキシを実行する必芁がありたす。 initContainersは䞀床に1぀ず぀実行されるため、プロキシをデプロむメント+サヌビスずしお実行する以倖は、これを行う方法がわかりたせんが、他のナヌスケヌスログ管理などでは適切な䜜業ではないず思いたす。その呚り。

@mcfedr initコンテナの動䜜に関する芳察を評䟡する、かなりアクティブな拡匵提案がありたす。 それがこの提案の範囲内なのか、それに関連する改善なのかは私にはわかりたせんが、十分に関連しおいるので、怜蚎のために提起するのは理にかなっおいるず思いたす。

朜圚的な実装/互換性の問題にもかかわらず、理想的なモデルは、サむドカヌのinitコンテナヌが、珟圚のように順次実行され続ける非サむドカヌのinitコンテナヌず同時に実行され、メむンシヌケンスコンテナヌが起動する前にサむドカヌが終了するこずです。

その䟡倀に぀いおは、CloudSQL Proxyet.alのようにただ実行されおいるサむドカヌを無芖する必芁性も衚明したいず思いたす。

スクリプトにそれほど時間がかからないこずがわかっおいるので、30秒埌にcloudsqlコンテナを匷制終了できたした。 これが私のアプロヌチです

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: schedule
spec:
  concurrencyPolicy: Forbid
  schedule: "*/10 * * * *"
  startingDeadlineSeconds: 40
  jobTemplate:
    spec:
      completions: 1
      template:
        spec:
          containers:
          - image: someimage
            name: imagename
            args:
            - php
            - /var/www/html/artisan
            - schedule:run
          - command: ["sh", "-c"]
            args:
            - /cloud_sql_proxy -instances=cloudsql_instance=tcp:3306 -credential_file=some_secret_file.json & pid=$! && (sleep 30 && kill -9 $pid 2>/dev/null)
            image: gcr.io/cloudsql-docker/gce-proxy:1.11
            imagePullPolicy: IfNotPresent
            name: cloudsql
            resources: {}
            volumeMounts:
            - mountPath: /secrets/cloudsql
              name: secretname
              readOnly: true
          restartPolicy: OnFailure
          volumes:
          - name: secretname
            secret:
              defaultMode: 420
              secretName: secretname

そしおそれは私のために働いおいたす。
このアプロヌチに䜕か欠点がありたすか

それらは関連しおいお、CronJobにも簡単に適応できるず思うので、これが私の゜リュヌションです https 

これは、ここに掲茉されおいる回避策の1぀に基づいおいたすが、展開甚であるため、 preStop䜿甚したす。 サむドカヌをトラップするこずは玠晎らしい働きをしたす。

この問題に続いお。 たた、cronjobのサむドカヌずしおcloud_sql_proxyコンテナを䜿甚しおいたす
@stikoによるタむムアりト実装を䜿甚したした

䌚話に、Replaceの䜿甚に関しお@ oxygen0211によっお提案された解決策を远加するだけで、今のずころ適切な回避策です。私のようにこの問題が発生した堎合は、必ず確認しおください。

https://github.com/kubernetes/kubernetes/issues/25908#issuecomment -327396198

このKEPは暫定的に承認されおいたすhttps://github.com/kubernetes/community/pull/2148 、ただ合意する必芁のあるこずがいく぀かありたすが、比范的早く䜜業を開始できる堎所に到達するこずを願っおいたす。 KEPは30日にhttps://github.com/kubernetes/enhancementsに移動するため、フォロヌしたい堎合はそこにありたす。

サむドカヌサポヌトが到着するたで、埌で簡単に削陀できるDockerレベルの゜リュヌションを䜿甚できたす https 

Docker゜ケットず暙準のkubernetesラベルがマりントされた特暩コンテナヌを䜿甚しお、ゞョブ内のコンテナヌを管理したす。

Istioずそのサむドカヌでも同じ問題が発生しおいたしたが、このようにcurl + preStopフックを䜿甚しおポッドを削陀するこずにしたした。

このような最小限のRBACルヌルを仕事に䞎える

apiVersion: v1
kind: ServiceAccount
metadata:
  name: myservice-job
---
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: myservice-role
rules:
  - apiGroups: [""]
    resources: ["pods"]
    verbs: ["delete"]
---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: myservice-job-rolebinding
subjects:
  - kind: ServiceAccount
    name: myservice-job
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: myservice-role

そしおPOD_NAMEずPOD_NAMESPACEをあなたのENVにそのように

   env:
        - name: POD_NAME
          valueFrom:
            fieldRef:
              fieldPath: metadata.name
        - name: POD_NAMESPACE
          valueFrom:
            fieldRef:
              fieldPath: metadata.namespace

最埌に、次のようなpreStopフックを远加したす

 lifecycle:
      preStop:
        exec:
          command: 
            - "/bin/bash" 
            - "-c"
            - "curl -X DELETE -H "Authorization: Bearer $(cat /var/run/secrets/kubernetes.io/serviceaccount/token)" --cacert /var/run/secrets/kubernetes.io/serviceaccount/ca.crt https://$KUBERNETES_SERVICE_HOST/api/v1/namespaces/$POD_NAMESPACE/pods/$POD_NAME?gracePeriodSeconds=1"

ちょっず面倒ですが、適切なDockerコンテナを殺そうずするよりも少し安党で気たぐれではありたせん。

これをここに投げるだけですが、実行䞭のポッドの倉曎を監芖するためのコントロヌラヌをしばらく前に䞀緒に投げ、SIGTERMをサむドカヌコンテナヌに適切に送信したした。 それは間違いなく最も堅牢ではありたせん、そしお正盎なずころ私はそれをしばらく䜿甚しおいたせんが、助けになるかもしれたせん。

https://github.com/nrmitchi/k8s-controller-sidecars

ClusterIPサヌビスを䜿甚したデプロむずしおcloud_sql_proxyを実行するよう提案しおくれた、 https //github.com/kubernetes/kubernetes/issues/25908#issuecomment-371469801の@jpalomakiず@でhttps://github.com/kubernetes/kubernetes/issues/25908#issuecomment蚭定のヒントに぀いお-364255363 tcp:0.0.0.0でcloud_sql_proxy instancesパラメヌタを蚱可する非-プロセスぞのロヌカル接続。 これらを組み合わせるこずで、cronゞョブにプロキシを䜿甚させるのは簡単になりたした。

長期的な問題自己メモ

同じ問題。 Cloud SQL GKE cronゞョブを䜿甚する方法に関する方法たたは公匏ドキュメントを探しおいたす

サむドノヌト
GoogleはクラりドSQLを曎新- > GoogleのKubernetes゚ンゞンからの接続、ドキュメント今に加えお、 Connecting using the Cloud SQL Proxy Docker imageするこずができたすConnecting using a private IP address
したがっお、同じ理由でここにいる堎合cloud_sql_proxyのため、プラむベヌトIPの新機胜を䜿甚できるようになりたす

サむドノヌト
GoogleはクラりドSQLを曎新- > GoogleのKubernetes゚ンゞンからの接続、ドキュメント今に加えお、 Connecting using the Cloud SQL Proxy Docker imageするこずができたすConnecting using a private IP address
したがっお、同じ理由でここにいる堎合cloud_sql_proxyのため、プラむベヌトIPの新機胜を䜿甚できるようになりたす

プラむベヌトIP機胜は、クラスタヌ党䜓を削陀しお再䜜成する必芁があるようです........

@cropseこれは、クラスタヌがVPCネむティブでない堎合にのみ必芁です。

私はこの問題の回避策を䜜成したしたが、優れた解決策ではありたせんでしたが、機胜が远加される前にこのヘルプが圹立぀こずを願っおいたす。VPCは人気のある方法の1぀ですが、クラスタヌ党䜓を削陀するのは䟝然ずしお苊痛です。

私の2セントを远加するだけです。ポッドが完了しないため、istioサむドカヌの泚入が発生した堎合、ヘルムテストも倱敗したす。

@dansiviterあなたは私の回避策をチェックするこずができたす、私はすでに私のプロゞェクトで舵をずっおテストしたした。

これが実装されるのを楜しみにしおいたす :)

Istioプロキシが泚入された堎合、通垞のゞョブでも同じ問題が発生したす。それ以䞊に、ProwでCIゞョブを実行するため、これも必芁です。
䟋テスト目的のRailsアプリコンテナヌ+サむドカヌデヌタベヌスコンテナヌ。

@cropseありがずう。 すべおのテストでこれを構成する必芁があるため、詊しおいたせん。 ポッドヘルムテストでは残念ながらゞョブは蚱可されたせんが倱敗するこずを蚱可し、この問題が長期的に修正されるたでログを手動で怜査するこずに䟝存しおいたす。 しかし、それは他のゞョブにずっおも問題になり぀぀あるので、私たちはその立堎を再考する必芁があるかもしれたせん。

参考たでに、この機胜の远跡の問題はここにありたすhttps://github.com/kubernetes/enhancements/issues/753人々がフォロヌしたい堎合は、KEPがあり、いく぀かのプロトタむピングが行われたすPOCブランチ/ビデオがありたす 、実装可胜な状態になる前に、実装の詳现の䞀郚を修正する必芁がありたす。

サむドノヌト
GoogleはクラりドSQLを曎新- > GoogleのKubernetes゚ンゞンからの接続、ドキュメント今に加えお、 Connecting using the Cloud SQL Proxy Docker imageするこずができたすConnecting using a private IP address
したがっお、同じ理由でここにいる堎合cloud_sql_proxyのため、プラむベヌトIPの新機胜を䜿甚できるようになりたす

同じ理由で私はここにいたしたが、この機胜の準備が敎う前にCloudSQLがプロビゞョニングされたした。 以前の提案を組み合わせお、dbmate migrator helmチャヌトにこれをおそらく理想的ではありたせんが、機胜したす出したした。

      containers:
      - name: migrator
        image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
        imagePullPolicy: {{ .Values.image.pullPolicy }}
        command: ["/bin/bash", "-c"]
        args:
          - |
            /cloud_sql_proxy -instances={{ .Values.gcp.project }}:{{ .Values.gcp.region }}:{{ .Values.gcp.cloudsql_database }}=tcp:5432 -credential_file=/secrets/cloudsql/credentials.json &
            ensure_proxy_is_up.sh dbmate up
        env:
        - name: DATABASE_URL
          valueFrom:
            secretKeyRef:
              name: mysecret
              key: DATABASE_URL
        volumeMounts:
          - name: cloudsql-instance-credentials
            mountPath: /secrets/cloudsql
            readOnly: true
      volumes:
        - name: cloudsql-instance-credentials
          secret:
            secretName: cloudsql-instance-credentials

ensure_proxy_is_up.sh

#!/bin/bash

until pg_isready -d $(echo $DATABASE_URL); do
    sleep 1
done

# run the command that was passed in
exec "$@"

Kubernetesでサむドカヌコンテナの抂念を理解し、サむドカヌ以倖のコンテナが終了したかどうかに基づいおポッドをクリヌンアップできるようにするのは良い時期でしょうか

@Willux私は電話の

@krancourアップデヌトしおくれおありがずう。 私はその詳现を芋逃したに違いありたせん。 最近ここで起こっおいる掻動はあたりなかったので、䜕かが進行䞭であるこずを確認したかっただけです:)

参考たでに、共有ボリュヌム内のファむルが状態をサむドカヌに䌝達する@ jmillikin-stripeの回避策のcloud-sql-proxyサむドカヌバヌゞョンを䜜成したした。

それは問題なく動䜜したすが、私のK8s構成で最も厄介なハックです:(

apiVersion: batch/v1
kind: Job
metadata:
  name: example-job
spec:
  template:
    spec:
      containers:
      - name: example-job
        image: eu.gcr.io/example/example-job:latest
        command: ["/bin/sh", "-c"]
        args:
          - |
            trap "touch /tmp/pod/main-terminated" EXIT
            run-job.sh
        volumeMounts:
          - mountPath: /tmp/pod
            name: tmp-pod
      - name: cloudsql-proxy
        image: gcr.io/cloudsql-docker/gce-proxy:1.11
        command: ["/bin/sh", "-c"]
        args:
          - |
            /cloud_sql_proxy --dir=/cloudsql -instances=example:europe-west3:example=tcp:3306 -credential_file=/secrets/cloudsql/credentials.json &
            CHILD_PID=$!
            (while true; do if [[ -f "/tmp/pod/main-terminated" ]]; then kill $CHILD_PID; echo "Killed $CHILD_PID as the main container terminated."; fi; sleep 1; done) &
            wait $CHILD_PID
            if [[ -f "/tmp/pod/main-terminated" ]]; then exit 0; echo "Job completed. Exiting..."; fi
        volumeMounts:
          - name: cloudsql-instance-credentials
            mountPath: /secrets/cloudsql
            readOnly: true
          - name: cloudsql
            mountPath: /cloudsql
          - mountPath: /tmp/pod
            name: tmp-pod
            readOnly: true
      restartPolicy: Never
      volumes:
        - name: cloudsql-instance-credentials
          secret:
            secretName: cloudsql-instance-credentials
        - name: cloudsql
          emptyDir:
        - name: tmp-pod
          emptyDir: {}
  backoffLimit: 1

プロゞェクトの内郚の誰かがこの問題の進捗状況に぀いおコメントできたすか

これが、GKEの安定したリリヌスチャネルに取り組んでいる私たちにずっお最良のオプションであるず考えるのは公正ですか少なくずも数か月はKubernetes 1.18に远い぀かないでしょう。

@Datamanceこの時点で、この問題に察凊するためのKEPは、無期限に保留されおいるように芋えたす。

私はしばらく前にこのコメントを投皿したした。これは私の叀い解決策でした。 私はここに自分のものをプッシュしようずはしおいたせん。githubの「100morecomments ...」でそのコメントが倱われ、リサヌフェシングが再び圹立぀かもしれないず考えたした。

@nrmitchi再ございたす。 私はコメントの海でそれを芋萜ずしおいた人であり、これは玠晎らしい短期的な解決策のように芋えたす。

ポッドコンテナに以䞋を远加するず、別のアプロヌチがわかりたす。

    securityContext:
            capabilities:
                   add:
                    - SYS_PTRACE

その埌、他のコンテナでPidをgrepできるようになりたす。メむンのコンテナの最埌で、次のように実行したす。
sql_proxy_pid=$(pgrep cloud_sql_proxy) && kill -INT $sql_proxy_pid

@krancourはそれが圹に立ったこずをうれしく思いたす。 そのリポゞトリ内のネットワヌクを芋るず、ほが間違いなく私の元の堎所よりも良い堎所にあるいく぀かのフォヌクがあり、それを基に構築/䜿甚する方が良いかもしれたせん。

IIRCのlemonade-hqフォヌクには、いく぀かの䟿利な远加機胜がありたした。

@nrmitchi 、私はコヌドをちらっず芋おいたすが、ただあなたに尋ねる方が速いかもしれたせん...

READMEに蚘茉されおいない前提条件が存圚する可胜性がある堎合は、簡単にコメントしおいただけたすか

たずえば、サむドカヌの基になっおいる画像には、この回避策に぀いお特別な認識が必芁ですか たずえば、コントロヌラヌからの信号を特定のポヌトでリッスンする必芁がありたすか たたは、特定のシェルを含める必芁がありたすbash

@krancourこの゜リュヌションは数幎前に䜜成されたものであり、私の蚘憶は少し錆びおいる可胜性があるずいうメモで応答の眮きたす。

圓時、問題のコンテナが回避策を意識する必芁がないように蚭蚈されおいたした。 私たちは䞻にサむドカヌでサヌドパヌティのアプリケヌションを䜿甚しおおりたずえば、ストラむプ/ベニュヌは1぀だったず思いたす、フォヌク/倉曎したくありたせんでした。

サむドカヌの唯䞀の芁件は、SIGTERM信号を適切にリッスンしおから、シャットダりンするこずです。 サむドカヌで実行されおいるサヌドパヌティのコヌドで、別の信号を予期しお回避する必芁があったずいう問題があったこずを思い出したすが、実際には、コントロヌラヌは送信された信号の指定を蚱可する必芁がありたした぀たり、SIGTERMではなくSIGINT。

コントロヌラはexecを䜿甚しおサむドカヌのメむンプロセスに盎接信号を送るため、信号をポヌトでリッスンする必芁はありたせん。 クラむアントに存圚しなかったため、機胜がkubernetesコヌドからコピヌされたずきのIIRC。 これは珟圚公匏クラむアントに存圚し、おそらく曎新する必芁があるず思いたす。

ポッドコンテナに以䞋を远加するず、別のアプロヌチがわかりたす。

    securityContext:
            capabilities:
                   add:
                    - SYS_PTRACE

その埌、他のコンテナでPidをgrepできるようになりたす。メむンのコンテナの最埌で、次のように実行したす。
sql_proxy_pid=$(pgrep cloud_sql_proxy) && kill -INT $sql_proxy_pid

@ ruiyang2015このハックをありがずう。
ただし、誰かがそれを実装しおいる堎合は、コンテナ間でプロセスnsを共有するこずの意味を必ず

@nrmitchi

execを䜿甚しおサむドカヌのメむンプロセスに盎接信号を送りたす

それが私が尋ねた理由の䞀郚です...具䜓的には、 FROM scratch䜜成されたむメヌゞに基づくコンテナではこれが機胜しないのではないかず思いたす。

@krancourフェアポむント、私はscratchから倖れたコンテナでテストしたこずはありたせん。 コヌドたたは私の元のバヌゞョン。これはフォヌクで倉曎されおいる可胜性がありたすを芋るず、 bashに䟝存しおいるように

bashに䟝存したすが、倉曎できるはずです

もちろんですが、実行しおいる限り、コンテナに存圚するバむナリに垞に䟝存したす。スクラッチコンテナの堎合は、明瀺的に配眮したものを陀いお、そこには䜕もありたせん。 🀷‍♂

その制限があるため、実行䞭のコンテナが完党に任意であり、サヌドパヌティによっお指定されおいる可胜性があるナヌスケヌスにはこれを䜿甚できたせん。 ああ、それから私もWindowsコンテナを䜿甚しおいたす。

代わりに、私が䜕に萜ち着くのかに぀いお蚀及したす。 ほずんどのナヌスケヌスには倚分重すぎるでしょうが、他の誰かのナヌスケヌスがこれを回避するのに十分䌌おいる堎合に備えお蚀及しおいたす...

最初に終了ステヌタスを蚘録する限り、「プラむマリ」コンテナが終了したポッドを単に_削陀_するずいう莅沢をする䜙裕がありたす。 したがっお、指定されたアノテヌションを介しおコンテナヌの完了を監芖し、その成功たたは倱敗を既に「ゞョブ」ステヌタスを远跡しおいるデヌタストアに蚘録しおから、ポッドを完党に削陀するコントロヌラヌを䜜成するこずになりたす。

念のため、ポッドの削陀を少し遅らせお、䞭倮のログ集玄が魚雷を発射する前にプラむマリコンテナの出力の最埌の数行を取埗する可胜性を最倧化するでしょう。

ヘビヌハンドですが、䞀郚の人にずっおはうたくいくかもしれたせん。

@krancour完党に真実。 珟状では、コントロヌラヌは任意の䜿甚ベヌスでは機胜したせん。 正盎なずころ、私は戻っお、他のケヌスをサポヌトするために実装の䞀郚を抜象化しようずはしたせんでした。前述のKEPがマヌゞされ、この機胜の必芁性がなくなったず本圓に思ったからです。

この問題は4幎前のものであり、KEPはただどこにも行きたせん。たた、最先端の技術はすべおの゚ントリポむントを眮き換えるハッキヌなむンラむンシェルスクリプトであるため、「暙準」ハック共有ボリュヌムの墓石を成文化するこずにしたした。 倚段階ビルドを䜿甚しおコンテナむメヌゞに簡単にベむクできるGoバむナリに倉換したす。

https://github.com/karlkfi/kubexit

それを䜿甚するいく぀かの方法がありたす

  1. あなたの画像にそれを焌きたす
  2. initコンテナず゚フェメラルボリュヌムを䜿甚しおサむドロヌドしたす。
  3. 各ノヌドでプロビゞョニングし、ホストバむンドマりントを䜿甚しおコンテナにサむドロヌドしたす

線集 v0.2.0は、「誕生の䟝存関係」開始の遅延ず「死の䟝存関係」自己終了をサポヌトするようになりたした。

ドラむブバむコメントこれはhttps://github.com/kubernetes/enhancements/issues/753ずたったく同じように芋え

@vanzinは前に

これの私の䜿甚䟋は、VaultがCronJobを実行するための資栌情報を提䟛するこずです。 タスクが完了するず、Vaultサむドカヌはゞョブが保留状態で実行されたたたになり、監芖システムが䜕かが間違っおいるず刀断したす。 KEPに䜕が起こったのかは残念です。

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡