技術部プラットフォームグループ SRE の akichan です。
私が所属する技術部プラットフォームグループは SUZURI や minne といったサービスごとにある事業部に所属しないサービス横断のSREの集団です。運用の効率化、サービスレベル目標を達成できるようにするための支援を行っています。
今回はペパボのSREが普段利用している便利なツールの紹介を通し、具体的な業務の内容について知っていただこうと思います。
Kubernetes関連
SRE は各サービス事業部のKubernetesクラスタの管理者でもあります。 日常的なクラスタの維持管理や、トラブルシュートに対応します。
stern
sternは複数のPodのログをまとめて見ることができるツールです。
kubectl logs
を使ってPodのログをみる場合、Podの正確な名前を指定する必要があり手間です。
sternはPod名の一部だけの指定をすれば一致するPodのログをtailできます。
kubectl-neat
kubectl-neatはデプロイしたリソースに追加されるUIDなどの情報を削除してくれるツールです。 設定の確認の際に見やすい上、既存のリソースからmanifestを作成して他のnamespaceやクラスタにデプロイする際に重宝します。
### 冗長な情報が加えられたsecret
$ kubectl get secret example-secret -o yaml
apiVersion: v1
data:
my-secret: YWJjZGVmZw==
kind: Secret
metadata:
creationTimestamp: "2022-06-09T14:12:11Z"
name: example-secret
namespace: akichan
resourceVersion: "772536770"
uid: 1bc75771-c0cd-4758-99b6-6d840192bbd9
type: Opaque
### kubectl-neatを利用して不要な情報を削除
$ kubectl get secret example-secret -o yaml | kubectl neat
apiVersion: v1
data:
my-secret: YWJjZGVmZw==
kind: Secret
metadata:
name: example-secret
namespace: akichan
type: Opaque
kubectl-view-secret
KubernetesのSecretリソースのデータはBase64でエンコードされており、値を確認する際にデコードしなくてはいけないなどやや手間です。 kubectl-view-secretを使うことで、デコードした内容を表示してくれます。
$ kubectl get secret example-secret -o yaml | kubectl neat
apiVersion: v1
data:
my-secret: YWJjZGVmZw==
kind: Secret
metadata:
name: example-secret
namespace: akichan
type: Opaque
### デコード
$ echo 'YWJjZGVmZw==' | base64 -d
abcdefg%
### view-secret
$ kubectl view-secret example-secret
Choosing key: my-secret
abcdefg
yq
kislyuk/yqはYAML/XMLのjqラッパーで、jqのようにYAMLから値を抜き出したりすることができます。 kustomize buildの結果の複数種類のmanifestから、特定のmanifestだけを抜き出して確認したりするときに特に役立ちます。
### ConfigMap,Service,Deployment
$ kustomize build examples/helloWorld | grep kind:
kind: ConfigMap
kind: Service
kind: Deployment
### ConfigMapだけ表示
$ kustomize build examples/helloWorld | yq -y 'select(.kind=="ConfigMap")'
apiVersion: v1
data:
altGreeting: Good Morning!
enableRisky: 'false'
kind: ConfigMap
metadata:
labels:
app: hello
name: the-map
### コンテナ名とlibenessProbe, readinessProbeだけを抜き出して表示
$ k get deploy argocd-server -o yaml | \
yq -y '.spec.template.spec.containers | map({name: .name, liveness: .livenessProbe, readiness: .readinessProbe })'
- name: argocd-server
liveness:
failureThreshold: 3
httpGet:
path: /healthz?full=true
port: 8080
scheme: HTTP
initialDelaySeconds: 3
periodSeconds: 30
successThreshold: 1
timeoutSeconds: 1
readiness:
failureThreshold: 3
httpGet:
path: /healthz
port: 8080
scheme: HTTP
initialDelaySeconds: 3
periodSeconds: 30
successThreshold: 1
timeoutSeconds: 1
ターミナル
体感で一日の半分以上見ている画面です。個人的にはできる限りここから離れないのが効率向上のポイントだと思っています。
ghq, GitHub CLI
事業部を跨いで多くのリポジトリに関わることもあり、効率的な業務のためこれらのリポジトリ管理とGitHub操作をCLIから行えるツールは必須です。
ghqを利用することで、どこにcloneするかをいちいち気を使う必要がなくなります。 pecoやfzfといったツールと組み合わせることで、高速にリポジトリを選択して移動することができます。
Github CLIはGitHubの多くの操作を行えるCLIツールです。gh repo view --web
でリポジトリをブラウザで開いたり、ターミナルからPRを作成するなどで活用しています。
またgh run watch
でGitHub Actionsの状態が見れるので、コミットをPushした後CIの結果を眺めながら別の修正を行うなども便利です。
tmux, tmux-xpanes
複数ペインを使い分けコーディング、サーバーのオペレーションを行っています。
私がよくするスタイルは、メインのペインでエディタを開き、3つのサブペインでdockerで開発環境を立ち上げながら、前述のGitHub CLIでCIの進捗を眺めたりしています。
こちらの方のYoutube動画を参考にide
というスクリプトを用意して、すぐこのスタイルでペインが開くようにしています。
#!/bin/bash
tmux split-window -v -p 30
tmux split-window -h -p 66
tmux split-window -h -p 50
tmux-xpanesはtmuxのペイン分割操作を便利にしてくれるツールです。
主には--ssh
オプションで複数サーバーに同時ログインして差異を確認したり、オペレーションするシーンで活用しています。
### server-10,server-11,server-12にペイン分割してログイン
$ tmux-xpanes --ssh server-{10..12}
コーディング
インフラ管理以外にも、監視プラグインや運用効率化のソフトウエアを書いたり、各サービスのアプリケーションに手を入れることもあります。
NeoVim
エディタはさまざまな派閥がありますが、あくまで私の環境のご紹介です。
coc.nvim
coc.nvimはLanguage Server Protocol(LSP)対応の補完プラグインです。 LSPのインストールも行えるので、これを入れておけば大体の言語を読み書きする環境が簡単に準備できます。
nvim-treesitter
nvim-treesitterはシンタックスハイライトのプラグインです。 個々の言語向けのハイライトプラグインを入れる必要なく、これだけで設定が済むことから利用しています。
telescope.nvim
曖昧検索のプラグインです。色々なリポジトリに広く関わるので、コードの場所や定義箇所を探すときに重宝します。 あとUIが抜群にかっこいいです。
Visual Studio Code
サブのエディタで、リモートでペアプログラミングする際にLive Share機能を利用することがあります。
デスクトップアプリ
Alfred
Alfredは高機能なランチャーアプリです。ワークフローでさまざまな機能を追加できます。
例えば、Mackerel連携のalfred-mackerel-page-workflowを使うことでAlfredから監視ホストのページやダッシュボードに即座に飛ぶことができます。 またWhois検索ワークフローはすぐにIPアドレスやドメインの情報を調べることができ、短時間に大量のアクセスをしてくるクライアントの調査等でよく使います。
さらにAlfredはスニペット機能も便利です。私がよく使うスニペットを紹介します。
-
デバッグ用にPodを立てる
kubectl run tmp -it --rm --restart=Never --image=alpine -o yaml --
-
netcatでポートが開いているかチェック
nc -v -w 10 example.com -z 80
-
tcpdumでping確認
tcpdump -i eth0 icmp
-
tcpdumpでhttpヘッダを表示
tcpdump -A 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)' | egrep --line-buffered "^........(GET |HTTP\/|POST |HEAD )|^[A-Za-z0-9-]+: " | sed -r 's/^........(GET |HTTP\/|POST |HEAD )/\n\1/g'
-
consul サーバーのraftステータス確認
consul operator raft list-peers
-
curlでresolveしてヘッダだけ表示
curl -D - -s -o /dev/null --resolve www.example.com:80:10.0.1.2 http://www.example.com/
-
mysqlでPROCESS LISTの接続元を集計
select USER, SUBSTRING_INDEX(HOST, ':', 1) AS ip, COUNT(*) AS cnt from information_schema.PROCESSLIST GROUP BY 1,2 ORDER BY cnt DESC LIMIT 20;
-
markdownにdetailタグでクリップボードのコードブロックをはる
<details> <summary></summary> ``` {clipboard} ``` </details>
Dash
Webで検索するより断然早いので、Terraform, PuppetなどのIaCツールや、nginxなどのMiddleware、よく書く言語(Ruby, Go)のドキュメントを参照するために使っています。 前述のAlfredと連携させて検索できるようにしています。
Monitoring
Mackerel/Prometheus
Mackerelは全社的に昔から利用している監視サービスです。Prometheusも利用していますが、こちらは主にk8s上のリソースを監視する用途で使っています。 SREにはシステム全体を把握している人が多いので、注目すべき点をダッシュボードにまとめたりする機会が多いです。
足りない監視項目を補うため監視プラグインを作成したりもします。
Datadog/ElasticAPM
サービスやアプリケーションのさまざまな理由によって二種類を併用しています。 SLOの確認で違反が見つかった時などに、原因を調査するために活用します。 原因を見つけた上、アプリケーションのコードを修正することもあります。
PagerDuty
Mackrel、Prometheusと連携し、必要な時にオンコールされるようにしています。
Slack Botを作成して、一時的なオンコールスケジュールの変更、ダウンタイムの設定、前日のオンコールのサマリの表示の操作を行っています。
ログ分析
日常的な運用や障害時の原因や影響の分析のため、SQLを書いてログを集計する機会も多いです。
Redash/BigQuery
アクセスログをはじめとした多くのログの保存にBigQueryを利用しています。 障害の調査の際には、Redashからクエリを実行してグラフにして共有するなど活用しています。 またカスタマーサポートをするパートナー向けに、お客様からのお問い合わせに関するログを簡単に検索できるダッシュボードを作成したりします。
Athena
RDSの監査ログやCloudFrontのログはS3に保存されるようになっています。これらを検索するときにAWS Athenaを利用します。 最近ではCloudFrontのログを調査して転送量の多いページを特定して改修した結果、年間数百万円規模のコスト削減を行いました。
まとめ
私たちが担当する領域についてよりイメージがつかめたでしょうか? もっと便利なツールなどあればぜひ教えてほしいです!
この記事を読んでペパボのSREに興味を持ったら採用サイトからご連絡ください!