Kubernetes Meetup #2 の補足

昔のことだが Kubernetes Meetup #2 で LT をする機会をもらった。

このときはマイクロサービスを実現するために Docker Registry をどう運用するか、というテーマで話した。5分の枠で話したことなので、詳細は省略せざるを得なかった。話しきれなかったことをブログにて補記しようと思う。

プライベートな Docker Registry

LT では Docker Registry へのアクセスを制限する方法について、二つ紹介した。簡単に実現できる方から解説していこう。

例えば AWS (Amazon Web Services)VPC (Virtual Private Cloud) を使うと仮定し、パブリックサブネットとプライベートサブネットが中にあるとする。Docker Registry は VPC の中でのみアクセス可能であればいいから、これはプライベートサブネットに配置する。

プライベートサブネットにある Docker Registry にどうコンテナをプッシュすればいいのだろうか? また、開発環境で Docker Registry にあるコンテナが必要になったとき、どうプルすればいいのだろう?

パブリックサブネットに踏み台サーバを用意して、そこを経由してアクセスするようにすればいい。

具体的には次のようになるだろう。

SSH Tunnel for Docker Registry

(注意: 本文中で Docker Registry と書いているものと図中の Private Registry は同じ)

踏み台を通した Docker Registry へのアクセス

次の三つの条件は満たしているものとする。

  1. インターネットから踏み台サーバへ 22番ポートで SSH 接続が可能
  2. 踏み台サーバから Docker Registry へ 22番ポートで SSH 接続が可能
  3. 踏み台サーバから Docker Registry へ 5000番ポートで Docker Registry への接続が可能

このとき、次のコマンドを実行して踏み台サーバ越しにDockerコンテナを取得できる。

(SSHトンネルの作成)
$ ssh -N -L 5000:docker-registry.example.jp:5000 user-name@fumidai.example.jp

(ローカルホストの5000番ポートを通して、Docker Registry から ubuntu コンテナを取得)
$ docker pull localhost:5000/ubuntu:latest

ここで ssh コマンドに渡したオプションの意味は次の通り。

  • -N 接続先でコマンドを実行しない。 (ポートフォワードをしたいときに指定する)
  • -L “ポート:ホスト:ホスト側ポート” のように指定する。localhost の “ポート” が “ホスト” の “ホスト側ポート” に転送されるようにする。

こうして、簡単にセキュアな Docker Registry を設定できる。

残る課題

ここまでで、踏み台へアクセス可能なユーザしかアクセスできない Docker Registry を作ることができた。ただ、もっと粒度の高いコントロールをしたいこともあるだろう。例えば「コンテナAにはユーザBからだけアクセスさせたい」というような場合だ。これについては、後のポストで書く。

コメントを残す

コメントを投稿するには、以下のいずれかでログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中