ここからは、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が表示されることを確認します。
Copyright © ITmedia, Inc. All Rights Reserved.