サイドカーコンテナパターン


サイドカーコンテナは、コンテナを変えることなく既存の容器の機能を加えるか、強化することを目指します.initコンテナと比較して、以前に説明したように、アプリケーションコンテナとしてサイドカーコンテナが起動し、同時に実行されます.サイドカーは、ちょうどあなたがコンテナリストに持っている2番目のコンテナであり、起動順序は保証されません.
sidecarコンテナの最も人気のある実装の1つはおそらくistioサービスメッシュにある.サイドカーコンテナ(使節プロキシ)は、アプリケーションコンテナーの横に実行され、インバウンドとアウトバウンドのリクエストを遮断します.このシナリオでは、SideCarは既存のコンテナーに機能を追加し、演算子がトラフィックルーティング、失敗注入、およびその他の機能を行うことができます.

より単純な考えは、サイドカー容器を持っているかもしれませんlog-collector ) アプリケーションコンテナーのログを収集して格納します.そのように、アプリケーション開発者として、ログを収集し、保存する心配する必要はありません.あなたは、サイドカーコンテナがそれらを集めることができて、更なる処理に彼らを送るか、彼らをアーカイブすることができる場所(容器の間で共有される)にログを書くだけである必要があります.
この例を続けるとinitコンテナに使用されます.我々は定期的に更新を実行するサイドカーコンテナを作成することができますgit pull とリポジトリを更新します.これを動作させるには、初期のクローンを行うためにinitコンテナを保存し、定期的に(60秒ごとに)サイドカーコンテナをチェックしてリポジトリの変更をプルします.
これを試すには、フォークを確認してくださいoriginal Github repository そして、下のYAMLでフォークを使ってください.
apiVersion: v1
kind: Pod
metadata:
  name: website
spec:
  initContainers:
    - name: clone-repo
      image: alpine/git
      command:
        - git
        - clone
        - --progress
        - https://github.com/peterj/simple-http-page.git
        - /usr/share/nginx/html
      volumeMounts:
        - name: web
          mountPath: "/usr/share/nginx/html"
  containers:
    - name: nginx
      image: nginx
      ports:
        - name: http
          containerPort: 80
      volumeMounts:
        - name: web
          mountPath: "/usr/share/nginx/html"
    - name: refresh
      image: alpine/git
      command:
        - sh
        - -c
        - watch -n 60 git pull
      workingDir: /usr/share/nginx/html
      volumeMounts:
        - name: web
          mountPath: "/usr/share/nginx/html"
  volumes:
    - name: web
      emptyDir: {}
容器を加えたrefresh 上のYAMLに.これはalpine/git イメージ、initコンテナと同じイメージ、そしてwatch -n 60 git pull コマンド.

The watch command periodically executes a command. In our case, it executes git pull command and updates the local repository every 60 seconds.


前に言及していない別のフィールドはworkingDir . このフィールドはコンテナの作業ディレクトリを設定します.我々はそれを設定している/usr/share/nginx/html ここで我々は元々initコンテナを使うためにrepoをクローンしました.
上記のYAMLをsidecar-container.yaml を使用してkubectl apply -f sidecar-container.yaml .
あなたが走るならばkubectl get pods initコンテナが実行されると、READY コラムを見る2/2 . これらの数字は、このポッドが合計2つのコンテナを持っていることをあなたに伝えます.
$ kubectl get po
NAME READY STATUS RESTARTS AGE
website 2/2 Running 0 3m39s
あなたがポートを前方にポッドにセットするならばkubectl port-forward pod/website 8000:80 コマンドをブラウザに開きますhttp://localhost:8000 , あなたは、以前と同じウェブページを見るでしょう.
私たちは別のターミナルウィンドウを開くことができますし、refresh コンテナ内部website pod
$ kubectl logs website -c refresh -f

Every 60.0s: git pull
Already up to date.
The watch コマンドが実行され、git pull コマンドはAlready up to date . を変えましょうindex.html あなたがフォークした倉庫で.
追加<div> 要素と更新方法index.html ファイルは以下のようになります:
<html>
  <head>
    <title>Hello from Simple-http-page</title>
  </head>
  <body>
    <h1>Welcome to simple-http-page</h1>
    <div>Hello!</div>
  </body>
</html>
次に、これをステージにして、master 枝.最も簡単な方法はGitthubのウェブページからです.開けるindex.html Githubについてhttps://github.com/peterj/simple-http-page/blob/master/index.html , しかし、あなたは私のユーザ名peterj あなたのユーザ名または組織を使用して、repoをフォークして、鉛筆アイコンをクリックしてファイルを編集します.

変更を加えるindex.html ファイルをクリックし、コミット変更ボタンをクリックして枝にコミットします.次に、出力を見るrefresh コンテナを参照してください.
Every 60.0s: git pull

From https://github.com/peterj/simple-http-page
   f804d4c..ad75286 master -> origin/master
Updating f804d4c..ad75286
Fast-forward
 index.html | 1 +
 1 file changed, 1 insertion(+)
上記の出力はリポジトリへの変更を示します.Gitは、更新されたファイルを共有ボリュームにプルします.最後に、あなたのブラウザをリフレッシュhttp://localhost:8000 ページの変更に気付きます.

あなたは、より多くの変更を行うことができますたびに、ページが60秒以内に更新されます.あなたが実行してポッドを削除することができますkubectl delete po website .