【GCP】gcloudやkubectlを使ってGCPリソースを操作する簡易環境をDockerで作った
最近趣味で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選ぶ必要もなかったかもしれない。