ためすう

Mac で kubectl と Minikube をインストール

2019-10-24

やったこと

Mac で kubectl と Minikube をインストールします。

調査

kubectl インストール

$ curl -LO "https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/darwin/amd64/kubectl"
$ chmod +x ./kubectl
$ sudo mv ./kubectl /usr/local/bin/kubectl

バージョン確認

$ kubectl version
Client Version: version.Info{Major:"1", Minor:"16", GitVersion:"v1.16.2", GitCommit:"c97fe5036ef3df2967d086711e6c0c405941e14b", GitTreeState:"clean", BuildDate:"2019-10-15T19:18:23Z", GoVersion:"go1.12.10", Compiler:"gc", Platform:"darwin/amd64"}
The connection to the server localhost:8080 was refused - did you specify the right host or port?

Minikube インストール

$ brew cask install minikube
$ minikube version
minikube version: v1.4.0
commit: 7969c25a98a018b94ea87d949350f3271e9d64b6

参考

サーバーの仮想化

2019-10-22

やったこと

サーバーの仮想化の概要を調べます。

調査

ホストOS型

ホストOSにゲストOSをインストールして利用します。

ソフトウェア例

  • VirtualBox
  • VMware

ハイパーバイザー型

コンピュータの仮想化技術のひとつである仮想機械(バーチャルマシン)を実現するための、制御プログラムである。仮想化モニタや仮想化OSと呼ばれることもある。

ソフトウェア例

  • Hyper-V
  • Linux KVM

コンテナ型

ゲストOSが不要で、単一のOSに対して、独立した環境を提供することが出来ます。

ソフトウェア例

  • Docker

参考

GCP 周りの用語を整理する

2019-10-22

やったこと

GCP (Google Cloud Platform) 周りの用語を整理します。

調査

GCP (Google Cloud Platform)

Google Cloud Platform(グーグル クラウド プラットフォーム、GCP)とは、Googleが提供しているクラウドコンピューティングサービスである。

GCE (Google Compute Engine)

Google Compute Engine は、Google のデータセンターとファイバー ネットワークで運用される仮想マシンを提供します。

GKE (Google Kubernetes Engine)

Google Kubernetes Engine は、Google のインフラストラクチャを使用して、コンテナ化されたアプリケーションのデプロイ、管理、スケーリングを行うマネージド環境を提供します。

GAE (Google App Engine)

Google App Engine は、Google のインフラの上でアプリケーションを作り、実行できるようにする PaaS ( Platform as a Service : サービスとしてのプラットフォーム)です。

参考

ssh-add を使う

2019-10-22

やったこと

ssh-add について調べます。

確認環境

$ man ssh-add --help
man, version 1.6c

調査

man より抜粋

DESCRIPTION ssh-add adds private key identities to the authentication agent, ssh-agent(1). When run without arguments, it adds the files ~/.ssh/id_rsa, ~/.ssh/id_dsa, ~/.ssh/id_ecdsa, and ~/.ssh/id_ed25519. After loading a private key, ssh-add will try to load corresponding certificate information from the filename obtained by appending -cert.pub to the name of the private key file. Alternative file names can be given on the command line.

ssh コマンドを使うとき、パスフレーズの入力をスキップ出来ます。

秘密鍵の登録

$ ssh-add ~/.ssh/id_rsa
Enter passphrase for /Users/hogehoge/.ssh/id_rsa:
Identity added: /Users/hogehoge/.ssh/id_rsa (/Users/hogehoge/.ssh/id_rsa)

$ ssh-add -l
2048 SHA256:xxxxxxxxxxx /Users/hogehoge/.ssh/id_rsa (RSA)

秘密鍵の削除

$ ssh-add -d ~/.ssh/id_rsa
Identity removed: /Users/hogehoge/.ssh/id_rsa (hogehoge@hogehoge-no-MBP)

$ ssh-add -l
The agent has no identities.

キーチェーンに保存する

-K      When adding identities, each passphrase will also be stored in the user's keychain.  When removing identities with -d, each passphrase will be
        removed from it.

参考

sed で行を差し込む

2019-10-21

やったこと

sed で行を差し込んでみます。

確認環境

$ gsed --version
gsed (GNU sed) 4.7

調査

aaa.rb

111
222
333
222
444
555

出力結果

$ gsed -e "/222/a差し込む" ./aaa.rb
111
222
差し込む
333
222
差し込む
444
555

実際にファイルを更新したい場合はこちら (-i オプション)

$ gsed -i -e "/222/a差し込む" ./aaa.rb

sed でコメントアウトする (行頭に文字追加)

2019-10-20

やったこと

sed で行頭に文字を追加してみます。

確認環境

$ gsed --version
gsed (GNU sed) 4.7

調査

aaa.rb

111
222
333
222
444
555

出力結果

$ gsed -e '/222/s/^/#/g' ./aaa.rb
111
#222
333
#222
444
555

実際にファイルを更新したい場合はこちら

$ gsed -i -e '/222/s/^/#/g' ./aaa.rb

docker を使ってみる (チュートリアル Part5: スタック)

2019-10-20

やったこと

docker を使ってみます。

チュートリアルの Part5 です。

調査

スタック (stack)

スタックは相互関係を持つサービスのグループであり、依存関係を共有します。そして、同時にオーケストレート(訳者注;複数のサーバ上で一斉に挙動する)やスケール(訳者注;サービスの拡大および縮小)します。

docker-compose.yml の準備

docker-compose.yml

version: '3'
services:
  web:
    image: hogehoge/get-started:part1
    deploy:
      replicas: 5
      resources:
        limits:
          cpus: "0.1"
          memory: 50M
      restart_policy:
        condition: on-failure
    ports:
      - '80:80'
    networks:
      - webnet
  visualizer:
    image: dockersamples/visualizer:stable
    ports:
      - "8080:8080"
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock"
    deploy:
      placement:
        constraints: [node.role == manager]
    networks:
      - webnet
  redis:
    image: redis
    ports:
      - "6379:6379"
    volumes:
      - ./data:/data
    deploy:
      placement:
        constraints: [node.role == manager]
    networks:
      - webnet
networks:
  webnet:

web.image はご自身の環境に合わせて変更してください

myvm1 環境にコピー

$ docker-machine scp docker-compose.yml myvm1:~

ディレクトリ準備

ホスト上の ./data に対して、Redis コンテナでは、/data でアクセスします。

$ docker-machine ssh myvm1 "mkdir ./data"

デプロイ

$ docker-machine ssh myvm1 "docker stack deploy -c docker-compose.yml getstartedlab"

確認

$ docker-machine ssh myvm1 "docker stack ps getstartedlab"
ID                  NAME                         IMAGE                             NODE                DESIRED STATE       CURRENT STATE          ERROR               PORTS
zh7eyy78eeiw        getstartedlab_redis.1        redis:latest                      myvm1               Running             Running 21 hours ago
a7qov9u2po63        getstartedlab_visualizer.1   dockersamples/visualizer:stable   myvm1               Running             Running 21 hours ago

redisvisualizer が追加されているのが確認できると思います。

確認

redis

http://192.168.99.100 http://192.168.99.101 にアクセスする度にカウンタが増えていきます。

visualizer

http://192.168.99.100:8080 でページを見ることが出来ます。

参考

docker を使ってみる (チュートリアル Part4: Swarm)

2019-10-20

やったこと

docker を使ってみます。

チュートリアルの Part4 です。

調査

Swarmクラスタの理解

swarm とは Docker が動作し、クラスタに参加しているマシン・グループです。

swarm 上のマシンは物理あるいは仮想どちらも使えます。swarm に加わった後は、これらは ノード として参照されます。

$ docker swarm init

swarm mode を有効化し、現在のマシンを swarm マネージャにします。

仮想マシン の作成

$ docker-machine create --driver virtualbox myvm1
$ docker-machine create --driver virtualbox myvm2

swarm の初期化

$ docker-machine ssh myvm1 "docker swarm init --advertise-addr 192.168.99.100:2377"
Swarm initialized: current node (xxxxxxxxxxx) is now a manager.

To add a worker to this swarm, run the following command:

    docker swarm join --token [my_token] 192.168.99.100:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

これで myvm1 が swarm manager となりました。

myvm2 を join する

$ docker-machine ssh myvm2 "docker swarm join \
--token [my_token] \
192.168.99.100:2377"
This node joined a swarm as a worker.

my_token は自分の token に置き換えてください。

node 確認

$ docker-machine ssh myvm1 "docker node ls"
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
2y7x69ce4gkm0eewep0meoyjk *   myvm1               Ready               Active              Leader              19.03.3
x3pmieqf6lri4b4wqp7hhgrw7     myvm2               Ready               Active                                  19.03.3

デプロイ

$ docker-machine scp docker-compose.yml myvm1:~
$ docker-machine ssh myvm1 "docker stack deploy -c docker-compose.yml getstartedlab"

※ docker-compose.yml は Part3 で使ったものを使用します。

image は Docker Hub にアップロードしているものを使います。

スタック (stack) の確認

$ docker-machine ssh myvm1 "docker stack ps getstartedlab"
ID                  NAME                         IMAGE                             NODE                DESIRED STATE       CURRENT STATE          ERROR               PORTS
ocgug6lzsq8t        getstartedlab_web.1          hogehoge/get-started:part1      myvm1               Running             Running 21 hours ago
wwq7y0fp5a8k        getstartedlab_web.2          hogehoge/get-started:part1      myvm2               Running             Running 21 hours ago
oyeqksqowa9x        getstartedlab_web.3          hogehoge/get-started:part1      myvm1               Running             Running 21 hours ago
jl7rqoy40yxl        getstartedlab_web.4          hogehoge/get-started:part1      myvm2               Running             Running 21 hours ago
qrrp9ft7fv87        getstartedlab_web.5          hogehoge/get-started:part1      myvm2               Running             Running 21 hours ago
$ docker-machine ls
NAME    ACTIVE   DRIVER       STATE     URL                         SWARM   DOCKER     ERRORS
myvm1   -        virtualbox   Running   tcp://192.168.99.100:2376           v19.03.3
myvm2   -        virtualbox   Running   tcp://192.168.99.101:2376           v19.03.3

192.168.99.100 192.168.99.101 にアクセスすると、5つのコンテナのいずれかにアクセスします。

swarm を削除する

$ docker-machine ssh myvm2 "docker swarm leave"
$ docker-machine ssh myvm1 "docker swarm leave --force"

参考

File#flock を使ってみる (Ruby)

2019-10-20

やったこと

File の flock について挙動を確認しました。

確認環境

$ ruby --version
ruby 2.6.3p62 (2019-04-16 revision 67580) [x86_64-darwin17]

$ rails --version
Rails 5.2.3

調査

排他ロックを使う

コンソール1

$ rails c
Running via Spring preloader in process 31090
Loading development environment (Rails 5.2.3)
irb(main):001:0> f = File.open("/tmp/foo", "w")
=> #<File:/tmp/foo>
irb(main):002:0> f.flock(File::LOCK_EX)
=> 0

コンソール2

$ rails c
Running via Spring preloader in process 31491
Loading development environment (Rails 5.2.3)
irb(main):001:0> f = File.open("/tmp/foo", "w")
=> #<File:/tmp/foo>
irb(main):002:0> f.flock(File::LOCK_EX)

コンソール2は止まっています。

コンソール1 (unlockする)

irb(main):003:0> f.flock(File::LOCK_UN)
=> 0

コンソール2

irb(main):002:0> f.flock(File::LOCK_EX)
=> 0

排他ロックされている場合、待たせない

コンソール1

$ rails c
Running via Spring preloader in process 33223
Loading development environment (Rails 5.2.3)
irb(main):001:0> f = File.open("/tmp/foo", "w")
=> #<File:/tmp/foo>
irb(main):002:0> f.flock(File::LOCK_EX | File::LOCK_NB)
=> 0

コンソール2

$ rails c
Running via Spring preloader in process 33627
Loading development environment (Rails 5.2.3)
irb(main):001:0>  f = File.open("/tmp/foo", "w")
=> #<File:/tmp/foo>
irb(main):002:0> f.flock(File::LOCK_EX | File::LOCK_NB)
=> false

先に排他的ロックが取られている場合、処理を待つことなく false が返されました。

参考

sed に BSD と GNU の確認方法

2019-10-20

やったこと

sed でテキストの置換処理を調べていたのですが、書いてある通りに動かないことがありました。

それは、BSD と GNU で異なることが原因のようでした。

Mac ではデフォルトでは sed は BSD 版が入っているようです。

今回、以下をやりました。

  • GNU 版のインストール
  • BSD、GNUの確認方法

調査

GNU 版のインストール

brew でインストールします。

$ brew install gnu-sed
$ gsed --version
gsed (GNU sed) 4.7
Copyright (C) 2018 Free Software Foundation, Inc.
(以下省略)

BSD、GNUの確認方法

$ man sed

出力結果 (抜粋)

SED(1)                    BSD General Commands Manual                   SED(1)

NAME
     sed -- stream editor

BSD 版が入っていることが確認できました。

参考