$ 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. 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の起動
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つの方法があります。
-
公式チュートリアルのように、LoadBalancerを利用してEXTERNAL-IPを取得する
-
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通りの方法があると思うので、どちらかの方法で修正してください。
-
https://kubernetes.io/examples/application/guestbook/frontend-service.yamlをダウンロードし、type: NodePortをtype: LoadBalancerに修正したファイルを、再度$ kubectl -n $(id -un) apply -f <変更したファイル名>で定義を更新する。
-
$ kubectl -n $(id -un) edit svc frontendを実行して、エディタを利用してtype: NodePortをtype: LoadBalancerに書き換えて保存する。
kubectl editを実行するとviコマンドが起動します。まだうまく使えない場合には次のような方法でemacsを利用してください。
$ env EDITOR=emacs kubectl -n $(id -un) edit svc frontend
最終的に稼動したアプリケーションが動けば完了です。
公式チュートリアルでは、そのまま削除(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