mutao.net

いわゆる雑記。

Kubernetes入門メモ書き

k8sに入門しているのでどうやって習得していったのか備忘録ながら書く。

k8sって2年前?くらいは「人類には早すぎる」って言われてた気がするのにもはや知ってて当たり前みたいな風潮がある。

人類の進化が早いのか、人類のミュータント化に成功したのか、k8sが歩み寄ったのか、AWS等のパブリッククラウドがカスタムして使いやすくなったのか。

多分一番最後かその前が当たりだと思っている。

第一歩

なにはともかく公式ドキュメントを読む。やっぱり文章量は公式が随一。

Kubernetesとは何か?では公式が丁寧に過去まで振り返って説明してくれている。

kubernetes.io

チュートリアルではRedis podを作成してみる等ハンズオンも手堅い。

kubernetes.io

参考書

仕組みと使い方がわかる Docker&Kubernetesのきほんのきほん

book.mynavi.jp

ほとんどがDockerについて言及されている。

k8sについては最後の章で少しだけハンズオンがある。

Dockerについての知識だったり経験はすでにあったのでその辺は読み飛ばした。

ただ、最後の章だけはイラストも豊富で公式ドキュメントで得た知識に肉付けすることができたかなと思っている。

「あとがき」では作者のDockerに対する著者の思い、今後私達が習得しなければならない知識に関しても言及してくれている点で良書。

買ってよかったと思える一冊。必須ではない。

入門 Kubernetes

www.oreilly.co.jp

絶対正義オライリーの参考書。オライリーあるあるというか物量がものすごいので何周もしないといけない。

ロールアウト戦略とかスケジューラの動きとかともかく詳細に書かれている。

k8s入門には必須だと思う。

本書について言及すると別のPOSTにした方がいいと思うので割愛する。

その他

気になっているものです。

udemyのコースがありました。udemyを多用している私にとって魅力的だったのですが、

講義概要を見るとEKSでのハンズオンになるみたいなので、EKSをマスターノードにして、EC2等をワーカーノードで構築していくんだろうなぁと思ってしまった。

EKSが巻き取ってくれているところが多そうというので最初は愚直にCerficide Kubernetesを使わないようにしようかなと悩んでいるところ。

多分、セールが来たら買います。

www.udemy.com

PHP Benchmark

mutaonet.hatenablog.com

の続き。

benchmarkに使うscriptは公式が出しているものを使っていきます。

github.com

実行環境

Raspberry Pi4 ModelB

CPU: 4core Arm Cortex-A72 ARMv8 64bit

RAM: 4GB

JIT機能は有効にしてないです。PHP8でもデフォルトで無効化なのでまずは基本の状態で見ていきます。

phpbrewについては↓のREADMEを参照するのが一番よいです。

github.com

PHP8.0.11

PHP 8.0.11 (cli) (built: Oct 17 2021 21:12:34) ( NTS )
Copyright (c) The PHP Group
Zend Engine v4.0.11, Copyright (c) Zend Technologies

$ php Zend/bench.php
simple             0.034
simplecall         0.012
simpleucall        0.050
simpleudcall       0.051
mandel             0.250
mandel2            0.272
ackermann(7)       0.058
ary(50000)         0.016
ary2(50000)        0.013
ary3(2000)         0.103
fibo(30)           0.189
hash1(50000)       0.022
hash2(500)         0.027
heapsort(20000)    0.059
matrix(20)         0.059
nestedloop(12)     0.071
sieve(30)          0.039
strcat(200000)     0.011
------------------------
Total              1.337

PHP 7.4.25

$ php -v
PHP 7.4.25 (cli) (built: Oct 26 2021 20:39:21) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies

$ php Zend/bench.php
simple             0.088
simplecall         0.018
simpleucall        0.056
simpleudcall       0.060
mandel             0.253
mandel2            0.294
ackermann(7)       0.062
ary(50000)         0.016
ary2(50000)        0.013
ary3(2000)         0.116
fibo(30)           0.194
hash1(50000)       0.025
hash2(500)         0.025
heapsort(20000)    0.064
matrix(20)         0.064
nestedloop(12)     0.125
sieve(30)          0.042
strcat(200000)     0.012
------------------------
Total              1.526

PHP 7.3.31

$ php -v
PHP 7.3.31 (cli) (built: Oct 26 2021 21:25:58) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.31, Copyright (c) 1998-2018 Zend Technologies

$ php Zend/bench.php
simple             0.103
simplecall         0.033
simpleucall        0.083
simpleudcall       0.098
mandel             0.507
mandel2            0.398
ackermann(7)       0.103
ary(50000)         0.018
ary2(50000)        0.014
ary3(2000)         0.162
fibo(30)           0.388
hash1(50000)       0.030
hash2(500)         0.030
heapsort(20000)    0.098
matrix(20)         0.104
nestedloop(12)     0.185
sieve(30)          0.055
strcat(200000)     0.014
------------------------
Total              2.424

PHP 7.2.24

$ php -v
PHP 7.2.24 (cli) (built: Oct 22 2019 08:28:36) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies

PHP Fatal error:  Uncaught Error: Call to undefined function hrtime() in /home/dev/ssd/git/php-src/Zend/bench.php:350
Stack trace:
#0 /home/dev/ssd/git/php-src/Zend/bench.php(357): gethrtime()
#1 /home/dev/ssd/git/php-src/Zend/bench.php(384): start_test()
#2 {main}
  thrown in /home/dev/ssd/git/php-src/Zend/bench.php on line 350

https://www.php.net/manual/ja/function.hrtime.php

hrtime()関数って標準であったよな・・・?と思ったらphp7.3から導入してました。

そりゃだめですよね。

5.6系を入れてみる。

エラーが出てだめでした。理由はopensslのバージョン問題です。

phpbrewの issuesも見てみましたが、サポートする気はないようです。

そもそもEOLを2018年に迎えているので当たり前ですね。

opensslのバージョン下げて無理やりいれようとか思いましたがクレイジーすぎると思ってすぐやめました。

やるとしてもソースからインストールですね。どこかでこけそうな予感してますが。

$ phpbrew known --old

$ phpbrew install 5.6

===> Loading and resolving variants...
Checking distribution checksum...
PHP Fatal error:  Uncaught Error: Call to undefined function PhpBrew\Tasks\hash_file() in phar:///usr/local/bin/phpbrew/src/PhpBrew/Tasks/DownloadTask.php:28
Stack trace:
#0 phar:///usr/local/bin/phpbrew/src/PhpBrew/Command/InstallCommand.php(384): PhpBrew\Tasks\DownloadTask->download('https://www.php...', '/root/.phpbrew/...', 'sha256', 'ffd025d34623553...')
#1 [internal function]: PhpBrew\Command\InstallCommand->execute('5.6.40')
#2 phar:///usr/local/bin/phpbrew/vendor/corneltek/cliframework/src/CommandBase.php(846): call_user_func_array(Array, Array)
#3 phar:///usr/local/bin/phpbrew/vendor/corneltek/cliframework/src/Application.php(398): CLIFramework\CommandBase->executeWrapper(Array)
#4 phar:///usr/local/bin/phpbrew/src/PhpBrew/Console.php(105): CLIFramework\Application->run(Array)
#5 phar:///usr/local/bin/phpbrew/bin/phpbrew(26): PhpBrew\Console->runWithTry(Array)
#6 /usr/local/bin/phpbrew(12): require('phar:///usr/loc...')
#7 {main}
  thrown in phar:///usr/local/bin/phpbrew/src/PhpBrew/Tasks/DownloadTask.php on line 28

ペチゾーが来たゾウ🐘

ラズパイ(CentOS)にphpbrewで最新版のPHPをinstallしてみる。

phpcon2021でペチゾー君が我が家に来たので久々にPHP触ってBenchmarkとってみようと思い立ったのでやってみる。

f:id:mutaonet:20211017212820j:plain

こういう抽選系のは当たったことないのでうれしい。elePHPantも欲しいです。

ちなみに PHP5.6系&CakePHP2なアプリケーション開発はしたことあります。確か4年ぐらい前の話。

プライベートでLalavel使ってメモ帳的なものも作ったことあるけど忘れてしまった。

$ dnf install php

$ curl -L -O https://github.com/phpbrew/phpbrew/raw/master/phpbrew

$ mv phpbrew /usr/local/bin/

$ /usr/local/bin/phpbrew init

$vi ~/.bashrc
## 追記
[[ -e ~/.phpbrew/bashrc ]] && source ~/.phpbrew/bashrc

$ phpbrew known
# WARNING: json extension is required for parsing release info.
===> Fetching release list...
Downloading https://www.php.net/releases/index.php?json=1&version=8&max=100 via curl extension
PHP Fatal error:  Uncaught Error: Call to undefined function PhpBrew\json_decode() in phar:///usr/local/bin/phpbrew/src/PhpBrew/ReleaseList.php:171
Stack trace:
#0 phar:///usr/local/bin/phpbrew/src/PhpBrew/ReleaseList.php(177): PhpBrew\ReleaseList::downloadReleaseListFromOfficialSite(8, 100, Object(GetOptionKit\OptionResult))
#1 phar:///usr/local/bin/phpbrew/src/PhpBrew/ReleaseList.php(136): PhpBrew\ReleaseList::buildReleaseListFromOfficialSite(Object(GetOptionKit\OptionResult))
#2 phar:///usr/local/bin/phpbrew/src/PhpBrew/Tasks/FetchReleaseListTask.php(13): PhpBrew\ReleaseList->fetchRemoteReleaseList(Object(GetOptionKit\OptionResult))
#3 phar:///usr/local/bin/phpbrew/src/PhpBrew/Command/KnownCommand.php(39): PhpBrew\Tasks\FetchReleaseListTask->fetch()
#4 [internal function]: PhpBrew\Command\KnownCommand->execute()
#5 phar:///usr/local/bin/phpbrew/vendor/corneltek/cliframework/src/CommandBase.php(846): call_user_func_array(Array, Array)
#6 phar:///usr/local/bin/phpbrew/vendor/corneltek/cliframework/src/Application.php(398): CL in phar:///usr/local/bin/phpbrew/src/PhpBrew/ReleaseList.php on line 171


## jsonモジュールがないだけみたいなのでinstall
$ dnf install php-json

$ phpbrew known
===> Fetching release list...
Downloading https://www.php.net/releases/index.php?json=1&version=8&max=100 via curl extension
Downloading https://www.php.net/releases/index.php?json=1&version=7&max=100 via curl extension
8.0: 8.0.11, 8.0.10, 8.0.9, 8.0.8, 8.0.7, 8.0.6, 8.0.5, 8.0.3 ...
7.4: 7.4.24, 7.4.23, 7.4.22, 7.4.21, 7.4.20, 7.4.19, 7.4.18, 7.4.16 ...
7.3: 7.3.31, 7.3.30, 7.3.29, 7.3.28, 7.3.27, 7.3.26, 7.3.25, 7.3.24 ...
7.2: 7.2.34, 7.2.33, 7.2.32, 7.2.31, 7.2.30, 7.2.29, 7.2.28, 7.2.27 ...
7.1: 7.1.33, 7.1.32, 7.1.31, 7.1.30, 7.1.29, 7.1.28, 7.1.27, 7.1.26 ...

## phpbrewで見える最新のものをinstall
$ phpbrew install 8.0.11 +default

## error出る
Package 'libxml-2.0', required by 'virtual:world', not found

Consider adjusting the PKG_CONFIG_PATH environment variable if you
installed software in a non-standard prefix.

Alternatively, you may set the environment variables LIBXML_CFLAGS
and LIBXML_LIBS to avoid the need to call pkg-config.
See the pkg-config man page for more details.

## 言われたとおりに
## see https://centos.pkgs.org/8/okey-x86_64/libxml2-devel-2.9.7-5.el8.x86_64.rpm.html
$ dnf install libxml2-devel

## またerror
checking for zlib >= 1.2.0.4... yes

checking whether to enable bc style precision math functions... yes

checking for BZip2 support... yes

checking for BZip2 in default path... not found

configure: error: Please reinstall the BZip2 distribution

Please checkout the build log file for more details:
## see https://centos.pkgs.org/8/centos-baseos-x86_64/bzip2-devel-1.0.6-26.el8.x86_64.rpm.html

$ dnf install bzip2-devel

## 次のerror
and CURL_LIBS to avoid the need to call pkg-config.

See the pkg-config man page for more details.

Please checkout the build log file for more details:
     tail /root/.phpbrew/build/php-8.0.11/build.log
[root@localhost ~]# tail /root/.phpbrew/build/php-8.0.11/build.log
configure: error: Package requirements (libcurl >= 7.29.0) were not met:

Package 'libcurl', required by 'virtual:world', not found

Consider adjusting the PKG_CONFIG_PATH environment variable if you
installed software in a non-standard prefix.

Alternatively, you may set the environment variables CURL_CFLAGS
and CURL_LIBS to avoid the need to call pkg-config.
See the pkg-config man page for more details.

## see https://centos.pkgs.org/8-stream/centos-baseos-x86_64/libcurl-devel-7.61.1-18.el8.x86_64.rpm.html
$ dnf install libcurl-devel

....

このあとも onigurumaがないとか色々と怒られたけど割愛。dnf install していくだけ。

ちゃんとしたやり方あるはずなんだけど見切り発車でやってしまったので結構詰まった。絶対スマートなやり方ある。

↓に必要だったものをまとめておきます。

$ dnf install php-json libxml2-devel bzip2-devel libcurl-devel readline-devel oniguruma-devel libxslt-devel libzip-devel

これで完了です。

Congratulations! Now you have PHP with 8.0.11 as php-8.0.11

* To configure your installed PHP further, you can edit the config file at
    /root/.phpbrew/php/php-8.0.11/etc/php.ini


To use the newly built PHP, try the line(s) below:

    $ phpbrew use php-8.0.11

Or you can use switch command to switch your default php to php-8.0.11:

    $ phpbrew switch php-8.0.11

PHP8からJITが導入されて爆速化しているみたいですね。

PRみましたが、相当な量で追うのを諦めました。というよりも知識が追いついていない感。

github.com

Benchmarkには以下を使う予定

github.com

Grafanaのパスワードがわからなくなった。

タイトルの通り、adminユーザのパスワードが分からなくなって困ってしまった。

ちなみに以下の記事で構築したラズパイ上のGrafana。

mutaonet.hatenablog.com

英語の記事だけどここに書いてありました。(日本語訳しました。)

ahelpme.com

# ps axuf|grep grafana
root     1775938  0.0  0.0 215532   796 pts/0    S+   20:01   0:00              \_ grep --color=auto grafana
grafana     1185  0.1  1.3 3124532 52104 ?       Ssl   8月20  95:31 /usr/sbin/grafana-server --config=/etc/grafana/grafana.ini --pidfile=/var/run/grafana/grafana-server.pid --packaging=rpm cfg:default.paths.logs=/var/log/grafana cfg:default.paths.data=/var/lib/grafana cfg:default.paths.plugins=/var/lib/grafana/plugins cfg:default.paths.provisioning=/etc/grafana/provisioning
# vi /etc/grafana/grafana.ini

#################################### Paths ####################################
[paths]
# Path to where grafana can store temp files, sessions, and the sqlite3 db (if that is used)
;data = /var/lib/grafana ⭐

# Temporary files in `data` directory older than given duration will be removed
;temp_data_lifetime = 24h

# Directory where grafana can store logs
;logs = /var/log/grafana

# Directory where grafana will automatically scan and look for plugins
;plugins = /var/lib/grafana/plugins

# folder that contains provisioning config files that grafana will apply on startup and while running.

sqliteを内部で使ってるんですね。

ということでsqliteでadminユーザのパスワードを初期化します。

# sqlite3 /var/lib/grafana/grafana.db
SQLite version 3.26.0 2018-12-01 12:34:55
Enter ".help" for usage hints.
sqlite> update user set password = '59acf18b94d7eb0694c61e60ce44c110c7a683ac6a8f09580d626f90f4a242000746579358d77dd9e570e83fa24faa88a8a6', salt = 'F3FAxVm33R' where login = 'admin';
sqlite>

Email for username: admin

Password: admin

で入力すると、パスワード変更画面が表示されてパスワードの変更&Loginができました!

f:id:mutaonet:20211010200616p:plain

やったことない手順だったのでメモ。

Apacheでロードバランシング

mod_proxy_balancerとは?

Apache2.2系から使えるようになったらL7のロードバランシング機能を持つmodule。

触れる機会があったのでちょっと調べてみる。

実際にはApacheでロードバランシングしているところを、AWSで言うELBに置き換えたいので調べてみたというところ。

httpd.apache.org

ロードするmoduleは以下。

LoadModule status_module modules/mod_status.so
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
LoadModule lbmethod_bybusyness_module modules/mod_lbmethod_bybusyness.so
LoadModule lbmethod_byrequests_module modules/mod_lbmethod_byrequests.so
LoadModule lbmethod_bytraffic_module modules/mod_lbmethod_bytraffic.so
LoadModule lbmethod_heartbeat_module modules/mod_lbmethod_heartbeat.so
LoadModule proxy_http_module modules/mod_proxy_http.so

ロードバランシングの設定は以下。

<Proxy balancer://mycluster>
BalancerMember http://127.0.0.1:81 retry=10 loadfactor=10
BalancerMember http://127.0.0.1:82 retry=10 loadfactor=50
</Proxy>
ProxyPass /test balancer://mycluster

このように設定すると http://127.0.0.1:8080/test でLB機にアクセスした場合にBalancerMemberで指定した2つのバックエンドサーバへとアクセスを振り分けられる。

BalancerMemberのパラメータについて

パラメータ 説明
retry コネクションを保持するためのリトライのタイムアウト値を秒単位で指定する。デフォルトで60秒。
loadfactor 1~100までの値で負荷係数を重み付けできる。デフォルトで1。

詳細は以下

httpd.apache.org

ロードバランサの管理画面

以下のように設定すると管理画面を表示することができる。

バランサマネージャと呼ぶらしい。この管理画面ではメンバを変更したり、特定のメンバをオフラインにするといった動的な管理ができる。

なので、Deny from all を指定して接続できる端末を制御する必要がある。ドメイン指定でも可能。

<Location /balancer-manager>
SetHandler balancer-manager

Order Deny,Allow
Deny from all
Allow from 127.0.0.1
</Location>

TODO

dockerで試したけど、キャプチャを取り忘れたのであとで貼ります。。。

LB用Apacheコンテナ * 1

バックエンドサーバ用Apacheコンテナ * 2

な最小構成を試してみました。

Apendix

github.com

load average

load average

「LAが急上昇しました。」とかそういうことを聞いたりする。

load averageについてこの機会におさらいかねてまとめておくことにした。

実行するタスクが増えてくるとタスクの実行待ちが発生する。

この待ち状態がプログラムの遅延状態としてload averageに表示される。

$ top
top - 18:59:58 up 27 days, 20:23,  1 user,  load average: 0.15, 0.30, 0.24 ⭐
Tasks: 134 total,   1 running, 133 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.9 us,  0.6 sy,  0.0 ni, 98.4 id,  0.1 wa,  0.0 hi,  0.0 si,  0.0 st
MiB Mem :   3797.7 total,    938.1 free,   1031.2 used,   1828.5 buff/cache
MiB Swap:    488.0 total,    488.0 free,      0.0 used.   2508.8 avail Mem

## 実行した時間が違うのでload averageが異なる。
$ uptime
 19:10:43 up 27 days, 20:33,  1 user,  load average: 0.07, 0.14, 0.17 ⭐

load average: 0.15, 0.30, 0.24

左から順に1分、5分、15分の単位でどの程度タスクの待ち時間が発生したかを表している。

load averageが高いということは、遅延が発生しているということになるので、負荷が高いということになる。

しかし、CPU負荷なのかI/O負荷なのかはこれだけでは判断できない。

Load averageの算出処理はカーネルのコードのこの辺りから追える。

github.com

sar

Load averageからCPU負荷なのかI/O負荷なのかを見極めていく。

$ sar
Linux 5.4.65-v8.2.el8 (localhost.localdomain)   2021年09月17日   _aarch64_   (4 CPU)

00時00分00秒     CPU     %user     %nice   %system   %iowait    %steal     %idle
00時10分00秒     all      2.14      0.00      1.09      0.17      0.00     96.60
00時20分00秒     all      1.55      0.00      0.76      0.14      0.00     97.55
00時30分00秒     all      1.61      0.00      0.81      0.14      0.00     97.45
00時40分00秒     all      1.61      0.00      0.78      0.40      0.00     97.21
00時50分00秒     all      1.62      0.00      0.79      0.18      0.00     97.41
01時00分00秒     all      1.54      0.04      0.76      0.15      0.00     97.51
01時10分00秒     all      1.61      0.00      0.80      0.34      0.00     97.24
01時20分00秒     all      1.62      0.00      0.81      0.13      0.00     97.44
01時30分00秒     all      1.60      0.00      0.80      0.34      0.00     97.26
01時40分00秒     all      1.59      0.00      0.78      0.16      0.00     97.47
01時50分01秒     all      1.57      0.00      0.77      0.20      0.00     97.46
02時00分01秒     all      1.62      0.22      0.84      0.17      0.00     97.15
02時10分00秒     all      1.67      0.00      0.83      0.32      0.00     97.18

CPU負荷

以下の項目に注目する。

  • %user: ユーザモード

ユーザプログラム(アプリケーション等)で実行したCPU使用率

  • %system: システムモード

カーネル(システム)で実行したCPU使用率

I/O負荷

  • %iowait:

ディスクI/O待ち。スワップアウト時などに値が上昇する。

プロセスの状態

load averageが分かり、CPU使用率・I/O待ち率が判明したら各プロセスからボトルネックを見つけていく。

mutaonet.hatenablog.com

以前の記事で書いてある通り、プロセスの状態は以下の通り。

$ ps aux | head -1 && ps aux | grep httpd
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root        6849  0.0  0.1  44256  6536 ?        Ss    5月30   1:40 /usr/sbin/httpd -DFOREGROUND
www       225430  0.0  0.1  56460  4592 ?        S     6月13   0:00 /usr/sbin/httpd -DFOREGROUND
www       225431  0.0  0.1 2293576 6108 ?        Sl    6月13   1:59 /usr/sbin/httpd -DFOREGROUND
www       225432  0.0  0.1 2490256 6340 ?        Sl    6月13   2:03 /usr/sbin/httpd -DFOREGROUND
www       225433  0.0  0.1 2293576 6140 ?        Sl    6月13   1:59 /usr/sbin/httpd -DFOREGROUND
STAT 状態 説明
R (Run) TASK_RUNNING 実行可能状態。CPUが空きさえすればいつでも実行可能
S (Sleep) TASK_INTERRUPTED 割り込み可能。入力待ち、スリープ等
D (Disk Sleep) TASK_UNINTERRUPTIBLE 割り込み不可能。主に短時間で復帰する場合の状態。ディスク入出力待ち
Z(Zombie) TASK_ZOMBIE ゾンビ状態。子プロセスがexitとして親プロセスにリープされるまでの状態

SREに求められる知識?

SREとして働く上でどんなスキルセットが必要なのか、そして自分はどこまで知識を持っているかというのを洗い出したいので書き出してみる。

qiitaで「各社の募集要項からSREに求められるスキルをまとめた」という素晴らしいPOSTがあったので参考にしてみることにする。

qiita.com

大規模システムの構築・運用

DAU 10万以上のサービス(もしくはそれと同様)のインフラ運用経験(FiNC/歓迎スキル)

20,000 req/sec オーバーのAPIトラフィックを安定して処理するためのバックエンドシステムの開発、運用(mercari/業務内容)

具体的な数値が出ているのはこの辺。

mercariのTechBlogで以下のようなPOSTがあった。

トラフィックに耐えうるシステムの構築・運用の知識とはここまでできるエンジニアと思って差し支えなさそう。

engineering.mercari.com

ちなみにOpenRestyについての知識は私はないので宿題にする。

経験値

  • 20,000 req/secを超えるシステムの構築・運用・管理経験はある。
  • 負荷試験
    • 試験シナリオは直近で考えて最大でどこまで耐えられるか等、検証した経験あり
  • AWS使っている案件だとELBが高スループット保証しているので問題になることはなかったと記憶している。
    • ただスパイクアクセスの場合はPre-Warmingを申請が必要とかそういう経験はあったちなみにスパイクする時間はだいたい判明していた。
    • AutoScalingが間に合わなくてインスタンス事前に増やしておいたりとかもあった。

クラウド

パブリッククラウド(AWS/GCP...)の経験が求められている。

AWSクラウド環境の技術進化に興味を持ち続け、最新のサービスを当社のビジネつ実現に適切な形で、適応する提案や研究意識(BASE/必須スキル)

クラウド上でのインフラ構築経験、および、3年以上の運用経験(FiNC/必須スキル)

ここらへんが自身の経験に当てはめて考えやすい。

経験

  • AWSの運用経験は2年ほど
  • プライベートクラウドの運用経験は2年以上(現在進行系)。
  • AWSのカンファレンスとかその他勉強会は参加しているけど、研究まではしていない。
    • 研究を何と定義するかによるが、調査・仮設・実験・考察・アウトプットでそれなりに有名であること。とするとそのような経験も知名度もない。

開発スキル(プログラミングスキル)

システムのパフォーマンスや信頼性を向上させるのに必要なアプリケーション、ミドルウェアへの機能追加、バグ修正を行うためのプログラミング能力(mercari/必須スキル)

OSSの公開、コントリビュートの経験(mercari/歓迎スキル)

経験

  • アプリケーションエンジニア(インフラレイヤーもかじってる)ので満たしてはいそう。
    • 実際の経験を話せることが重要なので、事前に振り返って経験整理すれば問題なさそう。
  • OSSの公開、コントリビュートの経験なし
    • やりたいです。エンジニアのスキルを見極める分水嶺的なものと認識しているので、年内挑戦予定(3ヶ月程度しかない...)。

パフォーマンスチューニング

アプリチームと共同し、サービスのパフォーマンス改善の可視化、分析、提案(BASE/業務内容)

高速なレスポンスを実現するためのアプリケーション、ミドルウェアのパフォーマンス改善(mercari/業務内容)

経験

  • 前述した通り経験あり。
    • 勉強会に登壇している人達と比べたら見劣りはする。
  • 直近ではここらへんを業務担当範囲にしている気がする。

ネットワーク

TCP/IP、HTTPなどのネットワークプロトコルについての基礎知識(mercari/必須スキル) ネットワークに関する基礎知識(エニグモ/必須スキル)

ここが一番難しかったです。

経験についてはあとで調べて追記します。

Linux

インフラ(Linux)構築・運用経験 3年以上(エニグモ/必須スキル)

Linux カーネル関連の知識・開発経験(cybozu/歓迎スキル)

最近自分の中で一番「キテ」いる分野。すごい面白いです。

経験

  • インフラ(Linux)構築・運用経験 3年以上あり。
  • Linuc Level1 取得済み(早くlevel3まで取らねば)

冗長化・分散手法

大規模サービス運用ではもはや前提となるためか、明示的に書いているところは少ないかも。

なるほど。オンプレ/クラウドといったことは抜きにしてそもそも論で分かっているかどうかを問われていそう。

冗長化や分散手法に対する基本的な知識(SmartNews/必須スキル)

経験

  • 冗長化や分散手法に対する基本的な知識あり

ログ収集・解析基盤

ログ解析、モニタリング自動化経験(cybozu/歓迎スキル)

ログ(メトリクス)収集・解析基盤の開発・構築・運用(cybozu/業務内容)

データ分析を迅速に行うためのログ収集・分析基盤の構築、運用(mercari/業務内容)

もはや鉄板といった感じ。

経験

  • ログ解析、運用経験あり。
  • 地味にアウトプットもしている。

mutaonet.hatenablog.com

mutaonet.hatenablog.com

監視・モニタリングシステム

インフラ基盤のモニタリング・アラートシステムの開発・運用(cybozu/業務内容)

障害検知やキャパシティプランニングのためのモニタリング環境の構築、運用(mercari/業務内容)

経験

  • 監視システムの構築の経験はなし。
    • 0ベースで監視システム構築から入るってすごい経験。。。
  • 運用経験はあります。アラート組み込んだりも経験あり。
    • アラート検知の設定が悪くてオオカミ少年みたいなアラートを作ってしまった経験も恥ずかしながらある。

セキュリティ

OS セキュリティ関連の知識(cybozu/歓迎スキル)

セキュリティに関する深い知識(mercari/歓迎スキル)

経験

  • 自分の中で一番弱い箇所だと思う。
  • CVEを読んで脆弱性対策をするとかそういった経験はあり。

オペレーション自動化・効率化

CIや自動構成管理、オーケストレーション等の構築、運用経験(BASE/歓迎スキル) Infrastructure as Codeの運用経験、もしくは興味をお持ちの方(エニグモ/歓迎スキル) デプロイや各種オペレーション自動化ツールの開発、運用(mercari/業務内容)

これも好きな分野。効率化とか考えるの好きだし、逆に言うと非効率だったり手間がある作業はどんどん潰したい。

経験

  • Ansibleでの構成管理経験あり
  • Jenkins/Drone.io

RDBMS

3年以上のRDB運用経験(FiNC/必須スキル)

MySQL等のRDBMSの運用経験(mercari/歓迎スキル)

経験

  • ざっくり言うとあり。
  • Cluster構成考えるとかレプリケーションとるとかは経験なし。知識としてかじったぐらい。

コンピュータサイエンス

コンピュータサイエンス修士またはそれに相当するスキル・経験(Retty/必須スキル)

ものすごいハードルが高い。。。大学院を修了してもいないし、そういった経験のある人とコミュニケーションをとった記憶もない気がする。

経験

  • 前述の通り自分のレベルは低い。
  • 体系的に学んだという実績を示すものはない。

感想

今回はqiitaに取り上げられていた募集要項の中から判断しやすいものを抜粋して自分がどのレベルにあるかざっくり探ってみました。

自分はまだまだ未熟であり、インプット・アウトプットの質と量を向上させていく必要があると感じました。業務経験も浅い気がしますね(5年目エンジニア)。

今回を気に知らないOSSも知れたので勉強の種が更に増えてモチベが上がりました。

(お家ラズパイKubernetes化計画を年内目処にやろう)

SREに求められているのは広範に渡る高いスキルだと知れたとともにSREとして働いている皆様に頭が上がりません。