Edited at

OSX + Vagrant + CoreOSでKubernetesを試してみた

More than 5 years have passed since last update.

OSX + Vagrant + CoreOSでKubernetesを試してみたのでメモです。試した手順を多少整理して書いているので、そのままでは動かないかもしれません。


参考


手順


CoreOSをVagrantで起動してsshログイン

Running CoreOS on Vagrantを参考にVagrantfileを取得して起動します。Running Kubernetes Example on CoreOS, Part 1


a single node cluster will work for this tutorial.


とあるので、config.rb内の $num_instances は1のままで良いです。ということで、全てコメント行になっているconfig.rb.sampleをそのまま使いました。

git clone https://github.com/coreos/coreos-vagrant.git

cd coreos-vagrant
cp config.rb.sample
vagrant up

起動したらsshでログインします。

vagrant ssh


CoreOS上でKubernetesのサービスをセットアップ・起動

Running Kubernetes Example on CoreOS, Part 1の記述は古いので、kelseyhightower/kubernetes-coreosの手順に沿って実行します。


Kubernetesのインストールディレクトリを作成

ここはRunning Kubernetes Example on CoreOS, Part 1kelseyhightower/kubernetes-coreosを参考にした結果、以下のようにします。

sudo mkdir -p /opt/kubernetes 

sudo chown -R core: /opt/kubernetes
cd /opt/kubernetes


Kubernetesのバイナリをインストール

sudo mkdir -p /opt/bin

sudo wget http://storage.googleapis.com/kubernetes/binaries.tar.gz
sudo tar -xvf binaries.tar.gz -C /opt/bin

kubecfgにPATHが通っていることを確認します。

core@core-01 /opt/kubernetes/kubernetes $ which kubecfg

/opt/bin/kubecfg


Kubernetesのsystemdユニットファイルを追加

git clone https://github.com/kelseyhightower/kubernetes-coreos.git

sudo cp kubernetes-coreos/units/* /etc/systemd/system/


Kubernetesのサービス起動

sudo systemctl start apiserver

sudo systemctl start controller-manager
sudo systemctl start kubelet
sudo systemctl start proxy


podの一覧表示

まだ何も作成していないので空です。

core@core-01 /opt/kubernetes $ kubecfg list /pods

Name Image(s) Host Labels
---------- ---------- ---------- ----------


redisの例はうまく動きました

Running Kubernetes Example on CoreOS, Part 1のCreating a Kubernetes podの節の例を試してみました。

上記の記事では /opt/kubernetes/bin/kubecfg となっていますが、この記事では /opt/bin/kubecfg でPATHが通っているので、以下では単に kubecfg で起動します。また -h http://127.0.0.1:8080 のオプションは無くても動いたので省略しています。

CoreOS内の/opt/kubernetesで以下のコマンドを実行しました。

mkdir kubernetes-coreos/pods

cat <<EOF > kubernetes-coreos/pods/redis.json
{
"id": "redis",
"desiredState": {
"manifest": {
"version": "v1beta1",
"id": "redis",
"containers": [{
"name": "redis",
"image": "dockerfile/redis",
"ports": [{
"containerPort": 6379,
"hostPort": 6379
}]
}]
}
},
"labels": {
"name": "redis"
}
}
EOF

kubecfg -c kubernetes-coreos/pods/redis.json create /pods

しばらく(10分ぐらい?)放置してたら無事終了していました。pod一覧を表示してみます。

core@core-01 /opt/kubernetes $ kubecfg list /pods

Name Image(s) Host Labels
---------- ---------- ---------- ----------
redis dockerfile/redis 127.0.0.1/ name=redis

docker0インターフェースのIPアドレスを確認します。

core@core-01 /opt/kubernetes $ ip a show docker0

4: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP
link/ether 56:84:7a:fe:97:99 brd ff:ff:ff:ff:ff:ff
inet 10.1.42.1/16 scope global docker0
valid_lft forever preferred_lft forever
inet6 fe80::5484:7aff:fefe:9799/64 scope link
valid_lft forever preferred_lft forever

dockerでredisのクライアントを起動して動作確認します。

core@core-01 /opt/kubernetes $ docker run -t -i dockerfile/redis /usr/local/bin/redis-cli -h 10.1.42.1

10.1.42.1:6379> keys *
(empty list or set)
10.1.42.1:6379> set foo bar
OK
10.1.42.1:6379> get foo
"bar"
10.1.42.1:6379> exit

podを削除してみます。

core@core-01 /opt/kubernetes $ kubecfg delete /pods/redis

I0721 03:23:40.857563 03173 request.go:220] Waiting for completion of /operations/3
Status
----------
success

pod一覧から消えたことを確認します。

core@core-01 /opt/kubernetes $ kubecfg list /pods

Name Image(s) Host Labels
---------- ---------- ---------- ----------


kubernetesのソースに含まれるguestbookの例は途中からうまくいかず

GuestBook exampleのREADMEを参考に試しました。

git clone https://github.com/GoogleCloudPlatform/kubernetes

cd kubernetes


事前準備

GuestBook exampleStep Zero: Prerequisitesのうち、hack/dev-build-and-up.sh はGoogle Cloud Engineで試すときに必要なスクリプトのようですのでここでは実行しません。

hack/build-go.sh のほうは実行が必要そうなので試してみたらgoがインストールされていないというエラーが出ました。

その後以下の手順で進めてみてわかったのですが、hack/build-go.sh でビルドされるコマンドのファイル名は上記の「Kubernetesのバイナリをインストール」の節に書いた http://storage.googleapis.com/kubernetes/binaries.tar.gz からダウンロードしたものと同じでした。コマンドのファイルサイズは違いましたが、以下の「goのインストール」と hack/build-go.sh の実行は不要かもしれません。


goのインストール

core@core-01 ~ $ uname -m

x86_64

で確認するとx86_64なのでDownloads - The Go Programming Languageからgo1.3.linux-amd64.tar.gzをダウンロードしてインストールします。

GOPATHを~/goにしたいので、インストール先は/usr/local/goにしようと思ったのですが sudo mkdir /usr/local/go とか試してもRead-only file systemというエラーになるので /opt/goにインストールしました。

cd

wget http://golang.org/dl/go1.3.linux-amd64.tar.gz
sudo tar xf go1.3.linux-amd64.tar.gz -C /opt

あとはGOPATHのディレクトリを作っておきます。

mkdir ~/go

~/.bash_profileはシンボリックリンクになっていたので、

core@core-01 ~ $ ls -l ~/.bash_profile

lrwxrwxrwx 1 core core 34 Jul 16 02:52 /home/core/.bash_profile -> ../../usr/share/skel/.bash_profile

消してコピーして

core@core-01 ~ $ rm .bash_profile

core@core-01 ~ $ cp /usr/share/skel/.bash_profile .bash_profile

以下のように設定を追加しました(ただし、CoreOSの流儀に合っているかは不明です)。

cat <<'EOF' >> ~/.bash_profile


export GOROOT=/opt/go
export GOPATH=~/go
export PATH=$GOROOT/bin:$GOPATH/bin:$PATH
EOF

exec $SHELL -l

core@core-01 ~ $ which go

/opt/go/bin/go
core@core-01 ~ $ go version
go version go1.3 linux/amd64


hack/build-go.shを実行

core@core-01 ~ $ cd /opt/kubernetes/kubernetes

core@core-01 /opt/kubernetes/kubernetes $ hack/build-go.sh
+++ Building proxy
+++ Building integration
+++ Building apiserver
+++ Building controller-manager
+++ Building kubelet
+++ Building kubecfg

ビルド対象のソースはcmdディレクトリにありました。

core@core-01 /opt/kubernetes/kubernetes $ find cmd -type f -ls

8974 4 -rw-r--r-- 1 core core 3114 Jul 21 03:29 cmd/apiserver/apiserver.go
8976 4 -rw-r--r-- 1 core core 1905 Jul 21 03:29 cmd/controller-manager/controller-manager.go
8978 12 -rw-r--r-- 1 core core 9421 Jul 21 03:29 cmd/integration/integration.go
8980 8 -rw-r--r-- 1 core core 7687 Jul 21 03:29 cmd/kubecfg/kubecfg.go
8982 4 -rw-r--r-- 1 core core 3836 Jul 21 03:29 cmd/kubelet/kubelet.go
8984 4 -rw-r--r-- 1 core core 2187 Jul 21 03:29 cmd/proxy/proxy.go

ビルドされたバイナリはoutput/goディレクトリに作られていました。

core@core-01 /opt/kubernetes/kubernetes $ ls -l output/go

total 50852
-rwxr-xr-x 1 core core 10412840 Jul 21 14:23 apiserver
-rwxr-xr-x 1 core core 7893672 Jul 21 14:23 controller-manager
-rwxr-xr-x 1 core core 9233288 Jul 21 14:23 integration
-rwxr-xr-x 1 core core 8522640 Jul 21 14:23 kubecfg
-rwxr-xr-x 1 core core 8523160 Jul 21 14:23 kubelet
-rwxr-xr-x 1 core core 7471752 Jul 21 14:23 proxy
drwxr-xr-x 1 core core 20 Jul 21 14:23 src

/opt/binにインストールしたバイナリは以下の5つです。


  • apiserver

  • controll-manager

  • kubecfg

  • kubelet

  • proxy

output/goにはこれに加えてintegrationというバイナリも作られています。ソースを検索してみると


https

${KUBE_TARGET}/linux/amd64/integration


から呼び出されていて、インテグレーションテストに使うコマンドのようです。

サービスを止めてintegration以外の全てのファイルを/opt/bin/にコピーしました。

core@core-01 /opt/kubernetes/kubernetes $ sudo systemctl stop apiserver

core@core-01 /opt/kubernetes/kubernetes $ sudo systemctl stop controller-manager
core@core-01 /opt/kubernetes/kubernetes $ sudo systemctl stop kubelet
core@core-01 /opt/kubernetes/kubernetes $ sudo systemctl stop proxy
core@core-01 /opt/kubernetes/kubernetes $ sudo cp output/go/{apiserver,controller-manager,kubecfg,kubelet,proxy} /opt/bin

その後サービスを起動しました。

core@core-01 /opt/kubernetes/kubernetes $ sudo systemctl start apiserver

core@core-01 /opt/kubernetes/kubernetes $ sudo systemctl start controller-manager
core@core-01 /opt/kubernetes/kubernetes $ sudo systemctl start kubelet
core@core-01 /opt/kubernetes/kubernetes $ sudo systemctl start proxy

で、続きを実行してみたのですが、結局redis-slaveの起動が終わらないのは一緒でした。

core@core-01 /opt/kubernetes/kubernetes $ kubecfg -c examples/guestbook/redis-slave-controller.json create /replicationControllers

I0721 14:55:39.058324 01343 request.go:220] Waiting for completion of /operations/9
I0721 14:55:59.062134 01343 request.go:220] Waiting for completion of /operations/9
^C


redisのマスターを起動

レポジトリに含まれている設定ファイルを確認します。

core@core-01 /opt/kubernetes/kubernetes $ cat examples/guestbook/redis-master.json

{
"id": "redis-master-2",
"desiredState": {
"manifest": {
"version": "v1beta1",
"id": "redis-master-2",
"containers": [{
"name": "master",
"image": "dockerfile/redis",
"ports": [{
"containerPort": 6379,
"hostPort": 6379
}]
}]
}
},
"labels": {
"name": "redis-master"
}
}

以下のコマンドで起動します。

core@core-01 /opt/kubernetes/kubernetes $ kubecfg -c examples/guestbook/redis-master.json create /pods

I0721 03:47:11.215798 03349 request.go:220] Waiting for completion of /operations/8
I0721 03:47:31.218575 03349 request.go:220] Waiting for completion of /operations/8
Name Image(s) Host Labels
---------- ---------- ---------- ----------
redis-master-2 dockerfile/redis / name=redis-master

pod一覧を確認してみます。

core@core-01 /opt/kubernetes/kubernetes $ kubecfg list /pods

Name Image(s) Host Labels
---------- ---------- ---------- ----------
redis-master-2 dockerfile/redis 127.0.0.1/ name=redis-master

dockerの状態をdocker psで見てみました。

core@core-01 /opt/kubernetes/kubernetes $ docker ps

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e45fe7b25100 dockerfile/redis:latest redis-server /etc/re About a minute ago Up About a minute k8s--master--redis_-_master_-_2--4befd1d1
787bb5ddf655 busybox:buildroot-2014.02 sh -c 'rm -f nap && About a minute ago Up About a minute 0.0.0.0:6379->6379/tcp k8s--net--redis_-_master_-_2--f8803f12

GuestBook exampleのREADMEでは redis-server /etc/re の1行だけですが、ここでは2行表示されました。

GuestBook exampleのREADMEではGoogle Computing Engineで実行していますが、ここではCoreOS上で実行しているので、何か違いがあるようです。


マスターサービスを起動

GuestBook exampleのREADMEによると


A Kubernetes 'service' is a named load balancer that proxies traffic to one or more containers. The services in a Kubernetes cluster are discoverable inside other containers via environment variables. Services find the containers to load balance based on pod labels.


とのことです。

レポジトリに含まれている設定ファイルを確認します。

core@core-01 /opt/kubernetes/kubernetes $ cat examples/guestbook/redis-master-service.json

{
"id": "redismaster",
"port": 10000,
"selector": {
"name": "redis-master"
}
}

以下のコマンドで起動します。

core@core-01 /opt/kubernetes/kubernetes $ kubecfg -c examples/guestbook/redis-master-service.json create /services

I0721 03:56:40.888615 03412 request.go:220] Waiting for completion of /operations/9
Name Labels Selector Port
---------- ---------- ---------- ----------
redismaster name=redis-master 10000

サービス一覧を表示すると同じ内容になっています。

core@core-01 /opt/kubernetes/kubernetes $ kubecfg list /services

Name Labels Selector Port
---------- ---------- ---------- ----------
redismaster name=redis-master 10000


スレーブのpodを起動

レポジトリに含まれている設定ファイルを確認します。

core@core-01 /opt/kubernetes/kubernetes $ cat examples/guestbook/redis-slave-controller.json

{
"id": "redisSlaveController",
"desiredState": {
"replicas": 2,
"replicaSelector": {"name": "redisslave"},
"podTemplate": {
"desiredState": {
"manifest": {
"version": "v1beta1",
"id": "redisSlaveController",
"containers": [{
"image": "brendanburns/redis-slave",
"ports": [{"containerPort": 6379, "hostPort": 6380}]
}]
}
},
"labels": {"name": "redisslave"}
}},
"labels": {"name": "redisslave"}
}

起動してみたのですが、 Waiting for completion というのが繰り返し表示されていつまでも終わらないので、CtrlーCで止めました。

core@core-01 /opt/kubernetes/kubernetes $ kubecfg -c examples/guestbook/redis-slave-controller.json create /replicationControllers

I0721 04:24:00.818199 03499 request.go:220] Waiting for completion of /operations/67
I0721 04:24:20.823015 03499 request.go:220] Waiting for completion of /operations/67
I0721 04:24:40.826668 03499 request.go:220] Waiting for completion of /operations/67
…(略)…
^C

redis-slaveのDockerfileがレポジトリにも含まれていたので内容を確認してみると以下のようになっていました。

core@core-01 /opt/kubernetes/kubernetes $ cat examples/guestbook/redis-slave/Dockerfile

FROM dockerfile/redis

ADD run.sh /run.sh

RUN chmod a+x /run.sh

CMD /run.sh
core@core-01 /opt/kubernetes/kubernetes $ cat examples/guestbook/redis-slave/run.sh
#!/bin/bash

redis-server --slaveof $SERVICE_HOST $REDISMASTER_SERVICE_PORT

単にredis-serverを起動するだけなのに、こんなにかかるわけがないので何かおかしいようです。

/replicationControllers の一覧を表示してみると作成自体はできているようです。

core@core-01 /opt/kubernetes/kubernetes/examples/guestbook $ kubecfg list /replicationControllers

Name Image(s) Selector Replicas
---------- ---------- ---------- ----------
redisSlaveController brendanburns/redis-slave name=redisslave 2

/podsの一覧を表示してみます。Step Three: Turn up the replicated slave pods.だとbrendanburns/redis-slaveのpodが2つ表示されるのですが、手元の環境では1つだけでした。

core@core-01 /opt/kubernetes/kubernetes $ kubecfg list /pods

Name Image(s) Host Labels
---------- ---------- ---------- ----------
redis-master-2 dockerfile/redis 127.0.0.1/ name=redis-master
169d845e-108c-11e4-b2af-0800273da0c1 brendanburns/redis-slave 127.0.0.1/ name=redisslave,replicationController=redisSlaveController

何が起きているのかとその原因はよくわからないので、とりあえず先に勧めてみました。


redisスレーブ用のサービス起動

レポジトリに含まれている設定ファイルを確認します。

core@core-01 /opt/kubernetes/kubernetes $ cat examples/guestbook/redis-slave-service.json

{
"id": "redisslave",
"port": 10001,
"labels": {
"name": "redisslave"
},
"selector": {
"name": "redisslave"
}
}

サービスを起動します。

core@core-01 /opt/kubernetes/kubernetes $ kubecfg -c examples/guestbook/redis-slave-service.json create /services

I0721 04:44:42.565445 03593 request.go:220] Waiting for completion of /operations/128
Name Labels Selector Port
---------- ---------- ---------- ----------
redisslave name=redisslave name=redisslave 10001

これは問題なく終了しました。

/servicesと/podsの一覧を見てみます。

core@core-01 /opt/kubernetes/kubernetes $ kubecfg list /services

Name Labels Selector Port
---------- ---------- ---------- ----------
redismaster name=redis-master 10000
redisslave name=redisslave name=redisslave 10001

core@core-01 /opt/kubernetes/kubernetes $ kubecfg list /pods
Name Image(s) Host Labels
---------- ---------- ---------- ----------
redis-master-2 dockerfile/redis 127.0.0.1/ name=redis-master
169d845e-108c-11e4-b2af-0800273da0c1 brendanburns/redis-slave 127.0.0.1/ name=redisslave,replicationController=redisSlaveController


フロントエンドのpod作成

kubernetes/examples/guestbook/README.md at master · GoogleCloudPlatform/kubernetesを参考に進めます。

レポジトリ内の設定ファイルを確認します。

core@core-01 /opt/kubernetes/kubernetes $ cat examples/guestbook/frontend-controller.json

{
"id": "frontendController",
"desiredState": {
"replicas": 3,
"replicaSelector": {"name": "frontend"},
"podTemplate": {
"desiredState": {
"manifest": {
"version": "v1beta1",
"id": "frontendController",
"containers": [{
"image": "brendanburns/php-redis",
"ports": [{"containerPort": 80, "hostPort": 8000}]
}]
}
},
"labels": {"name": "frontend"}
}},
"labels": {"name": "frontend"}
}

brendanburns/php-redisのDockerfileと思われるものがexamples/guestbook/php-redis/に入っているのでこれも確認しておきます。

core@core-01 /opt/kubernetes/kubernetes $ cat examples/guestbook/php-redis/Dockerfile

FROM brendanburns/php

ADD index.php /var/www/index.php
ADD controllers.js /var/www/controllers.js
ADD index.html /var/www/index.html

CMD /run.sh
core@core-01 /opt/kubernetes/kubernetes $ cat examples/guestbook/php-redis/index.php
<?

set_include_path('.:/usr/share/php:/usr/share/pear:/vendor/predis');

error_reporting(E_ALL);
ini_set('display_errors', 1);

require 'predis/autoload.php';

if (isset($_GET['cmd']) === true) {
header('Content-Type: application/json');
if ($_GET['cmd'] == 'set') {
$client = new Predis\Client([
'scheme' => 'tcp',
'host' => getenv('SERVICE_HOST'),
'port' => getenv('REDISMASTER_SERVICE_PORT'),
]);
$client->set($_GET['key'], $_GET['value']);
print('{"message": "Updated"}');
} else {
$read_port = getenv('REDISMASTER_SERVICE_PORT');

if (isset($_ENV['REDISSLAVE_SERVICE_PORT'])) {
$read_port = getenv('REDISSLAVE_SERVICE_PORT');
}
$client = new Predis\Client([
'scheme' => 'tcp',
'host' => getenv('SERVICE_HOST'),
'port' => $read_port,
]);

$value = $client->get($_GET['key']);
print('{"data": "' . $value . '"}');
}
} else {
phpinfo();
} ?>
core@core-01 /opt/kubernetes/kubernetes $ cat examples/guestbook/php-redis/index.html
<html ng-app="redis">
<head>
<title>Guestbook</title>
<link rel="stylesheet" href="//netdna.bootstrapcdn.com/bootstrap/3.1.1/css/bootstrap.min.css">
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.12/angular.min.js"></script>
<script src="/controllers.js"></script>
<script src="ui-bootstrap-tpls-0.10.0.min.js"></script>
</head>
<body ng-controller="RedisCtrl">
<div style="width: 50%; margin-left: 20px">
<h2>Guestbook</h2>
<form>
<fieldset>
<input ng-model="msg" placeholder="Messages" class="form-control" type="text" name="input"><br>
<button type="button" class="btn btn-primary" ng-click="controller.onRedis()">Submit</button>
</fieldset>
</form>
<div>
<div ng-repeat="msg in messages">
{{msg}}
</div>
</div>
</div>
</body>
</html>
core@core-01 /opt/kubernetes/kubernetes $ cat examples/guestbook/php-redis/controllers.js
var redisApp = angular.module('redis', ['ui.bootstrap']);

/**
* Constructor
*/
function RedisController() {}

RedisController.prototype.onRedis = function() {
this.scope_.messages.push(this.scope_.msg);
this.scope_.msg = "";
var value = this.scope_.messages.join();
this.http_.get("/index.php?cmd=set&key=messages&value=" + value)
.success(angular.bind(this, function(data) {
this.scope_.redisResponse = "Updated.";
}));
};

redisApp.controller('RedisCtrl', function ($scope, $http, $location) {
$scope.controller = new RedisController();
$scope.controller.scope_ = $scope;
$scope.controller.location_ = $location;
$scope.controller.http_ = $http;

$scope.controller.http_.get("/index.php?cmd=get&key=messages")
.success(function(data) {
console.log(data);
$scope.messages = data.data.split(",");
});
});

以下のコマンドでサービスを起動します。

core@core-01 /opt/kubernetes/kubernetes $ kubecfg -c examples/guestbook/frontend-controller.json create /replicationControllers

I0721 04:47:55.237466 03614 request.go:220] Waiting for completion of /operations/138
I0721 04:48:15.242877 03614 request.go:220] Waiting for completion of /operations/138
I0721 04:48:35.246837 03614 request.go:220] Waiting for completion of /operations/138
…(略)…
^C

なかなか帰ってこないので、Ctrl-Cで止めて状態を確認してみました。

core@core-01 /opt/kubernetes/kubernetes $ kubecfg list /pods

Name Image(s) Host Labels
---------- ---------- ---------- ----------
redis-master-2 dockerfile/redis 127.0.0.1/ name=redis-master
169d845e-108c-11e4-b2af-0800273da0c1 brendanburns/redis-slave 127.0.0.1/ name=redisslave,replicationController=redisSlaveController
45ff7456-1092-11e4-b2af-0800273da0c1 brendanburns/php-redis 127.0.0.1/ name=frontend,replicationController=frontendController

core@core-01 /opt/kubernetes/kubernetes $ kubecfg list /replicationControllers
Name Image(s) Selector Replicas
---------- ---------- ---------- ----------
redisSlaveController brendanburns/redis-slave name=redisslave 2
frontendController brendanburns/php-redis name=frontend 3

core@core-01 /opt/kubernetes/kubernetes $ kubecfg list /services
Name Labels Selector Port
---------- ---------- ---------- ----------
redismaster name=redis-master 10000
redisslave name=redisslave name=redisslave 10001

curlでhttp://localhost:8000にアクセスしてみるとguestbookのページが返ってきました。

core@core-01 /opt/kubernetes/kubernetes $ curl http://localhost:8000

<html ng-app="redis">
<head>
<title>Guestbook</title>
<link rel="stylesheet" href="//netdna.bootstrapcdn.com/bootstrap/3.1.1/css/bootstrap.min.css">
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.12/angular.min.js"></script>
<script src="/controllers.js"></script>
<script src="ui-bootstrap-tpls-0.10.0.min.js"></script>
</head>
<body ng-controller="RedisCtrl">
<div style="width: 50%; margin-left: 20px">
<h2>Guestbook</h2>
<form>
<fieldset>
<input ng-model="msg" placeholder="Messages" class="form-control" type="text" name="input"><br>
<button type="button" class="btn btn-primary" ng-click="controller.onRedis()">Submit</button>
</fieldset>
</form>
<div>
<div ng-repeat="msg in messages">
{{msg}}
</div>
</div>
</div>
</body>
</html>

OSXでChromeで http://172.17.8.101:8000/ を開いてみると、以下のように表示はできていました。

guestbook.png

ですが、何か入力してSubmitを押しても何も起きません。

http://172.17.8.101:8000/ をリロードしてChromeのdevtoolのコンソールを見てみるとJavaScriptのエラーが起きていました。

guestbook_js_error.png

br />

<b>Fatal error</b>: Uncaught exception 'Predis\Connection\ConnectionException' with message 'Connection refused [tcp://127.0.0.1:10000]' in /vendor/predis/predis/lib/Predis/Connection/AbstractConnection.php:141
Stack trace:
#0 /vendor/predis/predis/lib/Predis/Connection/StreamConnection.php(96): Predis\Connection\AbstractConnection-&gt;onConnectionError('Connection refu...', 111)
#1 /vendor/predis/predis/lib/Predis/Connection/StreamConnection.php(70): Predis\Connection\StreamConnection-&gt;tcpStreamInitializer(Object(Predis\Connection\ConnectionParameters))
#2 /vendor/predis/predis/lib/Predis/Connection/AbstractConnection.php(96): Predis\Connection\StreamConnection-&gt;createResource()
#3 /vendor/predis/predis/lib/Predis/Connection/StreamConnection.php(144): Predis\Connection\AbstractConnection-&gt;connect()
#4 /vendor/predis/predis/lib/Predis/Connection/AbstractConnection.php(181): Predis\Connection\StreamConnection-&gt;connect()
#5 /vendor/predis/predis/lib/Predis/Connection/StreamConnection.php(183): Predis\Connection\AbstractConnection-&gt;ge in <b>/vendor/predis/predis/lib/Predis/Connection/AbstractConnection.php</b> on line <b>141</b><br />
controllers.js:26

TypeError: Cannot read property 'split' of undefined
at http://172.17.8.101:8000/controllers.js:27:37
at https://ajax.googleapis.com/ajax/libs/angularjs/1.2.12/angular.min.js:66:373
at A (https://ajax.googleapis.com/ajax/libs/angularjs/1.2.12/angular.min.js:93:5)
at A (https://ajax.googleapis.com/ajax/libs/angularjs/1.2.12/angular.min.js:93:5)
at https://ajax.googleapis.com/ajax/libs/angularjs/1.2.12/angular.min.js:94:173
at h.$eval (https://ajax.googleapis.com/ajax/libs/angularjs/1.2.12/angular.min.js:102:456)
at h.$digest (https://ajax.googleapis.com/ajax/libs/angularjs/1.2.12/angular.min.js:100:218)
at h.$apply (https://ajax.googleapis.com/ajax/libs/angularjs/1.2.12/angular.min.js:103:264)
at f (https://ajax.googleapis.com/ajax/libs/angularjs/1.2.12/angular.min.js:67:120)
at H (https://ajax.googleapis.com/ajax/libs/angularjs/1.2.12/angular.min.js:71:191) angular.js:9435

predisが tcp://127.0.0.1:10000 に繋ぎに行こうとして失敗しているようです。なぜポート10000なのかが謎です。上記のindex.phpを見るとREDISSLAVE_SERVICE_PORT環境変数が設定されていればその値で、設定されていなければREDISMASTER_SERVICE_PORT環境変数の値を使うようになっています。

この時点でdocker psは以下のようになっていました。

core@core-01 /opt/kubernetes/kubernetes $ docker ps --no-trunc

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
150252488eb48d673ea27cc624f67d19894b0e6f7131b000d7f257b0fddff450 brendanburns/php-redis:latest /bin/sh -c /run.sh 46 minutes ago Up 46 minutes k8s----45ff7456_-_1092_-_11e4_-_b2af_-_0800273da0c1--8fafe560
d0c0d44598a1fc7e18bf3e37d4332dad2af23a61644092d3f7fb24344d6e0a1d busybox:buildroot-2014.02 sh -c 'rm -f nap && mkfifo nap && exec cat nap' 50 minutes ago Up 50 minutes 0.0.0.0:8000->80/tcp k8s--net--45ff7456_-_1092_-_11e4_-_b2af_-_0800273da0c1--94270597
0f4f8e809955377da2c176e0114795fa23d38f7d18e6237e27332a8a861ec101 brendanburns/redis-slave:latest /bin/sh -c /run.sh About an hour ago Up About an hour k8s----169d845e_-_108c_-_11e4_-_b2af_-_0800273da0c1--c8c817c2
56c29b155bab49ac10f76e963c7c431555accb4881a9d9dcf12952ed85265738 busybox:buildroot-2014.02 sh -c 'rm -f nap && mkfifo nap && exec cat nap' About an hour ago Up About an hour 0.0.0.0:6380->6379/tcp k8s--net--169d845e_-_108c_-_11e4_-_b2af_-_0800273da0c1--196db470
e45fe7b2510009127e2700cb628a2ac2fc3cfafff2278040d2d0d26fc21a6935 dockerfile/redis:latest redis-server /etc/redis/redis.conf About an hour ago Up About an hour k8s--master--redis_-_master_-_2--4befd1d1
787bb5ddf655ef576b1425f64772291296ce5cc983836153787a56587ad41c85 busybox:buildroot-2014.02 sh -c 'rm -f nap && mkfifo nap && exec cat nap' About an hour ago Up About an hour 0.0.0.0:6379->6379/tcp k8s--net--redis_-_master_-_2--f8803f12

redisのスレーブは6380、マスターは6379なので、10000になるのは何か変です。ひょっとすると、Docker Hubに登録されているbrendanburns/php-redisイメージのDockerfileやindex.phpは上記で確認したのとは違うのかもしれません。

疲れてきたので、とりあえず今回はこの辺で。気が向いたら、Docker Hubから落とすのではなく、ローカルでdocker buildして再度試してみます。