Taste of Tech Topics

Taste of Tech Topics

Acroquest Technology株式会社のエンジニアが書く技術ブログ

Kubernetesクラスタ環境を構築してDashboardで見える化を試してみた

こんにちは。

ポケモンGOみなさんやってますか?私は開始1週間くらいで一度止めてしまったのですが、周りが続けているのに触発されて再開。先日ようやくレベル20まで上がりました。

どうも、@です。

さて、今回はKubernetesについてです。
最近Kubernetes(以下k8s)を使うと決めて、k8sの環境構築をしています。
その際、公式のドキュメントやさくらのナレッジさんの記事が非常に参考になったのですが、OSやk8sなどのバージョンが一部異なるため、いろいろと試行錯誤を重ねることになりました。

kubernetesによるDockerコンテナ管理入門 - さくらのナレッジ

Kubernetes - What is Kubernetes?

そこで、同じような環境構築をしている人に、一例として少しでも参考になればと思い、k8sクラスタ環境の構築~Dashboardのインストールまでをまとめました。

0. 環境と条件

  1. 物理マシンでMaster1台、Node2台を用意する。
  2. 各マシンのOSはCentOS 7.2を利用する。
  3. k8sのバージョンは1.2系を利用する。(yum installでインストール可能な版)
  4. プライベートなDocker Registryを立てる(Docker HubにイメージをPushしたくない)
  5. k8s-dashboardをインストールし、Webブラウザからクラスタ管理をできるようにする。

今回のMaster/Nodeの構成では、次のIPアドレスをそれぞれ設定しています。

No マシン IPアドレス
1 Master 192.168.98.47
2 Node1 192.168.98.48
3 Node2 192.168.98.49

またMasterとNodeに今回インストールするものをまとめると次のようになります。

No マシン インストール
1 Master Kubernetes, etcd, flannel, docker-registry
2 Node Kubernetes, flannel, docker

1. 共通の設定

k8sはノード間の通信をする際に、マシンのホスト名を利用するようです。そこで、各マシンには、/etc/hostsに自マシンのIPアドレスとホスト名を登録しておきましょう。(このホスト名は後々k8sの設定で使うことになります。)

192.168.98.47 master

2. Masterの設定

必要なサービスをインストールします。

$ sudo yum install kubernetes
$ sudo yum install etcd
$ sudo yum install flannel
$ sudo yum install docker-registry

※etcd、flannel、docker-registryは他サイトでいくらでも説明されていると思いますので、ここでは説明を割愛します。

2.1. k8s関連の設定

サービスのインストールが完了したら、各種設定ファイルを変更します。全部載せると長いので、変更点のみ載せています。まずはk8sの動作に関する設定ファイルの編集です。Masterサーバとして自マシンのIPアドレスを設定します。
[/etc/kubernetes/config]

#KUBE_MASTER="--master=http://127.0.0.1:8080"
KUBE_MASTER="--master=http://192.168.98.47:8080"

kubeletには、自マシンのホスト名(/etc/hostsに記載したもの)と、API Serverの設定を記述します。
[/etc/kubernetes/kubelet]

#KUBELET_HOSTNAME="--hostname-override=127.0.0.1"
KUBELET_HOSTNAME="--hostname-override=master"

#KUBELET_API_SERVER="--api-servers=http://127.0.0.1:8080"
KUBELET_API_SERVER="--api-servers=http://192.168.98.47:8080"

※このKUBELET_HOSTNAMEの設定が、/etc/hostsに最初に登録したホスト名と同じである必要があります。

次に、API Serverの設定です。今回はローカルでの通信を想定しているので、--insecure-bind-addressを用いてAPI Serverのアドレスは指定します。
[/etc/kubernetes/apiserver]

#KUBE_API_ADDRESS="--insecure-bind-address=127.0.0.1"
KUBE_API_ADDRESS="--insecure-bind-address=192.168.98.47"

#KUBE_ETCD_SERVERS="--etcd-servers=http://127.0.0.1:2379"
KUBE_ETCD_SERVERS="--etcd-servers=http://192.168.98.47:2379"

APIServerへのアクセス用にキーの作成も必要になるので、ここで準備しておきます。

$ sudo openssl genrsa -out /etc/kubernetes/serviceaccount.key 2048

[/etc/kubernetes/apiserver]

#KUBE_API_ARGS=""
KUBE_API_ARGS="--service_account_key_file=/etc/kubernetes/serviceaccount.key"

[/etc/kubernetes/controller-manager]

#KUBE_CONTROLLER_MANAGER_ARGS=""
KUBE_CONTROLLER_MANAGER_ARGS="--service_account_private_key_file=/etc/kubernetes/serviceaccount.key"

これでk8sの設定は完了になります。

2.2. etcdの設定

次はetcdの設定を行います。configファイルでetcdが外部からのアクセスを許可するように編集します。

[/etc/etcd/etcd.conf]

#ETCD_LISTEN_CLIENT_URLS="http://localhost:2379"
ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379"

#ETCD_ADVERTISE_CLIENT_URLS="http://localhost:2379"
ETCD_ADVERTISE_CLIENT_URLS="http://0.0.0.0:2379"

2.3. Dockerの設定

最後にDockerの設定になります。今回Docker Registryはローカル通信で行うので、INSECURE_REGISTRYの設定が必要になります。またREGISTRYとしてMasterサーバのIPアドレスを指定します。
[/etc/sysconfig/docker]

#ADD_REGISTRY='--add-registry 127.0.0.1:5000'
ADD_REGISTRY='--add-registry 192.168.98.47:5000'

# INSECURE_REGISTRY='--insecure-registry'
INSECURE_REGISTRY='--insecure-registry 192.168.98.47:5000'

ここまでで主な設定は完了になります。

etcdctlでflannelが利用するネットワーク周りの設定をしておきます。
[注意]この設定はCentOS 7.2用の設定です。よく他のページで紹介されている「/coreos.com/network/config」というパスは、CoreOS用の設定になります。

$ sudo etcdctl mk /atomic.io/network/config '{"Network":"172.17.0.0/16"}'

2.4. 関連サービスの起動とサービス登録

ファイルの更新が完了したら、サービスの立ち上げと登録を行います。

$ sudo systemctl restart kube-apiserver
$ sudo systemctl restart kube-controller-manager
$ sudo systemctl restart kubelet
$ sudo systemctl restart flanneld
$ sudo systemctl restart etcd
$ sudo systemctl restart docker
$ sudo systemctl restart kube-scheduler
$ sudo systemctl restart kube-proxy
$ sudo systemctl enable kube-apiserver
$ sudo systemctl enable kube-controller-manager
$ sudo systemctl enable kubelet
$ sudo systemctl enable flanneld
$ sudo systemctl enable etcd
$ sudo systemctl enable kube-scheduler
$ sudo systemctl enable kube-proxy

3. Nodeの設定

まず必要なモノのインストールです。

$ sudo yum install kubernetes
$ sudo yum install docker
$ sudo yum install flannel

3.1. k8s関連の設定

次にk8s関連の設定ファイルの編集です。Master-Node間の通信のため、KUBE_MASTERにはMasterサーバのIPアドレスを指定します。
[/etc/kubernetes/config]

#KUBE_MASTER="--master=http://127.0.0.1:8080"
KUBE_MASTER="--master=http://192.168.98.47:8080"

対象となるマシンのKubeletのIPアドレスを指定します。またKUBELET_HOSTNAMEには/etc/hostsに指定した名前を使ってください。KUBELET_API_SERVERにはAPI Serverをインストールしたマシン(今回の場合はMasterのマシン)のIPアドレスを記述します。
[/etc/kubernetes/kubelet]

#KUBELET_ADDRESS="--address=127.0.0.1"
KUBELET_ADDRESS="--address=192.168.98.48"

#KUBELET_HOSTNAME="--hostname-override=127.0.0.1"
KUBELET_HOSTNAME="--hostname-override=node1"

#KUBELET_API_SERVER="--api-servers=http://127.0.0.1:8080"
KUBELET_API_SERVER="--api-servers=http://192.168.98.47:8080"

※192.168.98.47はMasterのIPアドレス、192.168.98.48はNodeのIPアドレスになります。

3.2. flannelの設定

k8sのMaster-Node間の通信を実現するためにFlanneldを利用しています。FLANNELD_ETCDには、ETCDをインストールしたマシンのIPアドレスを記述します。
[/etc/sysconfig/flanneld]

#FLANNEL_ETCD="http://127.0.0.1:2379"
FLANNEL_ETCD="http://192.168.98.47:2379"

3.3. Dockerの設定

最後にDockerの設定になります。こちらにも、INSECURE_REGISTRY、ADD_REGISTRYの設定が必要になります。
[/etc/sysconfig/docker]

#ADD_REGISTRY='--add-registry 127.0.0.1:5000'
ADD_REGISTRY='--add-registry 192.168.98.47:5000'

# INSECURE_REGISTRY='--insecure-registry'
INSECURE_REGISTRY='--insecure-registry 192.168.98.47:5000'

3.4. 関連サービスの起動とサービス登録

ファイルの更新が完了したら、サービスの立ち上げと登録を行います。

$ sudo systemctl restart kubelet
$ sudo systemctl restart flanneld
$ sudo systemctl restart docker
$ sudo systemctl restart kube-scheduler
$ sudo systemctl restart kube-proxy
$ sudo systemctl enable kubelet
$ sudo systemctl enable flanneld
$ sudo systemctl enable etcd
$ sudo systemctl enable kube-scheduler
$ sudo systemctl enable kube-proxy

同じ設定をもう一台のNodeマシンでも実施してください。(ホスト名とIPアドレスはマシンに合わせて変更してください)

4. 設定結果の確認

設定が完了したら、うまくMasterがNodeを認識しているか確認しましょう。kubectlコマンドをMasterマシンで実行すると確認ができます。

$ kubectl get nodes
NAME      STATUS    AGE
master    Ready     3d
node1     Ready     2d
node2     Ready     2d

上記のように出力されれば、一旦k8sの基本的な環境の設定は完了になります。

5. ダッシュボードのインストール

次にダッシュボードをインストールします。今回の環境はdokcer-registryをMasterに立てており、

  1. 開発環境でDockerイメージを作成
  2. Masterのdocker-registryにイメージをPush
  3. k8sにデプロイする際はNodeがdocker-registryからイメージをPull

という流れになります。

kubernetes-dashboardはdocke hubにimageが存在するため、次のように、開発環境にpullをしてきて、そのimageをMasterのregistryにpushします。
では、まずk8s-dashboardのローカルへのイメージの登録です。

$ docker pull gcr.io/google_containers/kubernetes-dashboard-amd64:v1.4.0
$ docker tag gcr.io/google_containers/kubernetes-dashboard-amd64:v1.4.0 192.168.98.47:5000/kubernetes-dashboard-amd64:v1.4.0
$ docker push 192.168.98.47:5000/kubernetes-dashboard-amd64:v1.4.0

これでDocker側の準備は整いましたので、k8s側でダッシュボードを作成します。すでにyamlファイルが公開されているので、そちらを取得し、中身をローカル用に変更してから作成します。

https://raw.githubusercontent.com/kubernetes/dashboard/master/src/deploy/kubernetes-dashboard.yaml

上記のファイルの中身を更新します。

        #image: gcr.io/google_containers/kubernetes-dashboard-amd64:v1.4.0
        image: 192.168.98.47:5000/kubernetes-dashboard-amd64:v1.4.0

        # - --apiserver-host=http://192.168.98.47:8080
          - --apiserver-host=http://192.168.98.47:8080

(最下に追記)
  externalIPs:
  -  192.168.98.47

このファイルをkubectlで読み込ませてダッシュボードを作成します。ダッシュボードはkube-systemというnamespaceを利用するので、事前にnamespaceを作成します。

$ kubectl create ns kube-system
$ kubectl create -f kubernetes-dashboard.yaml

以下のコマンドでdashboardのSTATUSがRunningになっていることを確認します。

$ kubectl get pods --all-namespaces
NAMESPACE     NAME                                    READY     STATUS    RESTARTS   AGE
kube-system   kubernetes-dashboard-4061540060-9gzk0   1/1       Running   0          2d

6. 結果の確認

問題なくdashboardのインストールができれば、以下のアドレスからダッシュボードが確認できるはずです。
http://192.168.98.47:8080/ui
f:id:acro-engineer:20161004083220p:plain

7. まとめ

今回k8sクラスタ環境を構築して、ダッシュボードのインストールを行いました。同じように嵌ってしまってなかなかインストールが進まない人は、ぜひ参考にしてみてください。また、よりよいやり方があるなど知っている人がいましたら、教えてもらえるとうれしいです。


それでは!

Acroquest Technologyでは、キャリア採用を行っています。


  • 日頃勉強している成果を、AWSHadoop、Storm、NoSQL、Elasticsearch、SpringBoot、HTML5/CSS3/JavaScriptといった最新の技術を使ったプロジェクトで発揮したい。
  • 社会貢献性の高いプロジェクトに提案からリリースまで携わりたい。
  • 書籍・雑誌等の執筆や対外的な勉強会の開催を通した技術の発信や、社内勉強会での技術情報共有により、技術的に成長したい。
  • OSSの開発に携わりたい。

 
少しでも上記に興味を持たれた方は、是非以下のページをご覧ください。
 
データ分析で国内に新規市場を生み出す新サービス開発者WANTED! - Acroquest Technology株式会社の新卒・インターンシップ - Wantedlywww.wantedly.com