[ 言語選択: English ]

1. Example: Deploying PHP Guestbook application with Redis

kubernetes.ioで公開されている公式サンプルを、このk8sクラスターで実行する方法を説明します。

これはRedisというNon-SQLデータベースサーバーを利用したPHP言語で書かれたゲストブック(落書き)アプリです。

1.1. 基本的な方法

チュートリル2のページをみて、コマンドを実行していきますが、 ここでは -n $(id -n) を主に追加したコマンドのリストを掲載しておきます。

1.1.1. Database Server - Redisの起動

$ kubectl -n $(id -un) apply -f https://kubernetes.io/examples/application/guestbook/redis-leader-deployment.yaml
$ kubectl -n $(id -un) get pods -l app=redis
$ kubectl -n $(id -un) apply -f https://kubernetes.io/examples/application/guestbook/redis-leader-service.yaml
$ kubectl -n $(id -un) get service -l app=redis

1.1.2. Slave Database Serverの起動

$ kubectl -n $(id -un) apply -f https://kubernetes.io/examples/application/guestbook/redis-follower-deployment.yaml
$ kubectl -n $(id -un) get pods -l app=redis
$ kubectl -n $(id -un) apply -f https://kubernetes.io/examples/application/guestbook/redis-follower-service.yaml
$ kubectl -n $(id -un) get service -l app=redis

1.1.3. ゲストブックアプリケーションの起動

$ kubectl -n $(id -un) apply -f https://kubernetes.io/examples/application/guestbook/frontend-deployment.yaml
$ kubectl -n $(id -un) get pods -l app=guestbook
$ kubectl -n $(id -un) apply -f https://kubernetes.io/examples/application/guestbook/frontend-service.yaml
$ kubectl -n $(id -un) get services -l app=guestbook

下記のコマンドで現状を確認してください。

$ kubectl -n $(id -un) get all -l "app in (redis, guestbook)"

順調であれば次のような出力が得られるはずです。

NAME                                  READY   STATUS    RESTARTS   AGE
pod/frontend-767747dfdd-hgsl7         1/1     Running   0          5m48s
pod/frontend-767747dfdd-mnqt2         1/1     Running   0          5m48s
pod/frontend-767747dfdd-s8pz9         1/1     Running   0          5m48s
pod/redis-follower-86546888fd-488pt   1/1     Running   0          6m45s
pod/redis-follower-86546888fd-xzv4t   1/1     Running   0          6m45s
pod/redis-leader-55b556899d-r4lds     1/1     Running   0          9m2s

NAME                     TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
service/frontend         ClusterIP   10.233.9.162    <none>        80/TCP     7s
service/redis-follower   ClusterIP   10.233.50.148   <none>        6379/TCP   6m5s
service/redis-leader     ClusterIP   10.233.10.36    <none>        6379/TCP   6m58s

NAME                             READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/redis-follower   2/2     2            2           6m45s
deployment.apps/redis-leader     1/1     1            1           9m2s

NAME                                        DESIRED   CURRENT   READY   AGE
replicaset.apps/frontend-767747dfdd         3         3         3       5m48s
replicaset.apps/redis-follower-86546888fd   2         2         2       6m45s
replicaset.apps/redis-leader-55b556899d     1         1         1       9m2s

1.1.4. Viewing the Frontend Service via LoadBalancer

公式チュートリアルでは詳細に説明されていませんが、サービスにアクセスするためには、2つの方法があります。

  1. 公式チュートリアルのように、LoadBalancerを利用してEXTERNAL-IPを取得する

  2. cm/nginx-confを修正し、各個人のReverse Proxyを経由してアクセスする。

1.1.4.1. (1)のLoadBalancerを利用する

次のように変更します。

$ env EDITOR=emacs kubectl -n $(id -un) edit svc frontend

次のように .spec.type の値を、LoadBalancer に変更してください。

  sessionAffinity: None
  type: LoadBalancer
status:
  loadBalancer: {}
1.1.4.2. (2)のcm/nginx-confを変更する

次の要領で変更します。

$ env EDITOR=emacs kubectl -n $(id -un) edit cm nginx-conf

次のように、location /<your namespace/ { } の内部を、proxy_pass http://frontend/; のようにしてください。

apiVersion: v1
data:
  proxy.conf: |
    server {
      listen 80;
      location /<your namespace>/ {
        proxy_pass    http://frontend/;
      }
    }
kind: ConfigMap
metadata:

cm/nginx-confを変更した後は必ず、pod/my-proxy を再起動してください。

$ kubectl -n $(id -un) delete pod -l app=my-proxy

いずれかの方法でサービスにアクセスできるように変更し、Webブラウザからservice/frontend に割り当てられたゲストブックアプリにアクセスしてください。

1.2. 実行する上での考慮点 - editコマンドの説明

終盤で Creating the Frontend Service と書かれたServiceを登録するための手順が書かれています。

次のセクション Viewing the Frontend Service via NodePortでは minikubeコマンドを実行する箇所がありますが、このコマンドは存在しません。 その箇所の説明では、"If you deployed this application to Minikube or a local cluster, you need to find the IP address to view your Guestbook."となっていて、minikubeを利用しておらず、ローカルクラスターでもない、この環境では実行する必要がありません。

その反対に次の Viewing the Frontend Service via LoadBalancer は実行する必要があります。

主に次のような2通りの方法があると思うので、どちらかの方法で修正してください。

  1. https://kubernetes.io/examples/application/guestbook/frontend-service.yamlをダウンロードし、type: NodePorttype: LoadBalancerに修正したファイルを、再度$ kubectl -n $(id -un) apply -f <変更したファイル名>で定義を更新する。

  2. $ kubectl -n $(id -un) edit svc frontendを実行して、エディタを利用してtype: NodePorttype: LoadBalancerに書き換えて保存する。

kubectl editを実行するとviコマンドが起動します。まだうまく使えない場合には次のような方法でemacsを利用してください。

$ env EDITOR=emacs kubectl -n $(id -un) edit svc frontend

最終的に稼動したアプリケーションが動けば完了です。

guestbook

公式チュートリアルでは、そのまま削除(kubectl delete)する流れになっているので、Webブラウザから確認する前にkubectl deleteを実行しないように注意してください。

1.3. 使用した削除

削除は、applyした時のYAMLファイルを指定することで、漏れなく作成したオブジェクトの削除ができます。

$ kubectl -n $(id -un) delete -f https://kubernetes.io/examples/application/guestbook/frontend-deployment.yaml
$ kubectl -n $(id -un) delete -f https://kubernetes.io/examples/application/guestbook/frontend-service.yaml
$ kubectl -n $(id -un) delete -f https://kubernetes.io/examples/application/guestbook/redis-slave-deployment.yaml
$ kubectl -n $(id -un) delete -f https://kubernetes.io/examples/application/guestbook/redis-slave-service.yaml
$ kubectl -n $(id -un) delete -f https://kubernetes.io/examples/application/guestbook/redis-master-deployment.yaml
$ kubectl -n $(id -un) delete -f https://kubernetes.io/examples/application/guestbook/redis-master-service.yaml
## 最後に作成したpod, svcが削除されていることを確認する
$ kubectl -n $(id -un) get all

確認が終ったら、作成したPod, Service定義を削除してください。

1.4. 【上級者向け】Redisサーバーに保存されている内容の確認

まず適当なpod/frontendにログインします。

$ kubectl -n $(id -un) exec -it "$(kubectl -n $(id -un) get pod -l app=guestbook -o jsonpath='{.items[0].metadata.name}')" -- bash

このPodの中から、curlコマンドでRedisサーバーに接続します。

# curl telnet://redis-follower:6379
get guestbook

get guestbook を入力すると、それまでWebブラウザに入力したメッセージが表示されます。

$38
,test message by yasu-abe,next message