涅槃を目指す in はてな

人生に迷う様を書きます

Kubernetes The Hard Way On VirtualBox 2日目

今回やること

前回はノードの作成をしました、今回は接続に必要な証明書の作成です。

Provisioning a CA and Generating TLS Certificates

Public Key Infrastructure (PKI)を準備し、以下のコンポーネントで使うTLS証明書を作成します。

  • etcd
  • kube-apiserver
  • kube-controller-manager
  • kube-scheduler
  • kubelet
  • kube-proxy

PKIてなに?

日本語では「公開鍵暗号基盤」とか訳されて、電子証明書を発行するために用いられ、3つの要素で構成されています。

  1. サーバ証明書やクライアント証明書
  2. 証明書の発行元である認証局
  3. 証明書を管理するリポジトリ

詳しくは以下を参照して下さい

ja.wikipedia.org

どこで作業するか

openssl コマンドが使えて、作成した証明書をVMにコピーできる環境であればOK。

公式ではmaster-1ノードを管理用クライアントにする方式が紹介されていますが、私は手元のPCを管理用マシンとして使いたいので手元のPCで行います。

Certificate Authority(認証局)作成

ここではTLS証明書発行に必要な認証局を作成します。

ディレクトリ作成

$ mkdir pki
$ cd pki

CA用の秘密鍵作成

$ openssl genrsa -out ca.key 2048

権限問題を回避するために /etc/ssl/openssl.cnf ファイル内の RANDFILE という文字列で始まる行があったらコメントアウトします。

RANDFILEは乱数を生成するためのファイルで、デフォだと $ENV::HOME/.rnd が使われるハズです(多分)

sudo sed -i '0,/RANDFILE/{s/RANDFILE/\#&/}' /etc/ssl/openssl.cnf

秘密鍵を使ってCSRを作成します。

openssl req -new -key ca.key -subj "/CN=KUBERNETES-CA" -out ca.csr

自分の秘密鍵を使って自己署名します

$ openssl x509 -req -in ca.csr -signkey ca.key -CAcreateserial  -out ca.crt -days 1000

Signature ok
subject=CN = KUBERNETES-CA
Getting Private key

直下に以下2つのファイルがあることを確認しましょう

ca.crt
ca.key

ca.crtKubernetes認証局の証明書で、ca.keyKubernetes認証局秘密鍵です。ca.crtは至る所で使われるので色んな所にコピーされます。

ca.key認証局が証明書の署名に使います。そしてそれは安全な場所に保管する必要があり、私の環境だと手元のPCが認証局サーバになります。これは他のノードにコピーする必要はありません。

クライアント証明書とサーバ証明書の作成

ここではkubernetesの各コンポーネント用のクライアント証明書とサーバ証明書、adminユーザ用のクライアント証明書を作成します。

admin 用のクライアント証明書作成

admin用の秘密鍵作成

$ openssl genrsa -out admin.key 2048

admin用のCSR作成。OUに注意。adminユーザはsystem:masters グループの一員であることに注意して下さい。

そうすることでkubectlを使ってあらゆる管理操作を行うことが出来ます。

$ openssl req -new -key admin.key -subj "/CN=admin/O=system:masters" -out admin.csr

作成した秘密鍵でadmin用の証明書に署名

$ openssl x509 -req -in admin.csr -CA ca.crt -CAkey ca.key -CAcreateserial  -out admin.crt -days 1000
Signature ok
subject=CN = admin, O = system:masters
Getting CA Private Key

以下のファイルが出来ていることを確認

admin.key
admin.crt

admin.keyadmin.crtがあれば管理者アクセスが可能です。これらをkubectlで使って管理操作を実行できるようにします。

Kubeletのクライアント証明書

ここではスキップします。Workerノードをセットアップする時に行います。

Controller Manager のクライアント証明書

ここではkube-controller-managerのクライアント所証明書と秘密鍵を作成します。

$ openssl genrsa -out kube-controller-manager.key 2048
$ openssl req -new -key kube-controller-manager.key -subj "/CN=system:kube-controller-manager" -out kube-controller-manager.csr
$ openssl x509 -req -in kube-controller-manager.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out kube-controller-manager.crt -days 1000

以下のファイルが出来ていることを確認

kube-controller-manager.key
kube-controller-manager.crt

Kube Proxyのクライアント証明書

ここではkube-proxy のクライアント所証明書と秘密鍵を作成します。

$ openssl genrsa -out kube-proxy.key 2048
$ openssl req -new -key kube-proxy.key -subj "/CN=system:kube-proxy" -out kube-proxy.csr
$ openssl x509 -req -in kube-proxy.csr -CA ca.crt -CAkey ca.key -CAcreateserial  -out kube-proxy.crt -days 1000

以下のファイルが出来ていることを確認

kube-proxy.key
kube-proxy.crt

Schedulerのクライアント証明書

ここではkube-scheduler のクライアント所証明書と秘密鍵を作成します。

似たような作業が続くのでコピペミスに注意。コピペの乱れは心の乱れ。

$ openssl genrsa -out kube-scheduler.key 2048
$ openssl req -new -key kube-scheduler.key -subj "/CN=system:kube-scheduler" -out kube-scheduler.csr
openssl x509 -req -in kube-scheduler.csr -CA ca.crt -CAkey ca.key -CAcreateserial  -out kube-scheduler.crt -days 1000

以下のファイルが出来ていることを確認

kube-scheduler.key
kube-scheduler.crt

The Kubernetes API Serverの証明書

kube-apiserverの証明書は、アクセス可能なコンポーネント名それぞれに対応するための名前の一部を代替名として持っている必要があります。

maesterサーバ、ロードバランサー、kube-apiサービス等のIPアドレスDNS名が含まれます。

opensslのconfファイルに以下の設定をします。10.96.0.1はThe Kubernetes API ServerのIPアドレスです。

$ cat > openssl.cnf <<EOF
[req]
req_extensions = v3_req
distinguished_name = req_distinguished_name
[req_distinguished_name]
[ v3_req ]
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
subjectAltName = @alt_names
[alt_names]
DNS.1 = kubernetes
DNS.2 = kubernetes.default
DNS.3 = kubernetes.default.svc
DNS.4 = kubernetes.default.svc.cluster.local
IP.1 = 10.96.0.1
IP.2 = 192.168.5.11
IP.3 = 192.168.5.12
IP.4 = 192.168.5.30
IP.5 = 127.0.0.1
EOF

kube-apiserverの証明書を作成します

$ openssl genrsa -out kube-apiserver.key 2048
$ openssl req -new -key kube-apiserver.key -subj "/CN=kube-apiserver" -out kube-apiserver.csr -config openssl.cnf
$ openssl x509 -req -in kube-apiserver.csr -CA ca.crt -CAkey ca.key -CAcreateserial  -out kube-apiserver.crt -extensions v3_req -extfile openssl.cnf -days 1000

以下のファイルが出来ていることを確認

kube-apiserver.crt
kube-apiserver.key

ETCDのサーバ証明書作成

kube-apiserverと同様に、etcdにはetcdクラスタを構成する全てのIPアドレスが必要です

$ cat > openssl-etcd.cnf <<EOF
[req]
req_extensions = v3_req
distinguished_name = req_distinguished_name
[req_distinguished_name]
[ v3_req ]
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
subjectAltName = @alt_names
[alt_names]
IP.1 = 192.168.5.11
IP.2 = 192.168.5.12
IP.3 = 127.0.0.1
EOF

etcd用の証明書を作成します

$ openssl genrsa -out etcd-server.key 2048
$ openssl req -new -key etcd-server.key -subj "/CN=etcd-server" -out etcd-server.csr -config openssl-etcd.cnf
$ openssl x509 -req -in etcd-server.csr -CA ca.crt -CAkey ca.key -CAcreateserial  -out etcd-server.crt -extensions v3_req -extfile openssl-etcd.cnf -days 1000

以下のファイルが出来ていることを確認

etcd-server.key
etcd-server.crt

Service Accountキーペア

Service Accountキーペアを作成します。

Kubernetesには、User AccountとService Accountがあります。User AccountはEKSではIAMと紐付いたりして、Kubernetesの管理対象ではありません。

Service AccountはPodの実行のために割り当てられ、Namespaceに紐づくリソースです。詳しくはこちらをご覧ください。

Managing Service Accounts | Kubernetes

$ openssl genrsa -out service-account.key 2048
$ openssl req -new -key service-account.key -subj "/CN=service-accounts" -out service-account.csr
$ openssl x509 -req -in service-account.csr -CA ca.crt -CAkey ca.key -CAcreateserial  -out service-account.crt -days 1000

以下のファイルが出来ていることを確認

service-account.key
service-account.crt

証明書の配布

証明書と秘密鍵をコントローラインスタンスに配布します。masterノードからではなく手元のPCで作成した鍵を配布ているので公式とは手順が異なっています

for instance in vagrant@192.168.5.11 vagrant@192.168.5.12 ; do
  scp ca.crt ca.key kube-apiserver.key kube-apiserver.crt \
    service-account.key service-account.crt \
    etcd-server.key etcd-server.crt \
    ${instance}:~/
done

master-1に配布されているか確認

vagrant@master-1:~$ ll
total 116
drwxr-xr-x 5 vagrant vagrant  4096 Sep 23 01:56 ./
drwxr-xr-x 4 root    root     4096 Sep 20 05:46 ../
-rw------- 1 vagrant vagrant   680 Sep 22 16:42 .bash_history
-rw-r--r-- 1 vagrant vagrant   220 Aug 27  2020 .bash_logout
-rw-r--r-- 1 vagrant vagrant  3771 Aug 27  2020 .bashrc
drwx------ 2 vagrant vagrant  4096 Sep 20 05:46 .cache/
drwx------ 3 vagrant vagrant  4096 Sep 20 05:46 .gnupg/
-rw-r--r-- 1 vagrant vagrant   807 Aug 27  2020 .profile
drwx------ 2 vagrant vagrant  4096 Sep 20 05:46 .ssh/
-rw-rw-r-- 1 vagrant vagrant  1001 Sep 23 01:56 ca.crt
-rw------- 1 vagrant vagrant  1679 Sep 23 01:56 ca.key
-rwxrwxr-x 1 vagrant vagrant 46007 Sep 20 05:47 cert_verify.sh*
-rw-rw-r-- 1 vagrant vagrant  1082 Sep 23 01:56 etcd-server.crt
-rw------- 1 vagrant vagrant  1679 Sep 23 01:56 etcd-server.key
-rw-rw-r-- 1 vagrant vagrant  1237 Sep 23 01:56 kube-apiserver.crt
-rw------- 1 vagrant vagrant  1675 Sep 23 01:56 kube-apiserver.key
-rw-rw-r-- 1 vagrant vagrant  1005 Sep 23 01:56 service-account.crt
-rw------- 1 vagrant vagrant  1675 Sep 23 01:56 service-account.key

master-2に配布されているか確認

vagrant@master-2:~$ ll
total 116
drwxr-xr-x 5 vagrant vagrant  4096 Sep 23 01:56 ./
drwxr-xr-x 4 root    root     4096 Sep 20 05:47 ../
-rw------- 1 vagrant vagrant   645 Sep 20 06:23 .bash_history
-rw-r--r-- 1 vagrant vagrant   220 Aug 27  2020 .bash_logout
-rw-r--r-- 1 vagrant vagrant  3771 Aug 27  2020 .bashrc
drwx------ 2 vagrant vagrant  4096 Sep 20 05:47 .cache/
drwx------ 3 vagrant vagrant  4096 Sep 20 05:47 .gnupg/
-rw-r--r-- 1 vagrant vagrant   807 Aug 27  2020 .profile
drwx------ 2 vagrant vagrant  4096 Sep 20 05:47 .ssh/
-rw-rw-r-- 1 vagrant vagrant  1001 Sep 23 01:56 ca.crt
-rw------- 1 vagrant vagrant  1679 Sep 23 01:56 ca.key
-rwxrwxr-x 1 vagrant vagrant 46007 Sep 20 05:48 cert_verify.sh*
-rw-rw-r-- 1 vagrant vagrant  1082 Sep 23 01:56 etcd-server.crt
-rw------- 1 vagrant vagrant  1679 Sep 23 01:56 etcd-server.key
-rw-rw-r-- 1 vagrant vagrant  1237 Sep 23 01:56 kube-apiserver.crt
-rw------- 1 vagrant vagrant  1675 Sep 23 01:56 kube-apiserver.key
-rw-rw-r-- 1 vagrant vagrant  1005 Sep 23 01:56 service-account.crt
-rw------- 1 vagrant vagrant  1675 Sep 23 01:56 service-account.key

今回はここまで!

お読みいただきありがとうございました!

面倒くさかったー

Kubernetes The Hard Way On VirtualBox 1日目

どうした

前からうすうす感じてたんですけど、私はkubernetesを雰囲気で使ってます。

どっかから落としたyamlをイジってはdeploy、既存のyamlをイジってはdeploy

「壊れたら再作成すればいいっしょw」

。。。

なんすかこれ?

なんなんすかこれ?

経典として買ったkubernetes完全ガイドが泣いてました

というわけで再入門。なんとなくスルーしてきた『Kubernetes The Hard Way』をやります!

しかもVirtualBoxでも出来るように神が作ってくれた『Kubernetes The Hard Way On VirtualBox』だッ!

Kubernetes The Hard Way On VirtualBox

本来はGCP上に作成したVMkubernetesを作成するんですが、これは手元のVirtualBoxで作成したVMkubernetesを作成します。

github.com

結構長いので、地道にやっていこうと思ってます。

今回は1日目。環境構築。

Prerequisites

VM Hardware Requirements

HW要件としては

8 GB of RAM (Preferably 16 GB) 50 GB Disk space

とされてます

私のうちのPCを確認

$ df -h
Filesystem      Size  Used Avail Use% Mounted on
udev             32G     0   32G   0% /dev
tmpfs           6.3G  2.5M  6.3G   1% /run
/dev/nvme0n1p2  457G  180G  254G  42% /
tmpfs            32G  235M   32G   1% /dev/shm
tmpfs           5.0M  4.0K  5.0M   1% /run/lock
$ free -h 
              total        used        free      shared  buff/cache   available
Mem:           62Gi       9.2Gi        29Gi       449Mi        23Gi        52Gi
Swap:         2.0Gi          0B       2.0Gi

余裕っすねうんうん。

Virtual Box

OSのバージョン確認

$ cat /etc/issue
Ubuntu 20.04.3 LTS

Virtual Boxのバージョン確認

$ VBoxManage -v
6.1.26r145957

Vagrant

Vagrantのバージョン確認

$ vagrant version
Installed Version: 2.2.6

Vagrant was unable to check for the latest version of Vagrant.
Please check manually at https://www.vagrantup.com

Provisioning Compute Resources

リポジトリをローカルにcloneします

$ git clone https://github.com/mmumshad/kubernetes-the-hard-way.git

vagrantファイルがあるディレクトリに移動

$ cd kubernetes-the-hard-way\vagrant

ここにあるVagrantfileを実行すると、以下のような5つのVMが作成されます。

VM VM Name Purpose IP Forwarded Port
master-1 kubernetes-ha-master-1 Master 192.168.5.11 2711
master-2 kubernetes-ha-master-2 Master 192.168.5.12 2712
worker-1 kubernetes-ha-worker-1 Worker 192.168.5.21 2721
worker-2 kubernetes-ha-worker-2 Worker 192.168.5.22 2722
loadbalancer kubernetes-ha-lb LoadBalancer 192.168.5.30 2730
$ vagrant up

しばらく待ちましょう。

プロンプトが戻ってきたらVMを確認

$ vagrant status
Current machine states:

master-1                  running (virtualbox)
master-2                  running (virtualbox)
loadbalancer              running (virtualbox)
worker-1                  running (virtualbox)
worker-2                  running (virtualbox)

This environment represents multiple VMs. The VMs are all listed
above with their current state. For more information about a specific
VM, run `vagrant status NAME`.

確認のため、各VMSSH接続してみましょう

$ vagrant ssh master-1
$ vagrant ssh master-2
$ vagrant ssh loadbalancer 
$ vagrant ssh worker-1
$ vagrant ssh worker-2  

workerでは、dokerのバージョン確認も確認しておきましょう

$ sudo docker version
Client: Docker Engine - Community
 Version:           20.10.8
 API version:       1.41
 Go version:        go1.16.6
 Git commit:        3967b7d
 Built:             Fri Jul 30 19:54:08 2021
 OS/Arch:           linux/amd64
 Context:           default
 Experimental:      true

Server: Docker Engine - Community
 Engine:
  Version:          20.10.8
  API version:      1.41 (minimum version 1.12)
  Go version:       go1.16.6
  Git commit:       75249d8
  Built:            Fri Jul 30 19:52:16 2021
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.4.9
  GitCommit:        e25210fe30a0a703442421b0f60afac609f950a3
 runc:
  Version:          1.0.1
  GitCommit:        v1.0.1-0-g4144b63
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0

Installing the Client Tools

管理タスク実行のための公開鍵設定と、kubectlといったクライアントツールを入れます。

master-1に入れる手順が公開されているが私のPCはUbuntuなので、ローカルで公開鍵を発行して書くServerに接続できるようにする

ローカルで鍵発行

$ ssh-keygen

基本的に全てデフォルトでおk

作成した鍵の中身をどこかにコピー

$ cat .ssh/id_rsa.pub

先程作成した全てのVMに鍵をコピー

cat >> ~/.ssh/authorized_keys <<EOF
ssh-rsa AAAAB3NzaC1yc2EAAAADA..........E= kbys@pc
EOF

Install kubectl

私のPCのはすでに入ってるので、ここら辺を参考にしてください

kubernetes.io

バージョン確認

$ kubectl version --client
Client Version: version.Info{Major:"1", Minor:"19", GitVersion:"v1.19.2", GitCommit:"f5743093fd1c663cb0cbc89748f730662345d44d", GitTreeState:"clean", BuildDate:"2020-09-16T13:41:02Z", GoVersion:"go1.15", Compiler:"gc", Platform:"linux/amd64"}

今日はここまで!

お読みいただきありがとうございました!

転職して半年経ったよ

TL;DR

退職エントリではなく、入社エントリです。

9月1日でちょうど入社6ヶ月。多少落ち着いてきたので現況を書きたいと思います。

どんな会社?

株式会社スタンバイという、求人検索エンジンを開発・提供している会社です。

こちらがサービスサイトです。

jp.stanby.com

なんで入ろうと思ったの?

以下が主な理由です。とどめは最終面接をしてもらった南社長の熱量に圧倒されました。

  • ビジネスの中心にプロダクトがある
  • これから発展させていこうというフェーズ
  • トラフィックなどのYahooが持っている資産(検索トラフィックとか)を使ってチャレンジが出来る
  • 会社自体は設立して2年だがプロダクトはそれ以前からあり実績がある(博打要素が少ない)

最後の部分を解説しますと、「スタンバイ」という仕事検索サービス自体は、2015年に生まれました。このときはビズリーチ内の1事業という位置づけです。

そして2019年に、Zホールディングス株式会社と株式会社ビズリーチは、求人検索エンジン事業を運営する合弁事業会社「株式会社スタンバイ」を設立しました。(公式発表

そこで何やってるの?

ProductPlatformグループというグループに所属してて、やってることは所謂SREです。

  • 各機能のSLOを策定し、SLOを意識した開発をするように啓蒙活動
  • EKSとそれに付随するエコシステム(ArgoCD,AppMesh,etc...)の導入

みたいな感じで、あとは各チームのインフラレイヤの相談事に乗ったり、メンテナンスをやったりしてます。

入ってみてどう?

良かったこと

嫌な奴が居なく、心理的安全性が高い。

これは素晴らしいことです。

前に居た会社もそうだったんですけど、みんな常にポジティブで建設的な議論を心がけています。

『会議室の長机の上で土下座させられる』『他の協力会社を潰すために無茶なタスクをやらせる』みたいな世界線で20〜30代を生きてきた私には奇跡のように見えてます。

さらに、現在弊社には大きく分けて

  • Yahoo OR ビズリーチから出向してる人
  • Yahoo OR ビズリーチから転籍してきた人
  • 他の会社から株式会社スタンバイに転職してきた人
  • 業務委託でスタンバイで働いてる人

のような、様々な人達が居ます。これだけ見ると『派閥とかあるんちゃうか?』と思うかもしれませんが、全くそんな事ありません。

それぞれが独自のやり方を押し付けるわけでもなく、『どうすればスタンバイというサービスが良くなるのか』について常に議論し、チャレンジし続けている姿には感銘を受けました。

チャレンジしたいこと

完全に私個人の問題ですが、私の悪い癖として『他人がやってる OR やろうとしてるタスクには手を付けない』というのがあります。

要するに誰かとタスクがバッティングしそうになると『どうぞどうぞ。やってみなはれ』とサッと手を引いちゃうんですよね。

また開発スタイルとして、1週間を1スプリントとしたスクラム開発を基本としているので『俺のせいで遅延が発生したらどうしよう』と勝手に遠慮しちゃう性格でもあります。

PO(プロダクトオーナ)は『不慣れな部分はカバーするから、ドンドンチャレンジしてくれ』と言ってくれてるのですが、僕が完全に『どうぞどうぞ型』の人間なのでここは是正して、自分の仕事の幅を広げていきたいところです。

プライベートへの影響

仕事は基本的にフルリモートです。コロナ終息後の対応は未確定ですが、フル出勤に戻ることはなさそうです。

最近はオンライベントの運営に参加し、(ほぼ無力に近いですが)持てる力をイベント成功に注いでいます。

最後に運営に参加しているイベントを2つ紹介させて下さい。

CI/CD Conference 2021

来たる9/3(金)に始まるのが、CI/CD Conference 2021というイベントで、CI/CDに関する勉強会です。

講演を聞くだけではなく、登壇者に質問したり参加者同士で意見を交換できる場所を用意した、双方向なイベントを目指しております。

基本的に講演動画のアーカイブ視聴は可能なので、後からゆっくり見ることも可能です。

参加は無料で、イベント自体は初級者から上級者まで、幅広く対応しています。

こちらから是非登録して下さい!

event.cloudnativedays.jp

CloudNative Days Tokyo 2021

こちらは現在登壇者を募集しております。

クラウドを使って組織を変えた、変えようとした、そんな皆さんの知識や経験を共有する交差点となるような場所を目指しております。

登壇したいという方は是非こちらから登録して下さい!

event.cloudnativedays.jp

最後までお読み頂き有難うございました。

Rancher Academy Week 3

なんの記事?

これは以前に入学したRancher AcademyのWeek 3の自分用メモです。

Week 3: Deployng Kubernetes With Rancher

  • k8sクラスタをデプロイする場所について

    • Hosted / Infrastructure Provider
    • EKS, AKS, GKEなんかに対応してるぞ
    • RancherのUIからノードの管理追加といった、ライフサイクル管理ができるぞ
    • Custom Provider
      • もしTerraformやAnsible、Shellスクリプト使ってデプロイしたいなら、カスタムドライバとして使えるぞ
      • ホストにDokcerさえ入っていれば大丈夫だ
      • カスタムドライバは作成するクラスタに固有の docker run コマンドを提供するので、それをプロビジョンするやつの最後に追加すれば自動的にクラスタに追加されるぞ
    • Imported Clusters
      • すでに動いているk8sクラスタのimportもできるぞ
      • クラスタに対して kubectl apply コマンドでRancher Agentを入れてるぞ
  • 制限のあるクラスタについて

    • Rancherやk8s自体に制限があるわけではない
    • Rancherがインフラレイヤやデータプレーンへのアクセスを制限されてると起きる
    • RKEで動いてるインフラやカスタムクラスタは両方共Rancherで管理可能だよ
    • ホストされたクラスタはライフサイクルマネジメントを組み込まれてて、Rancherはデータプレーンやコントロールプレンにアクセスできないので、バックアップやリストアをRancherから出来ないんだ
    • ImportしたクラスタはRancherには不透明に見えて、バックアップやリストアは組み込まれない
    • 非RKEクラスタを使うときは、クラスタの事業継続のためにプロバイダのツールを使う必要があるよ
  • サイジングについて

    • コントロールプレーン、データプレーン、ワーカーロールを別のノードプールに配置すると、リソース食い合わないのでおすすめだよ
    • ワークロードにはCPUとメモリの上限を設定してデプロイしてね
  • 障害への心得Rancher Docs: Troubleshooting

    1. すべての問題には解決策があります。これを覚えていれば、あなたのフラストレーションを軽減し、問題解決に費やすエネルギーを残すことができます。
    2. 第二の目は、あなたには見えないものを見ることができます。もしあなたが10分、15分以上問題を見ていたら、他の人に一緒に見てもらうように頼んでみてください。彼らがすぐに解決策を見つけてくれることに驚くことでしょう。
    3. 以前はうまくいっていたことが、今はうまくいかない場合は、「何が変わったのか」と自問してみましょう。どんなに小さなことでも、すべてを考えてみましょう。それらの変更を見直し、それを元に戻すことで問題が解決するかどうかを確認してください。
    4. 一度に一つのことを変更してからテストする。複数のものを変更して問題が解決した場合、どのものが原因なのか、解決策なのかわからなくなってしまいます。一度に1つのことだけを変更するとき、それはあなたが最初の場所で問題を作成した要因を特定するのに役立ちます。
    5. 問題は自力では消えない。問題は、それが到着したように神秘的なように消えた場合、それはちょうど神秘的なように返すことができることを知っています。クラスタの最新の状態に「何が変わったのか」という質問を適用して、その原因を見つけようとし続けてください - 問題がなくなるために何が変わったのでしょうか? 問題が発生したときに何かが変わったのでしょうか?
    6. 問題を客観的に見ることができなくなった、つまり、イライラしたり、怒ったり、感情的になったりしているのであれば、休んでみましょう。帰ってきてからの方が、離れている時間よりも問題解決の効果が高くなります。椅子から立ち上がって、部屋の中を動き回る。深呼吸をする。リラックスしてください。このリストの最初の項目を覚えておいてください - 解決策はそこにあります。多くの場合、外を歩いたり、ブロックの周りを散歩に行くような単純なあなたの環境の変化は、問題を解決する方法についての新しいアイデアをトリガするのに十分です。

Rancher Academy Week 2

なんの記事?

これは以前に入学したRancher AcademyのWeek 2の自分用メモです。

Week 2: Installing and Managing Rancher

  • Rancher Server のデプロイ
    • Sandbox的なスタンドアローンか、高可用性の2通りのデプロイ方法があるよ
      • SandboxはDockerコンテナで動かす
      • HA構成はRKEで動かすよ
      • スタンドアローンはあとからHAには変えられないのでよく考えろ

Standalone構成の場合

  • dockerでインストール
docker run -d --restart=unless-stopped \
  -p 80:80 -p 443:443 \
  --privileged \
  rancher/rancher:latest
  • バックアップしたい場合は、 /var/lib/rancher 内部を保存すると良いぞ
  • 詳しくはここを見ろ(Rancher Docs: Restoring Backups—Docker Installs

  • Rancherのアップグレード

    1. Rancher止める
    2. データコンテナを作成
    3. /var/lib/rancher をバックアップ
    4. 新しいイメージをPULL
    5. Racher起動
    6. 動作確認
    7. 古いRancherコンテナを消す

HA構成の場合

  • Rancherはk8s内で動くアプリケーションだ

    • RKEクラスタにデプロイするとetcdとかcontrolplane使って高可用性を実現するぞ
    • v2.4以降はk3sにもデプロイできるぞ
    • Enterpriseサポートが欲しい場合は、他のk8sディストリにデプロイしてもサポートしてくれるか要確認
  • RKEにデプロイする場合

Rancher Academy Week 1

なんの記事?

これは以前に入学したRancher AcademyのWeek 1の自分用メモです。

Week 1: Intro to Rancher and RKE

  • RancherにはRKEとK3Sという、2つのk8sディストリがあるよ
  • RKEはRancher Kubernetes Engineの略で、k8sをdockerコンテナで実行するよ

  • Rancher Serverの構成について

    • API,Auth Proxy,クラスタコントローラで構成されるよ
    • データストアにetcdを使ってるよ
    • 管理している各nodeには、クラスタコントローラとk8sAPIとの通信をブリッジするNode Agentがいるよ
      • Node AgentがEKS Control PlaneやRKE Kubernetes API Serverと通信する
    • Auth Proxyが認証を行い、認可はk8sがやるよ
  • Rancher(管理する方の環境)のInstallには、サンドボックス用に適したスタンドアロン方法と高可用性のk8sクラスタに入れる二つの方法があるよ

    • 今回はRKEを使うよ。Dockerコンテナで動くから移植性が高くて早いんだ
    • RKEはクラスタを定義するために宣言的な設定(yaml)を使うよ
    • RKEバイナリはSSH接続してk8sをインストールしてノードを作り、kubectlを使うための設定を返すよ
    • k8sのアップグレードは設定ファイルを変更して、rke upコマンドで変更できるよ
  • RKEのインストール(公式手順

wget -P  /usr/local/bin/  https://github.com/rancher/rke/releases/download/v1.1.0/rke_linux-amd64
sudo mv /usr/local/bin/rke_linux-amd64  /usr/local/bin/rke
sudo chmod +x /usr/local/bin/rke
rke --version

cp kube_config_cluster.yml ~/.kube/config

  • RKEの運用について
    • kube_config_cluster.yml のオリジナルは保存しておくこと
    • デフォルトでは、6時間ごとにスナップショットを作成し、1日分のスナップショットを保持するように設定されてるよ
      • /opt/rke/etcd-snapshots に作成されるよ
      • configで設定を変更することができるよ
      • S3や外部ディスクに保存もできるよ
      • リストア方法は(Rancher Docs: Restoring from Backup
    • kubernetes自体の更新も簡単にできるぞ(Rancher Docs: Upgrades
    • nodeの追加もyamlに定義を追加してrke upするだけだ!いいだろ?

Oracle Cloud 監視入門

コレはなんの記事?

この記事は、JPOUG Advent Calendar 2020 - Adventar の18日目の記事です。

17日目はおおの たかしさんの記事『Oracle Databaseバージョンアップ後の性能劣化で試したい暫定対処 | アシスト』でした。

www.ashisuto.co.jp

私もかつては OracleDBA だった時代があり、サポートには大変お世話になりました。 ただ、『『サポートからの回答待ちです』一辺倒だけではなく、自分でも調査・仮説検証が出来るエンジニアになれ』と先輩によく言われました。

そんなエンジニアになるためのヒントとして素晴らしい記事でした。

今回私がお伝えしたいのは DB から打って変わって、Oracle Cloud 上に作った Web システムを監視することになった場合、

  • まず、どこから見れば良いのか
  • どうやって見れば良いのか

という事を実例を交えて紹介していきたいと思います。

お前誰よ

現在、株式会社ウィルゲートでインフラエンジニアとして、自社サービスのインフラ運用をメインに日々ぼんやりしてます。

色々な組織形態があるかと思いますが、私は主にインフラの人≒運用の人な世界線で生きてきました。

最近社内勉強会用に書いたこちらの資料の評判が良かったので、

docs.google.com

今回は調子に乗って Oracle Cloud 上の Web システム監視のチュートリアルを書きたいと思います。

これからクラウド上に作ったシステムの監視を始めたい方への、何かの参考になれば幸いです。

今回の監視対象

監視対象のシステム構成

Oracle Cloud には Always Free というサービスがありましてですね、なんと

  • 2つのOracle Cloud Infrastructure Compute VM、ブロック・ストレージ、オブジェクト・ストレージ、アーカイブ・ストレージ、ロード・バランサとデータ・エグレス、監視と通知
  • Oracle Application Express(APEX)やOracle SQL Developerなどの強力なツールを含む、2つのOracle Autonomous Database

がずっと無償で提供されます!

今回ももちろんその範囲内で構成しております。全て Oracle Cloud 上に構築した Web システムです。

ロードバランサ(以下 LB )と、仮想マシン(以下 VM )が1つずつのシンプルな構成です。

f:id:ryo-plavi:20201215003331p:plain

VM には NGINX と php-fpm を入れて、以下のような php を置いております。

<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <title>テストサイト</title>
    </head>
    <body>
       <font size="7" color="#00ff00">
       <?php

       $text = array(
         "おすぎです!",
         "ピーコです!",
       );

       $count  = count($text);
       $random = rand(0, $count - 1);

       echo $text[$random];

       ?>
       </font>
</html>

さらにはちゃんとドメインをとって、外部公開しています。

https://headtonirvana.dev/

アクセスするたびに自分がおすぎなのかピーコなのかを再確認できるサイトなんですが、今年中には閉鎖します。

Oracle Cloud エージェント

Oracle Cloud の VM には、作成時に Oracle Cloud エージェント を有効にしています。

以下の画面にチェックを入れるだけでエージェントがインストールされて、OSの詳細なメトリクスを確認することが出来ます。

f:id:ryo-plavi:20201206103028p:plain

実際にOSにログインして確認してみると、 oracle-cloud-agent というサービスの起動を確認できます。

[opc@osugi ~]$ systemctl status oracle-cloud-agent
● oracle-cloud-agent.service - Oracle Cloud Infrastructure agent for management and monitoring
   Loaded: loaded (/etc/systemd/system/oracle-cloud-agent.service; enabled; vendor preset: disabled)
   Active: active (running) since 日 2020-12-06 01:32:46 GMT; 2min 32s ago
     Docs: https://docs.cloud.oracle.com/iaas/
 Main PID: 1776 (agent)
   CGroup: /system.slice/oracle-cloud-agent.service
           ├─1776 /usr/libexec/oracle-cloud-agent/agent
           ├─1808 /usr/libexec/oracle-cloud-agent/plugins/bastions
           └─1830 /usr/libexec/oracle-cloud-agent/plugins/gomon/gomon

12月 06 01:32:46 osugi systemd[1]: Started Oracle Cloud Infrastructure age...g.
12月 06 01:32:46 osugi agent[1776]: 2020/12/06 01:32:46 osName:CentOS Linu...:7
12月 06 01:32:46 osugi agent[1776]: 2020/12/06 01:32:46.618165 logger.go:3...og
12月 06 01:32:48 osugi sudo[1845]: oracle-cloud-agent : TTY=unknown ; PWD=...nd
Hint: Some lines were ellipsized, use -l to show in full.

監視システムを作ろう

どこから監視したらいいのか

監視対象のシステムは出来ました。では監視しましょう!

とはいえ、「どこから監視したら良いのか」と悩む方も少なくないでしょう。

そういう場合はまず

  • そのシステムの利用者は誰なのか
  • 利用者から見て「正常に動いてる状態」とはどういう状態か

を考えましょう。

今回は世界に向けた Web システムなので、『利用者は世界中の人』です。

その人達から見て正常に動いてる状態は、『Web アクセスが正常に行えるか』です。

かといって世界中の人に監視をお願いするわけにもいきません。

そこで外形監視ツールの登場です。

システムの外部(今回だと oracle cloud の外側のネットワーク)から Web アクセスをし、

を定期的にチェックしします。

今回外形監視に使うツールは、site24x7 を使います。

www.site24x7.jp

無償プランでも5サイトまで外形監視をすることが出来ます。

必要最低限の監視ならコレで十分かもしれません。

しかし今回の構成で言うと、LB を監視することで

  • 実際にどのくらいのアクセスが来てるのか
  • 来たアクセスを正常に、遅滞なく処理できているか

ということを確認でき、さらに VM を監視することで

  • システムリソースを使い切っていないか
  • サーバの I/O が処理待ちになっていないか

を確認することが出来ます。

Oracle Cloud のコンソール画面で LB や VM のメトリクスを確認できます。

f:id:ryo-plavi:20201216073347p:plain
LB のメトリクス

f:id:ryo-plavi:20201216073432p:plain
VM のメトリクス

コレでも十分に綺麗なのですが

  • 切り替えが必要なため、 LB と VM のグラフを1画面に納めて横断的に見ることが難しい。
  • 見るためにログインや画面操作が必要なため、共有しづらい
  • 時間が UTC 表示

といった課題があります。

そこで LB や VM の監視には、 OSS の データ可視化ツール Grafana を使います。

grafana.com

Grafana を使うことで以下のようなダッシュボードを作成できます。 上段が LB で、下段が VM です。

f:id:ryo-plavi:20201216074703p:plain

ただし、 Grafana はデータの可視化ツールなのでそれ単体では何も監視できません。

Oracle Cloud には Monitoringサービス というのがあり、クラウドの各リソースのメトリクスを Web ブラウザや API を通じて取得することが出来ます。

今回は Grafana から Oracle Cloud の API を叩いてメトリクスを取得し、可視化します。

docs.cloud.oracle.com

監視システムの構成

今回の監視システムの概要は以下のようになります。

f:id:ryo-plavi:20201215211823p:plain

長々と書いてしまいましたが、監視対象は Oracle Cloud 上に作った 「https://headtonirvana.dev/」 という URL の Web システムで、

監視システムは

  • 外形監視は、 site24x7
  • LB や VM は 、Grafana で可視化した Oracle Cloud の Monitoring サービスのメトリクス

を使います。

Oracle Cloud の 外形監視 を site24x7 で実現する

それでは外形監視から始めましょう。

site24x7 にユーザ登録します。作成してもいいですし、他サービスのアカウントとも連携できます。

f:id:ryo-plavi:20201216010734p:plain

ログイン後は Web サイト監視の追加画面で監視したい URL を設定しましょう。 あとは基本的にデフォルトのままでいいです。

f:id:ryo-plavi:20201216011257p:plain

しばらく待つと監視が始まり、以下のような画面になります。とても簡単。

f:id:ryo-plavi:20201216011438p:plain

Grafana から Oracle Cloud を監視できるようにする

Grafana のインストール

今回は VM に Grafana をパッケージからインストールします。

VM の OS は Ubuntu 20.04 LTS です。

こちらの公式手順どおりに行います。

grafana.com

リポジトリを登録し

sudo apt-get install -y apt-transport-https
sudo apt-get install -y software-properties-common wget
wget -q -O - https://packages.grafana.com/gpg.key | sudo apt-key add -

インストールします

sudo apt-get update
sudo apt-get install grafana

そして起動

sudo systemctl daemon-reload
sudo systemctl start grafana-server
sudo systemctl status grafana-server
sudo systemctl enable grafana-server.service

ブラウザで <IPアドレス>:3000 にアクセスして、grafanaの画面が出れば成功です。

Grafana で監視するためのユーザとグループ作成

次は Oracle Cloud のコンソールから行います。

Grafana で OCI を監視するための専用ユーザを作ります。

このユーザを使って Grafana から各メトリクスを取得します。 システムへの変更権限は不要なので、読み取り権限だけのユーザを作成します。

まずはグループの作成です。コンパネ画面から、「アイデンティティ」→「グループ」と進み、「グループの作成」を押下します。

今回は以下のように設定します。

  • 名前:gp-grafana
  • 説明: grafanaでの監視用グループ

f:id:ryo-plavi:20201213120119p:plain

次はグループに適用するポリシーの作成です。コンパネ画面から、「アイデンティティ」→「ポリシー」と進み、「ポリシーの作成」を押下します。

  • 名前:policy-grafana
  • 説明:grafanaでの監視用ポリシー
  • コンパートメント:<監視対象を作成したコンパートメント>

ポリシー・ビルダーはカスタマイズ(拡張)を押下し、以下の値を入力してください。

Allow group gp-grafana to read metrics in tenancy
Allow group gp-grafana to read compartments in tenancy

f:id:ryo-plavi:20201216082818p:plain

最後にコンパネ画面から、「アイデンティティ」→「ユーザ」と進み、「ユーザの作成」を押下します。

以下のように、IAM ユーザを作成します。

f:id:ryo-plavi:20201216081246p:plain

作成したユーザの詳細画面から『ユーザーをグループに追加』を押下し、先ほど作成した『gp-grafana』グループに追加しましょう。

f:id:ryo-plavi:20201216084521p:plain

Oracle Cloud を監視するためのプラグインを入れる

この作業は Grafana サーバで行います。

デフォの Grafana では Oracle Cloud の API を叩けないので、プラグインを入れます。

こちらのプラグインを使います

grafana.com

似たようなプラグインで、 Oracle Cloud Infrastructure plugin for Grafana | Grafana Labs というのがあるのですが、 こちら DEPRECATED (非推奨)になっていて、上記プラグインを使ってねと書いてあるので素直に従いましょう。 ぶっちゃけこちらのプラグインでは、現在動きません。

インストールは簡単です。以下のコマンドで簡単に入ります。

grafana-cli plugins install oci-metrics-datasource

しかし、これでおしまいではありません。 今回の監視サーバは Oracle Cloud の外部にあり、 API を叩くには認証が必要です。

認証のために、 Oracle Cloud をコマンドで操作するツール OCI CLI をインストールします。

VM に OCI CLI をインストールする

公式手順に沿って行います。

bash -c "$(curl -L https://raw.githubusercontent.com/oracle/oci-cli/master/scripts/install/install.sh)"

終わったらバージョンを確認しましょう

oci -v

次に、Oracle Cloud のコンソールから以下を確認し、メモ帳などに保存しておきましょう。

  • 先程作った Grafana ユーザーのOCID
    • アイデンティティ → ユーザー」と遷移し、ユーザの詳細画面から確認。(ocid1.user.oc1..aaaaaaa......みたいなやつがそうです)
  • 接続するOracle CloudのテナントのOCID
    • 「管理 → テナンシ詳細」と遷移し、て何子の詳細画面から確認(ocid1.tenancy.oc1..aaaaaaa....みたいなやつがそうです)

サーバに戻って、 OCI CLI のセットアップをしましょう。

oci setup config

選択肢は基本的にデフォで大丈夫です。 先程メモしたOCIDを間違わずに入力しましょう。

セットアップが終わったら、作成された鍵ファイルの中身をメモ帳にコピーしておいてください。

cat ~/.oci/oci_api_key.pem

次は Oracle Cloud のコンソールに先程メモした鍵を登録します。

アイデンティティ → ユーザー → APIキー」と遷移し、ユーザの詳細画面の 「APIキーの追加」を押下し、先程メモしたキーの中身を貼り付けます。

f:id:ryo-plavi:20201217092015p:plain

無事に保存できたら VM に戻ります。もう少しですよ!

以下のようにコマンドでリージョンの一覧が出たら CLI のセットアップは成功です。

$ oci iam region list --output table
+-----+----------------+
| key | name           |
+-----+----------------+
| AMS | eu-amsterdam-1 |
| BOM | ap-mumbai-1    |
| CWL | uk-cardiff-1   |
| DXB | me-dubai-1     |
| FRA | eu-frankfurt-1 |
| GRU | sa-saopaulo-1  |
| HYD | ap-hyderabad-1 |
| IAD | us-ashburn-1   |
| ICN | ap-seoul-1     |
| JED | me-jeddah-1    |
| KIX | ap-osaka-1     |
| LHR | uk-london-1    |
| MEL | ap-melbourne-1 |
| NRT | ap-tokyo-1     |
| PHX | us-phoenix-1   |
| SCL | sa-santiago-1  |
| SJC | us-sanjose-1   |
| SYD | ap-sydney-1    |
| YNY | ap-chuncheon-1 |
| YUL | ca-montreal-1  |
| YYZ | ca-toronto-1   |
| ZRH | eu-zurich-1    |
+-----+----------------+

プラグインOracle Cloud の API を使えるようにする

最後の手順です。 Grafana が Oracle Cloud の API を使えるようにしましょう。

セットアップした設定を grafana ユーザも使えるようにします。

sudo cp -r .oci /usr/share/grafana
sudo chown -R grafana:grafana /usr/share/grafana

次に config を編集し、key ファイルの PATH を変更します。

sudo vim /usr/share/grafana/.oci/config

以下のようにしましょう。

key_file=/usr/share/grafana/.oci/oci_api_key.pem

ここまで出来たら、 Grafana の UI にログインしましょう。

Configration → Data Sources と遷移し

f:id:ryo-plavi:20201217094344p:plain

Add data source を押下し

f:id:ryo-plavi:20201217094540p:plain

下の方にある、Oracle Cloud Infrastructure Metrics を Select します。

f:id:ryo-plavi:20201217095455p:plain

設定画面で、先ほどコピーしておいたテナントの OCID を設定し、リージョンは監視対象を作成したリージョン(私はap-tokyo-1)、environment は local で大丈夫です。

f:id:ryo-plavi:20201217101138p:plain

そして左下の Save & Test を押下し、以下のように 「Data source is working」と表示されれば成功です!

f:id:ryo-plavi:20201217101436p:plain

失敗しちゃう場合はコピーしたファイルのパーミッションや鍵の場所などを確認してください。

やっとダッシュボード作れますよ奥さん!

Grafana でダッシュボードを作る

コレで準備完了!実用的で格好いいダッシュボード作りましょう!

先程は

しかし今回の構成で言うと、LB を監視することで

  • 実際にどのくらいのアクセスが来てるのか
  • 来たアクセスを正常に、遅滞なく処理できているか

ということを確認でき、さらに VM を監視することで

  • システムリソースを使い切っていないか
  • サーバの I/O が処理待ちになっていないか を確認することが出来ます。

と書きましたが、もうちょっと具体的に話しましょう。

RED Method と USE Method という考え方があります。

RED Method と USE Method

grafana.com

まず RED Method は

  • Rate (単位時間あたりのリクエストの数)
  • Errors (その中でのエラーの数)
  • Duration (リクエストをさばくのにかかってる時間)

の頭文字をとったもので、

上記の記事では

サービスに関わる誰もがエラー率、リクエスト率、そしてそれらのリクエストのレイテンシの分布を理解する必要があります。 サービス監視の観点に一貫性を持たすことができ、開発側が意図していないコードのへの問い合わせも行えます。 RED Method はユーザの満足度を示す優れた指標です。 エラー率が高い場合、それは基本的にユーザーに影響があり、ページ読み込みエラーが発生します。 表示時間が長いとWebサイトの表示が遅くなります。これらは、意味のあるアラートを作成し、SLA を測定するための優れた測定基準です。

と紹介されてます。

そしてさらにオライリーが出版している『入門 監視』には、監視のデザインパターンとして以下のような考え方が紹介されています。

www.oreilly.co.jp

まず監視を追加すべきなのは、ユーザがあなたのアプリケーションとやり取りをするところです。 Apache のノードが何台動いているか、ジョブに対していくつのワーカが使用可能かが使用可能と行ったアプリケーションの実装の詳細をユーザは気にしません。

最も効果的な監視ができる方法の一つが、シンプルに HTTP レスポンスコード(特に HTTP 5xx 番台)を使うことです。 その次として、リクエスト時間(レイテンシとも言う)も有益です。 このどちらも『何が』問題なのかは教えてくれませんが、『何かが』問題で、それがユーザに影響を与えていることは分かります。

とあります。

RED Method はユーザに何が起きているのかを監視するために有益な、監視の指標だということが分かります。

次に USE Method は

  • Utilization (リソースがどのくらいビジーだったかの割合)
  • Saturation (キューの長さなどの、各リソースの仕事量)
  • Errors (エラーイベントが起きた数。messageログなど)

の頭文字で、リソース内部の状況を把握するのに適しています。

なので今回は、ユーザに近い LB を Red Method で監視し、 VM を USE Method で監視します。

そうすることで、例えばアクセスが急増した時に LB のリクエスト数と VM の CPU 使用率の相関を確認でき、 障害原因の調査や今後のリソース増強へのヒントに使うことが出来ます。

Oracle Cloud の LB を Red Method で監視する

公開されている LB のメトリクス情報を元に、どのメトリクスを監視するか考えてみましょう。

docs.cloud.oracle.com

それぞれ、以下のメトリクスで良さそうです。

  • Rate (単位時間あたりのリクエストの数)
    • HttpRequests
  • Errors (その中でのエラーの数)
    • HttpResponses502
    • HttpResponses504
    • HttpResponses5xx
  • Duration (リクエストをさばくのにかかってる時間)
    • ResponseTimeHttpHeader

それでは作っていきましょう!

Create → Dashboard と進みます

f:id:ryo-plavi:20201218081849p:plain

ダッシュボード作成画面になるので、 「Add new panel」を押しましょう

f:id:ryo-plavi:20201218082149p:plain

これが panel の作成画面です。ここでクエリを作成してグラフを作っていきましょう。

まずは HttpRequests です。単位時間あたりのリクエスト数を可視化しましょう。

以下のように設定すると、グラフが出てくるはずです。

項目 設定値
Region <監視対象があるリージョン>
Compartment <監視対象があるコンパートメント>
Namespace oci_lbaas
Resourcegroup NoResourceGroup
Metric HttpRequests
Aggregation max()
Window 1m
Resolution auto

f:id:ryo-plavi:20201218100911p:plain

Panel の名前はわかりやすくし、 Description の部分には監視しているメトリクスの説明を入れると忘れた頃に見ても安心です。

f:id:ryo-plavi:20201218101832p:plain

あとは Save を押してダッシュボードの名前を設定してみましょう

f:id:ryo-plavi:20201218102517p:plain

4つのメトリクスが出てきてると思いますが、これはロードバランサ自体と、バックエンド・セットというバックエンドのサーバへのヘルスチェックなどを定義した論理エンティティのメトリクスが表示されています。 そして、Oracle Cloud の LB はデフォルトで冗長化されてるので4つのメトリクスが表示されているというわけです。

次はエラーの数です。まずグラフの種類は 「Stat」を選択しましょう。

f:id:ryo-plavi:20201218103859p:plain

Display の Calculation は Max にしておいて下さい

f:id:ryo-plavi:20201218105106p:plain

そして以下のように設定すると、

項目 設定値
Region <監視対象があるリージョン>
Compartment <監視対象があるコンパートメント>
Namespace oci_lbaas
Resourcegroup NoResourceGroup
Metric HttpResponse502
Aggregation max()
Window 1m
Resolution auto

こんな画面が出てくると思います。6個もあるのは

  • LB の http リスナー
  • LB の https リスナー
  • バックエンド・セットの リスナー

冗長化されてるからです。

f:id:ryo-plavi:20201218105550p:plain

コレ以外にも504エラーの数もみたいので、クエリを複製してちょっと中身を変えましょう。

クエリの右上の部分に Duplicate query ボタンがあるので押してみましょう

f:id:ryo-plavi:20201218110857p:plain

クエリが複製されるので、合計2つ作って

  • HttpResponse502
  • HttpResponse504

それぞれが表示されるようにしてみましょう

複製したクエリの、以下の部分を変更しましょう

項目 設定値
Metric HttpResponse504

こんな画面ができしましたか?

f:id:ryo-plavi:20201218113210p:plain

「表示がちょっと多いな」と感じた方は、 Dimensions でコンポーネントをフィルタリングしてみましょう。

次は処理にかかった時間 Duration ですね。

以下のようにクエリを作りましょう。

項目 設定値
Region <監視対象があるリージョン>
Compartment <監視対象があるコンパートメント>
Namespace oci_lbaas
Resourcegroup NoResourceGroup
Metric ResponseTimeHttpHeader
Aggregation max()
Window 1m
Resolution auto

f:id:ryo-plavi:20201218114507p:plain

時間がわかりやすいように、縦軸に単位を付けましょう

オプションの Axes → Left Y → Unit で milliseconds(ms) を選択します。

f:id:ryo-plavi:20201218114820p:plain

あとはタイトルと説明を書いて保存

f:id:ryo-plavi:20201218114928p:plain

ダッシュボードに戻って、画面に収まるようにグラフの幅を調整しましょう。

f:id:ryo-plavi:20201218115128p:plain

コレで Red Method の完成です!

Oracle Cloud の VM を USE Method で監視する

公開されている VM のメトリクス情報を元に、どのメトリクスを監視するか考えてみましょう。

docs.cloud.oracle.com

それぞれ、以下のメトリクスで良さそうです。 今回の構成では、messageログの監視といった方法を使ったエラーイベントが検知できないので Error は見ません。

  • Utilization (リソースがどのくらいビジーだったかの割合)
    • CpuUtilization
    • MemoryUtilization
  • Saturation (キューの長さなどの、各リソースの仕事量)
    • NetworksBytesIn
    • NetworksBytesOut

それでは先程の要領でグラフを作ってみましょう。

Namespace と Metric が変わってることに注意です。

  • CpuUtilization

f:id:ryo-plavi:20201218120913p:plain

項目 設定値
Region <監視対象があるリージョン>
Compartment <監視対象があるコンパートメント>
Namespace oci_computeagent
Resourcegroup NoResourceGroup
Metric CpuUtilization
Aggregation max()
Window 1m
Resolution auto
  • MemoryUtilization

f:id:ryo-plavi:20201218121052p:plain

項目 設定値
Region <監視対象があるリージョン>
Compartment <監視対象があるコンパートメント>
Namespace oci_computeagent
Resourcegroup NoResourceGroup
Metric MemoryUtilization
Aggregation max()
Window 1m
Resolution auto
  • NetworksBytesIn/Out

f:id:ryo-plavi:20201218121311p:plain

Aggregation が rate になっていることに注意して下さい

項目 設定値
Region <監視対象があるリージョン>
Compartment <監視対象があるコンパートメント>
Namespace oci_computeagent
Resourcegroup NoResourceGroup
Metric NetworksBytesIn
Aggregation rate()
Window 1m
Resolution auto
項目 設定値
Region <監視対象があるリージョン>
Compartment <監視対象があるコンパートメント>
Namespace oci_computeagent
Resourcegroup NoResourceGroup
Metric NetworksBytesOut
Aggregation rate()
Window 1m
Resolution auto

またネットワークのグラフは受信と送信が混ざらないように、送信のグラフを反転させてます。

やり方は以下のように、 Out という文字列のあるメトリクスデータをY軸反転させます。

f:id:ryo-plavi:20201218121846p:plain

あとは単位もつけてあげましょう

f:id:ryo-plavi:20201218122100p:plain

あとはダッシュボードに戻って大きさを揃えて出来上がりです。

f:id:ryo-plavi:20201218122333p:plain

ダッシュボード設定

ダッシュボード上部から、ダッシュボードのセッティングを行えます。

f:id:ryo-plavi:20201218122707p:plain

名前とかタグの設定ができるんですけど、今回お伝えしたいのが Graph Tooltip です。

  • Default
  • Shared crosshair
  • Shared Tooltip

から選べるんですが、この設定で各パネルにある値を関連付けて確認しやすくなります。

画面で比較してみましょう

  • Default だと、マウスオーバーで1つのパネル上の値を確認できます

f:id:ryo-plavi:20201218123543p:plain
Default 設定

  • Shared crosshair だと、時間軸を赤い棒が各パネルに表示されます

f:id:ryo-plavi:20201218123809p:plain
Shared crosshair

  • Shared Tooltip だと、時間軸を赤い棒と、そのときの値が各パネルに表示されます

f:id:ryo-plavi:20201218124116p:plain
Shared Tooltip

違いが分かりましたでしょうか?

個人的に好きなのは Shared crosshair です。「この時にはアクセスが多くて、CPU使用率も高かったんだな」ていうのが直感的に分かって、 Shared Tooltip だと画面の情報がちょっと多い感じがするので。

こういうダッシュボードを定期的に共有して、「アクセスが多い時にサーバのリソースを使い切ってるのでサーバを増やしましょう」とか「このままユーザ数が増えていくとリソース不足が懸念されるので、来季の予算増やしましょう」みたいな話ができるようになると思います。

まとめ

クラウドの登場を期に SRE や DevOps、 SLA 、 SLO などの用語や概念が広まったり生まれたりして、運用界隈は新しい情報が多いです。

その中でも私が好きな言葉に「Nines don’t matter if users aren’t happy.(数字の9をいくら並べても、ユーザがハッピーじゃなきゃ意味ないよ)」というのがあります。

この辺の記事が原点ぽい?

thenewstack.io

T シャツなんかも売ってます。

T シャツの話はよくて、その記事の中ではシステム稼働率とかで9の数字をいくら並べても不幸な目に合うユーザは居るわけで、ユーザのために本当に必要なものを見極めて優先度を付けて監視しましょう。 絶対に気にしないとダメなものを定義しましょう。

みたいなことが書いてあります。

クラウド、仮想化、コンテナ化で抽象度のレイヤは高度かつ複雑になってきました。今回の構成でも、見ようと思えば紹介した量の何倍もの情報を見ることができるわけで、監視の重要性とは裏腹に「何したら良いの?」と戸惑う方も多いのではないのでしょうか。

今回紹介したような RED/USE Method のような考え方で優先度を付けて監視できると、幸せなユーザが増えるかもしれませんね。

最後までお読み頂きありがとうございました。

明日の 12月19日は Naotaka Shinogi さんです。よろしくおねがいします!