いますぐ実践! Linuxシステム管理

いますぐ実践! Linux システム管理 / Vol.276 / 読者数:2825名

こんばんは、うすだです。

耳鳴りというか難聴のため、 短期間ですがステロイドを点滴で投与したり服用したりしています。
(最初のお医者さんでは点滴、その後再発してからは服用です。)

1日に数ミリグラムだけなので、少量のはずですが、 ステロイドの副作用と思われる症状がすぐ顕著に出て、我ながら面白いと感じています。

主な症状としては、不眠、ムーンフェイス(満月様顔貌)、肥満、 顔面紅斑(というほど大げさではなく、顔が紅潮+熱を帯びているくらい)です。

ムーンフェイスに関しては、お医者さんからは、 もっと摂取しないと普通は出ないと言われました。調べると、 中等度以上の摂取で1〜2ヶ月経過で症状が現れるとのことです。ですが、 自分自身と家族が気づく程度には、輪郭が膨らんでおります。うーん、不思議です。

肥満に関しては、体重計曰く、内臓脂肪の値がここ何年も変わらなかったのですが、 突如悪くなりました。(体重は、ほぼ不変です。)

まあ、耳の方は徐々に回復していますので、 そのうち服用しなくてもよくなると思います。服用をやめた後、 これらの症状がどうなるのか、今から楽しみにしています。

なお、ステロイドの副作用には、増毛・脱毛というのもあります。しかし残念ながら、 点滴の後、抜け毛が増えているように感じています。

抜け毛が増えたのはきっとそういう季節だからで、 増毛の副作用が現れるのはこれからだ、と自らに言い聞かせています。

ステロイドをやめたら毛が増えたらいいのにとか、毛のことばかり考えていますが、 一瞬考えないようにして、今回もはりきってまいりましょう。

今回のお題 - Kubernetesを気軽に体験する (レベル:初級)

次から次へと出てくる新しいOSやディストリビューションに対応すべく、 VirtualBox や Docker などでお試し環境を作り吟味されている貴兄が、 それなりにいらっしゃるのではないかと思います。

ゲストOSやコンテナをちょっと動かしてみるだけなら、 標準で使えるGUIやコマンドで操作すれば、大抵は事足ります。

ですが、複数のゲストOSやコンテナを、 複数のマシンで分散して動かして管理しようとすると、 手順がかなり複雑になってしまいます。

そういった問題を解決するため、 複数のマシンを使ってコンテナの作成や起動など管理する、 「オーケストレーションツール」というものが、世の中にはいくつかあるようです。

その中でも、最近は「Kubernetes」というものが注目を浴びています。

そこで今回は、Kubernetes を使って、 Dockerのコンテナを動作させたり止めたりなどしてみたいと思います。

そして、今回は、すみません、Ubuntu 16.04 でのみ動作確認しました。
が、他のディストリビューションでも、手順は概ね同じと思います。

Kubernetesとは? Minikubeとは?

Kubernetes(「クーベネティス」「クーベルネイテス」「クベルネテス」 「クーバネティス」などいろんな読み方があるようです)とは、 コンテナの運用を自動化するためのオープンソースのシステムです。

Production-Grade Container Orchestration - Kubernetes
https://kubernetes.io/

複数サーバをクラスタとしてまとめて管理し、ネットワークやストレージの管理、 負荷分散や監視も行うことができます。

クラスタは、クラスタの管理を行う「マスター」と、 コンテナを実行する「ノード」から構成されます。

それから、実際には、複数のコンテナをまとめた「Pod」という単位で、作成や起動、 停止などの操作を行います。

一般的には、「Google Cloud Platform」や「Microsoft Azure」 といったクラウドプラットフォームで動かすようですが、 ローカルのマシンで動作させることも可能です。

今回は、Kubernetes を単体のマシンで動かすための「Minikube」というものを使って、 Kubernetes を体験してみたいと思います。

GitHub - kubernetes/minikube: Run Kubernetes locally
https://github.com/kubernetes/minikube

なお、Minikubeは、VirtualBoxか「KVM(Kernel-based VM)」上で動作するため、 いずれかを必要とします。今回は VirtualBox を使います。
(厳密には、Dockerでも動作するようです。詳細は上記ページにありますので、 必要な貴兄はぜひトライしてみてください。)

もし VirtualBox のインストールなど行われていない場合は、下記のURLを開いて、 お使いのプラットフォーム用のパッケージなどをダウンロードし、 インストールしてください。パッケージをインストールするだけで、 基本的な機能は使用できる…はずです。

Oracle VM VirtualBox - Downloads
http://www.oracle.com/technetwork/server-storage/virtualbox/downloads/

Minikubeとkubectlのインストール

Minikube で Kubernetes を体験するには、Minikubeのインストールと、 「kubectl」という管理コマンドをインストールする必要があります。

Overview of kubectl - Kubernetes
https://kubernetes.io/docs/reference/kubectl/overview/

Minikubeのインストール手順は、 前述のMinikubeのGitHubのページの記載(README.md)の通りです。が、念のため、 手順を以下に示します。

  $ curl -Lo minikube \
    https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 \
    && chmod +x minikube && sudo mv minikube /usr/local/bin/

以下を実行すると、Minikubeのバージョンを出力します。
Minikubeが最低限動作するかどうかの確認にもなると思います。

  $ minikube version
  minikube version: v0.27.0

次に、kubectlをインストールします。手順は、以下の記載の通りです。

Install and Set Up kubectl - Kubernetes
https://kubernetes.io/docs/tasks/tools/install-kubectl/

…が、念のため、一連の手順を以下に示します。

  $ sudo apt-get update
  $ sudo apt-get install apt-transport-https
  $ curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | \
    sudo apt-key add -
  $ sudo sh -c "echo deb http://apt.kubernetes.io/ kubernetes-xenial main \
    > /etc/apt/sources.list.d/kubernetes.list"
  $ sudo apt-get update
  $ sudo apt-get install kubectl

Bashの補完機能の設定をしておくと、コマンドラインでTABによる補完が効くようになり、 便利です。「~/.bashrc」に以下を追加しましょう。

[ -x "$(which kubectl)" ] && source <(kubectl completion bash)

Minikubeの起動

Minikube自体の操作には、「minikube」コマンドを使います。
まず、「minikube start」を実行すると、Minikube が起動します。

  $ minikube start
  Starting local Kubernetes v1.10.0 cluster...
  Starting VM...
  Downloading Minikube ISO
   150.53 MB / 150.53 MB [============================] 100.00% 0s
  Getting VM IP address...
  Moving files into cluster...
  Downloading kubeadm v1.10.0
  Downloading kubelet v1.10.0
  Finished Downloading kubelet v1.10.0
  Finished Downloading kubeadm v1.10.0
  Setting up certs...
  Connecting to cluster...
  Setting up kubeconfig...
  Starting cluster components...
  Kubectl is now configured to use the cluster.
  Loading cached images from config file.

出力されているメッセージから想像がつくと思いますが、 初回はいろいろなダウンロードや初期設定が行われるため、時間がかかります。
ちなみに、2回目以降実行した際の出力メッセージは、以下の通りです。

  $ minikube start
  Starting local Kubernetes v1.10.0 cluster...
  Starting VM...
  Getting VM IP address...
  Moving files into cluster...
  Setting up certs...
  Connecting to cluster...
  Setting up kubeconfig...
  Starting cluster components...
  Kubectl is now configured to use the cluster.
  Loading cached images from config file.

「minikube status」を実行すると、Minikube の状況がわかります。

  $ minikube status
  minikube: Running
  cluster: Running
  kubectl: Correctly Configured: pointing to minikube-vm at 192.168.99.100

VirtualBox の管理コマンド「vboxmanage」を以下のように実行すると、 MinikubeがVirtualBoxのゲストOSであることがわかります。

  $ vboxmanage list runningvms
  "minikube" {a2106a9a-a087-4872-aa1e-715f00361f55}

Podの起動と公開

ここからは、主にkubectlコマンドを使います。
まず、コンテナのもとのイメージを入手して、そのイメージからコンテナ(Pod) を作成して起動するには、「kubectl run」を実行します。
以下に例を示します。

  $ kubectl run hello-world --image=gcr.io/google-samples/node-hello:1.0 \
    --port=8080
  deployment.apps "hello-world" created

「gcrl.io/google-samples/node-hello」のバージョン「1.0」 のイメージをダウンロードし、これを基に「hello-world」という名の「Deployment」 を作成します。
そして、Deploymentからコンテナ(Pod)を生成し、起動します。
node-hello自体は、TCPのポート8080を介して、超単純なWebのサービスを提供する (というかページを返す)サンプルイメージのようです。

「kubectl get deployment」を実行すると、Deploymentを確認できます。

  $ kubectl get deployment
  NAME          DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
  hello-world   1         1         1            1           5m

「kubectl get pod」を実行すると、動作しているPodを確認できます。

  $ kubectl get pod
  NAME                           READY     STATUS    RESTARTS   AGE
  hello-world-6d86b54b4f-9847l   1/1       Running   0          5m

「kubectl describe pod Pod名」を実行すると、 Podに関する詳細な情報を知ることができます。以下に例を示します。
また、「kubectl describe deployment Deployment名」だと、 Deploymentに関する詳細な情報が得られます。

  $ kubectl describe pod hello-world
  Name:           hello-world-6d86b54b4f-9847l
  Namespace:      default
  Node:           minikube/10.0.2.15
  Start Time:     Sun, 03 Jun 2018 18:40:24 +0900
  Labels:         pod-template-hash=2842610609
                  run=hello-world
  Annotations:    
  Status:         Running
  IP:             172.17.0.4
  Controlled By:  ReplicaSet/hello-world-6d86b54b4f
  Containers:
    hello-world:
      Container ID:   docker://00776844d287a1f8d58183ebc56...略
      Image:          gcr.io/google-samples/node-hello:1.0
      Image ID:       docker-pullable://gcr.io/google-samples/node-hello...略
      Port:           8080/TCP
      Host Port:      0/TCP
      State:          Running
  ...後略

ただ、このままでは、8080/tcpのポートにアクセスできません。
そこで、以下のように「kubectl expose」を実行します。 「Service」というものが作成され、アクセスできるようになります。

  $ kubectl expose deployment hello-world --type=NodePort
  service "hello-world" exposed

「deployment Deployment名」で、対象のDeploymentを指定しています。
「--type=NodePort」で、kubectl run時に指定した「--port」 のポートを外部からアクセスできるようにします。

アクセスするためのURLを知るには、以下のように「minikube service」 を実行します。

  $ minikube service hello-world --url
  http://192.168.99.100:31373

Minikube を実行しているマシンでWebブラウザを起動し、 上記で得られたURLにアクセスすると、「Hello Kubernetes!」の画面が表示されます。

なお、「kubectl get service」を実行すると、Serviceを確認できます。

  $ kubectl get service
  NAME          TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGE
  hello-world   NodePort    10.106.102.1           8080:31373/TCP   1m
  kubernetes    ClusterIP   10.96.0.1              443/TCP          12h

ServiceやPod、Deploymentの削除

Serviceを削除するには、「kubectl delete service Service名」を実行します。 以下に例を示します。

  $ kubectl delete service hello-world
  service "hello-world" deleted

Deploymentを削除するには「kubectl delete deployment Deployment名」 を実行します。生成したPodも合わせて削除されます。

  $ kubectl delete deployment hello-world
  deployment.extensions "hello-world" deleted

Podだけを削除するには、「kubectl delete pod Pod名」を実行します。

  $ kubectl delete pod hello-world-6d86b54b4f-9847l
  pod "hello-world-6d86b54b4f-98471" deleted

ただ、Deploymentを削除せずにPodだけを削除すると、 自動的にPodを生成し直してくれます。

  $ kubectl get pod
  NAME                           READY     STATUS        RESTARTS   AGE
  hello-world-6d86b54b4f-6g6bz   1/1       Running       0          10s
  hello-world-6d86b54b4f-98471   1/1       Terminating   0          1h

2行目が再生成されたPodで、3行目が削除した(終了中の)Podです。
(もう少し経ってから再度実行すると、3行目が消えます。)

もし、Serviceを削除していなければ、前述と同じURLにアクセスすると、 新たに生成されたPodへとつながり、「Hello Kubernetes!」の画面が表示されます。

つまり、Podはひとつのアプリケーションの実行単位であり、 Deploymentはそれを永続的に実行し続けるためのもの、ということだと思います。

ただ、kubectl exposeは、podに対して行うこともできます。
「kubectl expose pod Pod名」を実行して作成したServiceは、そのPodがなくなると、 有効でなくなります。よって、新たにPodが生成されたら、 Serviceも再作成する(kubectl exposeする)必要があります。

Minikubeの停止

Minikubeを停止するには、「minikube stop」を実行します。

  $ minikube stop
  Stopping local Kubernetes cluster...
  Machine stopped.

Minikubeが停止すると、「minikube status」も以下のようになります。

  $ minikube status
  minikube: Stopped
  cluster: 
  kubectl: 

VirtualBoxで動作中のゲストOSもなくなります。

  $ vboxmanage list runningvms
  $

おわりに

以上、Minikubeを使って気軽にKubernetesを動かす方法を紹介しました。

わかりにくいところが多々あるかもしれませんが、 まずは書いてある通りに実行してみてください。その後、 いろいろアレンジしながら試していると、それなりに見えてくるようになる…と思います。

などと偉そうに書いていますが、私がKubernetes(Minikube)を使い始めたのは、 つい最近です。みなさまと一緒に成長していきたいと思います。

なお、「minikube dashboard」を実行すると、Webブラウザが起動し、 Webで操作できるようになります。

  $ minikube dashboard
  Opening kubernetes dashboard in default browser...

ですが、個人的には、コマンドラインで操作した方が早く覚えられるように思います。

宿題の答え

前回の宿題は、

  /var/www/html/shareを別のディレクトリに変更し、かつブラウザから
  は「http://Webサーバ/share/...」のままでアクセスできるようにして
  みましょう。

でした。

それには、「Alias」ディレクティブを使います。Aliasディレクティブを使うと、 URLとパスをマップしてくれます。たとえば、先頭が「/share」で始まるURLのパスを、 ファイルシステムの「/work/share」にマップする(結びつける)には、 以下の設定を追加します。
(前回と同様でよければ、「/etc/apache2/sites-enabled/share.conf」 に以下の設定を追加してください。)

Alias /share /work/share

これにより、たとえば「/share/foo/bar」にアクセスした場合、 ファイルシステムの「/work/share/foo/bar」を参照するようになります。
(つまり、DocumentRootと関係ないパスに結びつけることができます。)

ただ、このままだと「/share」へのアクセスが許可されておらず、 いつものForbiddenなページが表示されてしまいます。ですので、上記に加え、 以下のように「Require」ディレクティブを使って、許可する設定を追加します。 (2行目のOptionsの設定は、前回のままです。)

<Location /share/>
  Options -Indexes
  Require all granted
</Location>

Apacheをリロードすれば、上記設定が有効になります。

  $ sudo systemctl reload apache2

今回の宿題

今回の宿題は、

  MinikubeやPodがどこでどのように動作しているか、確認しましょう。

です。

Minikube がVirtualBoxのゲストOSとして動作していますが、 どんな設定で動いているのでしょうか。
また、Pod はDockerのコンテナとして動作しているはずですが、 どちらでどんなふうに動いているのでしょうか。

コマンドを使ったり、ファイルを眺めたりなど、 できる範囲内でいろいろ探っていただければと思います。
(つまり、書いている私自身が、まだわかっていないということです…。)

あとがき

あちこちに点在しているデータやバックアップを集約して整理したい! と思い、6TBのHDDと、SATAをUSB3.0に変換するドックみたいなものを、 ふと衝動買いしました。

まずは、大量のデータをかき集めて6TBのHDDへ移動させたところ、 外付けのSSDがほぼ空になり、メインPCの空き容量も、 数GBから150GB程度にまで広げることができました。

ただ、会社で最近、2TBのHDD 2台を、LVMを使ってミラーリングしましたが、 早速片方のHDDが壊れてミラーできなくなってしまいました。

HDDがいつ壊れてもおかしくないというのを目の当たりにして、HDDが1台だけでは、 その1台が壊れてしまったらデータがすべて消えてしまう、 ということに今更ながらに気づき、やや途方に暮れています。

もう1台、6TBのHDDを買ってミラーリングなどするか、マシンごとに役割を決め、 分散してデータのバックアップをとっておくか…。

前者の方がきれいですが、さらに1万円ちょいの出費が必要というのは、 なんだかなーという気がします。しかし、後者の場合、集約して管理! というそもそもの目的が達成されないということになってしまいます。

というわけで、前者を選ぶべきということは、わかっております。
ただ、最近話題の「Oculus Go」が気になっており、 万が一うっかり衝動買いしてしまったら、HDDが買えなくなってしまうかもしれません。

その場合、現構成(1台のHDDのまま)で恐る恐る使い続ける、 という第三のダメな選択肢を選んでしまいそうです…。

 

今回も、ここまで読んでいただき、誠にありがとうございました。
次回は、7月1日の発行をめざします。(まだ歯切れが悪くて恐縮です…)

 

「いますぐ実践! Linux システム管理」はこちらです。
メルマガの解除、バックナンバーなども、以下からどうぞ。
http://www.usupi.org/sysad/ (まぐまぐ ID:149633)

その他、作者に関するページは、概ね以下にございます。
http://www.usupi.org/kuri/ (まぐまぐ ID:126454)
http://usupi.seesaa.net/ (栗日記ブログ)
http://twitter.com/kuriking/ (twitter)
http://facebook.com/kuriking3 (facebook)
https://jp.pinterest.com/kuriking/ (pinterest) https://www.instagram.com/kuri_king_/ (instagram)


[バックナンバーのトップへ] [Linux システム管理のトップへ]

トップ

バックナンバー
    [日付順] [目的別]

プロフィール

▼ リンク

独学Linux
Linuxデスクトップ環境に関する情報が満載です。 メルマガもありますよ。
Server World
CentOS 6をサーバとしたときの設定例が、これでもかというくらいたくさん載っています。 CentOS以外のディストリビューション(Fedora, Ubuntu)も充実しています。
LINUXで自宅サーバーを構築・導入(Fedora9)
Fedora9のインストールの仕方から管理方法まで、詳しく載っています。 SearchManには情報がもりだくさんです。
マロンくん.NET
〜サーバ管理者への道〜
Linuxをサーバとして使用するための、いろいろな設定方法が載っています。 マロンくんもかわいいです。 なんといっても、マロンくんという名前がいいですね!!
日経Linux
今や数少なくなってしまったLinuxの雑誌。ニュースやガイドもあります。
Linux Square − @IT
@ITが提供する、Linux の情報が満載。 載っていない設定方法はないんじゃないでしょうか。
gihyo.jp…技術評論社
Linuxに限らず様々な技術情報が満載のサイト。 SoftwareDesign誌も、 ソフトウェア技術者は必見です。
SourceForge.JP Magazine
Linux に限らず、オープンソース関連の記事が網羅されています。
ITmediaエンタープライズ:Linux Tips 一覧
Tips というより FAQ 集でしょうか。わからないことがあれば覗きましょう。
IBM developerWorks : Linux
開発者向けですが、勉強になりますよ。
栗日記
システム管理とかと全然関係ありませんが、毎日栗の絵を描いています。
システム管理につかれちゃったとき、癒されたいときに、ご覧ください。:-)
WEB RANKING - PC関連
ランキングに参加してみました。押してやってください。

▼ 作ってみました

Add to Google

▼ せんでん




▼ 最近読んだ本

▼ 気に入ってる本