GKEにAPIをデプロイする
経緯
仕事でJavaで作成したAPIをGKEにデプロイしてくださいと言われた際に、色々やってデプロイしたのでその時の記憶を備忘として載せます。
## 前提
・Mavenプロジェクトで作成したアプリであること(違う場合は都度読み替える必要あり)
・デプロイする対象のワークロードが存在すること
・Cloud SDKのインストールを済ませていて対象のプロジェクトの認証が済んでいること
(参考:https://qiita.com/Quasar9/items/c5c633078ae091328260)
・Dockerのインストールが済んでいること
デプロイしたいAPI
@RestController
@RequestMapping("/sample4")
public class Sample4Controller {
@GetMapping("/hoges")
public ResponseEntity<SampleResponse> getHogeResponses() {
SampleResponse response = new SampleResponse();
List<Hoge> hogeList = new ArrayList<>();
hogeList.add(new Hoge("1", "hoge1", "explanation1"));
hogeList.add(new Hoge("2", "hoge2", "explanation2"));
response.setHogeList(hogeList);
return new ResponseEntity<>(response, new HttpHeaders(), HttpStatus.OK);
}
}
@Data
@NoArgsConstructor
public class SampleResponse {
private List<Hoge> hogeList;
}
@Data
@AllArgsConstructor
public class Hoge {
private String id;
private String name;
private String explanation;
}
GKEへデプロイする方法
次の2つが主な手順となる。
・DockerイメージをContainer Registryに登録する
・Container Registryに登録したイメージをワークロードのデプロイメントに指定する
DockerイメージをContainer Registryに登録する
今回はJibを使ってDockerイメージを作成する。
使い方としてはpomに下記を追加する。
<plugin>
<groupId>com.google.cloud.tools</groupId>
<artifactId>jib-maven-plugin</artifactId>
<version>2.8.0</version>
<configuration>
<allowInsecureRegistries>true</allowInsecureRegistries>
<to>
<image>asia.gcr.io/project-id/test:tag</image>
</to>
<container>
<environment>
<TZ>Asia/Tokyo</TZ>
<LANG>C.UTF-8</LANG>
</environment>
</container>
</configuration>
</plugin>
下記の部分はContainer Registryのパスを指定する。
また、:の後はイメージのタグを任意の名称でつける。
<to>
<image>asia.gcr.io/project-id/test:tag</image>
</to>
Jibの設定をしたら下記のコマンドを実行してイメージの作成&Container RegistryへのPUSHをする。※
mvn compile jib:build
下記オプションでタイムアウト値も設定できる。
-D jib.httpTimeout=80000
Container Registryを見てimageがPUSHされているかを確認する。
※ コマンドを実行した際にエラーがあった場合、認証情報を確認する。
また、下記のコマンドを実行してDockerにContainer RegistryにPUSHするための認証情報を設定する。
gcloud auth configure-docker
Container Registryに登録したイメージをワークロードのデプロイメントに指定する
ここまでの手順でContainer Registryにimageの登録が済んでいるので、デプロイ対象のワークロードを選択してデプロイメントにimageを設定して保存する。
spec:
containers:
image: <imageのpath>:<tag名>
変更を保存すれば最新のイメージでワークロードが更新される。
ロードバランサを作成して公開する
Kubernetes Engine >> ワークロード >> 対象のワークロードを選択 >> 公開タブをクリック >> 任意のPORTを指定してサービスタイプをロードバランサを選択して公開をクリック
上記で作成されたIPとPORTとAPIで指定したEnd Pointに対してリクエストを送ってレスポンスが返れば成功。