Docker管理ツール、Kubernetes、etcd、flannel、cAdvisorの概要とインストール、基本的な使い方:Docker運用管理製品/サービス大全(3)(3/6 ページ)
数多く台頭しているDockerの運用管理に関する製品/サービスの特長、使い方を徹底解説する特集。今回は、グーグルが主導で開発しているOSSであるKubernetes、flannel、cAdvisorの概要や主な機能、環境構築方法、使い方について。
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.
関連記事
- 所要時間わずか10分で「Docker」を体験しよう――Azureで始めるDocker入門
2014年から急速に注目度が増しているコンテナー型仮想化技術「Docker」。すでに多くのLinuxで利用可能な技術ですが、次期Windows Serverでもサポートされる予定です。Dockerとはどのようなものなのか、一度、実際に触って体験してみてはいかがでしょうか。 - Linux/OSSに不慣れでも大丈夫! WindowsでDockerを扱う際のポイント
本連載第31回は「Azureで始めるDocker入門」を掲載しました。掲載後、すぐに「Docker 1.6」がリリースされたので、意図したわけではありませんが、タイムリーな記事になったと思います。今回は、その記事でも紹介した「Docker Client for Windows」をフォローアップします。 - Docker代替のコンテナーランタイム「Rocket」をCoreOSが公開
CoreOSがDocker代替のシンプルなコンテナーランタイムを公開。Dockerの当初の目的であるシンプルなコンテナーを目指すプロトタイプだ。 - Docker、そしてCloud FoundryとPaaSの価値とは
Docker人気を踏まえたとき、Cloud Foundryはどのように位置付けられるのか。PaaSの最終的な価値とは何なのか。AWSとの競合とは。Cloud Foundryの責任者である米PivotalのJames Watters氏に聞いた。 - レッドハットが発表したOpenShift Enterprise 3は「Dockerを知らなくても使える」基盤
レッドハットが2015年7月22日に国内発表したPaaS製品「OpenShift Enterprise 3」の最大の狙いは、Dockerを知らなくてもアプリケーションの開発・運用ができるようにすることだという。ここでは、レッドハットの日本法人の説明に基づき、OpenShift Enterprise 3を紹介する。 - 米グーグルのDockerコンテナ管理サービスが一般提供開始
米グーグルがGoogle Cloud Platform上で提供しているDockerコンテナオーケストレーション/管理サービス、Google Container Engineが2015年8月26日、ベータ段階を終了、一般提供が開始された。毎週20億以上のコンテナを立ち上げているグーグルの経験に基づくサービスだとしている。