オーケストレーションによって Docker コンテナーを管理する

Comments

Docker はオーケストレーションによって、Docker 環境内でコンテナーをスケジューリングし、クラスターを管理し、そしてより多くのホストをプロビジョニングします。

Kubernetes

Kubernetes は、コンテナー化されたアプリケーションを自動でデプロイし、運用し、スケーリングするためのオープン・ソースのシステムです。Kubernetes はアプリケーションに含まれる複数コンテナーを論理単位にグループ化して、管理およびディスカバリーを簡易化します。
Kubernetes は Docker コンテナーを対象としたオープン・ソースのオーケストレーション・エンジンであり、マスター/スレーブの概念に従って機能します。Kubernetes クラスターは、以下の主要なコンポーネントで構成されます。

  • マスター: 1 つ以上のノード (ミニオン) を監視するクラスター・マネージャー。
  • ノード (ミニオンまたはスレーブ): コンテナーの起動を担当するクラスター・メンバー。
  • ポッド: Kubernetes での基本的な運用単位。スレーブ (ミニオン) 上で実行されるアプリケーションを構成する 1 つ以上のコンテナーを表します。

可用性

以下の表に、PowerPC LE (ppc64le) プラットフォームに関連するパッケージの場所を記載します。

Linux ディストリビューションパッケージの場所
Fedora 24 Distro リポジトリー
Red Hat Enterprise Linux (RHEL) 7.XUnicamp[1]

[1] Unicamp リポジトリー: http://ftp.unicamp.br/pub/ppc64el/rhel/7_1/misc_ppc64el/

RHEL 7.1 LE 上に Kubernetes クラスターをセットアップする

Kubernetes のインストールとセットアップ

Kubernetes クラスターの一部にするシステムのすべてに、以下の Unicamp リポジトリーが追加されるようにします。

# cat > /etc/yum.repos.d/unicamp-docker.repo <<EOF
[unicamp-docker]
name=Unicamp Repo for Docker Packages
baseurl=http://ftp.unicamp.br/pub/ppc64el/rhel/7_1/docker-ppc64el/
enabled=1
gpgcheck=0
EOF
 
# cat > /etc/yum.repos.d/unicamp-misc.repo <<EOF
[unicamp-misc]
name=Unicamp Repo for Misc Packages
baseurl=http://ftp.unicamp.br/pub/ppc64el/rhel/7_1/misc_ppc64el/
enabled=1
gpgcheck=0
EOF

Kubernetes マスターのインストールとセットアップ

  1. 必要なパッケージをインストールします。
    # yum install kubernetes-client kubernetes-master etcd
  2. ネットワーク・ポートを開きます。デフォルトでは、Kubernetes apiserver はポート 8080 で kubelet を listen します。このポートがローカル・ファイアウォールによってブロックされないようにしてください。ファイアウォールを使用している場合は、以下のコマンドを実行してパブリック・ゾーンの TCP ポートを開きます。
    # firewall-cmd --zone=public --add-port=8080/tcp --permanent 
    # firewall-cmd --reload

    さらに、デフォルトでは etcd サーバーがポート 2379 で listen するので、以下の手順に従って該当するポートを開きます。
    # firewall-cmd --zone=public --add-port=2379/tcp --permanent 
    # firewall-cmd –reload
  3. Kubernetes マスターを構成します。残りの構成手順では、Kubernetes マスターの IP アドレスは 192.168.122.76 で、Kubernetes ノードの IP アドレスは 192.168.122.236 であることを前提とします。
    /etc/kubernetes/config ファイルに、環境に応じた変更を加えます。前述の IP アドレス情報に基づくと、変更後のファイルの内容は以下のようになります。
    # logging to stderr means we get it in the systemd journal                                                                                    KUBE_LOGTOSTDERR="--logtostderr=true"
    # journal message level, 0 is debug
    KUBE_LOG_LEVEL="--v=0"
    # Should this cluster be allowed to run privileged docker containers
    KUBE_ALLOW_PRIV="--allow-privileged=false"
    # How the controller-manager, scheduler, and proxy find the apiserver
    KUBE_MASTER="--master=http://192.168.122.76:8080"
    /etc/kubernetes/apiserver ファイルに、環境に応じた変更を加えます。前述の IP アドレス情報に基づくと、変更後のファイルの内容は以下のようになります。
    # The address on the local server to listen to.
    KUBE_API_ADDRESS="--address=0.0.0.0"
    # The port on the  local server to listen on.
    # KUBE_API_PORT="--port=8080”
    # Port minions listen on
    # KUBELET_PORT="--kubelet-port=10250"
    #  Comma separated list of nodes in the etcd cluster
    KUBE_ETCD_SERVERS="--etcd-servers=http://192.168.122.76:2379"
    # Address range to use for services
    KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=10.254.0.0/16"
    # default admission control policies
    KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ResourceQuota"
    # Add your own!
    KUBE_API_ARGS=""
  4. etcd を構成します。/etc/etcd/etcd.conf ファイル内で、以下のように 2 つのパラメーターを変更します。
    ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379" 
    ETCD_ADVERTISE_CLIENT_URLS="http://0.0.0.0:2379"
  5. サービスを起動します。
    # for SERVICES in etcd kube-apiserver kube-controller-manager kube-scheduler; do
        systemctl restart $SERVICES
        systemctl enable $SERVICES
        systemctl status $SERVICES
    done

Kubernetes ノード (ミニオン) のインストールとセットアップ

  1. 必要なパッケージをインストールします。
     # yum install docker-io kubernetes-client kubernetes-node
  2. Kubernetes ノードを構成します。/etc/kubernetes/ kubelet に、環境に応じた変更を加えます。前述の IP アドレス情報に基づくと、変更後のファイルの内容は以下のようになります。
    # kubernetes kubelet (minion) config
    # The address for the info server to serve on (set to 0.0.0.0 or "" for all interfaces)
    KUBELET_ADDRESS="--address=0.0.0.0"
    # The port for the info server to serve on
    # KUBELET_PORT="--port=10250"
    # You may leave this blank to use the actual hostname
    KUBELET_HOSTNAME=" "
    # location of the api-server
    KUBELET_API_SERVER="--api-servers=http://192.168.122.76:8080"
    # Add your own!
    KUBELET_ARGS="—pod-infra-container-image=gcr.io/google_containers/pause-ppc64le:2.0"
  3. サービスを起動します。
    # for SERVICES in kube-proxy kubelet docker; do
      systemctl restart $SERVICES
      systemctl enable $SERVICES
      systemctl status $SERVICES
    done
  4. セットアップを確認します。マスターにログインし、kubectl get nodes を実行して利用可能なノードを確認します。
    [root@localhost ~]# kubectl get nodes
    NAME     LABELS                          STATUS AGE
    fed-node kubernetes.io/hostname=fed-node Ready  1h
  5. クラスター内の任意のノードからプライベート・レジストリーにログインし、レジストリー認証構成ファイルを取得します。
    # docker login https://registry-rhel71.kube.com:5000
    # cat /root/.docker/config.json 
    {
        "auths": {
            "https://registry-rhel71.kube.com:5000": {
                "auth": "cHJhZGlwdGE6cHJhZGlwdGE=",
                "email": "test@test.com"
            }
    }

Kubernetes クラスター内のすべてのノードに対し、この構成ファイル (config.json) をパス /root/.docker/config.json にコピーします。これで、クラスターはプライベート・レジストリー・サーバーを使用するようにセットアップされました。

Docker Swarm: Docker ホストのネイティブ・クラスタリング

Docker Swarm は、Docker 用のネイティブ・クラスタリング・ツールです。Swarm は Docker ホストのプールを単一の仮想 Docker ホストに変換します。Docker Swarm は標準 Docker API に対応するため、既に Docker デーモンと通信するツールであれば、どのツールでも Swarm を利用して複数のホストにトランスペアレントにスケーリングすることができます。
以下に、Swarm クラスターの概念図を示します。

Docker を示す図
Docker を示す図

可用性

現在のところ、Docker Swarm をビルドするには、Power プラットフォーム用の https://github.com/docker/swarm Web サイトにあるソースを使用する必要があります。

Power サーバー上のセットアップ

Ubuntu LE を実行する Power サーバー上の Swarm を操作するには、
以下のコマンドを実行します。

$ mkdir ~/go.prj
$ export GOPATH=~/go.prj
$ export PATH=$PATH:~/go.prj/bin
$ go get github.com/tools/godep
$ go get github.com/docker/swarm
swarm binary will be available under $GOPATH/bin/

操作する

  1. Swarm クラスターの一部にしなければならない Docker ホストのそれぞれについて、TCP で Docker API を公開するように Docker デーモンを構成します。
     docker -H tcp://0.0.0.0:2375 daemon

    Docker、Swarm、およびクライアント間での通信をセキュアにするために、TLS をセットアップするよう助言します。
  2. Swarm を実行して、ホストを登録します。
    • Docker Swarm イメージを使用している場合は、以下のコマンドを実行します。
       docker run -H tcp://0.0.0.0:2375 -d swarm join --addr=<node_ip:2375> <discovery-option>
    • ソースからビルドした Swarm を使用している場合は、以下のコマンドを実行します。
       swarm join --addr=<node_ip:2375> <discovery-option>
  3. 指定のマシン上で Swarm 管理サービスを起動します。
    • Docker Swarm イメージを使用している場合は、以下のコマンドを実行します。
       docker run -d -p <swarm_cluster_mgr_port>:2375 swarm manage <discovery-option>
    • ソースからビルドした Swarm を使用している場合は、以下のコマンドを実行します。
       swarm manage <discovery-option>

ディスカバリーとクラスター・メンバーシップ

Swarm がサポートする、Swarm ノードを検出してクラスターを作成するためのメカニズムは複数あります。

  • ホスト型ディスカバリー
    1. ディスカバリー・オプションとして token://<クラスター ID> を使用します。
    2. https://discovery-stage.hub.docker.com でホストされます。
  • ファイル
    1. Docker ホストを <IP>:<ポート> の形式でファイルに追加します。
    2. ディスカバリー・オプションとして file://<ファイルのパス> を使用します。
  • ノード詳細 (<IP>:<ポート>) のコンマ区切りリストを、コマンド・ライン・インターフェースに直接指定します。
  • etcd
    ディスカバリー・オプションとして etcd://<etcd IP>/<パス> を使用します。
  • Consul
    ディスカバリー・オプションとして consul://<consul IP>/<パス> を使用します。
  • Zookeeper
    ディスカバリー・オプションとして zk://<zookeeper アドレス 1>,<zookeeper アドレス 2>/<パス> を使用します。

ダウンロード可能なリソース


コメント

コメントを登録するにはサインインあるいは登録してください。

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Linux
ArticleID=1036784
ArticleTitle=オーケストレーションによって Docker コンテナーを管理する
publish-date=09012016