連載
» 2015年10月23日 05時00分 公開

Docker運用管理製品/サービス大全(3):Docker管理ツール、Kubernetes、etcd、flannel、cAdvisorの概要とインストール、基本的な使い方 (3/6)

[澤井健,株式会社NTTデータ]

Kubernetesを使いクラスター環境を作成する手順(単独ホスト)

 ここからは、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のインストール

 まずは、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」に変更します。

redis-masterの作成

 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の作成

 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クライアント)の作成

 先ほどの図にある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のReplicationControllerにホストとのポートのリンクを作成

 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ポートにアクセスして確認

 8000ポートにアクセスしGuestbookが表示されることを確認します。

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。