Input中心のブログ

kubernetesで実践するクラウドネイティブDevOps

June 21, 2020

これは定期的に書いてる読書感想?兼インプット用のブログです。 詳しくは aboutページをご覧ください。

LivenessとReadinessについて

この辺はいつも何となく適当にSpecに書いたり書かなかったりしているので両方の違いやできることをちゃんと知れてよかったなと思います。 読んでみると結構使い分けやそもそも書かなくてもいい場合などが分かってきたので、メモ代わりに書いておきます。

p81 Liveness probeとは? コンテナが機能しているかの判断のために使う。 httpを使う場合は`healthz`を使うのが慣例になっている。そのほかにはtcp, commandが使える

liveness probeはinitialDelaySecondで最初何秒間か待ってからリクエストを送ることができます。 Liveness probeはWebの場合は基本的にはhttpを使うのが基本なわけですが、commandを指定してそのcommandのexit codeが0かどうかでチェックすることもできるみたいです。 書き方は以下の通り

livenessProbe:
  httpGet:
    path: /healthz
    port: 8888
  initialDelaySeconds: 3
  periodSeconds: 3

他にcommandを指定するなら以下の通り

livenessProbe:
  exec:
    command:
    - cat
    - /tmp/healthy
p82 Readiness probeとは? kubernetesに一時的にリクエストを処理できない状態であることを伝えることができる。 これが整うまではリクエストを受け付けないという意味ではLivenessと同じ。

Readinessはサービスと途中でリクエストを受け付けられない状態になった場合に回復するために使うのがよさそう。 新しいContainerを作成して回復しようと思う場合はLivenessだけでいいのかも? 正直Containerを再起動するような処理を作成するのは難しそうなので、普通のAPIについてはLivenessだけ指定しておくとよいのか? 本には初期プロセス起動中にまだReadinessではないと返すのがいいと書いてあった。 下のコードは初期化をゴルーチンで起動しているが、もし別スレッドで動かしていればLivenessもエラーになってしまうことに注意。

func healthz(w http.ResponseWriter, r *http.Request) {
  fmt.Fprintf(w, "OK")
}

func readiness(w http.ResponseWriter, r *http.Request) {
  if initialized /* 初期化が終わっているかどうか */ {
    fmt.Fprintf(w, "OK")
  } else {
    w.WriteHeader(500)
    fmt.Fprintf(w, "NG")
  }
}

func main() {
  go initialize() // 重たい処理

  http.HandlerFunc("/healthz", healthz)
  http.HandlerFUnc("/readiness", readiness)
  http.ListenAndServe(":8000", nil)
}

Secretについて

僕は現在のところk8sはバイトくらいにしか使っていないので、あまりSecretファイルを触る権限をもらえていません。 なので、今のところあまり触る機会はないのですが、せっかくだからこの本を読んだついでに覚えておこうと思ったのでメモっておきます。

p212 Secretの作成戦略を3つ述べよ 1. Gitに暗号化して保存する。 2. Cloud Storageに保存する。 3. 専用のツールを使用する。 ソースコードやストレージには暗号化して書き込み、デプロイ時に復号化すると管理が楽になる。順番に楽・小規模↔難・大規模という風になっている

Secretはユーザから見るとbase64で暗号化されているだけなので簡単に複合か出来る。 そのため、k8sのRBACをうまく利用して見れる人と見れない人を区別する必要がある。 個人でやる分にはGitに暗号化して保存するで十分行けそう。 チーム開発でやる場合には複合鍵をどのように管理するかを決めておいて、Wikiとかに書いておくのがよさそう。

Gitなどで共有化する場合は、sopsのようなツールの使い方が紹介されていた。 これはyamlのキーはそのままで値だけを暗号化するツールでレビューとかをするときもキーがあっているかを見ることができるので結構便利そう。

そのほか普通に覚えておこうと思ったもの

p154 なぜlatestタグは役に立たないのか? latestタグというのはタグ付けされていないものの中で最新というだけ。基本的にはタグ付けされた安定版を使うべき

基本的にはlatestタグは使わずにバージョン管理されているタグを固定して運用しましょう。 いつもDockerfileでビルドするときはタグを指定せずにやってしまっているが、これは危ないのでタグはちゃんと指定するようにしよう。(自戒)

p265 knativeとはなにか? サーバレスも含めた全てのワークロードをk8sで管理するためのサービスツール。 k8sとIstioを統合したサービスらしい。

これについては触ったことが無いので感じだけ知っときたいなと思ってメモってます。 また、興味出てくるか必要になったらちゃんと調べよう。