rm /blog

IT系技術職のおっさんがIT技術とかライブとか日常とか雑多に語るブログです。* 本ブログに書かれている内容は個人の意見・感想であり、特定の組織に属するものではありません。/All opinions are my own.*

【GCP】gcloudやkubectlを使ってGCPリソースを操作する簡易環境をDockerで作った

最近趣味でGCPを使ってちょこちょこ遊び始めたのと、ちょうどCKADを受験するにあたってKubernetesGCPでいえば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選ぶ必要もなかったかもしれない。