LoginSignup
17
8

More than 5 years have passed since last update.

gcloud kubectl コマンドを Dockerコンテナ経由で使う

Last updated at Posted at 2018-03-22

前置き

GCPのCLIであるgcloudを使用する場合、手元のMacまたはPCにCloud SDKをインストールする必要があります。
しかしこの手のツールやミドルウェアをインストールすると依存関係やら、バージョンアップ時になにかが壊れたりとか、トラブルに遭遇することが(気持ち的に)多く、あまりインストールしたくありません。😭

なのでgcloudそしてGKEで使うkubectlコマンドをコンテナに押し込めて使おうと思います。
1コマンドでglcoudを起動でき、ローカルのDocker imageにもアクセスできる環境を目指します。😤

いくつもコマンド叩かなきゃいけないようなら、ローカルにgcloud直接インストールしたほうがマシに思えてしまうし、ローカルのDocker imageにアクセスできないと、せっかくローカルでビルドしてあるDockerイメージを GCPのContainer Registryにpushできなくなっちゃいまからね〜。

Ubuntu 17.10でためしていますが、Macでもいけるはず..です。問題があればぜひご一報を🙏

本題

使用イメージ

googleオフィシャルな、google/cloud-sdk:alpine を使います。

レジストリはこちら。
https://hub.docker.com/r/google/cloud-sdk/

latestタグの方はdebianベースで全部入りなんで、苦労したくなければそっちを使ったほうがいいかもしれません。しかしサイズ1.5G😮もあるので、やめとくことにしました。軽さは大事。

Dockerfile

alpineベースのイメージはgcloud以外kubectlすら入っていない硬派タイプなので、Dockerfileを書いて最低限、kubectlだけは入れておく必要があります。
インタラクティブに作業するためのイメージなので、ENTRYPOINTにはbashを指定しておきます。
日々のタイピング量節約。

Dockerfile
FROM  google/cloud-sdk:alpine
MAINTAINER xxxxx <xxxxx@xxxxx.jp>

WORKDIR /root/

RUN apk update  \
    && apk upgrade  \
    && gcloud components install kubectl \
    && apk add docker --no-cache

ENTRYPOINT bash

これだとビルドしたイメージも600MBくらいですみます😊

docker-compose.yaml

このイメージをビルドして、適切なオプション渡してコンテナ起動してもいいんですが、オプションが結構多いので、docker-compose.yamlも書きます。

docker-compose.yaml
version: '3'
services:
  gcloud:
    build: .
    volumes:
      - ./work/:/root
      - ./config:/root/.config/gcloud
      - /var/run/docker.sock:/var/run/docker.sock
    environment:
      - CLOUDSDK_CONFIG=/root/.config/gcloud
      - PROJECT_ID=xxxxx

volumesとenvironmentがポイント。

まず、volumesの方から

  • ./work:/root workディレクトリを作業ディレクトリにする設定
    ここで作業することになるので、ふさわしい場所をマウントすると良いです。対象プロジェクトのディレクトリとか。

  • ./config:/root/.config/gcloud gcloudの設定を永続化するためにローカルに書き出す場所
    これをやっておかないと、毎回GCPにログインするハメになります。
    公式なgoogle/cloud-sdkのDockerファイルを見ると
    VOLUME ["/root/.config"]
    という記述があります。要するに設定ディレクトリをexportしているわけです。
    このSDKの使い方を見ると

    Once you authenticate successfully, credentials are preserved in the volume of the gcloud-config container.

というわけで、gcloud-config コンテナを立ててそのvolumeを共有しろ的なことが書いてあります。
credentialsを共有するためだけにコンテナを立てたくないし、永続化してほしいので、exportしているその先をさらにdocker-composeのvolumesでマウントしてやります。これでgcloud-config用のコンテナは必要なくなりました。😀

  • /var/run/docker.sock:/var/run/docker.sock これでホスト側で動いているdocker プロセスにコンテナ側から接続します。 これだけでイメージが共有できる。素晴らしい。

続いて envrionment。

  • CLOUDSDK_CONFIG=/root/.config/gcloud デフォルト値なんですが念の為指定

  • PROJECT_ID=xxxxx なにかと入用になるので、環境変数にGKEで発行したPROJECT_IDを指定しておきます。

使い方

こんなディレクトリ構成に配置。

+ Dockerfile
+ docker-compose.yml
+ config/
+ work/

おもむろに実行

docker-compose run gcloud

コンテナがビルドされ、コーヒー一杯飲み終える頃にはbashが起動します☕

gcloudコマンドを初期化

gcloud init

これでローカルにcloud-sdkをインストールしたのとほぼ変わらない使用感を実現できるはずです。

なお、これらのコードを、以下のリポジトリにあげています。

タイピング量削減のため、docker-composeのラッパーシェルgcloud.shもつけております。

これがあれば、gcloudコマンドを使用したい時は

./gcloud.sh

ですみます。
便利使っていただければと🌴

17
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
17
8