ここからは、Kubernetesを使って単独ホスト上でクラスター環境を作成する手順を記載します(参考)。KubernetesはGuestbookサンプルを持っており、こちらを使いクラスター環境を構築し実行していきます。
今回構築した環境は下記です。
AWSの「RightImage_CentOS_7.0_x64_v14.1.4_HVM_EBS」のイメージを使って作成しました。「t2.micro」インスタンスではKubernetes起動時に「Cannot allocate memory」が発生してしまうので、「t2.small」インスタンスで検証しています。セキュリティグループはSSH、TCP8000を解放しています。
なお下記手順のdockerコマンドなどは、注釈がない限りは全てローカルのLinux環境から実行しています。
まずは、Kubernetesのインストールです。インストールされている全てのパッケージを最新の状態にします。
yum -y clean all yum -y update
次は、SELinuxなどのインストールです。ファイアウオールの制御を行うためにSELinuxなどをインストールします。
yum -y install selinux-policy-targeted policycoreutils-python yum -y install e4fsprogs
Kubernetesが使用するGo言語、Git、Dockerをインストールします。
yum -y install golang yum -y install git yum -y install docker systemctl enable docker.service systemctl start docker.service
Kubernetesが使用するetcdをインストールします。
git clone https://github.com/coreos/etcd.git /opt/etcd cd /opt/etcd ./build cp -a bin/etcd /usr/local/sbin/.
Kubernetesをインストールします。
git clone https://github.com/GoogleCloudPlatform/kubernetes.git /opt/kubernetes
ファイアウオールを無効化します。
systemctl stop firewalld systemctl disable firewalld setenforce 0
エディターで「/etc/sysconfig/selinux」の「SELINUX=enforcing」を「SELINUX=disabled」に変更します。
Kubernetesを起動します。
cd /opt/kubernetes export KUBERNETES_PROVIDER=local export KUBERNETES_MASTER=http://localhost:8080 hack/local-up-cluster.sh
redis-masterのReplicationControllerを作成し、他のコンテナーからアクセスできるようにServiceを作成します(このときにRedisをdocker pullします)。
cluster/kubectl.sh create -f examples/guestbook/redis-master-controller.json <--- ReplicationControllerの作成(Pod含む) cluster/kubectl.sh create -f examples/guestbook/redis-master-service.json <--- Serviceの作成
ReplicationControllerとServiceが作成されていることを確認(StatusがRunningになっています)。
[root@ip-<IP> kubernetes]# cluster/kubectl.sh get rc
CONTROLLER CONTAINER(S) IMAGE(S) SELECTOR REPLICAS
redis-master master redis name=redis-master 1
[root@ip-<IP> kubernetes]# cluster/kubectl.sh get pods
POD IP CONTAINER(S) IMAGE(S) HOST LABELS STATUS CREATED MESSAGE
redis-master-ludvo 172.17.0.1 127.0.0.1/127.0.0.1 name=redis-master Running About a minute
master redis
[root@ip-<IP> kubernetes]# cluster/kubectl.sh get services
NAME LABELS SELECTOR IP(S) PORT(S)
kubernetes component=apiserver,provider=kubernetes <none> <IP> 443/TCP
kubernetes-ro component=apiserver,provider=kubernetes <none> <IP> 80/TCP
redis-master name=redis-master name=redis-master <IP> 6379/TCP 10.0.0.81 6379
redis-slaveのReplicationControllerとServiceを作成します(このときにdocker pullでコンテナーを取得しPodを作成します)。
brendanburns/redis-slaveイメージは下記にあります。このDockerファイルはrun.shを使ってイメージを実行します。
このrun.shの中で「redis-server --slaveof redis-master 6379」コマンドを実行しslave化を行っています(本来は手動で実行してslave化を行います)。
cd /opt/kubernetes
cluster/kubectl.sh create -f examples/guestbook/redis-slave-controller.json <--- ReplicationControllerの作成(Pod含む)
cluster/kubectl.sh create -f examples/guestbook/redis-slave-service.json <--- Serviceの作成
[root@ip-<IP> kubernetes]# cluster/kubectl.sh get rc
CONTROLLER CONTAINER(S) IMAGE(S) SELECTOR REPLICAS
redis-master master redis name=redis-master 1
redis-slave slave kubernetes/redis-slave:v2 name=redis-slave 2
[root@ip-<IP> kubernetes]# cluster/kubectl.sh get pods
POD IP CONTAINER(S) IMAGE(S) HOST LABELS STATUS CREATED MESSAGE
redis-master-ludvo <IP> 127.0.0.1/127.0.0.1 name=redis-master Running 7 minutes
master redis Running 7 minutes
redis-slave-r9euz 127.0.0.1/ name=redis-slave Pending About a minute
slave kubernetes/redis-slave:v2
redis-slave-t6vf2 127.0.0.1/ name=redis-slave Pending About a minute
slave kubernetes/redis-slave:v2
[root@ip-<IP> kubernetes]# cluster/kubectl.sh get services
NAME LABELS SELECTOR IP(S) PORT(S)
kubernetes component=apiserver,provider=kubernetes <none> <IP> 443/TCP
kubernetes-ro component=apiserver,provider=kubernetes <none> <IP> 80/TCP
redis-master name=redis-master name=redis-master <IP> 6379/TCP
redis-slave name=redis-slave name=redis-slave <IP> 6379/TCP
先ほどの図にあるfrontend(HTMLクライアント)のReplicationControllerを作成します(このときにdocker pullでコンテナーを取得しPodを作成します)。
cluster/kubectl.sh create -f examples/guestbook/frontend-service.json [root@ip-<IP> kubernetes]# cluster/kubectl.sh get rc CONTROLLER CONTAINER(S) IMAGE(S) SELECTOR REPLICAS frontend php-redis kubernetes/example-guestbook-php-redis:v2 name=frontend 3 redis-master master redis name=redis-master 1 redis-slave slave kubernetes/redis-slave:v2 name=redis-slave 2
frontendのServiceを作成します。
cluster/kubectl.sh create -f examples/guestbook/frontend-service.json [root@ip-<IP> kubernetes]# cluster/kubectl.sh get services NAME LABELS SELECTOR IP PORT kubernetes component=apiserver,provider=kubernetes <IP> 443 redis-master name=redis-master name=redis-master <IP> 6379 redisslave name=redisslave name=redisslave <IP> 6379 frontend name=frontend name=frontend <IP> 80 kubernetes-ro component=apiserver,provider=kubernetes <IP> 80
frontendのServiceのIPとPortにアクセスします。
[root@ip-<IP> kubernetes]# curl http://<IP>:80
<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>
frontendのServiceのIPアドレスはDockerのIPアドレス空間のもののため外部からアクセスできません。そのため、frontendのReplicationControllerにホストとのポートのリンクを作成し、外部からアクセスできるように変更します。
frontendのReplicationControllerを削除します。
cluster/kubectl.sh delete -f examples/guestbook/frontend-controller.json
frontendのReplicationControllerのjsonファイル「examples/guestbook/frontend-controller.json」にホストのポート8000を追記します。
"ports":[
{
"containerPort":80,
"protocol":"TCP"
}
↓
"ports":[
{
"containerPort":80,
"hostPort":8000,
"protocol":"TCP"
}
frontendの ReplicationControllerを再作成します。
cluster/kubectl.sh create -f examples/guestbook/frontend-controller.json [root@ip-<IP> kubernetes]# cluster/kubectl.sh get rc CONTROLLER CONTAINER(S) IMAGE(S) SELECTOR REPLICAS frontend php-redis kubernetes/example-guestbook-php-redis:v2 name=frontend 3 redis-master master redis name=redis-master 1 redis-slave slave kubernetes/redis-slave:v2 name=redis-slave 2
brendanburns/php-redisは下記にあります。このIndex.phpで先に作成したMaster/SlaveのPodにアクセスを行っています。
8000ポートにアクセスしGuestbookが表示されることを確認します。
所要時間わずか10分で「Docker」を体験しよう――Azureで始めるDocker入門
Linux/OSSに不慣れでも大丈夫! WindowsでDockerを扱う際のポイント
Docker代替のコンテナーランタイム「Rocket」をCoreOSが公開
Docker、そしてCloud FoundryとPaaSの価値とは
レッドハットが発表したOpenShift Enterprise 3は「Dockerを知らなくても使える」基盤
米グーグルのDockerコンテナ管理サービスが一般提供開始Copyright © ITmedia, Inc. All Rights Reserved.