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

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

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

6月18日に、大阪でマグニチュード6.1の地震がありました。

平成30年6月18日07時58分頃の大阪府北部の地震について
https://www.jma.go.jp/jma/press/1806/18a/kaisetsu201806181000.pdf

実家が高槻にあり、震源地の近くだったのですが、幸い、 食器が落ちたり重い本棚がずれたりしたことを除けば、重篤な被害はありませんでした。

それよりも、次に本震が来るかもしれない、 という不安が精神的な重荷になっていたようで、眠れないという話をよく聞きました。

あれから半月ほど経過し、余震もおさまってきましたので、 不安はだいぶ薄れてきているように思います。

それにしても、毎回、予想外のところで地震が起きています。

私が生息している名古屋は、南海トラフ地震が発生すると、 大きな被害が発生する可能性のあるところです。

起きるかもしれないと言われ続けて数十年経ちますが、 次はここ名古屋で発生するかもしれない、という気持ちを忘れないようにしながら、 できる限り備えておきたいと思います。

さしあたって、賞味期限が2017年のリッツ缶とご飯を早急に消費せねばと思いつつ、 今回もはりきってまいりたいと思います。

今回のお題 - etcdを動かしてみる (レベル:中級)

前回、Kubernetesのお試し版とも言えるMinikubeをご紹介しました。

Vol.276 - Kubernetesを気軽に体験する
http://www.usupi.org/sysad/276.html

今回は、複数のLinuxを用意してちゃんとしたKubernetesの環境を構築… と思ったのですが、全体像がよくわからないまま、インストールや設定を行っても、 理解できずに終わってしまうかもしれません。

ですので、Kubernetesで使われている個々の機能を、まずは順番にご紹介した後、 Kubernetesの環境を構築した方が、理解しやすいのではないか、と思いました。

そんなわけで、今回は、「etcd」を簡単にご紹介したいと思います。

ちなみに、実は、私自身、まだ Kubernetes のことをきちんと理解できていません。 自身の理解を同時進行で進めていこうとしております。

毎回、理解が間に合うのだろうかという緊張感と、 ネタにはしばらく困ることはないという安心感の両方を感じながら、挑みたいと思います。

そして、今回も、Ubuntu16.04以外での動作確認をしておりません。
申し訳ございませんが、ご了承ください。

etcdの概要とインストール手順

etcd(etc distributed) は、 複数のマシンで設定情報を共有することを主な目的とした分散KVS(Key Value Store)です。

GitHub - coreos/etcd: Distributed reliable key-value store for the most critical data of a distributed system
https://github.com/coreos/etcd
Using etcd
https://coreos.com/etcd/

KVSとは、Keyを指定してValueを設定したり取得したりするデータストア (大量のデータを管理するソフトウェア)のことです。

etcdは、以下を重視して作られています。

  • シンプル (HTTP+JSONでアクセス可能)
  • セキュリティ (SSLによる暗号化が可能)
  • 速い (1秒間に1000回書き込みができる)
  • 信頼性 (Raftという分散合意アルゴリズムを使用)

Ubuntuには同名のパッケージがあり、下記の手順でインストールすれば、 いきなり使えます。(インストールするとサービスが自動起動します。)

  $ sudo apt install etcd

ただ、以下のようにバージョンが古いため、 後述の GitHub から入手する方法をおすすめします。

  $ etcd --version
  etcd Version: 2.2.5
  Git SHA: Not provided (use ./build instead of go build)
  Go Version: go1.6.2
  Go OS/Arch: linux/amd64

以下の、GitHubにあるビルド済のアーカイブを入手・展開して使うこともできます。

Releases・coreos/etcd・GitHub
https://github.com/coreos/etcd/releases/

現時点ではv3.3.8が最新です。v3.3.8の場合、たとえば以下のように入手・展開して、 etcdを実行します。

  $ curl -LO https://github.com/coreos/etcd/releases/download/v3.3.8/etcd-v3.3.8-linux-amd64.tar.gz
  $ tar xvfz etcd-v3.3.8-linux-amd64.tar.gz
  ...略...
  $ cd etcd-v3.3.8-linux-amd64/
  $ ./etcd

なお、etcdが使用するポートは、クライアント用の「2379/tcp」と、 他のサーバとの通信用の「2380/tcp」の2つです。
パッケージ版のetcdだと、以前のバージョンとの互換性を保つため、 上記に加えて「4001/tcp」と「7001/tcp」も使用します。
(/etc/default/etcdのコメントに記載があり、同ファイルで設定を変えることができます。)

また、データは、パッケージ版では「/var/lib/etcd/default」以下に、 GitHubから入手した版ではカレントディレクトリ直下に「default.etcd」 というディレクトリを作成し、そこに保存します。

etcdctlコマンドでアクセスしてみる

etcdにアクセスするには、「etcdctl」というコマンドを使います。
サーバ一覧を得るには、「member list」を引数に指定して実行します。

  $ etcdctl member list
  ce2a822cea30bfca: name=foo peerURLs=http://localhost:2380,http://localhost:7001 \
    clientURLs=http://localhost:2379,http://localhost:4001
サーバは自分自身だけなので、localhostの情報だけが出力されます。
なお、上記はパッケージ版の場合の結果で、GitHub版の場合は下記の結果が得られます。

  $ ./etcdctl member list
  8e9e05c52164694d: name=default peerURLs=http://localhost:2380 clientURLs=http://localhost:2379 isLeader=true

値を設定するには、「set」とKey、Valueを引数に指定して実行します。
たとえば、Keyが「foo」でValueが「bar」の場合の例を以下に示します。

  $ ./etcdctl set foo bar
  bar

値を得るには、「get」とKeyを引数に指定して実行します。
たとえば、先ほどの「foo」の値を得るには、以下のように実行します。

  $ ./etcdctl get foo
  bar

Keyを消すには、「rm」とKeyを指定して実行します。
先ほどの「foo」を消すには、以下のように実行します。

  $ ./etcdctl rm /foo
  PrevNode.Value: bar

なお、Keyは、ただの名前だけでなく、パスを指定できます。

  $ ./etcdctl set /bar/baz/qux quux
  quux

「ls」とディレクトリを引数に指定して実行すると、その直下のKeyなどを出力します。

  $ ./etcdctl ls /bar/baz
  /bar/baz/qux

他に、「mkdir」や「rmdir」などを引数に指定して、 ディレクトリの作成や削除も行えます。ただ、いちいちmkdirで作成しなくても、 setのとき、存在しないディレクトリがあれば自動で作られます。

HTTPでアクセスしてみる

etcdctlを実行する際、「--debug」オプションを指定すると、 HTTPで実際にアクセスするときのURLを出力してくれます。

  $ ./etcdcl --debug ls /
  ...中略...
  cURL Command: curl -X GET http://127.0.0.1:4001/v2/members
  cURL Command: curl -X GET http://127.0.0.1:2379/v2/members
  got endpoints(http://localhost:2379,http://localhost:2379) after sync
  Cluster-Endpoints: http://localhost:2379, http://localhost:2379
  cURL Command: curl -X GET http://localhost:2379/v2/keys/?quorum=false&recursive=false&sorted=false
  /foo
  /bar

etcdctlがなくても、上記を参考にcurlコマンドを使ってHTTPでアクセスすれば、 同等の情報を得ることができます。

  $ curl -X GET http://localhost:2379/v2/keys/?quorum=false&recursive=false&sorted=false
  {"action":"get","node":{"dir":true,"nodes":[\
    {"key":"/foo","value":"var","modifiedIndex":6,"createdIndex":6},\
    {"key":"/bar","dir":true,"modifiedIndex":7,"createdIndex":7}]}}

このように、JSONの形式で結果が得られます。

複数のマシンでクラスタを構築

今までは単一のマシンでetcdを動作させてきました。
次は、2台のマシンを使って、クラスタを構築してみましょう。
なお、以下では、パッケージ版ではなく、GitHubから得たetcdを使用して試しています。

それぞれのIPアドレスが「192.168.1.1」と「192.168.1.2」とする場合、 1台目では以下のように起動します。

  srv1$ ./etcd --name srv1 --listen-peer-urls http://192.168.1.1:2380 \
    --initial-advertise-peer-urls http://192.168.1.1:2380 \
    --initial-cluster srv1=http://192.168.1.1:2380,srv2=http://192.168.1.2:2380

名前を仮に「srv1」として、「--name」オプションで指定しています。
他のサーバとのやり取りに使うURLを「--listen-peer-urls」オプションで指定します。 デフォルトではlocalhostでlistenするため、IPアドレスを使ったURLを指定しています。
また、他のサーバに通知するURLも、 「--initial-advertise-peer-urls」オプションで同様に指定しています。
そして、「--initial-cluster」オプションで、 このクラスタを構成するマシン名とURLを指定します。ここでは2台分を指定しています。

なお、データを格納するディレクトリは、厳密には「名前.etcd」ですので、 今回は前述の「default.etcd」ではなく「srv1.etcd」となります。

同様に、2台目でも以下のように実行します。名前は「srv2」です。

  srv2$ ./etcd --name srv2 --listen-peer-urls http://192.168.1.2:2380 \
    --initial-advertise-peer-urls http://192.168.1.2:2380 \
    --initial-cluster srv1=http://192.168.1.1:2380,srv2=http://192.168.1.2:2380

双方を実行後、サーバ一覧を確認すると、 2台のマシンの構成で動作していることがわかります。
なお、どちらのマシンで実行しても、同じ結果が得られます。

  $ ./etcdctl member list
  27470ba4b88bce9e: name=srv1 peerURLs=http://192.168.1.1:2380 clientURLs=http://localhost:2379 isLeader=true
  f19e707aed49b299: name=srv2 peerURLs=http://192.168.1.2:2380 clientURLs=http://localhost:2379 isLeader=false

srv1の方に「isLeader=true」とあるため、1台目がリーダーのようです。

で、情報が共有されるため、片方のマシンで設定し、

  srv1$ ./etcdctl set /foo/bar baz
  baz

もう片方のマシンで参照すると、前者で設定した値が得られます。

  srv2$ ./etcdctl get /foo/bar
  baz

ただ、リーダーである1台目のetcdが死んでいると、データの参照はできますが、 設定はできませんでした。以下のようにエラーが発生します。

  $ etcdctl ls /
  /foo
  /bar
  $ etcdctl mkdir /baz
  Error:  client: etcd cluster is unavailable or misconfigured
  error #0: client: endpoint http://localhost:2379 exceeded header timeout
  error #1: client: endpoint http://localhost:2379 exceeded header timeout

1台目のetcdを復活させると、設定できるようになりました。

  $ etcdctl mkdir /baz
  $ etcdctl ls /
  /foo
  /bar
  /baz

おわりに

以上、etcdの使い方などを簡単にご紹介しました。

Kubernetes でどのように etcd が使われているか、 というところまで話が進みませんでした。そのうち確認してご紹介したいと思います。

というわけで、しばらくKubernetesネタが続きそうですが、なるべく単体で、 かつKubernetesがなくても試せる内容にしたいと思っています。

引き続きお付き合いいただけますと、誠に幸いです。

宿題の答え

前回の宿題は、

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

でした。

前回もご紹介しましたが、まず、minikube startで Minikube を起動すると、 VirtualBoxのゲストOSが起動します。

  $ minikube start
  ...中略...
  $ vboxmanage list runningvms
  "minikube" {a2106a9a-a087-4872-aa1e-715f00361f55}

さらに、ゲストOSでDockerが動作しています。
「minikube docker-env」を実行すると、 ゲストOSで動作しているDockerに直接アクセスするための環境変数を出力してくれます。

  $ minikube docker-env
  export DOCKER_TLS_VERIFY="1"
  export DOCKER_HOST="tcp://192.168.99.100:2376"
  export DOCKER_CERT_PATH="/home/usuda/.minikube/certs"
  export DOCKER_API_VERSION="1.23"
  # Run this command to configure your shell:
  # eval $(minikube docker-env)

最後に書いてあるように、evalコマンドで反映した上でdockerコマンドを実行すると、 ゲストOSの中のDockerに直接アクセスできます。

  $ eval $(minikube docker-env)
  $ docker version
  ...前略...
    Server:
   Version:      17.12.1-ce
   API version:  1.35 (minimum version 1.12)
   Go version:   go1.9.4
   Git commit:   7390fc6
   Built:        Tue Feb 27 22:20:43 2018
   OS/Arch:      linux/amd64
   Experimental: false

  $ docker ps
  ...たくさん実行されていますが割愛...

前回と同様にPodを起動すると、

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

Dockerコンテナが2つ起動していることが確認できます。

  $ docker ps | grep hello
  5f031c5465ff        4c7ea8709739                 "/bin/sh -c 'node ..."   23 minutes ago      Up 23 minutes                           k8s_hello-world_hello-world-6d86b54b4f-zmfk7_default_a69617b5-71d1-11e8-900f-0800278121c6_0
  bf9ba1fad0e6        k8s.gcr.io/pause-amd64:3.1   "/pause"                 23 minutes ago      Up 23 minutes                           k8s_POD_hello-world-6d86b54b4f-zmfk7_default_a69617b5-71d1-11e8-900f-0800278121c6_0

後者の/pauseを実行しているコンテナは、「pauseコンテナ」と呼ばれるもので、 ネットワークを利用するために作成されるもののようです。

なお、起動したゲストOSには、「minikube ssh」でログインできます。

  $ minikube ssh
                           _             _            
              _         _ ( )           ( )           
    ___ ___  (_)  ___  (_)| |/')  _   _ | |_      __  
  /' _ ` _ `\| |/' _ `\| || , <  ( ) ( )| '_`\  /'__`\
  | ( ) ( ) || || ( ) || || |\`\ | (_) || |_) )(  ___/
  (_) (_) (_)(_)(_) (_)(_)(_) (_)`\___/'(_,__/'`\____)

  $ pwd
  /home/docker
  $ uname -a
  Linux minikube 4.9.64 #1 SMP Fri Mar 30 21:27:22 UTC 2018 x86_64 GNU/Linux

ここでdockerコマンドを実行すれば、先ほどと同じ結果が得られます。

  $ docker version
  ...前略...
    Server:
   Engine:
    Version:    17.12.1-ce
    API version:        1.35 (minimum version 1.12)
    Go version: go1.9.4
    Git commit: 7390fc6
    Built:      Tue Feb 27 22:20:43 2018
    OS/Arch:    linux/amd64
    Experimental:       false

ログインすると、他にもいろいろ確認できると思います。
ぜひやってみてください。

今回の宿題

今回の宿題は、

  Minikubeで動作しているetcdにアクセスしてみましょう。

です。

宿題の答えの通りに docker ps を起動すると、 etcdが動作するコンテナの存在を確認できます。

後はなんとか試行錯誤して、その etcd にアクセスしてみてください。

なお、SSLを使っているため、etcdctlを実行する際に、 keyやcertなどのファイルをオプションで指定する必要があります。
(etcdctl --helpを実行すると、オプションの一覧が出力されます。)

あとがき

中学生の頃にパソコンと出会いました。それから、RPGを中心にゲームをよくやりました。 BASICでゲームをつくるということも、ゲームをやるのと同じくらい、 ちまちまとよくやっていました。

社会人になってからは、ゲームへの興味が薄れ、趣味でつくるプログラムも、 ちょっとした役に立つものばかりになってしまいました。

そんな私でも、VRやARというものには、以前から興味があります。ただ、 Oculus RiftやPlayStation VRは、本体だけでもそれなりの価格ですし、 さらにそこそこのPCもしくはPS4を必要とします。
欲しいなと思いつつも、金額的な壁に阻まれ、手を出せないでいました。

が、先日発売されたOculus Goは、 容量が32GBの方だと 23,800円 で購入できてしまいます。そして、 本体だけで動いてくださいます。
残念ながら、Oculus Rift にはあるポジショントラッキング機能 (HMDの位置を認識する機能)はありません。ですが、 頭の動きを感知するヘッドトラッキング機能はあります。それできっと十分、 と思われます。

もう、これは、買う、しかない、ということで、ポチりました。

ありがたいことに、3〜4日後に届きました。

言われるがままにセットアップを終わらせ、まずはYoutubeの360度動画を観てみました。 …おお、もうこれだけで十分満足、お腹いっぱいです。

…いやいや、アプリもたくさんあります。無料のアプリだけでなく、 有料のアプリもいくつかインストールして、遊んでみました。

どれも3Dをうまく活かしていて、楽しいです。中でも、 「Land's End」というパズルゲームが面白いです。ほぼ何も説明がないのですが、 操作していくうちにルールが覚えられ、自然とパズルを解いていけるようになってます。 風景もきれいで、おすすめです。

ちなみに、Oculus GoのOSは、Android でした。LinuxマシンにUSBで接続し、 adbでシェルを動かしたり、ストレージとして扱うことができます。

Unityでアプリの開発もできるようです。 先日うっかりLinux版のUnityをアンインストールしてしまいましたが、 機会があれば再インストールして試してみたいと思います。 (Linux版で開発可能かわかりませんが…。)

という感じで、ゲームやりたい熱と作りたい熱が再燃しつつあります。
今後、時間があれば、いろいろやっていきたいと思っています。

ただ、ゴーグルをつけていると、バンドで髪の毛がぼさぼさになります。
また、頬にゴーグルの跡が残ります。
出かける用事があるときは、Oculus Goを使わない方がよいと思います。

以上、頬に跡をつけて外に出かけたことのある経験者からの忠告でした。

 

今回も、ここまで読んでいただき、誠にありがとうございました。
次回は、8月5日の発行を目指します。(依然として歯切れが悪いですー)

 

「いますぐ実践! 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

▼ せんでん




▼ 最近読んだ本

▼ 気に入ってる本