sre

ペパボSREの道具箱

sre

技術部プラットフォームグループ SRE の akichan です。

私が所属する技術部プラットフォームグループは SUZURI や minne といったサービスごとにある事業部に所属しないサービス横断のSREの集団です。運用の効率化、サービスレベル目標を達成できるようにするための支援を行っています。

今回はペパボのSREが普段利用している便利なツールの紹介を通し、具体的な業務の内容について知っていただこうと思います。

Kubernetes関連

SRE は各サービス事業部のKubernetesクラスタの管理者でもあります。 日常的なクラスタの維持管理や、トラブルシュートに対応します。

stern

sternは複数のPodのログをまとめて見ることができるツールです。 kubectl logsを使ってPodのログをみる場合、Podの正確な名前を指定する必要があり手間です。 sternはPod名の一部だけの指定をすれば一致するPodのログをtailできます。

stern

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するかをいちいち気を使う必要がなくなります。 pecofzfといったツールと組み合わせることで、高速にリポジトリを選択して移動することができます。

Github CLIはGitHubの多くの操作を行えるCLIツールです。gh repo view --webでリポジトリをブラウザで開いたり、ターミナルからPRを作成するなどで活用しています。 またgh run watchでGitHub Actionsの状態が見れるので、コミットをPushした後CIの結果を眺めながら別の修正を行うなども便利です。

github cli

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に興味を持ったら採用サイトからご連絡ください!