ここからは、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入門
所要時間わずか10分で「Docker」を体験しよう――Azureで始めるDocker入門 Linux/OSSに不慣れでも大丈夫! WindowsでDockerを扱う際のポイント
Linux/OSSに不慣れでも大丈夫! WindowsでDockerを扱う際のポイント Docker代替のコンテナーランタイム「Rocket」をCoreOSが公開
Docker代替のコンテナーランタイム「Rocket」をCoreOSが公開 Docker、そしてCloud FoundryとPaaSの価値とは
Docker、そしてCloud FoundryとPaaSの価値とは レッドハットが発表したOpenShift Enterprise 3は「Dockerを知らなくても使える」基盤
レッドハットが発表したOpenShift Enterprise 3は「Dockerを知らなくても使える」基盤 米グーグルのDockerコンテナ管理サービスが一般提供開始
米グーグルのDockerコンテナ管理サービスが一般提供開始Copyright © ITmedia, Inc. All Rights Reserved.