Translated message

A translation of this page exists in English.

Warning message

  • This translation is outdated. For the most up-to-date information, please refer to the English version.
  • Log in to add comments or rate this document.

Kubernetes による Docker コンテナのオーケストレーション

Updated 2014-11-22T04:40:49+00:00

作成中: このナレッジは、現在作成中です。このナレッジでは、RHEL 7 および RHEL Atomic で Kubernetes を使用した基本フローを確認できます。手順を完成する前に修正すべき問題がいくつかあります。この手順が完成したら、このメッセージは削除されます。


Kubernetes は、Docker コンテナのオーケストレーションおよび管理するツールです。このナレッジでは、以下の手順を説明します。

  • Kubernetes で2 つのシステム (master および minion) を設定し、コンテナで起動させます。また、これらを Pod 内で連携させます。
  • 2 つのコンテナをビルドし、これらのコンテナを Kubernetes でデプロイするための yaml ファイルを作成します。

RHEL 7 ホストではコンテナをビルドするための利用し、Kubernetes master として動作させます。RHEL Atomic ホストでは、2 つのコンテナを実行させ、 Kubernetes minion として動作させます。そして、minion に Docker レジストリサービスをデプロイする追加のコンテナを設定します。

目次

Kubernetes の概要

Docker はコンテナのフォーマットを定義し、個々のコンテナを構築および管理します。一方、コンテナのセットと連携させるにはオーケストレーションツールが必要になります。Kubernetes は、Docker コンテナをデプロイおよび管理するためのツールです。必要なコンテナイメージをビルドした後、Kubernetes を使用して、Pod として参照される一連のコンテナを一つのグループにまとめます。

Kubernetes 自体は、Kubernetes master および minion で実行する一連のデーモンサービスに依存します。(yaml または json フォーマットで) Pod の定義を設定ファイルに保存します。kubectl コマンドを使用して Pod を作成および管理します。

以下の手順を使用して、ビルドホスト (RHEL 7) およびランタイムホスト (RHEL Atomic) を設定します。ビルドホストでは、デプロイするコンテナをビルドし、ローカルの Docker レジストリを追加し、レジストリにコンテナをプッシュします。適当な場所にあるコンテナのイメージを使用して、Pod を定義している yaml ファイルで kubectl コマンドを実行すると、これらのイメージをまとめてデプロイできます。

Docker コンテナをビルドするための設定

このナレッジでは、物理マシン上の RHEL 7 と仮想マシン上の RHEL Atomic で実行する Docker コンテナを構築し、Kubernetes でオーケストレーションをする 2 つの環境を設定します。

  • Kubernetes Master (RHEL 7): Docker コンテナをビルドする環境には RHEL 7 のサーバーインストールが推奨されます。RHEL 7 では、コンテナのビルドに必要な開発ツールを提供しています。後半では、RHEL 7 ホストが Kubernetes master、そして RHEL Atomic ホストが minion となる Kubernetes を使用してコンテナをデプロイします。

  • Kubernetes Minion (RHEL Atomic): このナレッジでは、RHEL 7 システムを使用してコンテナ (Kubernetes master) をビルドおよびデプロイし、Atomic でコンテナ (Kubernetes minion) を実行します。RHEL Atomic は、コンテナを効果的にデプロイするためのランタイム環境として作成されました。ただし、この記事の構成例を編成するのに必要なコンテナ開発ツール (docker、kubernetes など) はすべて含まれています。

上記の 2 つのシステムの設定はカスタマイズが可能です。今回の例では、KVM を使用し、仮想マシンとして同じ RHEL ホストシステムに2 つの環境がインストールされています。

RHEL 7 でビルドシステムを構築する

この例では、RHEL 7 サーバーソフトウェアを物理環境に直接インストールし、仮想マシンを利用しています。システムで適切なエンタイトルメントを設定しレポジトリをサブスクライブした後、Kubernetes master として実行する Docker および Kubernetes ソフトウェアをインストールします。また、RHEL Atomic ホストを仮想マシンとして RHEL 7 システムにインストールして、Kubernetes minion として実行します。

  1. RHEL 7 をインストールします。まずは、RHEL 7 サーバーの最小インストールを行います (Desktop または Workstation インストールでは docker のパッケージを利用することができません)。デスクトップから作業するために "Server with GUI" インストールは行いました。Red Hat Enterprise Linux 7 をインストールするには、以下を参照してください。

    Red Hat Enterprise Linux 7 Installation Guide

  2. RHEL 7 レポジトリを登録します。RHEL 7 をインストールしたら、Red Hat Network にシステムを登録してインストールし、docker および kubernetes パッケージをインストールします。さらに、必要なソフトウェアのレポジトリを有効にします (ここでは、pool_id を、RHEL 7 サブスクリプションのプール ID に変更します)。たとえば、以下のコマンドでシステムを登録、エンタイトルメント (プール ID) を付与します。一旦、エンタイトルメントで有効になるレポジトリをすべて無効にし、必要なリポジトリだけを有効にします。

    # subscription-manager register --username=rhnuser --password=rhnpasswd
    # subscription-manager list --available  Find pool ID for RHEL subscription
    # subscription-manager attach --pool=pool_id
    # subscription-manager repos --disable=*
    # subscription-manager repos --enable=rhel-7-server-rpms
    # subscription-manager repos --enable=rhel-7-server-extras-rpms
    # subscription-manager repos --enable=rhel-7-server-optional-rpms
    # subscription-manager repos --enable=rhel-atomic-host-beta-rpms
    


    この時、有効なレポジトリが利用できない場合は、おそらく別のプール ID を使用する必要があります。

  3. RHEL パッケージをアップデートします。インストールしたシステムの RHEL パッケージが最新であるのを確認するには、以下の yum コマンドを実行して再起動します。

    # yum update
    # systemctl reboot
    

  4. kubernetes および docker パッケージをインストールします。

    # yum install docker kubernetes
    

  5. docker のサービスを開始します。以下を実行して、docker のサービスを起動して有効にします。

    # systemctl start docker.service
    # systemctl enable docker.service
    

    このとき、docker、kubernetes、および etcd パッケージ、そして、環境によっては依存関係を満たすための他のパッケージがインストールされています。

RHEL Atomic でランタイムシステムを構築する

docker および kubernetes パッケージはすでに RHEL Atomic に含まれているため、RHEL Atomic を使用すれば、この記事で使用するコンテナは構築できます。今回の例では、RHEL 7 master を実行しているシステム上の仮想マシンとして RHEL Atomic を設定します。そして、Atomic VM を Kubernetes minion として使用して、Docker コンテナを実行します。RHEL Atomic ホストを取得して使用する方法については、以下を参照してください。

Getting Started with Red Hat Enterprise Linux Atomic Host

  1. ホストコンピューターにアクセスします。RHEL Atomic ホストを実行するために使用するホストシステムにログインします。この例では、上述の RHEL 7 システムを使用します。

  2. RHEL Atomic イメージをダウンロードします。Red Hat カスタマーポータルにログインし、Download Red Hat Enterprise Linux Atomic Host ページに移動します。そのページで Atomic RHEL ISO イメージを選択し、ホストコンピューターにダウンロードします。

  3. ISO イメージを KVM ホストにコピーします。この例では、libvirt イメージディレクトリにイメージをコピーしました。これにより、libvirt が使用する SELinux コンテキストが適切に設定されます。

    # cp RedHat-Atomic-Host-Installer-7.0-Beta.iso /var/lib/libvirt/images/
    
  4. RHEL Atomic を仮想マシンとしてインストールします。RHEL KVM にインストールする場合は、Virtual Machine Manager ([Applications]、[System Tools]、[Virtual Machine Manager] の順に選択) を使用するか、virt-install コマンドを実行して、RHEL Atomic ISO イメージを仮想マシンとして実行します。以下は、virt-install コマンドを使用した例となります。

    # virt-install --name atomic01 \
       --ram 4096                \
       --disk=/var/lib/libvirt/images/atomic01.qcow2,format=qcow2,bus=virtio,size=8  \
       --cdrom=/var/lib/libvirt/images/RHEL-Atomic-Host-Installer-7.0.0-Beta.iso         \
       --network bridge=virbr0 \
       --graphics vnc
    

    RHEL Atomic インストールプロセスを実行して、RHEL Atomic 仮想マシンを再起動します。特に、以下を設定することが推奨されます。

    • 言語、日時およびタイムゾーン、およびキーワード: 必要に応じて設定します。
    • インストール先: 上述の virt-install 例では、8GB qcow2 イメージを作成します。自動パーティションが、そのイメージをパーティション化します。[Add a Disk] を選択して、SAN、マルチパス、または RAID デバイスを含む補足のストレージデバイスを追加します。
    • ネットワークおよびホスト名: ネットワークをオンにして ([ON] ボタンをクリックして)、libvirt DHCP サーバーから IP アドレスの情報を自動的に取得することが強く推奨されます。Hostname ボックスにシステムのホスト名を入力します。

    インストールが開始したら、以下を設定します。

    • root パスワード: root の初期パスワードを設定します。
    • ユーザーアカウント: root ユーザー以外のユーザーアカウントを設定します。
  5. Atomic ホストの使用を開始します。RHEL Atomic システムへのログインプロンプトが表示されます。または、Atomic 仮想マシンへのコンソールを開きます。RHEL 7 KVM ホストシステムから root で virt-viewer atomic0 と入力します。または、RHEL Atomic インストール時に作成したユーザーアカウントとパスワードでシステムにログインできます。

  6. Atomic ホストのサブスクリプションを登録します。Atomic ホストのソフトウェアが最新版であることを確認するには、処理をする前にサブスクリプションを登録し、アップグレードをする必要があります。Atomic ホストをサブスクライブするには、以下を実行してください。なお、yourusername は Red Hat ユーザーアカウント名に変更します。

    # subscription-manager register --username=yourusername --auto-attach
    Password:*********
    
  7. Atomic ホストをアップデートします。docker、kubernetes、および etcd パッケージはすでにインストールしており、docker.service サービスは起動し、Atomic で実行しています。ただし、Atomic で利用できるソフトウェアが最新バージョンであることを確認するには、以下のように atomic upgrade コマンドを実行して再起動して、アップグレードを有効にしてください。

    # atomic upgrade
    # systemctl reboot
    

これで、RHEL Atomic 仮想マシンは Docker コンテナのビルドとオーケストレーションができるようになりました。

Kubernetes でコンテナのオーケストレーション

Kubernetes を使用すると、Pod 内でリンクしたコンテナ一式をデプロイすることができます。複数のコンテナを一度にデプロイするには、yaml ファイルを作成し、kubectl コマンドを使います。( kubectl コマンドは、json 形式の設定ファイルをサポートしています。) 結合されたコンテナで実行するアプリケーションは、 お互い同じローカルシステムで実行しているかのようにみえます。

複数のホストを、Kubernetes master と minion ホストのグループとして設定可能です。Kubernetes master は、Pod のトラッキングやデプロイを行います。Kubernetes minions は Pod を実行します。master からは、コンテナの Pod を実行するホストが選択できます。

以下の手順では、MongoDB (データベース) コンテナと RockMongo (データベースのグラフィカル管理ツール) コンテナをデプロイし、リンクさせます。この手順は、コンテナを作成し、kubectl コマンドでリンクさせ、Kubernetes minion ホストにデプロイする一般的な手順です。

Kubernetes master (RHEL 7 host) で以下を実行します。

  • MongoDB および RockMongo Docker イメージを構築するのに必要なファイルを作成します。
  • docker build コマンドを実行し、2 つのコンテナイメージを構築します。
  • Docker レジストリをデプロイして、Kubernetes minion 上にイメージを格納します。
  • kubectl コマンドを使用して、Kubernetes minion (RHEL Atomic ホスト) に 2 つのコンテナを実行します。
  • 2 つのコンテナを実行し、互いに接続できることをテストします。

ビルドホストでコンテナを作成する

  1. ビルドシステムにログインします。ビルド環境として使用するために、上で作成したシステムにログインします (上述したように、このナレッジの例ではRHEL 7 システムを使用しています)。

  2. 設定ファイルを取得します。2 つのコンテナを作成しオーケストレーションさせるための設定ファイル一式は、Multi-container kube configuration ページの github.com にあります。このファイルを少し加工したものがこのナレッジで提供されているため、以下の手順で説明されている説明ファイルにコピーアンドペーストできます。

  3. MongoDB 用の設定ファイルを作成します。MongoDB コンテナを構築するには、mongodb ディレクトリに移動して Dockerfile、mongodb.conf、および mongo.repo ファイルを作成します。Dockerfile ファイルが rhel7 Docker イメージを取得し、MongoDB コンテナを生成します。mongodb.conf ファイルが MongoDB のデフォルト 設定になります。 mongo.repo ファイルは コンテナが、 MongoDB パッケージをインストールするために必要となるレポジトリを指定しています。

    # mkdir -p ~/mymongo/{mongodb,rockmongo}
    # cd ~/mymongo/mongodb
    # vi Dockerfile
    FROM rhel7
    MAINTAINER John Jones  <jwjones@example.com>
    # Add repo files
    ADD ./mongo.repo /etc/yum.repos.d/
    # Install MongoDB packages and extras
    RUN useradd mongod
    RUN yum --assumeyes update && \
        yum --assumeyes install \
            mongo-10gen-server \
            mongo-10gen \
            procps-ng \
            iptables && \
        yum clean all && \
        mkdir -p /var/lib/mongodb && \
        touch /var/lib/mongodb/.keep && \
        chown -R mongod:mongod /var/lib/mongodb
    VOLUME ["/var/lib/mongodb"]
    USER mongod
    ADD mongodb.conf /etc/mongodb.conf
    EXPOSE 27017
    CMD ["/usr/bin/mongod", "--noauth", "--config", "/etc/mongodb.conf"]
    
    # vi mongodb.conf
    ##
    ### Basic Defaults
    ##
    dbpath = /var/lib/mongo
    smallfiles = true
    nohttpinterface = true
    noprealloc = true
    
    # vi mongo.repo
    [mongodb]
    name=MongoDB Repository
    baseurl=http://downloads-distro.mongodb.org/repo/redhat/os/x86_64/
    gpgcheck=0
    enabled=1
    
  4. MongoDB Docker イメージをビルドします。現在のディレクトリの Dockerfile、mongodb.conf、および mongodb.repo ファイルでは、以下のように、その Dockerfile から新しいイメージ(今回の例では rockmongo) がビルドできます。次に、docker images コマンドを実行して、mongo イメージが作成されたことを確認します。

    # cd ~/mymongo/mongodb
    # docker build -t mongo .
    Sending build context to Docker daemon  5.12 kB
    Sending build context to Docker daemon 
    Step 0 :FROM rhel7
     ---> e1f5733f050b
    Step 1 :MAINTAINER John Jones  <jwjones@example.com>
     ---> Using cache
     ---> 24b4debbee6e
    Step 2 :ADD ./mongo.repo /etc/yum.repos.d/
     ---> e6e42790fc9c
    ...
    Step 8 :CMD ["/usr/bin/mongod", "--noauth", "--config", "/etc/mongodb.conf"]
     ---> Running in 10b8d4e6360a
     ---> c6b8bd59bf3a
    Removing intermediate container 10b8d4e6360a
    Successfully built c6b8bd59bf3a
     # docker images
    REPOSITORY    TAG    IMAGE ID        CREATED         VIRTUAL SIZE
    mongo    latest c6b8bd59bf3a    53 seconds ago  590.4 MB
    rhel7    0      e1f5733f050b    3 months ago    140.2 MB
    ...
    
  5. RockMongo 用の設定ファイルを作成します。RockMongo コンテナをビルドするには、rockmongo ディレクトリに移動し、Dockerfile、epel.repo、および start.sh ファイルを作成します。Dockerfile ファイルが rhel7 Docker イメージを取得し、RockMongo コンテナを生成します。epel.repo ファイルは、コンテナが RockMongo パッケージをインストールするのに必要なレポジトリを 指定しています。start.sh ファイルは、Web サービスを起動するスクリプトになります。

    # cd ~/mymongo/rockmongo
    # vi Dockerfile
    FROM rhel7
    MAINTAINER John Jones  <jwjones@example.com>
    # update, install required, clean
    RUN yum -y update && \
        yum install -y httpd php php-devel wget php-pear unzip gcc-c++ \
        make findutils file && yum clean all
    # update pecl channels
    RUN pecl update-channels
    # install mongo drivers without Cyrus SASL (MongoDB Enterprise Authentication)
    RUN printf "no\n" | pecl install mongo && cd /etc && echo "extension=mongo.so" >> /etc/php.d/mongo.ini
    # install RockMongo
    ADD ./rockmongo-v1.1.2.zip /root/
    RUN cd /root  && \
        unzip rockmongo-v1.1.2.zip -d /var/www/ && rm -R /var/www/html && \
        mv /var/www/rockmongo/ /var/www/html && \
        sed -i 's/auth"] = true/auth"] = false/' /var/www/html/config.php
    # increase php upload size
    RUN sed -i 's/upload_max_filesize = 2M/upload_max_filesize = 10M/g' /etc/php.ini && \
        sed -i 's/post_max_size = 2M/post_max_size = 10M/g' /etc/php.ini
    # expose php information
    RUN echo '' > /var/www/html/info.php 
    # Add the php mongo driver
    ADD ./epel.repo /etc/yum.repos.d/epel.repo
    RUN yum -y install php-pecl-mongo --nogpgcheck && yum clean all
    # Add the start.sh and mark it executable
    ADD ./start.sh /start.sh
    RUN chmod +x /start.sh
    # Expose ports
    EXPOSE 80
    # CMD ["/usr/sbin/httpd", "-D", "FOREGROUND"]
    CMD ["/start.sh"]
    
    # vi epel.repo
    [epel]
    name=Extra Packages for Enterprise Linux 7 - $basearch
    #baseurl=http://download.fedoraproject.org/pub/epel/7/$basearch
    mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-7&arch=$basearch
    failovermethod=priority
    enabled=1
    gpgcheck=1
    gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
    [epel-debuginfo]
    name=Extra Packages for Enterprise Linux 7 - $basearch - Debug
    #baseurl=http://download.fedoraproject.org/pub/epel/7/$basearch/debug
    mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-debug-7&arch=$basearch
    failovermethod=priority
    enabled=0
    gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
    gpgcheck=1 
    [epel-source]
    name=Extra Packages for Enterprise Linux 7 - $basearch - Source
    #baseurl=http://download.fedoraproject.org/pub/epel/7/SRPMS
    mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-source-7&arch=$basearch
    failovermethod=priority
    enabled=0
    gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
    gpgcheck=1
    
    # vi start.sh
    #!/bin/bash
    # Tell the rockmongo service how to get to the MongoDB container
    # the SERVICE_HOST var is provided by kubernetes
    sed -i "s/mongo_host\"] = \"127.0.0.1\"/mongo_host\"] = \"$SERVICE_HOST\"/" /var/www/html/config.php
    # Start the Apache server
    /usr/sbin/httpd -D FOREGROUND
    
  6. rockmongo zip ファイルを取得します。rockmongo-v1.1.2.zip ファイルを現在のディレクトリにダウンロードします。以下のサイトから取得できます。

    http://sourceforge.net/projects/rockmongoadmin/

  7. RockMongo docker イメージをビルドします。現在のディレクトリで RockMongo の Dockerfile を使用して、以下のように Dockerfile から新しいイメージ (今回の例では mongo) をビルドします。

    # cd ~/mymongo/rockmongo
    # docker build -t rockmongo .
    Sending build context to Docker daemon 6.144 kB
    Sending build context to Docker daemon 
    Step 0 :FROM rhel7
     ---> e1f5733f050b
    Step 1 :MAINTAINER  John Jones  <jwjones@example.com>
     ---> Running in 233f435cca52
     ---> 512ad1ec520e
    Removing intermediate container 233f435cca52
    Step 2 :RUN yum -y update && yum install -y httpd php php-devel wget php-pear unzip gcc-c++ make findutils file && yum clean all
     ---> Running in 98bfc10833c6
    Resolving Dependencies
    --> Running transaction check
    ---> Package bash.x86_64 0:4.2.45-5.el7 will be updated
    ...
    Step 13 :CMD ["/start.sh"]
     ---> Running in cc37729917ee
     ---> 5c66369d24f6
    Removing intermediate container cc37729917ee
    Successfully built 5c66369d24f6
    
    # docker images
    REPOSITORY      TAG      IMAGE ID        CREATED         VIRTUAL SIZE
    rockmongo  latest   5c66369d24f6    5 minutes ago   488.2 MB
    mongo      latest   c6b8bd59bf3a    6 hours ago     590.4 MB
    rhel7      latest   e1f5733f050b    3 months ago    140.2 MB
    

Kubernetes サービスを起動する

RHEL 7 および RHEL Atomic システムで異なる Kubernetes サービスを起動します。RHEL 7 は Kubernetes master 、RHEL Atomic システムは minion にする必要があります。RHEL 7 システムでは kube-apiserver、kube-controller-manager、kube-scheduler、および etcd サービスを実行します。Atomic システムは、kubelet、proxy、および docker サービスを実行します。
この例で、2 つのホストシステムの名前と IP アドレスは以下のようになります。

  • rhel7-master (192.168.122.1)
  • rhelatomic-minion (192.168.122.68)

以下は、この 2 つのシステムで必要な Kubernetes サービスを設定し起動する方法になります。

Kubernetes Master (RHEL 7) および Minion (RHEL Atomic)で以下を実行します。

  1. ホスト名を追加します。両方のシステムでホスト名を DNS サーバーに定義している場合を除き、2 つのシステムのホスト名を /etc/hosts の各ファイルに追加する必要があります。たとえば、以下のようになります。

    192.168.122.1     rhel7-master               
    192.168.122.68    rhelatomic-minion 
    
  2. 設定ファイルを編集します。両方のホストで、/etc/kubernetes/config がすべてのホストで同じになるように編集します。ホストは、etcd サービスに対して、master (here rhel7-master) の場所とポート番号 (4001) を特定する必要があります (見やすくするために一部のコメントを削除しています)。

    ###
    # kubernetes system config
    # Comma separated list of nodes in the etcd cluster
    KUBE_ETCD_SERVERS="--etcd_servers=http://rhel7-master:4001"
    
    # 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 privleged docker containers
    KUBE_ALLOW_PRIV="--allow_privileged=false"
    
  3. firewalld および iptables を無効にします。firewalld および iptables サービスを両方のホストで無効にしていることを確認します。これらのサービスはいずれのホストでも実行しません。RHEL 7 master で以下のコマンド実行します (この 2 つのサービスは、Atomic minion ではシステムにはインストールもされていません)。

    # systemctl disable iptables firewalld
    # systemctl stop iptables firewalld
    

Kubernetes Master (RHEL 7) で以下を設定します。

  1. apiserver ファイルを編集します。****/etc/kubernetes/apiserver ファイルを編集して、すべてのネットワークインターフェイス (0.0.0.0) でサービスをリッスンさせ、master (rhel7-master) と minion (rhelatomic-minion) を指定します。

    ###
    # kubernetes system config
    
    # 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"
    
    # How the replication controller and scheduler find the apiserver
    KUBE_MASTER="--master=rhel7-master:8080"
    
    # Comma separated list of minions
    KUBELET_ADDRESSES="--machines=rhelatomic-minion"
    
    # Port minions listen on
    KUBELET_PORT="--kubelet_port=10250"
    
    # Address range to use for services
    KUBE_SERVICE_ADDRESSES="--portal_net=10.254.0.0/16"
    
    # Add you own!
    KUBE_API_ARGS=""
    
  2. Master で Kubernetes サービスを開始します。複数の Kubernetes サービスを起動する必要があります。

    for SERVICES in etcd kube-apiserver kube-controller-manager  kube-scheduler; do 
        systemctl restart $SERVICES
        systemctl enable $SERVICES
        systemctl status $SERVICES 
    done
    
  3. サービスを確認します。ss コマンドを実行して、サービスが実行しているポートを確認します。

    # ss -tulnp | grep -E "(kube)|(etcd)"
    
  4. etcd サービスをテストします。以下のように curl コマンドを使用して、etcd サービスをテストします。

    # curl -s -L http://rhel7-master:4001/version
    # curl -s -L http://rhel7-master:4001/v2/keys/mykey -XPUT -d value="this is awesome" | python -mjson.tool
    # curl -s -L http://rhel7-master:4001/v2/keys/mykey | python -mjson.tool
    # curl -s -L http://rhel7-master:4001/v2/keys/mykey -XDELETE | python -mjson.tool
    
  5. apiserver サービスをテストします。以下のように curl コマンドを使用して、apiserver サービスをテストします。

    # curl -s -L http://rhel7-master:8080/version | python -mjson.tool
    # curl -s -L http://rhel-7-master:8080/api/v1beta1/pods | python -mjson.tool
    # curl -s -L http://rhel-7-master:8080/api/v1beta1/minions | python -mjson.tool
    # curl -s -L http://rhel-7-master:8080/api/v1beta1/services | python -mjson.tool
    

Kubernetes Minion (RHEL Atomic) で以下を実行します。

  1. kublet ファイルを編集します。以下のように、/etc/kubernetes/kubelet ファイルを編集します。

    ###
    # kubernetes kubelet (minion) config
    
    # The address for the info server to serve on
    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="--hostname_override=rhelatomic-minion"
    
    # Add your own!
    KUBELET_ARGS=""
    
  2. Minion で、Kubernetes サービスを起動します。複数の Kubernetes サービスを起動する必要があります。

    # for SERVICES in docker kube-proxy.service  kubelet.service; do 
        systemctl restart $SERVICES
        systemctl enable $SERVICES
        systemctl status $SERVICES 
    done
    
  3. サービスを確認します。ss コマンドを実行して、サービスが実行しているポートを確認します。

    # ss -tulnp | grep -E "(kube)|(docker)"
    

Kubernetes Master (RHEL 7) に戻ります。

  1. Minion を確認します。Kubernetes mater から minion を確認できることを確認します。

    # kubectl get minions
    

Kubernetes でコンテナのレジストリを起動する

docker-registry パッケージを使用すると、利用しているシステムにローカルの Docker レジストリが設定できます。このパッケージは RHEL Atomic に含まれていないため、Docker.io から利用できる registry コンテナを実行してサービスを追加できます。以下の手順では、registry コンテナを Docker.io サイトから RHEL Atomic ホストに取得してレジストリを有効にし、コンテナをプッシュして、ローカルのレジストリからプルできることが説明されています。

以下は、registry コンテナからローカルの Docker レジストリを設定する際の注意点になります。

  • registry コンテナは Red Hat ではなく、Docker.io から提供されているものです。RHEL 7 の Red Hat docker-registry パッケージを代わりに使用する場合は、このオプションを選択できます。Docker レジストリに関するディスカッションについては、Get Started with Docker Containers を参照してください。
  • registry コンテナで、ディスク上のデータを保存できるようにする必要があります。上述した virt-install コマンドを確認し、十分なサイズの RHEL Atomic 仮想マシンが作成されたことを確認します。
  • minion でイメージのストレージディレクトリを作成して、使用できる SELinux ラベルのコンテナに渡します。

以下の手順で、以前作成した RHEL Atomic minion 上の registry コンテナを設定します。

Kubernetes minion (RHEL Atomic ホスト) で以下を実行します。

  1. コンテナのストレージディレクトリを作成します。RHEL Atomic minion でディレクトリを作成すると、レジストリにプッシュされたイメージを保持できます。

    # mkdir -p /var/lib/docker-registry-storage
    
  2. SELinux コンテキストを設定します。適切な SELinux コンテキストをディレクトリに設定すると、docker-registry サービスからアクセスできます。

    # chcon -Rt svirt_sandbox_file_t /var/lib/docker-registry-storage
    

Kubernetes master (RHEL 7 ホスト) で以下を実行します。

  1. yaml ファイルを作成します。registry コンテナを起動するために使用する yaml ファイルを作成します。
    重要: yaml ファイルのフォーマットはスペースの有無も区別されます。以下に記載されている内容 (スペースも含む) で yaml ファイルをコピーしてください。変更を加えると、Pod の作成時に動作しません。

    # vi myregistry.yaml
    kind:Pod
    id: docker-registry
    apiVersion: v1beta1
    namespace: default
    labels:
      name: docker-registry
    desiredState:
      manifest:
        version: v1beta1
        id: docker-registry
        volumes:[]
        containers:
        - name: master
          image: registry:latest
          ports:
            - containerPort:5000
              hostPort:5000
              protocol:TCP
          volumeMounts:
            - name: registry-data
              mountPath:/var/lib/docker-registry
              readOnly: false
          env:
            - name:STORAGE
              value: local
            - name:STORAGE_PATH
              value:/var/lib/docker-registry
        volumes:
          - name: registry-data
            source:
              hostDir:
                path:/var/lib/docker-registry-storage
    
  2. Pod を起動します。現在のディレクトリで yaml ファイルを使用して、以下のコマンドで registry コンテナを含む Pod を起動します。

    # kubectl create -f myregistry.yaml
    

Pod を作成する最初の手順として、Docker.io レジストリから registry コンテナを取得します。これには 10 分程度かかる場合があります。コンテナをデプロイすると、ポート 5000 からアクセスできる minion で docker-registry サービスが利用できます。

ローカルレジストリにコンテナをプッシュする

  1. イメージのタグを再度付けます。以下を入力して、ローカルシステムの TCP ポート 5000 で実行している Docker Registry に関連付けられているこれらのイメージのタグを再度付けます。

    # docker tag mongo localhost:5000/mongo
    # docker tag rockmongo localhost:5000/rockmongo
    

  2. ローカルの docker-registry にイメージをプッシュします。以下を実行して、2 つのイメージをローカルの Docker レジストリにプッシュします。

    # docker push localhost:5000/mongo
    # docker push localhost:5000/rockmongo
    

Kubernetes でコンテナを起動する

  1. yaml ファイルを作成します。multi-container.yaml ファイルを作成します。そのファイルを使用して、2 つのコンテナを 1 つの Pod に統合します。

    # cd ~/mymongo
    # vi multi-container.yaml
    apiVersion: v1beta1
    id: multicontainer 
    kind:Pod
    namespace: default
    desiredState:
      manifest:
        id: multicontainer
        version: v1beta1
        containers:
          - name: mongo
            image: localhost:5000/mongo
        containers:
          - name: rockmongo
            image: localhost:5000/rockmongo
            ports:
              - Name:WebPort
                containerPort:80
                hostPort:6060  
    
  2. kubectl でイメージをビルドします。作成したイメージを持ち、ローカルの Docker レジストリで kubectl コマンドを実行してコンテナを開始し、Pod で以下のように連携させます。

    # cd ~/mymongo/
    # kubectl create -f multi-container.yaml
    ID              Image(s)                                        Host   Labels   Status 
    ----------      ----------                                      -----  -------  ------
    multicontainer  localhost:5000/mongo,localhost:5000/rockmongo   /               Waiting 
    
  3. コンテナを確認します。コンテナが実行していることを確認するには、ホストの TCP ポート 6060 で実行している RockMongo グラフィカルインターフェイスを開きます。コンテナを実行している RHEL 7 ホストの web ブラウザーから http://localhost:6060 を開いて、RockMongo グラフィカルインターフェイスを確認します。たとえば、図 1 のような画面が表示されます。

    rockmongo_gui.png

    mongod サービスを持つコンテナは RockMongo と同じ Pod で実行しているため、2 つのサービスを同時に動作させるのに余計な設定は必要はありません。RockMongo に対して、mongod サービスは同じホストのポート 80 で実行しているように見えます。しかし、実際は2つのサービスは異なるコンテナで実行されており、 RockMongo サービスだけがポート (TCP ポート 6060 ) を公開しています。