そこはかとなく

見て聞いて触ったことの技術メモ

Helidon Getting Started 3 -Kubernetes-

この記事について

今回は前回の続き、Helidonで生成されたDockerfile、マニフェストファイル(yaml)を使ってKubernetes上にコンテナイメージをデプロイします。

Kubernetesの環境準備

今回はOracle Container Engine for Kubernetes(OKE)を使用します。
OKEの作成方法はチャーリー様のブログを御覧ください。 charleysdiary.hatenablog.com

コンテナレジストリの準備

今回コンテナレジストリは OCI Registry(OCIR)を使用します。
OCIRの利用方法は別途整理します。

コンテナレジストリへログイン

OCIRにログインするにはdocker login <OCIRリージョンコード> を実行します。
Usernameは<テナント名>/<ユーザー名>を指定します。(例:gse00014510/api.user)
Passwordは生成したトークン文字列を入力します。

$ docker login iad.ocir.io
Username: gse00014510/api.user
Password:
WARNING! Your password will be stored unencrypted in /home/vagrant/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded

コンテナレジストリへイメージをPush

docker tagコマンドでイメージにタグを付加し、docker push コマンドでコンテナレジストリへイメージをPushします。
タグは<リージョンコード>/<テナント名>/<リポジトリ名>/quickstart-se:v1.0を指定します。

タグの生成

$ docker tag quickstart-se iad.ocir.io/gse00014510/test/quickstart-se:v1.0

イメージのPush

$ docker push iad.ocir.io/gse00014510/test/quickstart-se:v1.0

出力

The push refers to repository [iad.ocir.io/gse00014510/test/quickstart-se]
b7913ec2fe2b: Pushed
8f8cf55d8492: Pushed
9eed0f90b339: Pushed
9bca1faaa73e: Pushed
0c3170905795: Pushed
df64d3292fd6: Pushed
v1.0: digest: sha256:d44f34c60934ba859e6562b89fedbc91eba8b9c8754db334dfc8a5bad2e1c7e4 size: 1572

これでレジストリへイメージのPushが完了しました。

マニフェストyaml)の編集

Kubernetesクラスターにコンテナをデプロイするには、クラスター上の配置情報をマニフェストと呼ばれるファイルに記述しておく必要があります。 マニフェストに先程Pushしたコンテナイメージを指定します。

30行目 image: iad.ocir.io/gse00014510/test/quickstart-se:v1.0

kind: Service
apiVersion: v1
metadata:
  name: quickstart-se
  labels:
    app: quickstart-se
spec:
  type: NodePort
  selector:
    app: quickstart-se
  ports:
  - port: 8080
    targetPort: 8080
    name: http
---
kind: Deployment
apiVersion: extensions/v1beta1
metadata:
  name: quickstart-se
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: quickstart-se
        version: v1
    spec:
      containers:
      - name: quickstart-se
        image: iad.ocir.io/gse00014510/test/quickstart-se:v1.0 #ここを修正
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 8080
---

OKEにデプロイ

さて、いよいよKubernetesクラスターへデプロイします。
kubectl createコマンドでマニフェストファイルをKubernetesクラスターに作成(適用)します。

$ kubectl create -f app.yaml
service/quickstart-se created
deployment.extensions/quickstart-se created

リソースの起動確認

Podの起動を確認

$ kubectl get pods
NAME                             READY   STATUS    RESTARTS   AGE
quickstart-se-58bd689f5c-dptr9   1/1     Running   0          56s

Serviceの起動を確認

$ kubectl get service
NAME            TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGE
kubernetes      ClusterIP   10.96.0.1      <none>        443/TCP          1h
quickstart-se   NodePort    10.96.98.114   <none>        8080:30734/TCP   1m

アプリの動作確認

デフォルトで生成されるマニフェストにはServiceタイプにNodePortが使用されています。
NodePortはクラスターが可動しているマシン(ここではOracle CloudのVMインスタンス)の特定のPortを公開し、
そこに来たトラフィックをコンテナに届けます。

kubectl get node コマンドでクラスターが可動しているマシンのIPアドレスを確認します。

$ kubectl get node
NAME             STATUS   ROLES   AGE   VERSION
132.145.XXX.AA   Ready    node    1h    v1.11.5
132.145.XXX.BB   Ready    node    1h    v1.11.5
132.145.XXX.CC   Ready    node    1h    v1.11.5

kubectl get service コマンドでNodePortに割り振られたPort番号を確認します。

$ kubectl get service
NAME            TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
kubernetes      ClusterIP   10.96.0.1       <none>        443/TCP          1h
quickstart-se   NodePort    10.96.245.253   <none>        8080:30908/TCP   1m

IPアドレスとPort番号を指定してRESTサービスを呼び出します。

$ curl -X GET http://132.145.XXX.AA:30908/greet
{"message":"Hello World!"}

Kubernets上にコンテナデプロイしてアプリが動作しているのが確認できました!

これでHelidon Getting Startedは完了です。RESTサービスを僅かな手順で作成することができ、かつKubernetesへの展開を迅速に行うことが出来ます。
途中説明を省略してしまったOCIRの使用方法はまた別の機会に纏めたいと思います。

ご覧いただきありがとうございました。

この記事はOracle Cloud その2 Advent Calendar 2018 - Adventar18日目です。
3日連続の最終日です。(明後日も書きます。)