最近趣味でGCPを使ってちょこちょこ遊び始めたのと、ちょうどCKADを受験するにあたってKubernetes(GCPでいえばGKE)を使いたく、その辺を操作する環境が欲しかったので作った。 また似たような環境が必要になったときのための備忘録。


はじめに

gcloud コマンドとか Kubernetes コマンドを打つだけなら自分のマシンにインストールすれば使えるのだが、私のパソコンはWindowsなので、Linux環境下でクラスタを操作する環境が欲しかった。 (CKADの試験環境がUbuntuなので、とりあえずLinux環境が欲しかった) でDockerコンテナにその辺全部詰め込んで起動させちまえばいいかという発想に至った。

Dockerfile

gcloudのオフィシャルDockerイメージをベースにちょっと改造しただけ。

FROM google/cloud-sdk:alpine

# install kubectl
#RUN gcloud components install kubectl
WORKDIR /root/
RUN curl -LO https://storage.googleapis.com/kubernetes-release/release/v1.19.6/bin/linux/amd64/kubectl
RUN mv /root/kubectl /usr/local/bin
RUN chmod a+x /usr/local/bin/kubectl

# COPY service-account file
COPY [Service AccoundのJSONファイル] /root/

# gcloud setting
RUN gcloud auth activate-service-account --key-file=/root/[Service AccoundのJSONファイル]
RUN gcloud config set project [あなたのプロジェクト名]

# get kubeconfig
RUN gcloud container clusters get-credentials [クラスター名] --zone=[ゾーン名]
  • 元々はGKEというよりGCP環境をある程度自由に触れる個人用のコンテナを作ろうと思っただけなので、そういう意味では kubectl はオマケである。 Service AccountのJSONファイルを設定して、プロジェクトをconfigしてるところで、最初の目的の部分は満たしている。
  • 事前にService Accountを作成し、キーjsonファイルを取得しておき、かつ docker build を実行するのと同じ場所に配置しておく必要がある。 (COPY でイメージ内にコピーかけてるためである。ここのパス指定を変えればjsonファイルはどこに配置しておいても良い。というか今にして思うと gcloud で取れそうな気もする。良く調べてない。) このあたりとか見てやってください。 また、Service Accountには最低限KubernetesとCompute Engineに関連する権限がないと動かないので注意。
  • 上で書いてる公式イメージはgcloudのCLIしか入ってないので、kubectl を別途導入している。 ただkubernetes.ioに書いてあるgcloudのSDKの一部としてダウンロードする方法、つまり gcloud components install kubectl だと(上のDockerfileでコメントしてるところ)何故かイメージサイズが1.6Gを超えるほど馬鹿でかくなってしまったので、素直にcurlでいれるようにしたら689MBまでサイズが下がり、かつ一応ちゃんと動作したので、これを使うことにしている。 なお上記のDockerファイル内ではv19.6のバージョンをべた書きしているが、ここは各自環境に合わせて変更していただきたい。
  • 最後の gcloud container clusters get-credentials [クラスター名] --zone=[ゾーン名]~/.kube/config を作成するコマンドである(kubectl --kubeconfig=.... のオプションに指定できるconfigファイルを作成する) ちなみに既存の ~/.kub/config ファイルが存在する場合は追記更新になる。 また、--zone=... のオプションはゾーン用クラスターに対するconfigの取得方法である。 リージョナルだと --region=... という引数になる。 ただリージョナルの場合、クラスター作成にあたってインスタンス数の作成上限引き上げが事前に必要になる(これをしてないとクラスター作成が失敗する) 最初そのやり方がわからず作れなかったので、その名残でゾーンになっている。 インスタンス数の作成上限引き上げはこのQiitaが詳しい

これを docker build -t [イメージ名] . でビルドして docker run --rm -d -t [イメージ名] で動かして 返ってきたコンテナIDで docker exec -it [コンテナID] /bin/sh で接続する。 単にホストから gcloud を実行したいだけなら docker run --rm -it [イメージ名] gcloud iam service-accounts list みたいな感じで実行可能。

今さら

今さらよく見てみたらUbuntuではないがDebianベースのイメージはあるみたいだ。。 わざわざalpine選ぶ必要もなかったかもしれない。