kubernetesに入門してみる

spring cloudで遊んでみよーとおもったので、まずはkubernetesから触ってみることにした。
触ってきたメモ的な感じで残してく。

環境

Kubernetesを有効化

DockerのSettingsを開いてKubernetesからぽちっと有効化してあげる
f:id:orekyuu:20190910222346p:plain

Applyするとインストールが始まるので終わるまでしばらく待つ
f:id:orekyuu:20190910222452p:plain

終わったらとりあえずkubectlコマンドが使えるはずなので kubectl version あたりを叩いて確認するとよき

動かしてみる

とりあえず簡単なSpring Bootアプリケーションをデプロイしてみる。
こんなかんじのアプリケーションを作って

@SpringBootApplication
@Controller
public class HelloApplication {

    public static void main(String[] args) {
        SpringApplication.run(HelloApplication.class, args);
    }

    @GetMapping
    @ResponseBody
    public String hello() {
        return "hello " + LocalDateTime.now().format(DateTimeFormatter.ISO_DATE_TIME);
    }
}

Jibを使ってイメージを作る
デフォルトのベースイメージだとJDK12サポートしてないからベースイメージにはopenjdk:12を使うよ
あとたくさんアプリ作りそうなのでマルチプロジェクト構成にしておく

plugins {
    id 'java'
    id 'org.springframework.boot' version '2.1.8.RELEASE' apply false
    id 'io.spring.dependency-management' version '1.0.8.RELEASE' apply false
    id 'com.google.cloud.tools.jib' version '1.5.1' apply false
}

repositories {
    jcenter()
}

subprojects {
    apply plugin: 'org.springframework.boot'
    apply plugin: 'io.spring.dependency-management'
    apply plugin: 'com.google.cloud.tools.jib'

    sourceCompatibility = 12

    def defaultEncoding = 'UTF-8'
    [AbstractCompile, Javadoc].each {
        tasks.withType(it).each { it.options.encoding = defaultEncoding }
    }

    repositories {
        jcenter()
    }

    jib {
        to {
            image = "net.orekyuu/" + project.name
        }
        from {
            image = "openjdk:12" // JDK12を使いたい場合は明示的にベースイメージ設定しておこう
        }
    }
}

gradlew :hello:jibDockerBuild を叩いてイメージを作る。Jib便利~。

D:\repos\spring-illust-service>gradlew :hello:jibDockerBuild

Containerizing application to Docker daemon as net.orekyuu/hello...
The base image requires auth. Trying again for openjdk:12...

Container entrypoint set to [java, -cp, /app/resources:/app/classes:/app/libs/*, net.orekyuu.hello.HelloApplication]

Built image to Docker daemon as net.orekyuu/hello
Executing tasks:
[==============================] 100.0% complete


BUILD SUCCESSFUL in 5m 52s
2 actionable tasks: 1 executed, 1 up-to-date

ビルドできたっぽいのでコンテナを動かしてみて動くことを確認
docker run -p 8080:8080 net.orekyuu/hello
ブラウザでlocalhost:8080を見るとちゃんとメッセージが見れたのでヨシ!

docker-compose.ymlでデプロイする

compose-on-kubernetesとやらでkubernetesにdocker-compose.ymlの定義に従ってコンテナをデプロイできるっぽいので使ってみる。とりあえず動かしたいしね。
とりあえずhelloアプリだけ起動するようにdocker-compose.ymlを用意。

version: '3.7'

services:
  hello-app:
    image: net.orekyuu/hello:latest
    ports:
      - 8080:8080

つぎにデプロイはdocker stack deployでできるらしい。docker-swarmと一緒だけどorchestratorオプションでkubernetesを指定できるらしい。なるほど。
stack名はhelloでデプロイ

D:\repos\spring-illust-service>docker stack deploy --orchestrator=kubernetes -c docker-compose.yml hello
Waiting for the stack to be stable and running...
hello-app: Pending              [pod status: 0/1 ready, 1/1 pending, 0/1 failed]

起動待ちがやけに長い…?

D:\repos\spring-illust-service>kubectl get all
NAME                             READY   STATUS             RESTARTS   AGE
pod/hello-app-557fc5fb78-b28md   0/1     ImagePullBackOff   0          5m33s

NAME                          TYPE           CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGE
service/hello-app             ClusterIP      None           <none>        55555/TCP        5m33s
service/hello-app-published   LoadBalancer   10.99.53.170   localhost     8080:32717/TCP   5m32s
service/kubernetes            ClusterIP      10.96.0.1      <none>        443/TCP          71m

NAME                        READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/hello-app   0/1     1            0           5m33s

NAME                                   DESIRED   CURRENT   READY   AGE
replicaset.apps/hello-app-557fc5fb78   1         1         0       5m33s

pod/hello-app-...のSTATUSがImagePullBackOffのままずっと動いてないっぽい。
おそらくローカルのイメージが見えてなくてpullをずっと待ってるのかな。明日は適当なレジストリ立てて試してみよ~