作成中: このナレッジは、現在作成中です。このナレッジでは、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 レジストリサービスをデプロイする追加のコンテナを設定します。
目次
- 概要
- Docker コンテナをビルドするための設定
RHEL 7 でビルドシステムを構築する | RHEL Atomic でランタイムシステムを構築する - Kubernetes でコンテナのオーケストレーション
ビルドホストでコンテナを作成する | Kubernetes サービスを起動する
Kubernetes でコンテナレジストリを設定する | ローカルレジストリにコンテナをプッシュする
Kubernetes でコンテナを起動する
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 として実行します。
-
RHEL 7 をインストールします。まずは、RHEL 7 サーバーの最小インストールを行います (Desktop または Workstation インストールでは docker のパッケージを利用することができません)。デスクトップから作業するために "Server with GUI" インストールは行いました。Red Hat Enterprise Linux 7 をインストールするには、以下を参照してください。
-
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 を使用する必要があります。 -
RHEL パッケージをアップデートします。インストールしたシステムの RHEL パッケージが最新であるのを確認するには、以下の yum コマンドを実行して再起動します。
# yum update # systemctl reboot
-
kubernetes および docker パッケージをインストールします。
# yum install docker kubernetes
-
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
-
ホストコンピューターにアクセスします。RHEL Atomic ホストを実行するために使用するホストシステムにログインします。この例では、上述の RHEL 7 システムを使用します。
-
RHEL Atomic イメージをダウンロードします。Red Hat カスタマーポータルにログインし、Download Red Hat Enterprise Linux Atomic Host ページに移動します。そのページで Atomic RHEL ISO イメージを選択し、ホストコンピューターにダウンロードします。
-
ISO イメージを KVM ホストにコピーします。この例では、libvirt イメージディレクトリにイメージをコピーしました。これにより、libvirt が使用する SELinux コンテキストが適切に設定されます。
# cp RedHat-Atomic-Host-Installer-7.0-Beta.iso /var/lib/libvirt/images/
-
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 ユーザー以外のユーザーアカウントを設定します。
-
Atomic ホストの使用を開始します。RHEL Atomic システムへのログインプロンプトが表示されます。または、Atomic 仮想マシンへのコンソールを開きます。RHEL 7 KVM ホストシステムから root で virt-viewer atomic0 と入力します。または、RHEL Atomic インストール時に作成したユーザーアカウントとパスワードでシステムにログインできます。
-
Atomic ホストのサブスクリプションを登録します。Atomic ホストのソフトウェアが最新版であることを確認するには、処理をする前にサブスクリプションを登録し、アップグレードをする必要があります。Atomic ホストをサブスクライブするには、以下を実行してください。なお、yourusername は Red Hat ユーザーアカウント名に変更します。
# subscription-manager register --username=yourusername --auto-attach Password:*********
-
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 つのコンテナを実行し、互いに接続できることをテストします。
ビルドホストでコンテナを作成する
-
ビルドシステムにログインします。ビルド環境として使用するために、上で作成したシステムにログインします (上述したように、このナレッジの例ではRHEL 7 システムを使用しています)。
-
設定ファイルを取得します。2 つのコンテナを作成しオーケストレーションさせるための設定ファイル一式は、Multi-container kube configuration ページの github.com にあります。このファイルを少し加工したものがこのナレッジで提供されているため、以下の手順で説明されている説明ファイルにコピーアンドペーストできます。
-
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
-
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 ...
-
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
-
rockmongo zip ファイルを取得します。rockmongo-v1.1.2.zip ファイルを現在のディレクトリにダウンロードします。以下のサイトから取得できます。
http://sourceforge.net/projects/rockmongoadmin/
-
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)で以下を実行します。
-
ホスト名を追加します。両方のシステムでホスト名を DNS サーバーに定義している場合を除き、2 つのシステムのホスト名を /etc/hosts の各ファイルに追加する必要があります。たとえば、以下のようになります。
192.168.122.1 rhel7-master 192.168.122.68 rhelatomic-minion
-
設定ファイルを編集します。両方のホストで、/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"
-
firewalld および iptables を無効にします。firewalld および iptables サービスを両方のホストで無効にしていることを確認します。これらのサービスはいずれのホストでも実行しません。RHEL 7 master で以下のコマンド実行します (この 2 つのサービスは、Atomic minion ではシステムにはインストールもされていません)。
# systemctl disable iptables firewalld # systemctl stop iptables firewalld
Kubernetes Master (RHEL 7) で以下を設定します。
-
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=""
-
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
-
サービスを確認します。ss コマンドを実行して、サービスが実行しているポートを確認します。
# ss -tulnp | grep -E "(kube)|(etcd)"
-
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
-
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) で以下を実行します。
-
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=""
-
Minion で、Kubernetes サービスを起動します。複数の Kubernetes サービスを起動する必要があります。
# for SERVICES in docker kube-proxy.service kubelet.service; do systemctl restart $SERVICES systemctl enable $SERVICES systemctl status $SERVICES done
-
サービスを確認します。ss コマンドを実行して、サービスが実行しているポートを確認します。
# ss -tulnp | grep -E "(kube)|(docker)"
Kubernetes Master (RHEL 7) に戻ります。
-
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 ホスト) で以下を実行します。
-
コンテナのストレージディレクトリを作成します。RHEL Atomic minion でディレクトリを作成すると、レジストリにプッシュされたイメージを保持できます。
# mkdir -p /var/lib/docker-registry-storage
-
SELinux コンテキストを設定します。適切な SELinux コンテキストをディレクトリに設定すると、docker-registry サービスからアクセスできます。
# chcon -Rt svirt_sandbox_file_t /var/lib/docker-registry-storage
Kubernetes master (RHEL 7 ホスト) で以下を実行します。
-
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
-
Pod を起動します。現在のディレクトリで yaml ファイルを使用して、以下のコマンドで registry コンテナを含む Pod を起動します。
# kubectl create -f myregistry.yaml
Pod を作成する最初の手順として、Docker.io レジストリから registry コンテナを取得します。これには 10 分程度かかる場合があります。コンテナをデプロイすると、ポート 5000 からアクセスできる minion で docker-registry サービスが利用できます。
ローカルレジストリにコンテナをプッシュする
-
イメージのタグを再度付けます。以下を入力して、ローカルシステムの TCP ポート 5000 で実行している Docker Registry に関連付けられているこれらのイメージのタグを再度付けます。
# docker tag mongo localhost:5000/mongo # docker tag rockmongo localhost:5000/rockmongo
-
ローカルの docker-registry にイメージをプッシュします。以下を実行して、2 つのイメージをローカルの Docker レジストリにプッシュします。
# docker push localhost:5000/mongo # docker push localhost:5000/rockmongo
Kubernetes でコンテナを起動する
-
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
-
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
-
コンテナを確認します。コンテナが実行していることを確認するには、ホストの TCP ポート 6060 で実行している RockMongo グラフィカルインターフェイスを開きます。コンテナを実行している RHEL 7 ホストの web ブラウザーから http://localhost:6060 を開いて、RockMongo グラフィカルインターフェイスを確認します。たとえば、図 1 のような画面が表示されます。
mongod サービスを持つコンテナは RockMongo と同じ Pod で実行しているため、2 つのサービスを同時に動作させるのに余計な設定は必要はありません。RockMongo に対して、mongod サービスは同じホストのポート 80 で実行しているように見えます。しかし、実際は2つのサービスは異なるコンテナで実行されており、 RockMongo サービスだけがポート (TCP ポート 6060 ) を公開しています。